@rangertechnologies/ngnxt 2.1.254 → 2.1.255
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 +138 -169
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/package.json +4 -6
- package/rangertechnologies-ngnxt-2.1.255.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 -158
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
- 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 -7
- 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 -616
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
- 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 -1121
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
- 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/pipe/svg/svg.pipe.mjs +0 -26
- 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 -474
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
- 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 -335
- 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.254.tgz +0 -0
|
@@ -1,639 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
|
|
2
|
-
import { VERSION } from '../../../../environments/version';
|
|
3
|
-
import { PdfPropertiesComponent } from '../pdf-properties/pdf-properties.component';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
6
|
-
import { FormsModule } from '@angular/forms';
|
|
7
|
-
import { NxtDatatable } from '../../../components/datatable/datatable.component';
|
|
8
|
-
import { BookletComponent } from '../../booklet/booklet.component';
|
|
9
|
-
import { AppTemplatesComponent } from '../../builder/templates/templates.component';
|
|
10
|
-
import { NxtInput } from '../../../components/nxt-input/nxt-input.component';
|
|
11
|
-
import { ImageCropperComponent } from '../../../components/image-cropper/component/image-cropper.component';
|
|
12
|
-
import _ from 'lodash'; // Ensure lodash is installed
|
|
13
|
-
import { NxtCustomTranslatePipe } from '../../../pipe/custom-translate.pipe';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "../../../services/pdf-designer/pdf-designer.service";
|
|
16
|
-
import * as i2 from "@angular/common";
|
|
17
|
-
import * as i3 from "@angular/material/tooltip";
|
|
18
|
-
import * as i4 from "@angular/forms";
|
|
19
|
-
export class PdfDesignerComponent {
|
|
20
|
-
pdfDesignerService;
|
|
21
|
-
//@Output() elementButtonClicked = new EventEmitter<string>();
|
|
22
|
-
textareas;
|
|
23
|
-
pdfJSON;
|
|
24
|
-
bookletId;
|
|
25
|
-
isPreview = false;
|
|
26
|
-
pdfSaveHandlerEmit = new EventEmitter();
|
|
27
|
-
templateMode = new EventEmitter();
|
|
28
|
-
pdfPreviewEmit = new EventEmitter();
|
|
29
|
-
field;
|
|
30
|
-
pdfElements = [];
|
|
31
|
-
elements = [];
|
|
32
|
-
bookId;
|
|
33
|
-
sections = {
|
|
34
|
-
basic: true,
|
|
35
|
-
advanced: true
|
|
36
|
-
};
|
|
37
|
-
elementsList = [];
|
|
38
|
-
elementDisabledArray;
|
|
39
|
-
version = VERSION.version;
|
|
40
|
-
pdf;
|
|
41
|
-
selectedElement = null;
|
|
42
|
-
isSelectTablePopup = false;
|
|
43
|
-
currentType;
|
|
44
|
-
addTable = true;
|
|
45
|
-
dots = Array(6);
|
|
46
|
-
draggedIndex = null;
|
|
47
|
-
templateSelected = false;
|
|
48
|
-
isImageEdit = false;
|
|
49
|
-
selectedImageElement;
|
|
50
|
-
transform = {
|
|
51
|
-
translateUnit: 'px',
|
|
52
|
-
scale: 1,
|
|
53
|
-
rotate: 0,
|
|
54
|
-
flipH: false,
|
|
55
|
-
flipV: false,
|
|
56
|
-
translateH: 0,
|
|
57
|
-
translateV: 0
|
|
58
|
-
};
|
|
59
|
-
loading = false;
|
|
60
|
-
canvasRotation = 0;
|
|
61
|
-
cropper;
|
|
62
|
-
cropperMaxHeight = 0;
|
|
63
|
-
cropperMaxWidth = 0;
|
|
64
|
-
cropperMinHeight = 0;
|
|
65
|
-
cropperMinWidth = 0;
|
|
66
|
-
cropperStaticWidth = 0;
|
|
67
|
-
cropperStaticHeight = 0;
|
|
68
|
-
aspectRatio = 4 / 3;
|
|
69
|
-
roundCropper = false;
|
|
70
|
-
isImageHover = false;
|
|
71
|
-
alignImage = 'center';
|
|
72
|
-
showTextSettings = false;
|
|
73
|
-
selectedColumn = null;
|
|
74
|
-
//subscription: any;
|
|
75
|
-
constructor(pdfDesignerService) {
|
|
76
|
-
this.pdfDesignerService = pdfDesignerService;
|
|
77
|
-
}
|
|
78
|
-
//AP-14JUN25 - Called after view initialization to auto-resize all textareas
|
|
79
|
-
ngAfterViewInit() {
|
|
80
|
-
this.resizeAllTextareas();
|
|
81
|
-
}
|
|
82
|
-
//AP-14JUN25 - Calculates contrast text color (black or white) based on background color
|
|
83
|
-
getContrastColor(bgColor = '#000000') {
|
|
84
|
-
// Convert hex to RGB
|
|
85
|
-
const color = bgColor.replace('#', '');
|
|
86
|
-
const r = parseInt(color.substring(0, 2), 16);
|
|
87
|
-
const g = parseInt(color.substring(2, 4), 16);
|
|
88
|
-
const b = parseInt(color.substring(4, 6), 16);
|
|
89
|
-
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
|
|
90
|
-
return brightness > 128 ? '#000000' : '#ffffff';
|
|
91
|
-
}
|
|
92
|
-
//AP-14JUN25 - Automatically resizes all textareas based on their content
|
|
93
|
-
resizeAllTextareas() {
|
|
94
|
-
this.textareas.forEach((textareaRef) => {
|
|
95
|
-
const textarea = textareaRef.nativeElement;
|
|
96
|
-
textarea.style.height = 'auto';
|
|
97
|
-
textarea.style.height = textarea.scrollHeight + 'px';
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
ngOnInit() {
|
|
101
|
-
this.elementsList = [
|
|
102
|
-
{ "type": "text", "img": "TextArea", "label": "Text" },
|
|
103
|
-
{ "type": "input", "img": "Text", "label": "Input" },
|
|
104
|
-
{ "type": "date", "img": "Date", "label": "Date" },
|
|
105
|
-
{ "type": "image", "img": "Image", "label": "Image" },
|
|
106
|
-
{ "type": "Line", "img": "line", "label": "Line" },
|
|
107
|
-
{ "type": "Space", "img": "space", "label": "Space" },
|
|
108
|
-
{ "type": "Table", "img": "Table", "label": "Table" },
|
|
109
|
-
{ "type": "Pdf", "img": "Search", "label": "Book" },
|
|
110
|
-
];
|
|
111
|
-
this.elementDisabledArray = {
|
|
112
|
-
Table: [
|
|
113
|
-
'Pdf', 'Calendar', "Boolean", 'List', 'Table', 'Checkbox', 'Radio',
|
|
114
|
-
'Dropdown', 'RichTextArea', 'Number', 'Label', 'image',
|
|
115
|
-
'Email', 'Date', 'Time', 'DateTime', 'Line', 'Space'
|
|
116
|
-
]
|
|
117
|
-
};
|
|
118
|
-
if (!this.isPreview) {
|
|
119
|
-
this.pdfDesignerService.pdfElements$.subscribe(elements => {
|
|
120
|
-
setTimeout(() => {
|
|
121
|
-
this.pdfElements = elements.map(field => ({ ...field }));
|
|
122
|
-
}, 0);
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
if (this.pdfJSON && (this.pdfJSON !== '')) {
|
|
126
|
-
this.initializeForm();
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
this.pdfDesignerService.newBook();
|
|
130
|
-
}
|
|
131
|
-
// AP-12MAR25 - Added to handle bookletId
|
|
132
|
-
if (this.bookletId) {
|
|
133
|
-
localStorage.setItem('unique_id', this.bookletId);
|
|
134
|
-
}
|
|
135
|
-
this.pdf = this.pdfDesignerService.getBook();
|
|
136
|
-
if (!this.isPreview) {
|
|
137
|
-
this.pdfDesignerService.selectedElement$.subscribe(index => {
|
|
138
|
-
const elements = this.pdfDesignerService.getElements();
|
|
139
|
-
if (index >= 0) {
|
|
140
|
-
this.selectedElement = elements[index];
|
|
141
|
-
}
|
|
142
|
-
// this.pdfElements = [...elements]
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
this.pdfDesignerService.addElementWithId();
|
|
146
|
-
}
|
|
147
|
-
isSectionOpen(section) {
|
|
148
|
-
return this.sections[section];
|
|
149
|
-
}
|
|
150
|
-
ngOnChanges(changes) {
|
|
151
|
-
if (changes['pdfJSON'] && changes['pdfJSON'].currentValue) {
|
|
152
|
-
if (this.pdfJSON && (this.pdfJSON !== '')) {
|
|
153
|
-
this.initializeForm();
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
this.pdfDesignerService.newBook();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
onTemplateSelected(event) {
|
|
161
|
-
this.pdfDesignerService.clearElements();
|
|
162
|
-
event.elements.forEach(el => this.pdfDesignerService.addElement(el));
|
|
163
|
-
// Emit template mode to parent
|
|
164
|
-
this.templateMode.emit(true);
|
|
165
|
-
}
|
|
166
|
-
initializeForm() {
|
|
167
|
-
if (!this.pdfJSON || !this.pdfJSON) {
|
|
168
|
-
console.warn("Invalid pdfJSON structure");
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
this.pdfElements = [];
|
|
172
|
-
this.pdfDesignerService.clearElements();
|
|
173
|
-
this.pdfDesignerService.intializeBook(this.pdfJSON);
|
|
174
|
-
this.pdfElements = this.pdfDesignerService.getElements();
|
|
175
|
-
}
|
|
176
|
-
selectElement(index) {
|
|
177
|
-
this.selectedFieldIndex = index;
|
|
178
|
-
this.pdfDesignerService.setSelectedElement(index);
|
|
179
|
-
this.pdf = this.pdfDesignerService.getBook();
|
|
180
|
-
}
|
|
181
|
-
selectedFieldIndex = null;
|
|
182
|
-
selectHeading(event) {
|
|
183
|
-
this.pdfDesignerService.selectHeading(event);
|
|
184
|
-
this.pdf = this.pdfDesignerService.getBook();
|
|
185
|
-
}
|
|
186
|
-
// AP-17APR25 generateUiId
|
|
187
|
-
generateUiId() {
|
|
188
|
-
return this.pdfDesignerService.addElementWithId();
|
|
189
|
-
}
|
|
190
|
-
addElement(type) {
|
|
191
|
-
const unique_id = this.generateUiId();
|
|
192
|
-
this.currentType = type;
|
|
193
|
-
if (this.selectedElement?.type === 'Table' && this.addTable) {
|
|
194
|
-
this.isSelectTablePopup = true;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
const newElement = {
|
|
198
|
-
id: unique_id,
|
|
199
|
-
type,
|
|
200
|
-
margin: [0, 0, 0, 0],
|
|
201
|
-
fontSize: 14,
|
|
202
|
-
fontWeight: '400',
|
|
203
|
-
fontStyle: [],
|
|
204
|
-
alignItems: '',
|
|
205
|
-
nxtType: type,
|
|
206
|
-
referenceField: null,
|
|
207
|
-
question: null,
|
|
208
|
-
questionNumber: this.pdfDesignerService.getElements().length + 1,
|
|
209
|
-
fieldsMeta: [],
|
|
210
|
-
pdfReference: null,
|
|
211
|
-
pdfReferenceQuestions: null,
|
|
212
|
-
style: {
|
|
213
|
-
bold: false,
|
|
214
|
-
italic: false,
|
|
215
|
-
alignment: 'left',
|
|
216
|
-
fontSize: 14,
|
|
217
|
-
margin: [0, 0, 0, 0],
|
|
218
|
-
color: '#000000',
|
|
219
|
-
},
|
|
220
|
-
imageData: null,
|
|
221
|
-
imageSize: type === 'image' ? { width: 100, height: 100 } : null,
|
|
222
|
-
tableConfig: type === 'Table' ? {
|
|
223
|
-
isNosIndicator: false,
|
|
224
|
-
addInlineRecord: true,
|
|
225
|
-
isPagination: false,
|
|
226
|
-
actionButton: false,
|
|
227
|
-
isDeleteRow: true,
|
|
228
|
-
isEditRow: false,
|
|
229
|
-
searchBar: false,
|
|
230
|
-
isButtons: false,
|
|
231
|
-
} : null,
|
|
232
|
-
width: 100,
|
|
233
|
-
styleClass: unique_id,
|
|
234
|
-
};
|
|
235
|
-
this.pdfDesignerService.addElement(newElement);
|
|
236
|
-
this.pdfElements = this.pdfDesignerService.getElements();
|
|
237
|
-
this.addTable = true;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
//AP-14JUN25 - Handles textarea input: auto-resizes and updates the field content
|
|
241
|
-
onTextAreaInput(event, field) {
|
|
242
|
-
const textarea = event.target;
|
|
243
|
-
// 1. Auto-resize logic
|
|
244
|
-
textarea.style.height = 'auto';
|
|
245
|
-
textarea.style.height = textarea.scrollHeight + 'px';
|
|
246
|
-
// 2. Trigger value update and PDF sync
|
|
247
|
-
this.onQuestionChange(textarea.value, field);
|
|
248
|
-
}
|
|
249
|
-
onQuestionChange(value, field) {
|
|
250
|
-
let elementId;
|
|
251
|
-
// SKS19JUN25 Clone to avoid modifying the original
|
|
252
|
-
const pdfElementsClone = _.cloneDeep(this.pdfElements);
|
|
253
|
-
const updatePdfQuestion = (element, value) => {
|
|
254
|
-
if (element.type === 'Pdf') {
|
|
255
|
-
const subElements = element.pdfReferenceQuestions?.[element.pdfReference] || [];
|
|
256
|
-
for (const subElement of subElements) {
|
|
257
|
-
const found = updatePdfQuestion(subElement, value); // recursive call
|
|
258
|
-
if (found)
|
|
259
|
-
return true; // stop once match is found
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
if (element.id === field.id) {
|
|
264
|
-
element.value = value;
|
|
265
|
-
return true;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return false;
|
|
269
|
-
};
|
|
270
|
-
pdfElementsClone.forEach((element, index) => {
|
|
271
|
-
const found = updatePdfQuestion(element, value);
|
|
272
|
-
if (found && elementId === undefined) {
|
|
273
|
-
elementId = index;
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
if (elementId !== undefined) {
|
|
277
|
-
const updatedElement = pdfElementsClone[elementId];
|
|
278
|
-
this.pdfDesignerService.elementUpdate(updatedElement, 'valueChange');
|
|
279
|
-
// SKS19JUN25 Optionally preview or test using updatedElement (without updating original)
|
|
280
|
-
if (this.isPreview) {
|
|
281
|
-
this.pdfPreview(this.pdfDesignerService.downloadElement());
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
pdfPreview(pdf) {
|
|
286
|
-
this.pdfPreviewEmit.emit(pdf);
|
|
287
|
-
}
|
|
288
|
-
onFieldDateChange(event) {
|
|
289
|
-
}
|
|
290
|
-
removeElement(field, index) {
|
|
291
|
-
this.pdfDesignerService.removeElementComponent(field.id);
|
|
292
|
-
this.pdfElements = this.pdfDesignerService.getElements();
|
|
293
|
-
}
|
|
294
|
-
onDragStart(event, index) {
|
|
295
|
-
this.draggedIndex = index;
|
|
296
|
-
event.dataTransfer?.setData('text/plain', index.toString());
|
|
297
|
-
}
|
|
298
|
-
onDragOver(event, index) {
|
|
299
|
-
event.preventDefault();
|
|
300
|
-
}
|
|
301
|
-
onDrop(event, dropIndex) {
|
|
302
|
-
event.preventDefault();
|
|
303
|
-
if (this.draggedIndex === null || this.draggedIndex === dropIndex)
|
|
304
|
-
return;
|
|
305
|
-
const draggedItem = this.pdfElements[this.draggedIndex];
|
|
306
|
-
// Remove dragged item from old position and insert it in new position
|
|
307
|
-
this.pdfElements.splice(this.draggedIndex, 1);
|
|
308
|
-
this.pdfElements.splice(dropIndex, 0, draggedItem);
|
|
309
|
-
//AP-28MAR25 Update questionNumber dynamically based on new order
|
|
310
|
-
this.pdfElements.forEach((element, index) => {
|
|
311
|
-
element.questionNumber = index + 1;
|
|
312
|
-
});
|
|
313
|
-
// Reset dragged index
|
|
314
|
-
this.draggedIndex = null;
|
|
315
|
-
// Notify service about the update
|
|
316
|
-
this.pdfDesignerService.updateElementsOrder(this.pdfElements);
|
|
317
|
-
}
|
|
318
|
-
toggleBoolean(field) {
|
|
319
|
-
field.boolean = !field.boolean;
|
|
320
|
-
}
|
|
321
|
-
// SKS13MAR25 table popup conformation based element add
|
|
322
|
-
onClose() {
|
|
323
|
-
this.isSelectTablePopup = false;
|
|
324
|
-
this.addTable = false;
|
|
325
|
-
this.addElement(this.currentType);
|
|
326
|
-
}
|
|
327
|
-
// SKS13MAR25 column element add inside a table
|
|
328
|
-
addOnTable() {
|
|
329
|
-
this.addTable = true;
|
|
330
|
-
this.isSelectTablePopup = false;
|
|
331
|
-
const elements = [...this.pdfDesignerService.getElements()];
|
|
332
|
-
// Find the element and update its columns
|
|
333
|
-
const index = elements.findIndex(el => el.id === this.selectedElement.id);
|
|
334
|
-
const rowNum = this.pdfElements[index].columns ? this.pdfElements[index].columns?.length : 0;
|
|
335
|
-
const unique_id = this.generateUiId();
|
|
336
|
-
const tableElement = {
|
|
337
|
-
label: `HEADER LABEL ${rowNum}`,
|
|
338
|
-
fieldName: `FIELD NAME${rowNum}`,
|
|
339
|
-
type: this.currentType,
|
|
340
|
-
id: unique_id
|
|
341
|
-
};
|
|
342
|
-
this.pdfDesignerService.addTableElement(tableElement, this.selectedFieldIndex);
|
|
343
|
-
this.pdfElements = this.pdfDesignerService.getElements();
|
|
344
|
-
// this.addTableData(unique_id, fieldName)
|
|
345
|
-
}
|
|
346
|
-
addTableData(fieldId, fieldName) {
|
|
347
|
-
// this.pdfDesignerService.addTablefieldData(tableElement);
|
|
348
|
-
}
|
|
349
|
-
columnSelected(event) {
|
|
350
|
-
// SKS19MAR25 table column update
|
|
351
|
-
if (!this.isPreview) {
|
|
352
|
-
this.pdfDesignerService.setSelectedTableElement(this.selectedFieldIndex, event);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
removeColumn(event) {
|
|
356
|
-
this.pdfDesignerService.removeSelectedTableElement(this.selectedFieldIndex, event);
|
|
357
|
-
}
|
|
358
|
-
// SKS25MAR25 image add
|
|
359
|
-
async fileChangeEvent(field, event) {
|
|
360
|
-
const file = event.target.files[0];
|
|
361
|
-
if (!file)
|
|
362
|
-
return;
|
|
363
|
-
try {
|
|
364
|
-
const imageData = await this.readFileAsDataURL(file);
|
|
365
|
-
let elementId;
|
|
366
|
-
const updatePdfImage = (element) => {
|
|
367
|
-
if (element.type === 'Pdf') {
|
|
368
|
-
const subElements = element.pdfReferenceQuestions?.[element.pdfReference] || [];
|
|
369
|
-
for (const subElement of subElements) {
|
|
370
|
-
const found = updatePdfImage(subElement); // recursive call
|
|
371
|
-
if (found)
|
|
372
|
-
return true;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
if (element.id === field.id) {
|
|
377
|
-
element.imageData = imageData;
|
|
378
|
-
element.orgImageData = imageData;
|
|
379
|
-
if (!element.imageSize) {
|
|
380
|
-
element.imageSize = { width: 100, height: 100 };
|
|
381
|
-
}
|
|
382
|
-
return true;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
return false;
|
|
386
|
-
};
|
|
387
|
-
this.pdfElements.forEach((element, index) => {
|
|
388
|
-
const found = updatePdfImage(element);
|
|
389
|
-
if (found && elementId === undefined) {
|
|
390
|
-
elementId = index; // remember top-level match
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
if (elementId !== undefined) {
|
|
394
|
-
this.pdfDesignerService.elementUpdate(this.pdfElements[elementId], 'valueChange');
|
|
395
|
-
if (this.isPreview) {
|
|
396
|
-
this.pdfPreview(this.pdfDesignerService.downloadElement());
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
catch (error) {
|
|
401
|
-
console.error("Error reading file:", error);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
readFileAsDataURL(file) {
|
|
405
|
-
return new Promise((resolve, reject) => {
|
|
406
|
-
const reader = new FileReader();
|
|
407
|
-
reader.onload = () => resolve(reader.result);
|
|
408
|
-
reader.onerror = (error) => reject(error);
|
|
409
|
-
reader.readAsDataURL(file);
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
// SKS2APR25 disabled element
|
|
413
|
-
isElementDisabled(elementType) {
|
|
414
|
-
if (this.selectedElement) {
|
|
415
|
-
const elements = this.elementDisabledArray[this.selectedElement.type];
|
|
416
|
-
if (elements) {
|
|
417
|
-
return elements.includes(elementType);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
return false;
|
|
421
|
-
}
|
|
422
|
-
async onImageEdit(ques) {
|
|
423
|
-
this.isImageEdit = true;
|
|
424
|
-
this.selectedImageElement = ques;
|
|
425
|
-
//Assign imageSize default value
|
|
426
|
-
if (!this.selectedImageElement.imageSize) {
|
|
427
|
-
this.selectedImageElement.imageSize = { width: 100, height: 100 };
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
async onImageDelete(ques) {
|
|
431
|
-
try {
|
|
432
|
-
ques.imageData = '';
|
|
433
|
-
ques.orgImageData = '';
|
|
434
|
-
// Initialize logo size if not already set
|
|
435
|
-
if (!ques.imageSize) {
|
|
436
|
-
ques.imageSize = { width: 100, height: 100 };
|
|
437
|
-
}
|
|
438
|
-
// await this.childEventCapture(ques.imageData, ques);
|
|
439
|
-
}
|
|
440
|
-
catch (error) {
|
|
441
|
-
console.error("Error reading file:", error);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
// SKS25MAR25 image edit functions
|
|
445
|
-
flipHorizontal() {
|
|
446
|
-
this.transform = {
|
|
447
|
-
...this.transform,
|
|
448
|
-
flipH: !this.transform.flipH
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
flipVertical() {
|
|
452
|
-
this.transform = {
|
|
453
|
-
...this.transform,
|
|
454
|
-
flipV: !this.transform.flipV
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
resetImage() {
|
|
458
|
-
this.canvasRotation = 0;
|
|
459
|
-
this.cropper = undefined;
|
|
460
|
-
this.transform = {
|
|
461
|
-
translateUnit: 'px',
|
|
462
|
-
scale: 1,
|
|
463
|
-
rotate: 0,
|
|
464
|
-
flipH: false,
|
|
465
|
-
flipV: false,
|
|
466
|
-
translateH: 0,
|
|
467
|
-
translateV: 0
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
zoomOut() {
|
|
471
|
-
this.transform = {
|
|
472
|
-
...this.transform,
|
|
473
|
-
scale: this.transform.scale - .1
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
zoomIn() {
|
|
477
|
-
this.transform = {
|
|
478
|
-
...this.transform,
|
|
479
|
-
scale: this.transform.scale + .1
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
rotateLeft() {
|
|
483
|
-
this.loading = true;
|
|
484
|
-
setTimeout(() => {
|
|
485
|
-
this.canvasRotation--;
|
|
486
|
-
this.flipAfterRotate();
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
rotateRight() {
|
|
490
|
-
this.loading = true;
|
|
491
|
-
setTimeout(() => {
|
|
492
|
-
this.canvasRotation++;
|
|
493
|
-
this.flipAfterRotate();
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
moveLeft() {
|
|
497
|
-
this.transform = {
|
|
498
|
-
...this.transform,
|
|
499
|
-
translateH: this.transform.translateH - 1
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
moveRight() {
|
|
503
|
-
this.transform = {
|
|
504
|
-
...this.transform,
|
|
505
|
-
translateH: this.transform.translateH + 1
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
moveDown() {
|
|
509
|
-
this.transform = {
|
|
510
|
-
...this.transform,
|
|
511
|
-
translateV: this.transform.translateV + 1
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
moveUp() {
|
|
515
|
-
this.transform = {
|
|
516
|
-
...this.transform,
|
|
517
|
-
translateV: this.transform.translateV - 1
|
|
518
|
-
};
|
|
519
|
-
}
|
|
520
|
-
flipAfterRotate() {
|
|
521
|
-
const flippedH = this.transform.flipH;
|
|
522
|
-
const flippedV = this.transform.flipV;
|
|
523
|
-
this.transform = {
|
|
524
|
-
...this.transform,
|
|
525
|
-
flipH: flippedV,
|
|
526
|
-
flipV: flippedH,
|
|
527
|
-
translateH: 0,
|
|
528
|
-
translateV: 0
|
|
529
|
-
};
|
|
530
|
-
}
|
|
531
|
-
//AP-20JUN25 - Updates the image size (width and height) of the selected image element and reflects the change via the service
|
|
532
|
-
onImageSizeChange() {
|
|
533
|
-
const index = this.pdfElements.findIndex((el) => el.id === this.selectedImageElement.id);
|
|
534
|
-
if (index !== -1) {
|
|
535
|
-
this.pdfElements[index].imageSize = {
|
|
536
|
-
width: this.selectedImageElement.imageSize.width,
|
|
537
|
-
height: this.selectedImageElement.imageSize.height
|
|
538
|
-
};
|
|
539
|
-
// Update element in service
|
|
540
|
-
this.pdfDesignerService.elementUpdate(this.pdfElements[index], 'valueChange');
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
async imageCropped(event) {
|
|
544
|
-
try {
|
|
545
|
-
const base64 = await this.convertBlobToBase64(event.objectUrl);
|
|
546
|
-
this.selectedImageElement.imageData = base64;
|
|
547
|
-
// await this.childEventCapture(base64, this.selectedImageElement);
|
|
548
|
-
// set default if not present
|
|
549
|
-
if (!this.selectedImageElement.imageSize) {
|
|
550
|
-
this.selectedImageElement.imageSize = { width: 100, height: 100 };
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
catch (error) {
|
|
554
|
-
console.error("Error in imageCropped:", error);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
cropperReady(sourceImageDimensions) {
|
|
558
|
-
this.loading = false;
|
|
559
|
-
}
|
|
560
|
-
// SKS25MAR25 blob to base 64 converter
|
|
561
|
-
convertBlobToBase64(objectUrl) {
|
|
562
|
-
return fetch(objectUrl)
|
|
563
|
-
.then(response => response.blob())
|
|
564
|
-
.then(blob => {
|
|
565
|
-
return new Promise((resolve, reject) => {
|
|
566
|
-
const reader = new FileReader();
|
|
567
|
-
reader.readAsDataURL(blob);
|
|
568
|
-
reader.onloadend = () => resolve(reader.result);
|
|
569
|
-
reader.onerror = error => reject(error);
|
|
570
|
-
});
|
|
571
|
-
});
|
|
572
|
-
}
|
|
573
|
-
closeModal() {
|
|
574
|
-
this.isImageEdit = false;
|
|
575
|
-
}
|
|
576
|
-
openTextSettings(field, event) {
|
|
577
|
-
this.selectedColumn = field;
|
|
578
|
-
this.showTextSettings = true;
|
|
579
|
-
}
|
|
580
|
-
closeTextSettings() {
|
|
581
|
-
this.showTextSettings = false;
|
|
582
|
-
}
|
|
583
|
-
//AP-14JUN25 - Toggles bold or italic style for the selected text block
|
|
584
|
-
toggleStyle(style) {
|
|
585
|
-
if (!this.selectedColumn)
|
|
586
|
-
return;
|
|
587
|
-
if (style === 'bold') {
|
|
588
|
-
this.selectedColumn.style.bold = !this.selectedColumn.style.bold;
|
|
589
|
-
}
|
|
590
|
-
else if (style === 'italic') {
|
|
591
|
-
this.selectedColumn.style.italics = !this.selectedColumn.style.italics;
|
|
592
|
-
}
|
|
593
|
-
this.updateContent();
|
|
594
|
-
}
|
|
595
|
-
//AP-14JUN25 - Sets text alignment (left, center, right) for the selected text block
|
|
596
|
-
setAlignment(alignment) {
|
|
597
|
-
if (!this.selectedColumn)
|
|
598
|
-
return;
|
|
599
|
-
this.selectedColumn.style.alignment = alignment;
|
|
600
|
-
this.updateContent();
|
|
601
|
-
}
|
|
602
|
-
//AP-14JUN25 - Updates the content in the PDF designer with the selected style changes
|
|
603
|
-
updateContent() {
|
|
604
|
-
this.pdfDesignerService.elementUpdate(this.selectedColumn, 'valueChange');
|
|
605
|
-
}
|
|
606
|
-
pdfSaveHandler(event) {
|
|
607
|
-
if (event === 'preview') {
|
|
608
|
-
this.pdfSaveHandlerEmit.emit({ "action": 'preview', "pdf": this.pdfDesignerService.downloadElement() });
|
|
609
|
-
}
|
|
610
|
-
else if (event === 'download') {
|
|
611
|
-
this.pdfSaveHandlerEmit.emit({ "action": 'download', "pdf": this.pdfDesignerService.downloadElement() });
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
this.pdfSaveHandlerEmit.emit(event);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerComponent, deps: [{ token: i1.PdfDesignerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
618
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PdfDesignerComponent, isStandalone: true, selector: "app-pdf-designer", inputs: { pdfJSON: "pdfJSON", bookletId: "bookletId", isPreview: "isPreview" }, outputs: { pdfSaveHandlerEmit: "pdfSaveHandlerEmit", templateMode: "templateMode", pdfPreviewEmit: "pdfPreviewEmit" }, viewQueries: [{ propertyName: "textareas", predicate: ["autoTextarea"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div\n class=\"element\"\n [class.disabled]=\"selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\"\n (click)=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)) && addElement(element.type)\"\n [draggable]=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type))\"\n [matTooltip]=\"\n selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\n ? ('THIS_ELEMENT_NOT_SUPPORTED' | nxtCustomTranslate : 'This element is not supported when a ') +\n (selectedElement?.type || ('CERTAIN_ELEMENT' | nxtCustomTranslate : 'certain element')) +\n (' IS_PRESENT' | nxtCustomTranslate : ' is present')\n : null\n \"\n >\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div> \n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">{{ 'HEADING' | nxtCustomTranslate : 'Heading' }}</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">{{ 'PREVIEW' | nxtCustomTranslate : 'PREVIEW' }}</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">{{ 'DOWNLOAD' | nxtCustomTranslate : 'DOWNLOAD' }}</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\">\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style?.fontSize ? field.style.fontSize + 'px' : '14px',\n 'font-weight': field.style?.bold ? 'bold' : 'normal',\n 'font-style': field.style?.italics ? 'italic' : 'normal',\n 'text-decoration': field.style?.decoration ? 'decoration' : 'none',\n 'text-align': field.style?.alignment || 'left',\n 'margin': field.style?.margin?.length === 4\n ? field.style.margin[1] + 'px ' + field.style.margin[2] + 'px ' +\n field.style.margin[3] + 'px ' + field.style.margin[0] + 'px'\n : '0',\n 'color': field.style?.color || '#000'\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">{{ 'BOLD' | nxtCustomTranslate : 'B' }}</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>{{ 'ITALIC' | nxtCustomTranslate : 'I' }}</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_LEFT' | nxtCustomTranslate : 'format_align_left' }}</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_CENTER' | nxtCustomTranslate : 'format_align_center' }}</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_RIGHT' | nxtCustomTranslate : 'format_align_right' }}</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"{{ 'ALTERNATIVE_IMAGE_TEXT' | nxtCustomTranslate : 'Alternative image text' }}\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>{{ 'WIDTH' | nxtCustomTranslate : 'Width' }} {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>{{ 'HEIGHT' | nxtCustomTranslate : 'Height' }} {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\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()\" [class.enabled]=\"transform.flipH\"\n title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n 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 </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "component", type: PdfPropertiesComponent, selector: "app-pdf-properties", inputs: ["selectedElementType", "templateSelected"], outputs: ["formButtonHandler", "templateSaveHandler"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
|
|
619
|
-
}
|
|
620
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerComponent, decorators: [{
|
|
621
|
-
type: Component,
|
|
622
|
-
args: [{ selector: 'app-pdf-designer', standalone: true, imports: [CommonModule, ImageCropperComponent, PdfPropertiesComponent, MatTooltipModule, FormsModule, NxtDatatable, BookletComponent, AppTemplatesComponent, NxtInput, NxtCustomTranslatePipe], template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div\n class=\"element\"\n [class.disabled]=\"selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\"\n (click)=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)) && addElement(element.type)\"\n [draggable]=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type))\"\n [matTooltip]=\"\n selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\n ? ('THIS_ELEMENT_NOT_SUPPORTED' | nxtCustomTranslate : 'This element is not supported when a ') +\n (selectedElement?.type || ('CERTAIN_ELEMENT' | nxtCustomTranslate : 'certain element')) +\n (' IS_PRESENT' | nxtCustomTranslate : ' is present')\n : null\n \"\n >\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div> \n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">{{ 'HEADING' | nxtCustomTranslate : 'Heading' }}</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">{{ 'PREVIEW' | nxtCustomTranslate : 'PREVIEW' }}</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">{{ 'DOWNLOAD' | nxtCustomTranslate : 'DOWNLOAD' }}</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\">\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style?.fontSize ? field.style.fontSize + 'px' : '14px',\n 'font-weight': field.style?.bold ? 'bold' : 'normal',\n 'font-style': field.style?.italics ? 'italic' : 'normal',\n 'text-decoration': field.style?.decoration ? 'decoration' : 'none',\n 'text-align': field.style?.alignment || 'left',\n 'margin': field.style?.margin?.length === 4\n ? field.style.margin[1] + 'px ' + field.style.margin[2] + 'px ' +\n field.style.margin[3] + 'px ' + field.style.margin[0] + 'px'\n : '0',\n 'color': field.style?.color || '#000'\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">{{ 'BOLD' | nxtCustomTranslate : 'B' }}</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>{{ 'ITALIC' | nxtCustomTranslate : 'I' }}</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_LEFT' | nxtCustomTranslate : 'format_align_left' }}</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_CENTER' | nxtCustomTranslate : 'format_align_center' }}</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_RIGHT' | nxtCustomTranslate : 'format_align_right' }}</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"{{ 'ALTERNATIVE_IMAGE_TEXT' | nxtCustomTranslate : 'Alternative image text' }}\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>{{ 'WIDTH' | nxtCustomTranslate : 'Width' }} {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>{{ 'HEIGHT' | nxtCustomTranslate : 'Height' }} {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\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()\" [class.enabled]=\"transform.flipH\"\n title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n 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 </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"] }]
|
|
623
|
-
}], ctorParameters: () => [{ type: i1.PdfDesignerService }], propDecorators: { textareas: [{
|
|
624
|
-
type: ViewChildren,
|
|
625
|
-
args: ['autoTextarea']
|
|
626
|
-
}], pdfJSON: [{
|
|
627
|
-
type: Input
|
|
628
|
-
}], bookletId: [{
|
|
629
|
-
type: Input
|
|
630
|
-
}], isPreview: [{
|
|
631
|
-
type: Input
|
|
632
|
-
}], pdfSaveHandlerEmit: [{
|
|
633
|
-
type: Output
|
|
634
|
-
}], templateMode: [{
|
|
635
|
-
type: Output
|
|
636
|
-
}], pdfPreviewEmit: [{
|
|
637
|
-
type: Output
|
|
638
|
-
}] } });
|
|
639
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlc2lnbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTRCLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBSTdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzVHLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDLDZCQUE2QjtBQUVyRCxPQUFPLEVBQUUsc0JBQXNCLEVB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LGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQzt1RkFNaEssU0FBUztzQkFBdEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNuQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvdmVyc2lvbic7XG5pbXBvcnQgeyBQZGZQcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi4vcGRmLXByb3BlcnRpZXMvcGRmLXByb3BlcnRpZXMuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dERhdGF0YWJsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9va2xldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Jvb2tsZXQvYm9va2xldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYnVpbGRlci90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvbnh0LWlucHV0L254dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9pbWFnZS10cmFuc2Zvcm0uaW50ZXJmYWNlJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9jcm9wcGVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7IC8vIEVuc3VyZSBsb2Rhc2ggaXMgaW5zdGFsbGVkXG5pbXBvcnQgeyBQZGZEZXNpZ25lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBkZi1kZXNpZ25lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgUGRmUHJvcGVydGllc0NvbXBvbmVudCwgTWF0VG9vbHRpcE1vZHVsZSwgRm9ybXNNb2R1bGUsIE54dERhdGF0YWJsZSwgQm9va2xldENvbXBvbmVudCwgQXBwVGVtcGxhdGVzQ29tcG9uZW50LCBOeHRJbnB1dCwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wZGYtZGVzaWduZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBkZkRlc2lnbmVyQ29tcG9uZW50IHtcbiAgLy9AT3V0cHV0KCkgZWxlbWVudEJ1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQFZpZXdDaGlsZHJlbignYXV0b1RleHRhcmVhJykgdGV4dGFyZWFzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBASW5wdXQoKSBwZGZKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogYW55O1xuICBASW5wdXQoKSBpc1ByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcGRmU2F2ZUhhbmRsZXJFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZU1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBwZGZQcmV2aWV3RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmaWVsZDogYW55O1xuICBwZGZFbGVtZW50czogYW55W10gPSBbXTtcbiAgZWxlbWVudHM6IGFueVtdID0gW107XG4gIGJvb2tJZDogc3RyaW5nO1xuICBzZWN0aW9ucyA9IHtcbiAgICBiYXNpYzogdHJ1ZSxcbiAgICBhZHZhbmNlZDogdHJ1ZVxuICB9O1xuICBlbGVtZW50c0xpc3Q6IGFueVtdID0gW107XG4gIGVsZW1lbnREaXNhYmxlZEFycmF5OiBhbnk7XG4gIHZlcnNpb24gPSBWRVJTSU9OLnZlcnNpb247XG4gIHBkZjogYW55O1xuICBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IG51bGw7XG4gIGlzU2VsZWN0VGFibGVQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50VHlwZTogc3RyaW5nO1xuICBhZGRUYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGRvdHMgPSBBcnJheSg2KTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGxhdGVTZWxlY3RlZCA9IGZhbHNlO1xuICBpc0ltYWdlRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudDogYW55O1xuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge1xuICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgc2NhbGU6IDEsXG4gICAgcm90YXRlOiAwLFxuICAgIGZsaXBIOiBmYWxzZSxcbiAgICBmbGlwVjogZmFsc2UsXG4gICAgdHJhbnNsYXRlSDogMCxcbiAgICB0cmFuc2xhdGVWOiAwXG4gIH07XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgY2FudmFzUm90YXRpb24gPSAwO1xuICBjcm9wcGVyPzogQ3JvcHBlclBvc2l0aW9uO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaXNJbWFnZUhvdmVyID0gZmFsc2U7XG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgc2hvd1RleHRTZXR0aW5ncyA9IGZhbHNlO1xuICBzZWxlY3RlZENvbHVtbjogYW55ID0gbnVsbDtcbiAgXG5cbiAgLy9zdWJzY3JpcHRpb246IGFueTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZEZXNpZ25lclNlcnZpY2U6IFBkZkRlc2lnbmVyU2VydmljZSkge1xuICB9XG4gIC8vQVAtMTRKVU4yNSAtIENhbGxlZCBhZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIHRvIGF1dG8tcmVzaXplIGFsbCB0ZXh0YXJlYXNcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucmVzaXplQWxsVGV4dGFyZWFzKCk7XG4gIH1cblxuICAvL0FQLTE0SlVOMjUgLSBDYWxjdWxhdGVzIGNvbnRyYXN0IHRleHQgY29sb3IgKGJsYWNrIG9yIHdoaXRlKSBiYXNlZCBvbiBiYWNrZ3JvdW5kIGNvbG9yXG4gIGdldENvbnRyYXN0Q29sb3IoYmdDb2xvcjogc3RyaW5nID0gJyMwMDAwMDAnKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0IGhleCB0byBSR0JcbiAgICBjb25zdCBjb2xvciA9IGJnQ29sb3IucmVwbGFjZSgnIycsICcnKTtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xuICAgIHJldHVybiBicmlnaHRuZXNzID4gMTI4ID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG5cbiAgLy9BUC0xNEpVTjI1IC0gQXV0b21hdGljYWxseSByZXNpemVzIGFsbCB0ZXh0YXJlYXMgYmFzZWQgb24gdGhlaXIgY29udGVudFxuICByZXNpemVBbGxUZXh0YXJlYXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZXh0YXJlYXMuZm9yRWFjaCgodGV4dGFyZWFSZWY6IEVsZW1lbnRSZWYpID0+IHtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gdGV4dGFyZWFSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gdGV4dGFyZWEuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbGVtZW50c0xpc3QgPSBbXG4gICAgICB7IFwidHlwZVwiOiBcInRleHRcIiwgXCJpbWdcIjogXCJUZXh0QXJlYVwiLCBcImxhYmVsXCI6IFwiVGV4dFwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcImlucHV0XCIsIFwiaW1nXCI6IFwiVGV4dFwiLCBcImxhYmVsXCI6IFwiSW5wdXRcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJkYXRlXCIsIFwiaW1nXCI6IFwiRGF0ZVwiLCBcImxhYmVsXCI6IFwiRGF0ZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcImltYWdlXCIsIFwiaW1nXCI6IFwiSW1hZ2VcIiwgXCJsYWJlbFwiOiBcIkltYWdlXCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiTGluZVwiLCBcImltZ1wiOiBcImxpbmVcIiwgXCJsYWJlbFwiOiBcIkxpbmVcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJTcGFjZVwiLCBcImltZ1wiOiBcInNwYWNlXCIsIFwibGFiZWxcIjogXCJTcGFjZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcIlRhYmxlXCIsIFwiaW1nXCI6IFwiVGFibGVcIiwgXCJsYWJlbFwiOiBcIlRhYmxlXCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiUGRmXCIsIFwiaW1nXCI6IFwiU2VhcmNoXCIsIFwibGFiZWxcIjogXCJCb29rXCIgfSxcbiAgICBdO1xuICAgIHRoaXMuZWxlbWVudERpc2FibGVkQXJyYXkgPSB7XG4gICAgICBUYWJsZTogW1xuICAgICAgICAnUGRmJywgJ0NhbGVuZGFyJywgXCJCb29sZWFuXCIsICdMaXN0JywgJ1RhYmxlJywgJ0NoZWNrYm94JywgJ1JhZGlvJyxcbiAgICAgICAgJ0Ryb3Bkb3duJywgJ1JpY2hUZXh0QXJlYScsICdOdW1iZXInLCAnTGFiZWwnLCAnaW1hZ2UnLFxuICAgICAgICAnRW1haWwnLCAnRGF0ZScsICdUaW1lJywgJ0RhdGVUaW1lJywgJ0xpbmUnLCAnU3BhY2UnXG4gICAgICBdXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5wZGZFbGVtZW50cyQuc3Vic2NyaWJlKGVsZW1lbnRzID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wZGZFbGVtZW50cyA9IGVsZW1lbnRzLm1hcChmaWVsZCA9PiAoeyAuLi5maWVsZCB9KSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBkZkpTT04gJiYgKHRoaXMucGRmSlNPTiAhPT0gJycpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLm5ld0Jvb2soKVxuICAgIH1cbiAgICAvLyBBUC0xMk1BUjI1IC0gQWRkZWQgdG8gaGFuZGxlIGJvb2tsZXRJZFxuICAgIGlmICh0aGlzLmJvb2tsZXRJZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3VuaXF1ZV9pZCcsIHRoaXMuYm9va2xldElkKTtcblxuICAgIH1cbiAgICB0aGlzLnBkZiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLnBkZkVsZW1lbnRzID0gWy4uLmVsZW1lbnRzXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgfVxuXG4gIGlzU2VjdGlvbk9wZW4oc2VjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnNbc2VjdGlvbl07XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3BkZkpTT04nXSAmJiBjaGFuZ2VzWydwZGZKU09OJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5wZGZKU09OICYmICh0aGlzLnBkZkpTT04gIT09ICcnKSkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5uZXdCb29rKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRlbXBsYXRlU2VsZWN0ZWQoZXZlbnQ6IHsgc2VsZWN0ZWRUZW1wbGF0ZTogYW55OyBlbGVtZW50czogYW55W10gfSkge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmNsZWFyRWxlbWVudHMoKTtcbiAgICBldmVudC5lbGVtZW50cy5mb3JFYWNoKGVsID0+IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnQoZWwpKTtcblxuICAgIC8vIEVtaXQgdGVtcGxhdGUgbW9kZSB0byBwYXJlbnRcbiAgICB0aGlzLnRlbXBsYXRlTW9kZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMucGRmSlNPTiB8fCAhdGhpcy5wZGZKU09OKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJJbnZhbGlkIHBkZkpTT04gc3RydWN0dXJlXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBkZkVsZW1lbnRzID0gW11cbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5jbGVhckVsZW1lbnRzKCk7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuaW50aWFsaXplQm9vayh0aGlzLnBkZkpTT04pO1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICB9XG5cbiAgc2VsZWN0RWxlbWVudChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXgpO1xuICAgIHRoaXMucGRmID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0Qm9vaygpO1xuICB9XG5cbiAgc2VsZWN0ZWRGaWVsZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0SGVhZGluZyhldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2VsZWN0SGVhZGluZyhldmVudCk7XG4gICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG4gIH1cbiAgLy8gQVAtMTdBUFIyNSBnZW5lcmF0ZVVpSWQgXG4gIGdlbmVyYXRlVWlJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuYWRkRWxlbWVudFdpdGhJZCgpO1xuICB9XG5cbiAgYWRkRWxlbWVudCh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIHRoaXMuY3VycmVudFR5cGUgPSB0eXBlXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHRoaXMuYWRkVGFibGUpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3RUYWJsZVBvcHVwID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0ge1xuICAgICAgICBpZDogdW5pcXVlX2lkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBtYXJnaW46IFswLCAwLCAwLCAwXSxcbiAgICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgICBmb250V2VpZ2h0OiAnNDAwJyxcbiAgICAgICAgZm9udFN0eWxlOiBbXSxcbiAgICAgICAgYWxpZ25JdGVtczogJycsXG4gICAgICAgIG54dFR5cGU6IHR5cGUsXG4gICAgICAgIHJlZmVyZW5jZUZpZWxkOiBudWxsLFxuICAgICAgICBxdWVzdGlvbjogbnVsbCxcbiAgICAgICAgcXVlc3Rpb25OdW1iZXI6IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCkubGVuZ3RoICsgMSxcbiAgICAgICAgZmllbGRzTWV0YTogW10sXG4gICAgICAgIHBkZlJlZmVyZW5jZTogbnVsbCxcbiAgICAgICAgcGRmUmVmZXJlbmNlUXVlc3Rpb25zOiBudWxsLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgIGl0YWxpYzogZmFsc2UsXG4gICAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgZm9udFNpemU6IDE0LCAgXG4gICAgICAgICAgbWFyZ2luOiBbMCwgMCwgMCwgMF0sXG4gICAgICAgICAgY29sb3I6ICcjMDAwMDAwJywgIFxuICAgICAgICB9LFxuICAgICAgICBpbWFnZURhdGE6IG51bGwsXG4gICAgICAgIGltYWdlU2l6ZTogdHlwZSA9PT0gJ2ltYWdlJyA/IHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDAgfSA6IG51bGwsXG4gICAgICAgIHRhYmxlQ29uZmlnOiB0eXBlID09PSAnVGFibGUnID8ge1xuICAgICAgICAgIGlzTm9zSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgaXNQYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpb25CdXR0b246IGZhbHNlLFxuICAgICAgICAgIGlzRGVsZXRlUm93OiB0cnVlLFxuICAgICAgICAgIGlzRWRpdFJvdzogZmFsc2UsXG4gICAgICAgICAgc2VhcmNoQmFyOiBmYWxzZSxcbiAgICAgICAgICBpc0J1dHRvbnM6IGZhbHNlLFxuICAgICAgICB9IDogbnVsbCxcblxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICBzdHlsZUNsYXNzOiB1bmlxdWVfaWQsXG4gICAgICB9O1xuICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuYWRkRWxlbWVudChuZXdFbGVtZW50KTtcbiAgICAgIHRoaXMucGRmRWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgdGhpcy5hZGRUYWJsZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvL0FQLTE0SlVOMjUgLSBIYW5kbGVzIHRleHRhcmVhIGlucHV0OiBhdXRvLXJlc2l6ZXMgYW5kIHVwZGF0ZXMgdGhlIGZpZWxkIGNvbnRlbnRcbiAgb25UZXh0QXJlYUlucHV0KGV2ZW50OiBFdmVudCwgZmllbGQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHRleHRhcmVhID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gIFxuICAgIC8vIDEuIEF1dG8tcmVzaXplIGxvZ2ljXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnNjcm9sbEhlaWdodCArICdweCc7XG4gIFxuICAgIC8vIDIuIFRyaWdnZXIgdmFsdWUgdXBkYXRlIGFuZCBQREYgc3luY1xuICAgIHRoaXMub25RdWVzdGlvbkNoYW5nZSh0ZXh0YXJlYS52YWx1ZSwgZmllbGQpO1xuICB9XG5cbm9uUXVlc3Rpb25DaGFuZ2UodmFsdWU6IHN0cmluZywgZmllbGQ6IGFueSkge1xuICBsZXQgZWxlbWVudElkOiBhbnkgfCB1bmRlZmluZWQ7XG5cbiAgLy8gU0tTMTlKVU4yNSBDbG9uZSB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsXG4gIGNvbnN0IHBkZkVsZW1lbnRzQ2xvbmUgPSBfLmNsb25lRGVlcCh0aGlzLnBkZkVsZW1lbnRzKTtcblxuICBjb25zdCB1cGRhdGVQZGZRdWVzdGlvbiA9IChlbGVtZW50OiBhbnksIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnUGRmJykge1xuICAgICAgY29uc3Qgc3ViRWxlbWVudHMgPSBlbGVtZW50LnBkZlJlZmVyZW5jZVF1ZXN0aW9ucz8uW2VsZW1lbnQucGRmUmVmZXJlbmNlXSB8fCBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3ViRWxlbWVudCBvZiBzdWJFbGVtZW50cykge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHVwZGF0ZVBkZlF1ZXN0aW9uKHN1YkVsZW1lbnQsIHZhbHVlKTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTsgLy8gc3RvcCBvbmNlIG1hdGNoIGlzIGZvdW5kXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LmlkID09PSBmaWVsZC5pZCkge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcGRmRWxlbWVudHNDbG9uZS5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBmb3VuZCA9IHVwZGF0ZVBkZlF1ZXN0aW9uKGVsZW1lbnQsIHZhbHVlKTtcbiAgICBpZiAoZm91bmQgJiYgZWxlbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsZW1lbnRJZCA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSBwZGZFbGVtZW50c0Nsb25lW2VsZW1lbnRJZF07XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh1cGRhdGVkRWxlbWVudCwgJ3ZhbHVlQ2hhbmdlJyk7XG4gICAgLy8gU0tTMTlKVU4yNSBPcHRpb25hbGx5IHByZXZpZXcgb3IgdGVzdCB1c2luZyB1cGRhdGVkRWxlbWVudCAod2l0aG91dCB1cGRhdGluZyBvcmlnaW5hbClcbiAgICBpZiAodGhpcy5pc1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucGRmUHJldmlldyh0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gICAgfVxuICB9XG59XG4gIFxucGRmUHJldmlldyhwZGY6YW55KXtcbiAgdGhpcy5wZGZQcmV2aWV3RW1pdC5lbWl0KHBkZilcbn1cbiAgb25GaWVsZERhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICB9XG5cbiAgcmVtb3ZlRWxlbWVudChmaWVsZDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UucmVtb3ZlRWxlbWVudENvbXBvbmVudChmaWVsZC5pZCk7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gIH1cblxuICBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBpbmRleDtcbiAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoJ3RleHQvcGxhaW4nLCBpbmRleC50b1N0cmluZygpKTtcbiAgfVxuXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgZHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ2dlZEluZGV4ID09PSBudWxsIHx8IHRoaXMuZHJhZ2dlZEluZGV4ID09PSBkcm9wSW5kZXgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYWdnZWRJdGVtID0gdGhpcy5wZGZFbGVtZW50c1t0aGlzLmRyYWdnZWRJbmRleF07XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dlZCBpdGVtIGZyb20gb2xkIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXQgaW4gbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5wZGZFbGVtZW50cy5zcGxpY2UodGhpcy5kcmFnZ2VkSW5kZXgsIDEpO1xuICAgIHRoaXMucGRmRWxlbWVudHMuc3BsaWNlKGRyb3BJbmRleCwgMCwgZHJhZ2dlZEl0ZW0pO1xuXG4gICAgLy9BUC0yOE1BUjI1IFVwZGF0ZSBxdWVzdGlvbk51bWJlciBkeW5hbWljYWxseSBiYXNlZCBvbiBuZXcgb3JkZXJcbiAgICB0aGlzLnBkZkVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBlbGVtZW50LnF1ZXN0aW9uTnVtYmVyID0gaW5kZXggKyAxO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZHJhZ2dlZCBpbmRleFxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcblxuICAgIC8vIE5vdGlmeSBzZXJ2aWNlIGFib3V0IHRoZSB1cGRhdGVcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS51cGRhdGVFbGVtZW50c09yZGVyKHRoaXMucGRmRWxlbWVudHMpO1xuICB9XG5cbiAgdG9nZ2xlQm9vbGVhbihmaWVsZDogYW55KTogdm9pZCB7XG4gICAgZmllbGQuYm9vbGVhbiA9ICFmaWVsZC5ib29sZWFuO1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgdGFibGUgcG9wdXAgY29uZm9ybWF0aW9uIGJhc2VkIGVsZW1lbnQgYWRkXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5pc1NlbGVjdFRhYmxlUG9wdXAgPSBmYWxzZVxuICAgIHRoaXMuYWRkVGFibGUgPSBmYWxzZVxuICAgIHRoaXMuYWRkRWxlbWVudCh0aGlzLmN1cnJlbnRUeXBlKVxuICB9XG4gIC8vIFNLUzEzTUFSMjUgY29sdW1uIGVsZW1lbnQgYWRkIGluc2lkZSBhIHRhYmxlXG4gIGFkZE9uVGFibGUoKSB7XG4gICAgdGhpcy5hZGRUYWJsZSA9IHRydWVcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4udGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKV07XG5cbiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGFuZCB1cGRhdGUgaXRzIGNvbHVtbnNcbiAgICBjb25zdCBpbmRleCA9IGVsZW1lbnRzLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IHJvd051bSA9IHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmNvbHVtbnMgPyB0aGlzLnBkZkVsZW1lbnRzW2luZGV4XS5jb2x1bW5zPy5sZW5ndGggOiAwXG4gICAgY29uc3QgdW5pcXVlX2lkID0gdGhpcy5nZW5lcmF0ZVVpSWQoKTtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB7XG4gICAgICBsYWJlbDogYEhFQURFUiBMQUJFTCAke3Jvd051bX1gLFxuICAgICAgZmllbGROYW1lOiBgRklFTEQgTkFNRSR7cm93TnVtfWAsXG4gICAgICB0eXBlOiB0aGlzLmN1cnJlbnRUeXBlLFxuICAgICAgaWQ6IHVuaXF1ZV9pZFxuICAgIH1cbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5hZGRUYWJsZUVsZW1lbnQodGFibGVFbGVtZW50LCB0aGlzLnNlbGVjdGVkRmllbGRJbmRleCk7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgLy8gdGhpcy5hZGRUYWJsZURhdGEodW5pcXVlX2lkLCBmaWVsZE5hbWUpXG4gIH1cbiAgYWRkVGFibGVEYXRhKGZpZWxkSWQsIGZpZWxkTmFtZSkge1xuICAgIC8vIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZFRhYmxlZmllbGREYXRhKHRhYmxlRWxlbWVudCk7XG4gIH1cbiAgY29sdW1uU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuICAgIC8vIFNLUzE5TUFSMjUgdGFibGUgY29sdW1uIHVwZGF0ZVxuICAgIGlmICghdGhpcy5pc1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4LCBldmVudCk7XG4gICAgfVxuICB9XG4gIHJlbW92ZUNvbHVtbihldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWRUYWJsZUVsZW1lbnQodGhpcy5zZWxlY3RlZEZpZWxkSW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIC8vIFNLUzI1TUFSMjUgaW1hZ2UgYWRkXG4gIGFzeW5jIGZpbGVDaGFuZ2VFdmVudChmaWVsZDogYW55LCBldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSk7XG4gICAgICBsZXQgZWxlbWVudElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIFxuICAgICAgY29uc3QgdXBkYXRlUGRmSW1hZ2UgPSAoZWxlbWVudDogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdQZGYnKSB7XG4gICAgICAgICAgY29uc3Qgc3ViRWxlbWVudHMgPSBlbGVtZW50LnBkZlJlZmVyZW5jZVF1ZXN0aW9ucz8uW2VsZW1lbnQucGRmUmVmZXJlbmNlXSB8fCBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YkVsZW1lbnQgb2Ygc3ViRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gdXBkYXRlUGRmSW1hZ2Uoc3ViRWxlbWVudCk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgICAgICBpZiAoZm91bmQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PT0gZmllbGQuaWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICAgICAgZWxlbWVudC5vcmdJbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaW1hZ2VTaXplKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gIFxuICAgICAgdGhpcy5wZGZFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB1cGRhdGVQZGZJbWFnZShlbGVtZW50KTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGVsZW1lbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZWxlbWVudElkID0gaW5kZXg7IC8vIHJlbWVtYmVyIHRvcC1sZXZlbCBtYXRjaFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgXG4gICAgICBpZiAoZWxlbWVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnBkZkVsZW1lbnRzW2VsZW1lbnRJZF0sICd2YWx1ZUNoYW5nZScpO1xuICAgICAgICBpZih0aGlzLmlzUHJldmlldyl7XG4gICAgICAgICAgdGhpcy5wZGZQcmV2aWV3KHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmRvd25sb2FkRWxlbWVudCgpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICB9XG4gIH0gIFxuICBcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gU0tTMkFQUjI1IGRpc2FibGVkIGVsZW1lbnRcbiAgaXNFbGVtZW50RGlzYWJsZWQoZWxlbWVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnREaXNhYmxlZEFycmF5W3RoaXMuc2VsZWN0ZWRFbGVtZW50LnR5cGVdXG4gICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFzeW5jIG9uSW1hZ2VFZGl0KHF1ZXM6IGFueSkge1xuICAgIHRoaXMuaXNJbWFnZUVkaXQgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQgPSBxdWVzO1xuXG4gIC8vQXNzaWduIGltYWdlU2l6ZSBkZWZhdWx0IHZhbHVlXG4gIGlmICghdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZSA9IHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDAgfTtcbiAgfVxuICB9XG4gIGFzeW5jIG9uSW1hZ2VEZWxldGUocXVlczogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXMuaW1hZ2VEYXRhID0gJyc7XG4gICAgICBxdWVzLm9yZ0ltYWdlRGF0YSA9ICcnO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBsb2dvIHNpemUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICBpZiAoIXF1ZXMuaW1hZ2VTaXplKSB7XG4gICAgICAgIHF1ZXMuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgICAgfVxuICAgICAgLy8gYXdhaXQgdGhpcy5jaGlsZEV2ZW50Q2FwdHVyZShxdWVzLmltYWdlRGF0YSwgcXVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBTS1MyNU1BUjI1IGltYWdlIGVkaXQgZnVuY3Rpb25zXG4gIGZsaXBIb3Jpem9udGFsKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwSDogIXRoaXMudHJhbnNmb3JtLmZsaXBIXG4gICAgfTtcbiAgfVxuXG4gIGZsaXBWZXJ0aWNhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcFY6ICF0aGlzLnRyYW5zZm9ybS5mbGlwVlxuICAgIH07XG4gIH1cblxuICByZXNldEltYWdlKCkge1xuICAgIHRoaXMuY2FudmFzUm90YXRpb24gPSAwO1xuICAgIHRoaXMuY3JvcHBlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgICBzY2FsZTogMSxcbiAgICAgIHJvdGF0ZTogMCxcbiAgICAgIGZsaXBIOiBmYWxzZSxcbiAgICAgIGZsaXBWOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfTtcbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHNjYWxlOiB0aGlzLnRyYW5zZm9ybS5zY2FsZSEgLSAuMVxuICAgIH07XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHNjYWxlOiB0aGlzLnRyYW5zZm9ybS5zY2FsZSEgKyAuMVxuICAgIH07XG4gIH1cbiAgcm90YXRlTGVmdCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyAvLyBVc2UgdGltZW91dCBiZWNhdXNlIHJvdGF0aW5nIGltYWdlIGlzIGEgaGVhdnkgb3BlcmF0aW9uIGFuZCB3aWxsIGJsb2NrIHRoZSB1aSB0aHJlYWRcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICByb3RhdGVSaWdodCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG1vdmVMZWZ0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVIOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIISAtIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZVJpZ2h0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVIOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIISArIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZURvd24oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZVY6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZVYhICsgMVxuICAgIH07XG4gIH1cblxuICBtb3ZlVXAoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZVY6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZVYhIC0gMVxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBmbGlwQWZ0ZXJSb3RhdGUoKSB7XG4gICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcbiAgICBjb25zdCBmbGlwcGVkViA9IHRoaXMudHJhbnNmb3JtLmZsaXBWO1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwSDogZmxpcHBlZFYsXG4gICAgICBmbGlwVjogZmxpcHBlZEgsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH07XG4gIH1cbi8vQVAtMjBKVU4yNSAtIFVwZGF0ZXMgdGhlIGltYWdlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQpIG9mIHRoZSBzZWxlY3RlZCBpbWFnZSBlbGVtZW50IGFuZCByZWZsZWN0cyB0aGUgY2hhbmdlIHZpYSB0aGUgc2VydmljZVxub25JbWFnZVNpemVDaGFuZ2UoKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5wZGZFbGVtZW50cy5maW5kSW5kZXgoKGVsOiBhbnkpID0+IGVsLmlkID09PSB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmlkKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmltYWdlU2l6ZSA9IHsgXG4gICAgICB3aWR0aDogdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUud2lkdGgsIFxuICAgICAgaGVpZ2h0OiB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS5oZWlnaHQgXG4gICAgfTtcbiAgICAvLyBVcGRhdGUgZWxlbWVudCBpbiBzZXJ2aWNlXG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnBkZkVsZW1lbnRzW2luZGV4XSwgJ3ZhbHVlQ2hhbmdlJyk7XG4gIH1cbn1cbiAgYXN5bmMgaW1hZ2VDcm9wcGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5jb252ZXJ0QmxvYlRvQmFzZTY0KGV2ZW50Lm9iamVjdFVybCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlRGF0YSA9IGJhc2U2NDtcbiAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUoYmFzZTY0LCB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50KTtcbiAgICAgICAvLyBzZXQgZGVmYXVsdCBpZiBub3QgcHJlc2VudFxuICAgIGlmICghdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIGltYWdlQ3JvcHBlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG5cbiAgY3JvcHBlclJlYWR5KHNvdXJjZUltYWdlRGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG4gIC8vIFNLUzI1TUFSMjUgYmxvYiB0byBiYXNlIDY0IGNvbnZlcnRlclxuICBjb252ZXJ0QmxvYlRvQmFzZTY0KG9iamVjdFVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZmV0Y2gob2JqZWN0VXJsKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKVxuICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIGNsb3NlTW9kYWwoKSB7XG4gICAgdGhpcy5pc0ltYWdlRWRpdCA9IGZhbHNlO1xuICB9XG4gICAgIG9wZW5UZXh0U2V0dGluZ3MoZmllbGQ6IGFueSwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4gPSBmaWVsZDtcbiAgICAgIHRoaXMuc2hvd1RleHRTZXR0aW5ncyA9IHRydWU7XG4gICAgfVxuICBcbiAgICBjbG9zZVRleHRTZXR0aW5ncygpIHtcbiAgICAgIHRoaXMuc2hvd1RleHRTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cbiAgIFxuICAgIC8vQVAtMTRKVU4yNSAtIFRvZ2dsZXMgYm9sZCBvciBpdGFsaWMgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGJsb2NrXG4gICAgdG9nZ2xlU3R5bGUoc3R5bGU6ICdib2xkJyB8ICdpdGFsaWMnKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW4pIHJldHVybjtcbiAgICAgIGlmIChzdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4uc3R5bGUuYm9sZCA9ICF0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLmJvbGQ7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlID09PSAnaXRhbGljJykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLml0YWxpY3MgPSAhdGhpcy5zZWxlY3RlZENvbHVtbi5zdHlsZS5pdGFsaWNzO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgfVxuICBcbiAgICAvL0FQLTE0SlVOMjUgLSBTZXRzIHRleHQgYWxpZ25tZW50IChsZWZ0LCBjZW50ZXIsIHJpZ2h0KSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgYmxvY2tcbiAgICBzZXRBbGlnbm1lbnQoYWxpZ25tZW50OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbikgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbi5zdHlsZS5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcbiAgICB9XG5cbiAgICAvL0FQLTE0SlVOMjUgLSBVcGRhdGVzIHRoZSBjb250ZW50IGluIHRoZSBQREYgZGVzaWduZXIgd2l0aCB0aGUgc2VsZWN0ZWQgc3R5bGUgY2hhbmdlc1xuICAgIHVwZGF0ZUNvbnRlbnQoKSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMuc2VsZWN0ZWRDb2x1bW4sICd2YWx1ZUNoYW5nZScpO1xuICAgIH1cbiAgICBwZGZTYXZlSGFuZGxlcihldmVudDphbnkpe1xuICAgICAgaWYoZXZlbnQgPT09ICdwcmV2aWV3Jyl7XG4gICAgICAgIHRoaXMucGRmU2F2ZUhhbmRsZXJFbWl0LmVtaXQoe1wiYWN0aW9uXCI6J3ByZXZpZXcnLFwicGRmXCI6dGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCl9KVxuICAgICAgfSBlbHNlIGlmKGV2ZW50ID09PSAnZG93bmxvYWQnKXtcbiAgICAgICAgdGhpcy5wZGZTYXZlSGFuZGxlckVtaXQuZW1pdCh7XCJhY3Rpb25cIjonZG93bmxvYWQnLFwicGRmXCI6dGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCl9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZGZTYXZlSGFuZGxlckVtaXQuZW1pdChldmVudClcbiAgICAgIH1cbiAgICB9XG59IiwiPCEtLSBBUCAyMkpBTjI1IC0gZm9ybSBwcmV2aWV3IGFuZCBBbGwgZm9ybSBlbGVtZW50cyAtLT5cbjwhLS0gQVAgMjVGRUIyNSAtIEFsbCBlbGVtZW50cyB1cGRhdGUgLS0+XG48ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgPGRpdiBjbGFzcz1cImNlbnRlci1mcmFtZVwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgIDwhLS0gRm9ybSBCdWlsZGVyIFNlY3Rpb24gQWxsIEVsZW1lbnRzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJmb3JtLWJ1aWxkZXJcIj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBlbGVtZW50c0xpc3RcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJlbGVtZW50XCJcbiAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgJiYgZWxlbWVudERpc2FibGVkQXJyYXlbc2VsZWN0ZWRFbGVtZW50LnR5cGVdPy5pbmNsdWRlcyhlbGVtZW50LnR5cGUpXCJcbiAgICAgICAgICAgIChjbGljayk9XCIhKHNlbGVjdGVkRWxlbWVudD8udHlwZSAmJiBlbGVtZW50RGlzYWJsZWRBcnJheVtzZWxlY3RlZEVsZW1lbnQudHlwZV0/LmluY2x1ZGVzKGVsZW1lbnQudHlwZSkpICYmIGFkZEVsZW1lbnQoZWxlbWVudC50eXBlKVwiXG4gICAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiEoc2VsZWN0ZWRFbGVtZW50Py50eXBlICYmIGVsZW1lbnREaXNhYmxlZEFycmF5W3NlbGVjdGVkRWxlbWVudC50eXBlXT8uaW5jbHVkZXMoZWxlbWVudC50eXBlKSlcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudD8udHlwZSAmJiBlbGVtZW50RGlzYWJsZWRBcnJheVtzZWxlY3RlZEVsZW1lbnQudHlwZV0/LmluY2x1ZGVzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgICA/ICgnVEhJU19FTEVNRU5UX05PVF9TVVBQT1JURUQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1RoaXMgZWxlbWVudCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSAnKSArXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRFbGVtZW50Py50eXBlIHx8ICgnQ0VSVEFJTl9FTEVNRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdjZXJ0YWluIGVsZW1lbnQnKSkgK1xuICAgICAgICAgICAgICAgICAgKCcgSVNfUFJFU0VOVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnIGlzIHByZXNlbnQnKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMve3sgZWxlbWVudC5pbWcgfX0uc3ZnXCIgY2xhc3M9XCJlbGVtZW50LWljb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG92ZXItbGFiZWxcIj57eyBlbGVtZW50LmxhYmVsIH19PC9kaXY+ICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctZG90c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvdFwiICpuZ0Zvcj1cImxldCBkb3Qgb2YgZG90c1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuPCEtLSBcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZW1wbGF0ZS1zZWN0aW9uXCI+XG4gICAgICAgIDxhcHAtdGVtcGxhdGVzICh0ZW1wbGF0ZVNlbGVjdGVkKT1cIm9uVGVtcGxhdGVTZWxlY3RlZCgkZXZlbnQpXCI+PC9hcHAtdGVtcGxhdGVzPlxuICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICA8IS0tIFNLUzEwTUFSMjUgZm9vdGVyIHZlcnNpb24gc2hvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3ktZm9vdGVyLXZlcnNpb25cIj5cbiAgICAgICAge3t2ZXJzaW9ufX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQVAtMjdNQVIyNSBSZW1vdmUgQ0RLIGRyYWcgYW5kIGRyb3AgcmVwbGFjZSBkcmFnZ2FibGUgZnVuY3Rpb24gIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXByZXZpZXdcIj5cbiAgICAgIDwhLS0gQVAtMTBNQVIyNSBIZWFkaW5nIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7YmFja2dyb3VuZC1jb2xvcjogI0VGRjhGRjsgYm9yZGVyOiAxcHggc29saWQgI0U2RjNGRjttYXJnaW4tYm90dG9tOjEwcHhcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SGVhZGluZygnSGVhZGVyJylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiIHN0eWxlPVwicGFkZGluZzogMTBweDsgZGlzcGxheTogZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInBkZlwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBkZi50aXRsZSA9PSAnJ1wiIHN0eWxlPVwiY29sb3I6IzNmNGE1MjVjXCI+e3sgJ0hFQURJTkcnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hlYWRpbmcnIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGRmLnRpdGxlICE9PSAnJ1wiPnt7cGRmLnRpdGxlfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgKGNsaWNrKT1cInBkZlNhdmVIYW5kbGVyKCdwcmV2aWV3JylcIj57eyAnUFJFVklFVycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUFJFVklFVycgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgKGNsaWNrKT1cInBkZlNhdmVIYW5kbGVyKCdkb3dubG9hZCcpXCI+e3sgJ0RPV05MT0FEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdET1dOTE9BRCcgfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgcGRmRWxlbWVudHM7IGxldCBpID0gaW5kZXhcIj5cblxuICAgICAgICA8IS0tIEFQLTE5TUFSMjUgTGluZSBFbGVtZW50IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdMaW5lJ1wiIGNsYXNzPVwibGluZS1maWVsZFwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsaW5lLWVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHIgY2xhc3M9XCJjdXN0b20tbGluZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXhcIiBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXdlaWdodCc6IGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICd0ZXh0LWFsaWduJzogZmllbGQudGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnYm9yZGVyLXN0eWxlJzogKGZpZWxkLmxpbmVTdHlsZT8udG9Mb3dlckNhc2UoKSB8fCAnc29saWQnKSxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdtYXJnaW4tdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdtYXJnaW4tYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLVNLUzI1TUFSMjUgSW1hZ2UgVXBsb2FkIEVsZW1lbnQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2ltYWdlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIiBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICdmb250LWZhbWlseSc6IGZpZWxkLmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgICAnZm9udC1zaXplJzogKGZpZWxkLmZvbnRTaXplIHx8IDE0KSArICdweCcsXG4gICAgJ3dpZHRoJzogKGZpZWxkLndpZHRoIHx8IDEwMCkgKyAnJScsXG4gICAgJ2FsaWduLWl0ZW1zJzogZmllbGQuYWxpZ25JdGVtcyB8fCAnJyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdmb250LXN0eWxlJzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2l0YWxpYycpID8gJ2l0YWxpYycgOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnYm9sZCcpID8gJ2JvbGQnIDogKGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcpLFxuICAgICdtYXJnaW4nOiBcbiAgICAgIChmaWVsZC5tYXJnaW4/LlswXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsxXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsyXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlszXSB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLWJvdHRvbSc6IChmaWVsZC5wYWRkaW5nQm90dG9tID8/IDEwKSArICdweCdcbiAgfVwiIChtb3VzZWVudGVyKT1cImlzSW1hZ2VIb3ZlciA9IHRydWU7XCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpc0ltYWdlSG92ZXIgPSBmYWxzZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbWFnZUhvdmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUHJldmlld1wiIChjbGljayk9XCJvbkltYWdlRWRpdChmaWVsZClcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4xMDY3IDYuMDcxNzRMOS45MjgzMyA0Ljg5MzRMMi4xNjY2NyAxMi42NTUxVjEzLjgzMzRIMy4zNDVMMTEuMTA2NyA2LjA3MTc0Wk0xMi4yODUgNC44OTM0TDEzLjQ2MzMgMy43MTUwN0wxMi4yODUgMi41MzY3NEwxMS4xMDY3IDMuNzE1MDdMMTIuMjg1IDQuODkzNFpNNC4wMzUgMTUuNTAwMUgwLjVWMTEuOTY0MkwxMS42OTU4IDAuNzY4NDAzQzExLjg1MjEgMC42MTIxNzcgMTIuMDY0IDAuNTI0NDE0IDEyLjI4NSAwLjUyNDQxNEMxMi41MDYgMC41MjQ0MTQgMTIuNzE3OSAwLjYxMjE3NyAxMi44NzQyIDAuNzY4NDAzTDE1LjIzMTcgMy4xMjU5QzE1LjM4NzkgMy4yODIxOCAxNS40NzU3IDMuNDk0MSAxNS40NzU3IDMuNzE1MDdDMTUuNDc1NyAzLjkzNjA0IDE1LjM4NzkgNC4xNDc5NiAxNS4yMzE3IDQuMzA0MjRMNC4wMzU4MyAxNS41MDAxSDQuMDM1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzZDNzU3RFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNQcmV2aWV3XCIgKGNsaWNrKT1cIm9uSW1hZ2VEZWxldGUoZmllbGQpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQgMy45ODcyNkMxMS43OCAzLjc2NzI2IDkuNTQ2NjcgMy42NTM5MyA3LjMyIDMuNjUzOTNDNiAzLjY1MzkzIDQuNjggMy43MjA2IDMuMzYgMy44NTM5M0wyIDMuOTg3MjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1wcmV2aWV3XCIgKm5nSWY9XCJmaWVsZC5pbWFnZURhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZmllbGQuaW1hZ2VEYXRhXCIgXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImZpZWxkLmltYWdlU2l6ZT8ud2lkdGggfHwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImZpZWxkLmltYWdlU2l6ZT8uaGVpZ2h0IHx8IDEwMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmllbGQuaW1hZ2VEYXRhXCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGNsYXNzPVwibG9nby11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnVVBMT0FEX0lNQUdFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdVcGxvYWQgSW1hZ2UnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChmaWVsZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTcGFjZSBFbGVtZW50IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdTcGFjZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwiaGVpZ2h0OjkzcHhcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCIgc3R5bGU9XCJtYXJnaW46IC0xMXB4IC0xMXB4IDAgMDtcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUZXh0QXJlYSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAndGV4dCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFTlRFUl9ERVRBSUxFRF9URVhUX0hFUkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIGRldGFpbGVkIHRleHQgaGVyZS4uLidcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQudmFsdWU/IGZpZWxkLnZhbHVlIDogJydcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25UZXh0QXJlYUlucHV0KCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgI2F1dG9UZXh0YXJlYVxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImlzUHJldmlldyA/IDQwIDogbnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuVGV4dFNldHRpbmdzKGZpZWxkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQ29udGVudCgpXCIgXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQuc3R5bGU/LmZvbnRTaXplID8gZmllbGQuc3R5bGUuZm9udFNpemUgKyAncHgnIDogJzE0cHgnLFxuICAgICAgICAgICAgICAgICdmb250LXdlaWdodCc6IGZpZWxkLnN0eWxlPy5ib2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBmaWVsZC5zdHlsZT8uaXRhbGljcyA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgJ3RleHQtZGVjb3JhdGlvbic6IGZpZWxkLnN0eWxlPy5kZWNvcmF0aW9uID8gJ2RlY29yYXRpb24nIDogJ25vbmUnLFxuICAgICAgICAgICAgICAgICd0ZXh0LWFsaWduJzogZmllbGQuc3R5bGU/LmFsaWdubWVudCB8fCAnbGVmdCcsXG4gICAgICAgICAgICAgICAgJ21hcmdpbic6IGZpZWxkLnN0eWxlPy5tYXJnaW4/Lmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgICAgPyBmaWVsZC5zdHlsZS5tYXJnaW5bMV0gKyAncHggJyArIGZpZWxkLnN0eWxlLm1hcmdpblsyXSArICdweCAnICtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuc3R5bGUubWFyZ2luWzNdICsgJ3B4ICcgKyBmaWVsZC5zdHlsZS5tYXJnaW5bMF0gKyAncHgnXG4gICAgICAgICAgICAgICAgICA6ICcwJyxcbiAgICAgICAgICAgICAgICAnY29sb3InOiBmaWVsZC5zdHlsZT8uY29sb3IgfHwgJyMwMDAnXG4gICAgICAgICAgICAgIH1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUFQLTA1SlVOMjUgVGV4dCBTZXR0aW5ncyBUb29sYmFyOiBBbGxvd3MgZWRpdGluZyBmb250IHNpemUsIGJvbGQvaXRhbGljIHN0eWxlcywgYWxpZ25tZW50LCBhbmQgY2xvc2luZyB0aGUgdG9vbGJhciBmb3IgdGhlIHNlbGVjdGVkIGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGV4dFNldHRpbmdzICYmIGlzUHJldmlldyAmJiBzZWxlY3RlZENvbHVtbiA9PT0gZmllbGRcIiBjbGFzcz1cInRleHQtc2V0dGluZ3MtdG9vbGJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzZweCAxMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JveC1zaGFkb3cnOiAnMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6LWluZGV4JzogJzY1NTM1JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWxpZ24taXRlbXMnOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FwOiAnOHB4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb250IFNpemUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuZm9udFNpemVcIiBjbGFzcz1cInRvb2xiYXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEyXCI+MTJwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxNFwiPjE0cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTZcIj4xNnB0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjE4XCI+MThwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNFwiPjI0cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCBDb2xvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwiVGV4dCBDb2xvclwiIGNsYXNzPVwiY29sb3ItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2xvci1ib3hcIiBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuY29sb3IgfHwgJyMwMDAnXCIgKGNsaWNrKT1cInRleHRDb2xvcklucHV0LmNsaWNrKClcIj5BPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3RleHRDb2xvcklucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuY29sb3JcIiAoY2hhbmdlKT1cInVwZGF0ZUNvbnRlbnQoKVwiIGNsYXNzPVwiY29sb3ItcGlja2VyLWhpZGRlblwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCb2xkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlU3R5bGUoJ2JvbGQnKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy5ib2xkXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPnt7ICdCT0xEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGFsaWMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVTdHlsZSgnaXRhbGljJylcIiBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ29sdW1uPy5zdHlsZT8uaXRhbGljc1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj48aT57eyAnSVRBTElDJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdJJyB9fTwvaT48L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVbmRlcmxpbmUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZVN0eWxlKCd1bmRlcmxpbmUnKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy51bmRlcmxpbmVcIiBjbGFzcz1cInRvb2xiYXItYnRuXCI+PHU+VTwvdT48L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWxpZ24gTGVmdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNldEFsaWdubWVudCgnbGVmdCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ2xlZnQnXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+e3sgJ0ZPUk1BVF9BTElHTl9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdmb3JtYXRfYWxpZ25fbGVmdCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWxpZ24gQ2VudGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdjZW50ZXInKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy5hbGlnbm1lbnQgPT09ICdjZW50ZXInXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+e3sgJ0ZPUk1BVF9BTElHTl9DRU5URVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ2Zvcm1hdF9hbGlnbl9jZW50ZXInIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFsaWduIFJpZ2h0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdyaWdodCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPnt7ICdGT1JNQVRfQUxJR05fUklHSFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ2Zvcm1hdF9hbGlnbl9yaWdodCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xvc2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZVRleHRTZXR0aW5ncygpXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87XCI+4pyVPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIElucHV0IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdpbnB1dCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gQVAtMDRKVU4yNSAtIHJlcGxhY2UgYXBwLWN1c3RvbS1pbnB1dCAtLT5cbiAgICAgICAgICAgICAgPG54dC1pbnB1dCBbdHlwZV09XCIndGV4dCdcIiBbbW9kZV09XCInZWRpdCdcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIiBbcXVlc3Rpb25dPVwiXCIgW2xhYmVsRm9udF09XCJcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucXVlc3Rpb25UZXh0XCIgW2xhYmVsQ29sb3JdPVwiXCIgW2xhYmVsU2l6ZV09XCJcIiBbaW5wdXRWYWx1ZVNpemVdPVwiXCIgW2xhYmVsV2VpZ2h0XT1cIlwiXG4gICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cIlwiIFtzaG93TGFiZWxdPVwiXCIgaW5wdXRCb3JkZXI9XCJub25lXCIgc3ZnSGVpZ2h0PVwiMjBweFwiIHN2Z1dpZHRoPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uID8gZmllbGQucXVlc3Rpb24gOiAnRU5URVJfWU9VUl9JTlBVVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgeW91ciBpbnB1dCdcIiBbcmVxdWlyZWRdPVwiXCJcbiAgICAgICAgICAgICAgICBpbnB1dEJnQ29sb3I9XCIjRjVGNUY1XCIgW2lucHV0SWRdPVwiXCIgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cIicnXCIgKGlucHV0VmFsdWUpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2RhdGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICdmb250LWZhbWlseSc6IGZpZWxkLmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgICAnZm9udC1zaXplJzogKGZpZWxkLmZvbnRTaXplIHx8IDE0KSArICdweCcsXG4gICAgJ3dpZHRoJzogKGZpZWxkLndpZHRoIHx8IDEwMCkgKyAnJScsXG4gICAgJ2FsaWduLWl0ZW1zJzogZmllbGQuYWxpZ25JdGVtcyB8fCAnJyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdmb250LXN0eWxlJzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2l0YWxpYycpID8gJ2l0YWxpYycgOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnYm9sZCcpID8gJ2JvbGQnIDogKGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcpLFxuICAgICdtYXJnaW4nOiBcbiAgICAgIChmaWVsZC5tYXJnaW4/LlswXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsxXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsyXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlszXSB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLWJvdHRvbSc6IChmaWVsZC5wYWRkaW5nQm90dG9tID8/IDEwKSArICdweCdcbiAgfVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWUgJiYgIWlzUHJldmlld1wiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIEFQLTA0SlVOMjUgLSByZXBsYWNlIGN1c3RvbSBkYXRlIHBpY2tlciAtLT5cbiAgICAgICAgICAgICAgPG54dC1pbnB1dCBbdHlwZV09XCInZGF0ZSdcIiBbbW9kZV09XCInZWRpdCdcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIiBbcXVlc3Rpb25dPVwiXCIgW2xhYmVsRm9udF09XCJcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucXVlc3Rpb25UZXh0XCIgW2xhYmVsQ29sb3JdPVwiXCIgW2xhYmVsU2l6ZV09XCJcIiBbaW5wdXRWYWx1ZVNpemVdPVwiXCIgW2xhYmVsV2VpZ2h0XT1cIlwiXG4gICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cIlwiIFtzaG93TGFiZWxdPVwiXCIgaW5wdXRCb3JkZXI9XCJub25lXCIgc3ZnSGVpZ2h0PVwiMjBweFwiIHN2Z1dpZHRoPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uID8gZmllbGQucXVlc3Rpb24gOiAnRU5URVJfWU9VUl9JTlBVVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgeW91ciBpbnB1dCdcIiBbcmVxdWlyZWRdPVwiXCJcbiAgICAgICAgICAgICAgICBpbnB1dEJnQ29sb3I9XCIjRjVGNUY1XCIgW2lucHV0SWRdPVwiXCIgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cIicnXCIgKGlucHV0VmFsdWUpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBkZiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAnUGRmJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAnZm9udC1mYW1pbHknOiBmaWVsZC5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICdhbGlnbi1pdGVtcyc6IGZpZWxkLmFsaWduSXRlbXMgfHwgJycsXG4gICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAnYm9yZGVyLXdpZHRoJzogKGZpZWxkLmxpbmVXaWR0aCB8fCAxKSArICdweCcsXG4gICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAnZm9udC1zdHlsZSc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2JvbGQnKSA/ICdib2xkJyA6IChmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnKSxcbiAgICAnbWFyZ2luJzogXG4gICAgICAoZmllbGQubWFyZ2luPy5bMF0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMV0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMl0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bM10gfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLXRvcCc6IChmaWVsZC5wYWRkaW5nVG9wIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy1ib3R0b20nOiAoZmllbGQucGFkZGluZ0JvdHRvbSA/PyAxMCkgKyAncHgnXG4gIH1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJldmlld1wiIGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSA8bGliLWJvb2tsZXQgW2Jvb2tsZXRKU09OXT1cImZpZWxkLnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1wiPjwvbGliLWJvb2tsZXQ+IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkPy5wZGZSZWZlcmVuY2VRdWVzdGlvbnNbZmllbGQ/LnBkZlJlZmVyZW5jZV07IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gQVAtMTlNQVIyNSBMaW5lIEVsZW1lbnQgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdMaW5lJ1wiIGNsYXNzPVwibGluZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJjdXN0b20tbGluZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXhcIiBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXdlaWdodCc6IGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICd0ZXh0LWFsaWduJzogZmllbGQudGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnYm9yZGVyLXN0eWxlJzogKGZpZWxkLmxpbmVTdHlsZT8udG9Mb3dlckNhc2UoKSB8fCAnc29saWQnKSxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdtYXJnaW4tdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdtYXJnaW4tYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdpbWFnZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvZ28gcHJldmlldyBhcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLXByZXZpZXdcIiAqbmdJZj1cImZpZWxkLmltYWdlRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImZpZWxkLmltYWdlRGF0YVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVwbG9hZCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmaWVsZC5pbWFnZURhdGFcIiBjbGFzcz1cImxvZ28tdXBsb2FkLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQte3tpfX1cIiBjbGFzcz1cImxvZ28tdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdVUExPQURfSU1BR0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1VwbG9hZCBJbWFnZScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChmaWVsZCwgJGV2ZW50KVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAnU3BhY2UnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBzdHlsZT1cImhlaWdodDo5M3B4XCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICd0ZXh0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiIFtwbGFjZWhvbGRlcl09XCInRU5URVJfREVUQUlMRURfVEVYVF9IRVJFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciBkZXRhaWxlZCB0ZXh0IGhlcmUuLi4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJpc1ByZXZpZXcgPyA0MCA6IGZpZWxkLnNpemUgfHwgMTAwXCIgWyhuZ01vZGVsKV09XCJmaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTE0SlVOMjUgQWRkZWQgbnh0LWlucHV0IGluIHBkZiAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2lucHV0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWlucHV0IFt0eXBlXT1cIid0ZXh0J1wiIFttb2RlXT1cIidlZGl0J1wiIFsobmdNb2RlbCldPVwiZmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VOVEVSX1lPVVJfSU5QVVQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIHlvdXIgaW5wdXQnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ueHQtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdUYWJsZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm54dC10YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG54dC1kYXRhdGFibGUgaXNCdXR0b25zIFtxdWVzdGlvbl09XCJmaWVsZFwiIGZyb209XCJmb3JtQnVpbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiaXNQcmV2aWV3ID8gJ3ZpZXcnIDogJ2VkaXQnXCIgW2FwaU1ldGFdPVwiZmllbGQ/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZUNvbmZpZ109XCJmaWVsZC50YWJsZUNvbmZpZ1wiIHRhYmxlSWQ9XCJcIiBkaXJlY3Rpb249XCJsdHJcIiB0YWJsZVdpZHRoPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUXVlc3Rpb25DaGFuZ2UoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkLnZhbHVlPy5kYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VkaXRhYmxlPXRydWUgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpIChyZW1vdmVDb2x1bW4pPXJlbW92ZUNvbHVtbigkZXZlbnQpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSAgVGFibGUgIC0tPlxuICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAnZm9udC1mYW1pbHknOiBmaWVsZC5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICdhbGlnbi1pdGVtcyc6IGZpZWxkLmFsaWduSXRlbXMgfHwgJycsXG4gICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAnYm9yZGVyLXdpZHRoJzogKGZpZWxkLmxpbmVXaWR0aCB8fCAxKSArICdweCcsXG4gICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAnZm9udC1zdHlsZSc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2JvbGQnKSA/ICdib2xkJyA6IChmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnKSxcbiAgICAnbWFyZ2luJzogXG4gICAgICAoZmllbGQubWFyZ2luPy5bMF0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMV0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMl0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bM10gfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLXRvcCc6IChmaWVsZC5wYWRkaW5nVG9wIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy1ib3R0b20nOiAoZmllbGQucGFkZGluZ0JvdHRvbSA/PyAxMCkgKyAncHgnXG4gIH1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJueHQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG54dC1kYXRhdGFibGUgaXNCdXR0b25zIFtxdWVzdGlvbl09XCJmaWVsZFwiIGZyb209XCJmb3JtQnVpbGRlclwiIFttb2RlXT1cImlzUHJldmlldyA/ICd2aWV3JyA6ICdlZGl0J1wiXG4gICAgICAgICAgICAgICAgICBbYXBpTWV0YV09XCJmaWVsZD8uc3ViVGV4dFwiIFt0YWJsZUNvbmZpZ109XCJmaWVsZC50YWJsZUNvbmZpZ1wiIHRhYmxlSWQ9XCJcIiBkaXJlY3Rpb249XCJsdHJcIlxuICAgICAgICAgICAgICAgICAgdGFibGVXaWR0aD1cImF1dG9cIiBpc0VkaXRhYmxlPXRydWUgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJmaWVsZC52YWx1ZT8uZGF0YVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1yZW1vdmVDb2x1bW4oJGV2ZW50KT5cbiAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gU0tTMTNNQVIyNSBwb3B1cCBjb25mb3JtYXRpb24gYm94IC0tPlxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLW92ZXJsYXlcIiAqbmdJZj1cImlzU2VsZWN0VGFibGVQb3B1cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm94XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnRuLWZiXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPuKclTwvYnV0dG9uPlxuICAgICAgPHA+e3sgJ0FERF9UQUJMRV9DT05GSVJNQVRJT04nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1RoZXNlIGVsZW1lbnQgd2FudCB0byBhZGQgYSB0YWJsZScgfX08L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lci1mYlwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwieWVzLWJ0bi1mYlwiIChjbGljayk9XCJhZGRPblRhYmxlKClcIj57eyAnWUVTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdZZXMnIH19PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuby1idG4tZmJcIiAoY2xpY2spPVwib25DbG9zZSgpXCI+e3sgJ05PJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdObycgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGFwcC1wZGYtcHJvcGVydGllcyAqbmdJZj1cIiFpc1ByZXZpZXdcIiAoZm9ybUJ1dHRvbkhhbmRsZXIpPVwicGRmU2F2ZUhhbmRsZXIoJGV2ZW50KVwiPjwvYXBwLXBkZi1wcm9wZXJ0aWVzPlxuPC9kaXY+XG48IS0tU0tTMjVNQVIyNSBNb2RhbCBPdmVybGF5IC0tPlxuPGRpdiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIiAqbmdJZj1cImlzSW1hZ2VFZGl0XCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIChjbGljayk9XCJjbG9zZU1vZGFsKClcIj7Dlzwvc3Bhbj5cbiAgICAgIDwhLS0gSW1hZ2UgRWRpdG9yIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSW1hZ2VFbGVtZW50Py50eXBlID09PSAnaW1hZ2UnXCI+XG4gICAgICAgICAgPGltYWdlLWNyb3BwZXIgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZURhdGFcIiBbaW1hZ2VCYXNlNjRdPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQub3JnSW1hZ2VEYXRhXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCIgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiIFtyb3VuZENyb3BwZXJdPVwicm91bmRDcm9wcGVyXCIgW2JhY2tncm91bmRDb2xvcl09XCInd2hpdGUnXCJcbiAgICAgICAgICAgICAgaW1hZ2VBbHRUZXh0PVwie3sgJ0FMVEVSTkFUSVZFX0lNQUdFX1RFWFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FsdGVybmF0aXZlIGltYWdlIHRleHQnIH19XCIgW2FsbG93TW92ZUltYWdlXT1cImZhbHNlXCIgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCIgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCIgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCIgW2Nyb3BwZXJTdGF0aWNXaWR0aF09XCJjcm9wcGVyU3RhdGljV2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlclN0YXRpY0hlaWdodF09XCJjcm9wcGVyU3RhdGljSGVpZ2h0XCIgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlck1pbkhlaWdodF09XCJjcm9wcGVyTWluSGVpZ2h0XCIgW2Nyb3BwZXJNYXhXaWR0aF09XCJjcm9wcGVyTWF4V2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlck1heEhlaWdodF09XCJjcm9wcGVyTWF4SGVpZ2h0XCIgW3Jlc2V0Q3JvcE9uQXNwZWN0UmF0aW9DaGFuZ2VdPSd0cnVlJyBbKGNyb3BwZXIpXT1cImNyb3BwZXJcIlxuICAgICAgICAgICAgICBbKHRyYW5zZm9ybSldPVwidHJhbnNmb3JtXCIgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiIG91dHB1dD1cImJsb2JcIiBmb3JtYXQ9XCJwbmdcIlxuICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvaW1hZ2UtY3JvcHBlcj5cblxuICAgICAgICAgIDwhLS1BUC0yMEpVTjI1IC0gSW1hZ2Ugc2l6ZSBjb250cm9sczogQWxsb3cgdXNlciB0byBtYW51YWxseSBhZGp1c3Qgd2lkdGggYW5kIGhlaWdodCB1c2luZyByYW5nZSBzbGlkZXJzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZURhdGFcIiBjbGFzcz1cIm1hbnVhbC1zaXplLWlucHV0c1wiPlxuICAgICAgICAgICAgPGxhYmVsPnt7ICdXSURUSCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnV2lkdGgnIH19IHt7IHNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS53aWR0aCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiNTBcIiBtYXg9XCIzMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLndpZHRoXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW1hZ2VTaXplQ2hhbmdlKClcIiAvPlxuICAgICAgICAgIFxuICAgICAgICAgICAgPGxhYmVsPnt7ICdIRUlHSFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hlaWdodCcgfX0ge3sgc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLmhlaWdodCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiNTBcIiBtYXg9XCIzMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLmhlaWdodFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkltYWdlU2l6ZUNoYW5nZSgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcblxuICAgICAgICAgIDwhLS0gQ29udHJvbHMgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlRGF0YVwiIGNsYXNzPVwiY29udHJvbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlTGVmdCgpXCIgdGl0bGU9XCJ7eyAnUk9UQVRFX0xFRlQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1JvdGF0ZSBMZWZ0JyB9fVwiPuKfsjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCIgdGl0bGU9XCJ7eyAnUk9UQVRFX1JJR0hUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSb3RhdGUgUmlnaHQnIH19XCI+4p+zPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21PdXQoKVwiIHRpdGxlPVwie3sgJ1pPT01fT1VUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdab29tIE91dCcgfX1cIj4tPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21JbigpXCIgdGl0bGU9XCJ7eyAnWk9PTV9JTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWm9vbSBJbicgfX1cIj4rPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVMZWZ0KClcIiB0aXRsZT1cInt7ICdNT1ZFX0xFRlQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgTGVmdCcgfX1cIj7ihpA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVJpZ2h0KClcIiB0aXRsZT1cInt7ICdNT1ZFX1JJR0hUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIFJpZ2h0JyB9fVwiPuKGkjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlVXAoKVwiIHRpdGxlPVwie3sgJ01PVkVfVVAnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgVXAnIH19XCI+4oaRPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVEb3duKClcIiB0aXRsZT1cInt7ICdNT1ZFX0RPV04nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgRG93bicgfX1cIj7ihpM8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwSFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0ZMSVBfSE9SSVpPTlRBTExZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGbGlwIEhvcml6b250YWxseScgfX1cIj7ihpQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcFZlcnRpY2FsKClcIiBbY2xhc3MuZW5hYmxlZF09XCJ0cmFuc2Zvcm0uZmxpcFZcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdGTElQX1ZFUlRJQ0FMTFknIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZsaXAgVmVydGljYWxseScgfX1cIj7ihpU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicmVzZXRJbWFnZSgpXCIgdGl0bGU9XCJ7eyAnUkVTRVQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Jlc2V0JyB9fVwiPsOXPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|