@eqproject/eqp-dynamic-module 2.11.4 → 2.11.5
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/USERGUIDE.md +437 -437
- package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +143 -13
- package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +76 -3
- package/esm2020/lib/components/private/add-formula-field/add-formula-field.component.mjs +74 -13
- package/esm2020/lib/components/private/dynamic-module-field-extra-fix/dynamic-module-field-extra-fix.component.mjs +14 -2
- package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs +735 -0
- package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +1 -1
- package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +1 -1
- package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +1 -1
- package/esm2020/lib/components/private/graphs/graph/graph.component.mjs +3 -3
- package/esm2020/lib/eqp-dynamic-module.module.mjs +4 -1
- package/esm2020/lib/utils/css-color.mjs +101 -0
- package/esm2020/lib/utils/css-declarations.mjs +119 -0
- package/esm2020/lib/utils/css-property-catalog.mjs +134 -0
- package/esm2020/lib/utils/field-style-catalog.mjs +491 -0
- package/esm2020/public-api.mjs +6 -1
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +2062 -195
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +2020 -195
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +39 -0
- package/lib/components/private/add-form-field/add-form-field.component.d.ts +19 -0
- package/lib/components/private/add-formula-field/add-formula-field.component.d.ts +5 -1
- package/lib/components/private/field-graphics-editor/field-graphics-editor.component.d.ts +192 -0
- package/lib/eqp-dynamic-module.module.d.ts +66 -65
- package/lib/utils/css-color.d.ts +15 -0
- package/lib/utils/css-declarations.d.ts +23 -0
- package/lib/utils/css-property-catalog.d.ts +36 -0
- package/lib/utils/field-style-catalog.d.ts +130 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs
ADDED
|
@@ -0,0 +1,735 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FieldTypeEnum } from '../../../models/baseField.model';
|
|
3
|
+
import { AvailableFileExtensions, AvailableImageExtensions } from '../../../models/fields/attachmentField.model';
|
|
4
|
+
import { BoolPresentantioEnum } from '../../../models/fields/booleanField.model';
|
|
5
|
+
import { DateTimeTypeEnum } from '../../../models/fields/dateField.model';
|
|
6
|
+
import { buildCssColor, cssColorToAlphaPercent, cssColorToHex } from '../../../utils/css-color';
|
|
7
|
+
import { getCssDeclaration, parseCssDeclarations, setCssDeclaration } from '../../../utils/css-declarations';
|
|
8
|
+
import { buildCustomCssPropertyDef, CSS_ALL_PROPERTIES, CSS_CORE_PROPERTIES, getCssPropertyDef, } from '../../../utils/css-property-catalog';
|
|
9
|
+
import { cloneFieldStyleMap, ensureFieldStyleMap, getCommonStates, getFieldStyleElements, getFieldStyleTypeDef, getFieldDisplayName, getEffectiveStyleMap, legacyTargetKey, mergeLegacyStylesIntoMap, GLOBAL_STYLE_ELEMENTS, resolveGlobalElementKeys, } from '../../../utils/field-style-catalog';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
import * as i2 from "@angular/material/button";
|
|
13
|
+
import * as i3 from "@angular/material/tooltip";
|
|
14
|
+
import * as i4 from "@angular/common";
|
|
15
|
+
import * as i5 from "tmw-icons";
|
|
16
|
+
import * as i6 from "../field-templates/text-field-template/text-field-template.component";
|
|
17
|
+
import * as i7 from "../field-templates/boolean-field-template/boolean-field-template.component";
|
|
18
|
+
import * as i8 from "../field-templates/date-field-template/date-field-template.component";
|
|
19
|
+
import * as i9 from "../field-templates/textarea-field-template/textarea-field-template.component";
|
|
20
|
+
import * as i10 from "../field-templates/numeric-field-template/numeric-field-template.component";
|
|
21
|
+
import * as i11 from "../field-templates/list-value-field-template/list-value-field-template.component";
|
|
22
|
+
import * as i12 from "../field-templates/attachment-field-template/attachment-field-template.component";
|
|
23
|
+
import * as i13 from "../field-templates/image-field-template/image-field-template.component";
|
|
24
|
+
import * as i14 from "../field-templates/image-field-selector-template/image-field-selector-template.component";
|
|
25
|
+
import * as i15 from "../field-templates/label-field-template/label-field-template.component";
|
|
26
|
+
import * as i16 from "../field-templates/image-with-markers-field-template/image-with-markers-field-template.component";
|
|
27
|
+
import * as i17 from "../field-templates/action-button-field-template/action-button-field-template.component";
|
|
28
|
+
export class FieldGraphicsEditorComponent {
|
|
29
|
+
constructor(formBuilder) {
|
|
30
|
+
this.formBuilder = formBuilder;
|
|
31
|
+
/** Campi selezionati nella tabella del configuratore */
|
|
32
|
+
this.fields = [];
|
|
33
|
+
this.formulaObject = {};
|
|
34
|
+
/** Emesso dopo aver scritto le modifiche sui campi */
|
|
35
|
+
this.applyEvent = new EventEmitter();
|
|
36
|
+
this.cancelEvent = new EventEmitter();
|
|
37
|
+
this.FieldTypeEnum = FieldTypeEnum;
|
|
38
|
+
this.displayName = getFieldDisplayName;
|
|
39
|
+
/** Scheda attiva: grafica valida per tutti i campi, oppure divisa per tipologia */
|
|
40
|
+
this.activeTab = 'globale';
|
|
41
|
+
this.groups = [];
|
|
42
|
+
/** Campi selezionati con una grafica configurabile (esclusi Lookup e Form di dettaglio) */
|
|
43
|
+
this.styleableFields = [];
|
|
44
|
+
this.unsupportedFields = [];
|
|
45
|
+
this.activeGroupIndex = 0;
|
|
46
|
+
//#region Stato della scheda "Grafica globale"
|
|
47
|
+
this.globalElements = [];
|
|
48
|
+
this.globalStates = [];
|
|
49
|
+
this.globalSelectedState = 'Normale';
|
|
50
|
+
this.globalOpenElement = '';
|
|
51
|
+
this.globalShowAllProperties = false;
|
|
52
|
+
this.globalSampleIndex = 0;
|
|
53
|
+
/** Modifiche globali in sospeso, indicizzate per "ElementoLogico|Stato|proprietà" */
|
|
54
|
+
this.globalOverrides = {};
|
|
55
|
+
this.globalPreviewField = null;
|
|
56
|
+
this.globalPreviewRecord = null;
|
|
57
|
+
//#endregion Stato della scheda "Grafica globale"
|
|
58
|
+
/** Incrementato ad ogni modifica per forzare il ricalcolo degli stili nelle anteprime */
|
|
59
|
+
this.styleVersion = 0;
|
|
60
|
+
/**
|
|
61
|
+
* Definizioni create al volo per le proprietà scritte a mano e fuori catalogo.
|
|
62
|
+
* Vanno memorizzate: propertiesFor() viene richiamata ad ogni ciclo di change detection
|
|
63
|
+
* e ricreare gli oggetti farebbe ricostruire le righe, facendo perdere il fuoco mentre si scrive.
|
|
64
|
+
*/
|
|
65
|
+
this.customPropertyDefs = {};
|
|
66
|
+
}
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
this.buildGroups();
|
|
69
|
+
this.buildGlobalTab();
|
|
70
|
+
}
|
|
71
|
+
//#region Costruzione
|
|
72
|
+
buildGroups() {
|
|
73
|
+
this.groups = [];
|
|
74
|
+
this.styleableFields = [];
|
|
75
|
+
this.unsupportedFields = [];
|
|
76
|
+
(this.fields ?? []).forEach((field) => {
|
|
77
|
+
const def = getFieldStyleTypeDef(field?.FieldType);
|
|
78
|
+
if (!def) {
|
|
79
|
+
this.unsupportedFields.push(field);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.styleableFields.push(field);
|
|
83
|
+
let group = this.groups.find((g) => Number(g.def.fieldType) === Number(def.fieldType));
|
|
84
|
+
if (!group) {
|
|
85
|
+
group = {
|
|
86
|
+
def,
|
|
87
|
+
fields: [],
|
|
88
|
+
elements: getFieldStyleElements(field),
|
|
89
|
+
styleMap: {},
|
|
90
|
+
overrides: {},
|
|
91
|
+
hasDifferences: false,
|
|
92
|
+
sampleIndex: 0,
|
|
93
|
+
selectedState: def.states[0]?.key ?? 'Normale',
|
|
94
|
+
openElement: getFieldStyleElements(field)[0]?.key ?? '',
|
|
95
|
+
showAllProperties: false,
|
|
96
|
+
previewField: null,
|
|
97
|
+
previewRecord: null,
|
|
98
|
+
};
|
|
99
|
+
this.groups.push(group);
|
|
100
|
+
}
|
|
101
|
+
group.fields.push(field);
|
|
102
|
+
});
|
|
103
|
+
this.groups.forEach((group) => {
|
|
104
|
+
const reference = JSON.stringify(cloneFieldStyleMap(group.fields[0]));
|
|
105
|
+
group.hasDifferences = group.fields.some((f) => JSON.stringify(cloneFieldStyleMap(f)) !== reference);
|
|
106
|
+
this.rebuildGroup(group);
|
|
107
|
+
});
|
|
108
|
+
this.activeGroupIndex = 0;
|
|
109
|
+
}
|
|
110
|
+
buildGlobalTab() {
|
|
111
|
+
const types = this.styleableFields.map((f) => f.FieldType);
|
|
112
|
+
this.globalElements = GLOBAL_STYLE_ELEMENTS.filter((g) => this.styleableFields.some((f) => resolveGlobalElementKeys(f, g.key).length > 0));
|
|
113
|
+
this.globalStates = getCommonStates(types);
|
|
114
|
+
this.globalSelectedState = this.globalStates[0]?.key ?? 'Normale';
|
|
115
|
+
this.globalOpenElement = this.globalElements[0]?.key ?? '';
|
|
116
|
+
this.globalSampleIndex = 0;
|
|
117
|
+
this.rebuildGlobalPreview();
|
|
118
|
+
}
|
|
119
|
+
//#endregion Costruzione
|
|
120
|
+
//#region Scheda "Grafica personalizzata"
|
|
121
|
+
/**
|
|
122
|
+
* Ricostruisce la mappa mostrata per un gruppo: parte dagli stili reali del campo campione
|
|
123
|
+
* — così una grafica impostata fuori da questo editor viene sempre riportata —, poi applica
|
|
124
|
+
* le modifiche globali e infine quelle specifiche della tipologia.
|
|
125
|
+
*/
|
|
126
|
+
rebuildGroup(group) {
|
|
127
|
+
const sample = group.fields[group.sampleIndex] ?? group.fields[0];
|
|
128
|
+
if (!sample) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// La base comprende il CSS legacy assorbito, altrimenti l'editor mostrerebbe
|
|
132
|
+
// "non impostato" su proprietà che a video si vedono eccome (applicate inline)
|
|
133
|
+
group.styleMap = getEffectiveStyleMap(sample);
|
|
134
|
+
this.applyGlobalOverridesToMap(sample, group.styleMap);
|
|
135
|
+
Object.keys(group.overrides).forEach((entry) => {
|
|
136
|
+
const { key, prop } = this.splitEntry(entry);
|
|
137
|
+
this.writeIntoMap(group.styleMap, key, prop, group.overrides[entry]);
|
|
138
|
+
});
|
|
139
|
+
this.buildPreview(group);
|
|
140
|
+
}
|
|
141
|
+
/** Ricrea il campo fittizio usato dall'anteprima, agganciandogli la mappa mostrata */
|
|
142
|
+
buildPreview(group) {
|
|
143
|
+
const source = group.fields[group.sampleIndex] ?? group.fields[0];
|
|
144
|
+
if (!source) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const clone = this.buildPreviewField(source, group.styleMap);
|
|
148
|
+
group.elements = getFieldStyleElements(clone);
|
|
149
|
+
if (!group.elements.some((e) => e.key === group.openElement)) {
|
|
150
|
+
group.openElement = group.elements[0]?.key ?? '';
|
|
151
|
+
}
|
|
152
|
+
group.previewField = clone;
|
|
153
|
+
group.previewRecord = { [clone.Name]: this.getPreviewInitialValue(clone) };
|
|
154
|
+
this.styleVersion++;
|
|
155
|
+
}
|
|
156
|
+
get activeGroup() {
|
|
157
|
+
return this.groups[this.activeGroupIndex] ?? null;
|
|
158
|
+
}
|
|
159
|
+
selectGroup(index) {
|
|
160
|
+
this.activeGroupIndex = index;
|
|
161
|
+
this.styleVersion++;
|
|
162
|
+
}
|
|
163
|
+
selectState(group, stateKey) {
|
|
164
|
+
group.selectedState = stateKey;
|
|
165
|
+
this.styleVersion++;
|
|
166
|
+
}
|
|
167
|
+
toggleElement(group, elementKey) {
|
|
168
|
+
group.openElement = group.openElement === elementKey ? '' : elementKey;
|
|
169
|
+
}
|
|
170
|
+
/** Cambiando campione si rileggono i suoi stili reali, mantenendo le modifiche in sospeso */
|
|
171
|
+
changeSample(group, index) {
|
|
172
|
+
group.sampleIndex = Number(index);
|
|
173
|
+
this.rebuildGroup(group);
|
|
174
|
+
}
|
|
175
|
+
groupFieldNames(group) {
|
|
176
|
+
return group.fields.map((f) => getFieldDisplayName(f)).join(', ');
|
|
177
|
+
}
|
|
178
|
+
get sampleFieldLabel() {
|
|
179
|
+
const g = this.activeGroup;
|
|
180
|
+
if (!g) {
|
|
181
|
+
return '';
|
|
182
|
+
}
|
|
183
|
+
const f = g.fields[g.sampleIndex] ?? g.fields[0];
|
|
184
|
+
return f ? getFieldDisplayName(f) : '';
|
|
185
|
+
}
|
|
186
|
+
//#endregion Scheda "Grafica personalizzata"
|
|
187
|
+
//#region Scheda "Grafica globale"
|
|
188
|
+
selectTab(tab) {
|
|
189
|
+
this.activeTab = tab;
|
|
190
|
+
// Passando alla scheda per tipologia i valori devono già includere le modifiche globali
|
|
191
|
+
if (tab === 'personalizzata') {
|
|
192
|
+
this.groups.forEach((g) => this.rebuildGroup(g));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
this.rebuildGlobalPreview();
|
|
196
|
+
}
|
|
197
|
+
this.styleVersion++;
|
|
198
|
+
}
|
|
199
|
+
selectGlobalState(stateKey) {
|
|
200
|
+
this.globalSelectedState = stateKey;
|
|
201
|
+
this.styleVersion++;
|
|
202
|
+
}
|
|
203
|
+
toggleGlobalElement(elementKey) {
|
|
204
|
+
this.globalOpenElement = this.globalOpenElement === elementKey ? '' : elementKey;
|
|
205
|
+
}
|
|
206
|
+
changeGlobalSample(index) {
|
|
207
|
+
this.globalSampleIndex = Number(index);
|
|
208
|
+
this.rebuildGlobalPreview();
|
|
209
|
+
}
|
|
210
|
+
get globalSampleField() {
|
|
211
|
+
return this.styleableFields[this.globalSampleIndex] ?? this.styleableFields[0] ?? null;
|
|
212
|
+
}
|
|
213
|
+
/** True se l'elemento logico non esiste sul campo attualmente in anteprima */
|
|
214
|
+
isGlobalElementMissingOnSample(elementKey) {
|
|
215
|
+
const sample = this.globalSampleField;
|
|
216
|
+
if (!sample) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
return resolveGlobalElementKeys(sample, elementKey).length === 0;
|
|
220
|
+
}
|
|
221
|
+
rebuildGlobalPreview() {
|
|
222
|
+
const sample = this.globalSampleField;
|
|
223
|
+
if (!sample) {
|
|
224
|
+
this.globalPreviewField = null;
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const map = getEffectiveStyleMap(sample);
|
|
228
|
+
this.applyGlobalOverridesToMap(sample, map);
|
|
229
|
+
const clone = this.buildPreviewField(sample, map);
|
|
230
|
+
this.globalPreviewField = clone;
|
|
231
|
+
this.globalPreviewRecord = { [clone.Name]: this.getPreviewInitialValue(clone) };
|
|
232
|
+
this.styleVersion++;
|
|
233
|
+
}
|
|
234
|
+
/** Riversa le modifiche globali in sospeso su una mappa stili, risolte per quel campo */
|
|
235
|
+
applyGlobalOverridesToMap(field, map) {
|
|
236
|
+
const typeDef = getFieldStyleTypeDef(field?.FieldType);
|
|
237
|
+
if (!typeDef) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
Object.keys(this.globalOverrides).forEach((entry) => {
|
|
241
|
+
const parts = entry.split('|');
|
|
242
|
+
if (parts.length !== 3) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const [globalKey, state, prop] = parts;
|
|
246
|
+
if (!typeDef.states.some((s) => s.key === state)) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
resolveGlobalElementKeys(field, globalKey).forEach((realKey) => {
|
|
250
|
+
this.writeIntoMap(map, realKey + state, prop, this.globalOverrides[entry]);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
globalStyleKeysForSample(elementKey) {
|
|
255
|
+
const sample = this.globalSampleField;
|
|
256
|
+
if (!sample) {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
return resolveGlobalElementKeys(sample, elementKey).map((k) => k + this.globalSelectedState);
|
|
260
|
+
}
|
|
261
|
+
/** Valore mostrato per una proprietà globale: quello reale del campione più le modifiche */
|
|
262
|
+
getGlobalPropertyValue(elementKey, prop) {
|
|
263
|
+
const entry = `${elementKey}|${this.globalSelectedState}|${prop.toLowerCase()}`;
|
|
264
|
+
if (Object.prototype.hasOwnProperty.call(this.globalOverrides, entry)) {
|
|
265
|
+
return this.globalOverrides[entry];
|
|
266
|
+
}
|
|
267
|
+
const sample = this.globalSampleField;
|
|
268
|
+
if (!sample) {
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
const keys = resolveGlobalElementKeys(sample, elementKey);
|
|
272
|
+
if (keys.length === 0) {
|
|
273
|
+
return '';
|
|
274
|
+
}
|
|
275
|
+
const map = getEffectiveStyleMap(sample);
|
|
276
|
+
return getCssDeclaration(map[keys[0] + this.globalSelectedState] ?? '', prop);
|
|
277
|
+
}
|
|
278
|
+
setGlobalPropertyValue(elementKey, prop, value) {
|
|
279
|
+
const entry = `${elementKey}|${this.globalSelectedState}|${prop.toLowerCase()}`;
|
|
280
|
+
this.globalOverrides[entry] = (value ?? '').trim();
|
|
281
|
+
this.rebuildGlobalPreview();
|
|
282
|
+
}
|
|
283
|
+
resetGlobalProperty(elementKey, prop) {
|
|
284
|
+
this.setGlobalPropertyValue(elementKey, prop, '');
|
|
285
|
+
}
|
|
286
|
+
isGlobalPropertySet(elementKey, prop) {
|
|
287
|
+
return !!this.getGlobalPropertyValue(elementKey, prop);
|
|
288
|
+
}
|
|
289
|
+
/** Proprietà mostrate nella scheda globale per un elemento logico */
|
|
290
|
+
globalPropertiesFor(elementKey) {
|
|
291
|
+
const result = this.globalShowAllProperties
|
|
292
|
+
? CSS_ALL_PROPERTIES.slice()
|
|
293
|
+
: CSS_CORE_PROPERTIES.slice();
|
|
294
|
+
const sample = this.globalSampleField;
|
|
295
|
+
const valorized = [];
|
|
296
|
+
if (sample) {
|
|
297
|
+
const map = getEffectiveStyleMap(sample);
|
|
298
|
+
resolveGlobalElementKeys(sample, elementKey).forEach((realKey) => {
|
|
299
|
+
parseCssDeclarations(map[realKey + this.globalSelectedState] ?? '')
|
|
300
|
+
.forEach((d) => { if (!valorized.includes(d.prop)) {
|
|
301
|
+
valorized.push(d.prop);
|
|
302
|
+
} });
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
Object.keys(this.globalOverrides).forEach((entry) => {
|
|
306
|
+
const parts = entry.split('|');
|
|
307
|
+
if (parts.length === 3 && parts[0] === elementKey && parts[1] === this.globalSelectedState
|
|
308
|
+
&& this.globalOverrides[entry] && !valorized.includes(parts[2])) {
|
|
309
|
+
valorized.push(parts[2]);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
this.pushValorized(result, valorized);
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
globalSetPropertiesCount(elementKey) {
|
|
316
|
+
return this.globalPropertiesFor(elementKey)
|
|
317
|
+
.filter((p) => this.isGlobalPropertySet(elementKey, p.prop)).length;
|
|
318
|
+
}
|
|
319
|
+
//#endregion Scheda "Grafica globale"
|
|
320
|
+
//#region Lettura/scrittura proprietà per tipologia
|
|
321
|
+
/** Chiave della mappa stili: "Elemento" + "Stato" (es. InputFocused) */
|
|
322
|
+
styleKey(group, elementKey) {
|
|
323
|
+
return elementKey + group.selectedState;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Proprietà mostrate per un elemento: quelle di base, più quelle già valorizzate
|
|
327
|
+
* (anche se scritte a mano e fuori catalogo), più tutte le altre se richiesto.
|
|
328
|
+
*/
|
|
329
|
+
propertiesFor(group, elementKey) {
|
|
330
|
+
const css = group.styleMap[this.styleKey(group, elementKey)] ?? '';
|
|
331
|
+
const result = group.showAllProperties
|
|
332
|
+
? CSS_ALL_PROPERTIES.slice()
|
|
333
|
+
: CSS_CORE_PROPERTIES.slice();
|
|
334
|
+
this.pushValorized(result, parseCssDeclarations(css).map((d) => d.prop));
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
pushValorized(result, valorized) {
|
|
338
|
+
valorized.forEach((prop) => {
|
|
339
|
+
if (result.some((p) => p.prop === prop)) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const catalogued = getCssPropertyDef(prop);
|
|
343
|
+
if (catalogued) {
|
|
344
|
+
result.push(catalogued);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (!this.customPropertyDefs[prop]) {
|
|
348
|
+
this.customPropertyDefs[prop] = buildCustomCssPropertyDef(prop);
|
|
349
|
+
}
|
|
350
|
+
result.push(this.customPropertyDefs[prop]);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
setPropertiesCount(group, elementKey) {
|
|
354
|
+
return parseCssDeclarations(group.styleMap[this.styleKey(group, elementKey)] ?? '').length;
|
|
355
|
+
}
|
|
356
|
+
getPropertyValue(group, elementKey, prop) {
|
|
357
|
+
return getCssDeclaration(group.styleMap[this.styleKey(group, elementKey)] ?? '', prop);
|
|
358
|
+
}
|
|
359
|
+
setPropertyValue(group, elementKey, prop, value) {
|
|
360
|
+
const key = this.styleKey(group, elementKey);
|
|
361
|
+
const clean = (value ?? '').trim();
|
|
362
|
+
this.writeIntoMap(group.styleMap, key, prop, clean);
|
|
363
|
+
group.overrides[`${key}|${prop.toLowerCase()}`] = clean;
|
|
364
|
+
this.styleVersion++;
|
|
365
|
+
}
|
|
366
|
+
resetProperty(group, elementKey, prop) {
|
|
367
|
+
this.setPropertyValue(group, elementKey, prop, '');
|
|
368
|
+
}
|
|
369
|
+
isPropertySet(group, elementKey, prop) {
|
|
370
|
+
return !!this.getPropertyValue(group, elementKey, prop);
|
|
371
|
+
}
|
|
372
|
+
//#endregion Lettura/scrittura proprietà per tipologia
|
|
373
|
+
//#region Controlli colore e misura
|
|
374
|
+
colorHex(value) { return cssColorToHex(value); }
|
|
375
|
+
colorAlpha(value) { return cssColorToAlphaPercent(value); }
|
|
376
|
+
buildColor(hex, alpha) { return buildCssColor(hex, Number(alpha)); }
|
|
377
|
+
/** Parte numerica di una misura ("14px" -> 14); il minimo del catalogo se non impostata */
|
|
378
|
+
sizeNumber(value, definition) {
|
|
379
|
+
const parsed = parseFloat(value);
|
|
380
|
+
if (isNaN(parsed)) {
|
|
381
|
+
return definition.min ?? 0;
|
|
382
|
+
}
|
|
383
|
+
return parsed;
|
|
384
|
+
}
|
|
385
|
+
buildSize(definition, value) {
|
|
386
|
+
const numeric = Number(value);
|
|
387
|
+
if (value === '' || value == null || isNaN(numeric)) {
|
|
388
|
+
return '';
|
|
389
|
+
}
|
|
390
|
+
return `${numeric}${definition.unit ?? ''}`;
|
|
391
|
+
}
|
|
392
|
+
//#endregion Controlli colore e misura
|
|
393
|
+
//#region Applicazione
|
|
394
|
+
/**
|
|
395
|
+
* Riversa sui campi selezionati soltanto le proprietà effettivamente toccate: prima quelle
|
|
396
|
+
* globali, poi quelle della singola tipologia, che quindi hanno la precedenza. Tutte le altre
|
|
397
|
+
* regole già presenti sui singoli campi restano intatte.
|
|
398
|
+
*/
|
|
399
|
+
apply() {
|
|
400
|
+
const targets = this.collectWriteTargets();
|
|
401
|
+
this.absorbLegacyWhereNeeded(targets);
|
|
402
|
+
targets.forEach((writes, field) => {
|
|
403
|
+
const map = ensureFieldStyleMap(field);
|
|
404
|
+
if (!map) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
writes.forEach((value, entry) => {
|
|
408
|
+
const { key, prop } = this.splitEntry(entry);
|
|
409
|
+
this.writeIntoMap(map, key, prop, value);
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
this.applyEvent.emit();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Espande le modifiche in sospeso in scritture concrete per campo: prima quelle globali,
|
|
416
|
+
* poi quelle della singola tipologia, che quindi hanno la precedenza.
|
|
417
|
+
*/
|
|
418
|
+
collectWriteTargets() {
|
|
419
|
+
const targets = new Map();
|
|
420
|
+
const note = (field, key, prop, value) => {
|
|
421
|
+
if (!targets.has(field)) {
|
|
422
|
+
targets.set(field, new Map());
|
|
423
|
+
}
|
|
424
|
+
targets.get(field).set(`${key}|${prop}`, value);
|
|
425
|
+
};
|
|
426
|
+
this.styleableFields.forEach((field) => {
|
|
427
|
+
const typeDef = getFieldStyleTypeDef(field?.FieldType);
|
|
428
|
+
if (!typeDef) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
Object.keys(this.globalOverrides).forEach((entry) => {
|
|
432
|
+
const parts = entry.split('|');
|
|
433
|
+
if (parts.length !== 3) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const [globalKey, state, prop] = parts;
|
|
437
|
+
if (!typeDef.states.some((s) => s.key === state)) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
resolveGlobalElementKeys(field, globalKey).forEach((realKey) => {
|
|
441
|
+
note(field, realKey + state, prop, this.globalOverrides[entry]);
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
this.groups.forEach((group) => {
|
|
446
|
+
Object.keys(group.overrides).forEach((entry) => {
|
|
447
|
+
const { key, prop } = this.splitEntry(entry);
|
|
448
|
+
group.fields.forEach((field) => note(field, key, prop, group.overrides[entry]));
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
return targets;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Il CSS legacy viene applicato dai template come stile inline e batterebbe le regole
|
|
455
|
+
* iniettate: dove l'editor sta per scrivere, lo si assorbe nella mappa per elemento e
|
|
456
|
+
* si azzera la proprietà legacy. Restano intatte le proprietà legacy su elementi non toccati.
|
|
457
|
+
*/
|
|
458
|
+
absorbLegacyWhereNeeded(targets) {
|
|
459
|
+
targets.forEach((writes, field) => {
|
|
460
|
+
const keys = new Set([...writes.keys()].map((e) => this.splitEntry(e).key));
|
|
461
|
+
['LabelstyleCSS', 'FieldstyleCSS'].forEach((name) => {
|
|
462
|
+
const css = field[name];
|
|
463
|
+
if (!css || !String(css).trim()) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
const target = legacyTargetKey(field, name);
|
|
467
|
+
if (!target || !keys.has(target)) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const map = ensureFieldStyleMap(field);
|
|
471
|
+
if (!map) {
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (mergeLegacyStylesIntoMap(field, map, name).consumed.length > 0) {
|
|
475
|
+
field[name] = null;
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
cancel() {
|
|
481
|
+
this.cancelEvent.emit();
|
|
482
|
+
}
|
|
483
|
+
get hasChanges() {
|
|
484
|
+
return Object.keys(this.globalOverrides).length > 0
|
|
485
|
+
|| this.groups.some((g) => Object.keys(g.overrides).length > 0);
|
|
486
|
+
}
|
|
487
|
+
get changesCount() {
|
|
488
|
+
return Object.keys(this.globalOverrides).length
|
|
489
|
+
+ this.groups.reduce((n, g) => n + Object.keys(g.overrides).length, 0);
|
|
490
|
+
}
|
|
491
|
+
//#endregion Applicazione
|
|
492
|
+
//#region Strato comune alle due schede
|
|
493
|
+
// Il template delle righe-proprietà è unico: queste proprietà instradano lettura e
|
|
494
|
+
// scrittura sulla scheda attiva, evitando di duplicare il markup dei controlli.
|
|
495
|
+
get currentElements() {
|
|
496
|
+
return this.activeTab === 'globale' ? this.globalElements : (this.activeGroup?.elements ?? []);
|
|
497
|
+
}
|
|
498
|
+
get currentStates() {
|
|
499
|
+
return this.activeTab === 'globale' ? this.globalStates : (this.activeGroup?.def.states ?? []);
|
|
500
|
+
}
|
|
501
|
+
get currentSelectedState() {
|
|
502
|
+
return this.activeTab === 'globale' ? this.globalSelectedState : (this.activeGroup?.selectedState ?? '');
|
|
503
|
+
}
|
|
504
|
+
setCurrentState(stateKey) {
|
|
505
|
+
if (this.activeTab === 'globale') {
|
|
506
|
+
this.selectGlobalState(stateKey);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (this.activeGroup) {
|
|
510
|
+
this.selectState(this.activeGroup, stateKey);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
get currentOpenElement() {
|
|
514
|
+
return this.activeTab === 'globale' ? this.globalOpenElement : (this.activeGroup?.openElement ?? '');
|
|
515
|
+
}
|
|
516
|
+
toggleCurrentElement(elementKey) {
|
|
517
|
+
if (this.activeTab === 'globale') {
|
|
518
|
+
this.toggleGlobalElement(elementKey);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (this.activeGroup) {
|
|
522
|
+
this.toggleElement(this.activeGroup, elementKey);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
get currentShowAllProperties() {
|
|
526
|
+
return this.activeTab === 'globale' ? this.globalShowAllProperties : (this.activeGroup?.showAllProperties ?? false);
|
|
527
|
+
}
|
|
528
|
+
toggleCurrentShowAll() {
|
|
529
|
+
if (this.activeTab === 'globale') {
|
|
530
|
+
this.globalShowAllProperties = !this.globalShowAllProperties;
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
if (this.activeGroup) {
|
|
534
|
+
this.activeGroup.showAllProperties = !this.activeGroup.showAllProperties;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
rowProperties(elementKey) {
|
|
538
|
+
if (this.activeTab === 'globale') {
|
|
539
|
+
return this.globalPropertiesFor(elementKey);
|
|
540
|
+
}
|
|
541
|
+
return this.activeGroup ? this.propertiesFor(this.activeGroup, elementKey) : [];
|
|
542
|
+
}
|
|
543
|
+
rowCount(elementKey) {
|
|
544
|
+
if (this.activeTab === 'globale') {
|
|
545
|
+
return this.globalSetPropertiesCount(elementKey);
|
|
546
|
+
}
|
|
547
|
+
return this.activeGroup ? this.setPropertiesCount(this.activeGroup, elementKey) : 0;
|
|
548
|
+
}
|
|
549
|
+
rowGet(elementKey, prop) {
|
|
550
|
+
if (this.activeTab === 'globale') {
|
|
551
|
+
return this.getGlobalPropertyValue(elementKey, prop);
|
|
552
|
+
}
|
|
553
|
+
return this.activeGroup ? this.getPropertyValue(this.activeGroup, elementKey, prop) : '';
|
|
554
|
+
}
|
|
555
|
+
rowSet(elementKey, prop, value) {
|
|
556
|
+
if (this.activeTab === 'globale') {
|
|
557
|
+
this.setGlobalPropertyValue(elementKey, prop, value);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (this.activeGroup) {
|
|
561
|
+
this.setPropertyValue(this.activeGroup, elementKey, prop, value);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
rowIsSet(elementKey, prop) {
|
|
565
|
+
return !!this.rowGet(elementKey, prop);
|
|
566
|
+
}
|
|
567
|
+
rowReset(elementKey, prop) {
|
|
568
|
+
this.rowSet(elementKey, prop, '');
|
|
569
|
+
}
|
|
570
|
+
/** Colore: la pastiglia e lo slider lavorano insieme sullo stesso valore */
|
|
571
|
+
rowSetColorHex(elementKey, prop, hex) {
|
|
572
|
+
const alpha = this.colorAlpha(this.rowGet(elementKey, prop));
|
|
573
|
+
this.rowSet(elementKey, prop, this.buildColor(hex, alpha));
|
|
574
|
+
}
|
|
575
|
+
rowSetColorAlpha(elementKey, prop, alpha) {
|
|
576
|
+
const hex = this.colorHex(this.rowGet(elementKey, prop));
|
|
577
|
+
this.rowSet(elementKey, prop, this.buildColor(hex, Number(alpha)));
|
|
578
|
+
}
|
|
579
|
+
rowSetSize(elementKey, definition, value) {
|
|
580
|
+
this.rowSet(elementKey, definition.prop, this.buildSize(definition, value));
|
|
581
|
+
}
|
|
582
|
+
//#endregion Strato comune alle due schede
|
|
583
|
+
//#region Anteprima comune
|
|
584
|
+
get currentSampleFields() {
|
|
585
|
+
return this.activeTab === 'globale' ? this.styleableFields : (this.activeGroup?.fields ?? []);
|
|
586
|
+
}
|
|
587
|
+
get currentSampleIndex() {
|
|
588
|
+
return this.activeTab === 'globale' ? this.globalSampleIndex : (this.activeGroup?.sampleIndex ?? 0);
|
|
589
|
+
}
|
|
590
|
+
changeCurrentSample(index) {
|
|
591
|
+
if (this.activeTab === 'globale') {
|
|
592
|
+
this.changeGlobalSample(index);
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
if (this.activeGroup) {
|
|
596
|
+
this.changeSample(this.activeGroup, index);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
get currentPreviewField() {
|
|
600
|
+
return this.activeTab === 'globale' ? this.globalPreviewField : (this.activeGroup?.previewField ?? null);
|
|
601
|
+
}
|
|
602
|
+
get currentPreviewRecord() {
|
|
603
|
+
return this.activeTab === 'globale' ? this.globalPreviewRecord : (this.activeGroup?.previewRecord ?? null);
|
|
604
|
+
}
|
|
605
|
+
/** Tipologia del campo mostrato in anteprima, per scegliere il template giusto */
|
|
606
|
+
get currentPreviewType() {
|
|
607
|
+
return Number(this.currentPreviewField?.FieldType ?? 0);
|
|
608
|
+
}
|
|
609
|
+
//#endregion Anteprima comune
|
|
610
|
+
//#region Utilità
|
|
611
|
+
/** Scrive (o rimuove, se il valore è vuoto) una proprietà dentro una mappa stili */
|
|
612
|
+
writeIntoMap(map, key, prop, value) {
|
|
613
|
+
const updated = setCssDeclaration(map[key] ?? '', prop, value);
|
|
614
|
+
if (updated) {
|
|
615
|
+
map[key] = updated;
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
// rimossa del tutto: il JSON salvato resta compatto
|
|
619
|
+
delete map[key];
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
splitEntry(entry) {
|
|
623
|
+
const i = entry.lastIndexOf('|');
|
|
624
|
+
return { key: entry.slice(0, i), prop: entry.slice(i + 1) };
|
|
625
|
+
}
|
|
626
|
+
trackByProp(_index, definition) { return definition.prop; }
|
|
627
|
+
trackByKey(_index, entry) { return entry.key; }
|
|
628
|
+
//#endregion Utilità
|
|
629
|
+
//#region Anteprima
|
|
630
|
+
/** Crea il campo fittizio dell'anteprima agganciandogli la mappa stili passata */
|
|
631
|
+
buildPreviewField(source, styleMap) {
|
|
632
|
+
const clone = this.safeClone(source);
|
|
633
|
+
const def = getFieldStyleTypeDef(clone.FieldType);
|
|
634
|
+
if (def) {
|
|
635
|
+
clone[def.styleProp] = styleMap;
|
|
636
|
+
}
|
|
637
|
+
// Il legacy e' gia' dentro styleMap: lasciarlo qui lo riapplicherebbe inline,
|
|
638
|
+
// coprendo le regole iniettate e mostrando un'anteprima falsa
|
|
639
|
+
clone.LabelstyleCSS = null;
|
|
640
|
+
clone.FieldstyleCSS = null;
|
|
641
|
+
const controlName = clone.Label || 'preview_field';
|
|
642
|
+
clone.Name = controlName;
|
|
643
|
+
this.prepareTypeSpecificPreview(clone);
|
|
644
|
+
const initialValue = this.getPreviewInitialValue(clone);
|
|
645
|
+
clone.FormFormGroup = this.formBuilder.group({ [controlName]: [initialValue] });
|
|
646
|
+
return clone;
|
|
647
|
+
}
|
|
648
|
+
getPreviewInitialValue(field) {
|
|
649
|
+
switch (Number(field.FieldType)) {
|
|
650
|
+
case FieldTypeEnum['Allegato']:
|
|
651
|
+
return [];
|
|
652
|
+
case FieldTypeEnum['Data e/o ora']:
|
|
653
|
+
return null;
|
|
654
|
+
case FieldTypeEnum['Booleano']:
|
|
655
|
+
return false;
|
|
656
|
+
case FieldTypeEnum['Etichetta']:
|
|
657
|
+
return field.Etichetta || field.Description || 'Testo etichetta di esempio';
|
|
658
|
+
case FieldTypeEnum['Elenco generico']:
|
|
659
|
+
return field.IsMultiChoiche ? [] : null;
|
|
660
|
+
case FieldTypeEnum['Elenco immagini']:
|
|
661
|
+
return field.IsMultiChoiche ? [] : null;
|
|
662
|
+
default:
|
|
663
|
+
return '';
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
/** Completa il campo di anteprima con i valori minimi richiesti dai singoli template */
|
|
667
|
+
prepareTypeSpecificPreview(field) {
|
|
668
|
+
switch (Number(field.FieldType)) {
|
|
669
|
+
case FieldTypeEnum['Allegato']: {
|
|
670
|
+
const af = field;
|
|
671
|
+
if (!af.AllowedMimeTypes || af.AllowedMimeTypes.length === 0) {
|
|
672
|
+
af.AllowedMimeTypes = AvailableFileExtensions
|
|
673
|
+
.concat(AvailableImageExtensions)
|
|
674
|
+
.map((ext) => ext.key);
|
|
675
|
+
}
|
|
676
|
+
break;
|
|
677
|
+
}
|
|
678
|
+
case FieldTypeEnum['Data e/o ora']: {
|
|
679
|
+
const df = field;
|
|
680
|
+
if (df.IsOnlyDate == null) {
|
|
681
|
+
df.IsOnlyDate = DateTimeTypeEnum['Solo data'];
|
|
682
|
+
}
|
|
683
|
+
break;
|
|
684
|
+
}
|
|
685
|
+
case FieldTypeEnum['Etichetta']: {
|
|
686
|
+
const lf = field;
|
|
687
|
+
if (!lf.Etichetta) {
|
|
688
|
+
lf.Etichetta = field.Description || 'Testo etichetta di esempio';
|
|
689
|
+
}
|
|
690
|
+
break;
|
|
691
|
+
}
|
|
692
|
+
case FieldTypeEnum['Booleano']: {
|
|
693
|
+
const bf = field;
|
|
694
|
+
if (bf.PresetationType == null) {
|
|
695
|
+
bf.PresetationType = BoolPresentantioEnum.Checkbox;
|
|
696
|
+
}
|
|
697
|
+
break;
|
|
698
|
+
}
|
|
699
|
+
default:
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
safeClone(obj) {
|
|
704
|
+
const seen = new WeakSet();
|
|
705
|
+
return JSON.parse(JSON.stringify(obj, (key, value) => {
|
|
706
|
+
if (key === 'FormFormGroup') {
|
|
707
|
+
return undefined;
|
|
708
|
+
}
|
|
709
|
+
if (typeof value === 'object' && value !== null) {
|
|
710
|
+
if (seen.has(value)) {
|
|
711
|
+
return undefined;
|
|
712
|
+
}
|
|
713
|
+
seen.add(value);
|
|
714
|
+
}
|
|
715
|
+
return value;
|
|
716
|
+
}));
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
FieldGraphicsEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldGraphicsEditorComponent, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
720
|
+
FieldGraphicsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FieldGraphicsEditorComponent, selector: "field-graphics-editor", inputs: { fields: "fields", endPointConfiguration: "endPointConfiguration", formulaObject: "formulaObject" }, outputs: { applyEvent: "applyEvent", cancelEvent: "cancelEvent" }, ngImport: i0, template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "component", type: i6.TextFieldTemplateComponent, selector: "text-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i7.BooleanFieldTemplateComponent, selector: "boolean-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i8.DateFieldTemplateComponent, selector: "date-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i9.TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i10.NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i11.ListValueFieldTemplateComponent, selector: "list-value-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i12.AttachmentFieldTemplateComponent, selector: "attachment-field-template", inputs: ["onlyImages", "field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "onAttachmentsChange"] }, { kind: "component", type: i13.ImageFieldTemplateComponent, selector: "image-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageDraw"] }, { kind: "component", type: i14.ImageFieldSelectorTemplateComponent, selector: "image-field-selector-template", inputs: ["record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i15.LabelFieldTemplateComponent, selector: "label-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i16.ImageWithMarkersFieldTemplateComponent, selector: "image-with-markers-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageMark"] }, { kind: "component", type: i17.ActionButtonFieldTemplateComponent, selector: "action-button-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["fireTrigger", "recordChange"] }] });
|
|
721
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldGraphicsEditorComponent, decorators: [{
|
|
722
|
+
type: Component,
|
|
723
|
+
args: [{ selector: 'field-graphics-editor', template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"] }]
|
|
724
|
+
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; }, propDecorators: { fields: [{
|
|
725
|
+
type: Input
|
|
726
|
+
}], endPointConfiguration: [{
|
|
727
|
+
type: Input
|
|
728
|
+
}], formulaObject: [{
|
|
729
|
+
type: Input
|
|
730
|
+
}], applyEvent: [{
|
|
731
|
+
type: Output
|
|
732
|
+
}], cancelEvent: [{
|
|
733
|
+
type: Output
|
|
734
|
+
}] } });
|
|
735
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFhLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsSSxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0YsT0FBTyxFQUFhLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFLckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RyxPQUFPLEVBQ0gseUJBQXlCLEVBRXpCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ3BCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNILGtCQUFrQixFQUNsQixtQkFBbUIsRUFH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LENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztpQkFBRTtnQkFDdkYsTUFBTTthQUNUO1lBQ0Q7Z0JBQ0ksTUFBTTtTQUNiO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBSSxHQUFNO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pELElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRTtnQkFBRSxPQUFPLFNBQVMsQ0FBQzthQUFFO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztpQkFBRTtnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzswSEF4dUJRLDRCQUE0Qjs4R0FBNUIsNEJBQTRCLDhPQy9EekMsaThqQkEwUkE7NEZEM05hLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDSSx1QkFBdUI7eUdBT3hCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQmFzZUZpZWxkLCBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCwgQXZhaWxhYmxlRmlsZUV4dGVuc2lvbnMsIEF2YWlsYWJsZUltYWdlRXh0ZW5zaW9ucyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgQm9vbGVhbkZpZWxkLCBCb29sUHJlc2VudGFudGlvRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYm9vbGVhbkZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZUZpZWxkLCBEYXRlVGltZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9kYXRlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbWFnZVNlbGVjdG9yRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlU2VsZWN0b3JGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IExhYmVsRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2xhYmVsRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgYnVpbGRDc3NDb2xvciwgY3NzQ29sb3JUb0FscGhhUGVyY2VudCwgY3NzQ29sb3JUb0hleCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Nzcy1jb2xvcic7XHJcbmltcG9ydCB7IGdldENzc0RlY2xhcmF0aW9uLCBwYXJzZUNzc0RlY2xhcmF0aW9ucywgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHtcclxuICAgIGJ1aWxkQ3VzdG9tQ3NzUHJvcGVydHlEZWYsXHJcbiAgICBDc3NQcm9wZXJ0eURlZixcclxuICAgIENTU19BTExfUFJPUEVSVElFUyxcclxuICAgIENTU19DT1JFX1BST1BFUlRJRVMsXHJcbiAgICBnZXRDc3NQcm9wZXJ0eURlZixcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtcHJvcGVydHktY2F0YWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgICBjbG9uZUZpZWxkU3R5bGVNYXAsXHJcbiAgICBlbnN1cmVGaWVsZFN0eWxlTWFwLFxyXG4gICAgRmllbGRTdHlsZUVudHJ5RGVmLFxyXG4gICAgRmllbGRTdHlsZVR5cGVEZWYsXHJcbiAgICBnZXRDb21tb25TdGF0ZXMsXHJcbiAgICBnZXRGaWVsZFN0eWxlRWxlbWVudHMsXHJcbiAgICBnZXRGaWVsZFN0eWxlVHlwZURlZixcclxuICAgIGdldEZpZWxkRGlzcGxheU5hbWUsXHJcbiAgICBnZXRFZmZlY3RpdmVTdHlsZU1hcCxcclxuICAgIGxlZ2FjeVRhcmdldEtleSxcclxuICAgIG1lcmdlTGVnYWN5U3R5bGVzSW50b01hcCxcclxuICAgIEdMT0JBTF9TVFlMRV9FTEVNRU5UUyxcclxuICAgIEdsb2JhbFN0eWxlRWxlbWVudERlZixcclxuICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyxcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9maWVsZC1zdHlsZS1jYXRhbG9nJztcclxuXHJcbi8qKiBVbiBncnVwcG8gcmFjY29nbGllIHR1dHRpIGkgY2FtcGkgc2VsZXppb25hdGkgY2hlIGNvbmRpdmlkb25vIGxhIHN0ZXNzYSB0aXBvbG9naWEgKi9cclxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFN0eWxlR3JvdXAge1xyXG4gICAgZGVmOiBGaWVsZFN0eWxlVHlwZURlZjtcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPjtcclxuICAgIGVsZW1lbnRzOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXBwYSBtb3N0cmF0YSBhIHZpZGVvOiBwYXJ0ZSBzZW1wcmUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIHNjZWx0byBjb21lIGNhbXBpb25lLFxyXG4gICAgICogY29uIHNvcHJhIGxlIG1vZGlmaWNoZSBhbmNvcmEgbm9uIGFwcGxpY2F0ZS4gVmEgcmljb3N0cnVpdGEgcXVhbmRvIGNhbWJpYSBpbCBjYW1waW9uZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgICAvKiogTW9kaWZpY2hlIGluIHNvc3Blc28sIGluZGljaXp6YXRlIHBlciBcIkVsZW1lbnRvU3RhdG98cHJvcHJpZXTDoFwiICovXHJcbiAgICBvdmVycmlkZXM6IHsgW2VudHJ5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICAgIC8qKiBUcnVlIHNlIGkgY2FtcGkgZGVsIGdydXBwbyBwYXJ0b25vIGRhIGdyYWZpY2hlIGRpdmVyc2UgZnJhIGxvcm8gKi9cclxuICAgIGhhc0RpZmZlcmVuY2VzOiBib29sZWFuO1xyXG4gICAgc2FtcGxlSW5kZXg6IG51bWJlcjtcclxuICAgIHNlbGVjdGVkU3RhdGU6IHN0cmluZztcclxuICAgIG9wZW5FbGVtZW50OiBzdHJpbmc7XHJcbiAgICBzaG93QWxsUHJvcGVydGllczogYm9vbGVhbjtcclxuICAgIHByZXZpZXdGaWVsZDogYW55O1xyXG4gICAgcHJldmlld1JlY29yZDogYW55O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZmllbGQtZ3JhcGhpY3MtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWVsZC1ncmFwaGljcy1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWVsZEdyYXBoaWNzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSBkZWwgY29uZmlndXJhdG9yZSAqL1xyXG4gICAgQElucHV0KCkgZmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICAgIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG5cclxuICAgIC8qKiBFbWVzc28gZG9wbyBhdmVyIHNjcml0dG8gbGUgbW9kaWZpY2hlIHN1aSBjYW1waSAqL1xyXG4gICAgQE91dHB1dCgpIGFwcGx5RXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBjYW5jZWxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG4gICAgZGlzcGxheU5hbWUgPSBnZXRGaWVsZERpc3BsYXlOYW1lO1xyXG5cclxuICAgIC8qKiBTY2hlZGEgYXR0aXZhOiBncmFmaWNhIHZhbGlkYSBwZXIgdHV0dGkgaSBjYW1waSwgb3BwdXJlIGRpdmlzYSBwZXIgdGlwb2xvZ2lhICovXHJcbiAgICBhY3RpdmVUYWI6ICdnbG9iYWxlJyB8ICdwZXJzb25hbGl6emF0YScgPSAnZ2xvYmFsZSc7XHJcblxyXG4gICAgZ3JvdXBzOiBBcnJheTxGaWVsZFN0eWxlR3JvdXA+ID0gW107XHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgY29uIHVuYSBncmFmaWNhIGNvbmZpZ3VyYWJpbGUgKGVzY2x1c2kgTG9va3VwIGUgRm9ybSBkaSBkZXR0YWdsaW8pICovXHJcbiAgICBzdHlsZWFibGVGaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4gPSBbXTtcclxuICAgIHVuc3VwcG9ydGVkRmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBhY3RpdmVHcm91cEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vI3JlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIGdsb2JhbEVsZW1lbnRzOiBBcnJheTxHbG9iYWxTdHlsZUVsZW1lbnREZWY+ID0gW107XHJcbiAgICBnbG9iYWxTdGF0ZXM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXTtcclxuICAgIGdsb2JhbFNlbGVjdGVkU3RhdGU6IHN0cmluZyA9ICdOb3JtYWxlJztcclxuICAgIGdsb2JhbE9wZW5FbGVtZW50OiBzdHJpbmcgPSAnJztcclxuICAgIGdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBnbG9iYWxTYW1wbGVJbmRleDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBNb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvLCBpbmRpY2l6emF0ZSBwZXIgXCJFbGVtZW50b0xvZ2ljb3xTdGF0b3xwcm9wcmlldMOgXCIgKi9cclxuICAgIGdsb2JhbE92ZXJyaWRlczogeyBbZW50cnk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBnbG9iYWxQcmV2aWV3RmllbGQ6IGFueSA9IG51bGw7XHJcbiAgICBnbG9iYWxQcmV2aWV3UmVjb3JkOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIC8qKiBJbmNyZW1lbnRhdG8gYWQgb2duaSBtb2RpZmljYSBwZXIgZm9yemFyZSBpbCByaWNhbGNvbG8gZGVnbGkgc3RpbGkgbmVsbGUgYW50ZXByaW1lICovXHJcbiAgICBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbml6aW9uaSBjcmVhdGUgYWwgdm9sbyBwZXIgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIGEgbWFubyBlIGZ1b3JpIGNhdGFsb2dvLlxyXG4gICAgICogVmFubm8gbWVtb3JpenphdGU6IHByb3BlcnRpZXNGb3IoKSB2aWVuZSByaWNoaWFtYXRhIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgICogZSByaWNyZWFyZSBnbGkgb2dnZXR0aSBmYXJlYmJlIHJpY29zdHJ1aXJlIGxlIHJpZ2hlLCBmYWNlbmRvIHBlcmRlcmUgaWwgZnVvY28gbWVudHJlIHNpIHNjcml2ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0eURlZnM6IHsgW3Byb3A6IHN0cmluZ106IENzc1Byb3BlcnR5RGVmIH0gPSB7fTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYnVpbGRHcm91cHMoKTtcclxuICAgICAgICB0aGlzLmJ1aWxkR2xvYmFsVGFiKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIENvc3RydXppb25lXHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3R5bGVhYmxlRmllbGRzID0gW107XHJcbiAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgICAodGhpcy5maWVsZHMgPz8gW10pLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgICAgICAgICBpZiAoIWRlZikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMucHVzaChmaWVsZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5maW5kKChnKSA9PiBOdW1iZXIoZy5kZWYuZmllbGRUeXBlKSA9PT0gTnVtYmVyKGRlZi5maWVsZFR5cGUpKTtcclxuICAgICAgICAgICAgaWYgKCFncm91cCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZCksXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVNYXA6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzRGlmZmVyZW5jZXM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RhdGU6IGRlZi5zdGF0ZXNbMF0/LmtleSA/PyAnTm9ybWFsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlbkVsZW1lbnQ6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZClbMF0/LmtleSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzaG93QWxsUHJvcGVydGllczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld0ZpZWxkOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdSZWNvcmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gSlNPTi5zdHJpbmdpZnkoY2xvbmVGaWVsZFN0eWxlTWFwKGdyb3VwLmZpZWxkc1swXSkpO1xyXG4gICAgICAgICAgICBncm91cC5oYXNEaWZmZXJlbmNlcyA9IGdyb3VwLmZpZWxkcy5zb21lKChmKSA9PiBKU09OLnN0cmluZ2lmeShjbG9uZUZpZWxkU3R5bGVNYXAoZikpICE9PSByZWZlcmVuY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRHcm91cChncm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlR3JvdXBJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdsb2JhbFRhYigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMuc3R5bGVhYmxlRmllbGRzLm1hcCgoZikgPT4gZi5GaWVsZFR5cGUpO1xyXG5cclxuICAgICAgICB0aGlzLmdsb2JhbEVsZW1lbnRzID0gR0xPQkFMX1NUWUxFX0VMRU1FTlRTLmZpbHRlcigoZykgPT5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMuc29tZSgoZikgPT4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGYsIGcua2V5KS5sZW5ndGggPiAwKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTdGF0ZXMgPSBnZXRDb21tb25TdGF0ZXModHlwZXMpO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZSA9IHRoaXMuZ2xvYmFsU3RhdGVzWzBdPy5rZXkgPz8gJ05vcm1hbGUnO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPSB0aGlzLmdsb2JhbEVsZW1lbnRzWzBdPy5rZXkgPz8gJyc7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMucmVidWlsZEdsb2JhbFByZXZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQ29zdHJ1emlvbmVcclxuXHJcbiAgICAvLyNyZWdpb24gU2NoZWRhIFwiR3JhZmljYSBwZXJzb25hbGl6emF0YVwiXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaWNvc3RydWlzY2UgbGEgbWFwcGEgbW9zdHJhdGEgcGVyIHVuIGdydXBwbzogcGFydGUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIGNhbXBpb25lXHJcbiAgICAgKiDigJQgY29zw6wgdW5hIGdyYWZpY2EgaW1wb3N0YXRhIGZ1b3JpIGRhIHF1ZXN0byBlZGl0b3IgdmllbmUgc2VtcHJlIHJpcG9ydGF0YSDigJQsIHBvaSBhcHBsaWNhXHJcbiAgICAgKiBsZSBtb2RpZmljaGUgZ2xvYmFsaSBlIGluZmluZSBxdWVsbGUgc3BlY2lmaWNoZSBkZWxsYSB0aXBvbG9naWEuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVidWlsZEdyb3VwKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSBncm91cC5maWVsZHNbZ3JvdXAuc2FtcGxlSW5kZXhdID8/IGdyb3VwLmZpZWxkc1swXTtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy8gTGEgYmFzZSBjb21wcmVuZGUgaWwgQ1NTIGxlZ2FjeSBhc3NvcmJpdG8sIGFsdHJpbWVudGkgbCdlZGl0b3IgbW9zdHJlcmViYmVcclxuICAgICAgICAvLyBcIm5vbiBpbXBvc3RhdG9cIiBzdSBwcm9wcmlldMOgIGNoZSBhIHZpZGVvIHNpIHZlZG9ubyBlY2NvbWUgKGFwcGxpY2F0ZSBpbmxpbmUpXHJcbiAgICAgICAgZ3JvdXAuc3R5bGVNYXAgPSBnZXRFZmZlY3RpdmVTdHlsZU1hcChzYW1wbGUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlHbG9iYWxPdmVycmlkZXNUb01hcChzYW1wbGUsIGdyb3VwLnN0eWxlTWFwKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAub3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgdGhpcy53cml0ZUludG9NYXAoZ3JvdXAuc3R5bGVNYXAsIGtleSwgcHJvcCwgZ3JvdXAub3ZlcnJpZGVzW2VudHJ5XSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVpbGRQcmV2aWV3KGdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmljcmVhIGlsIGNhbXBvIGZpdHRpemlvIHVzYXRvIGRhbGwnYW50ZXByaW1hLCBhZ2dhbmNpYW5kb2dsaSBsYSBtYXBwYSBtb3N0cmF0YSAqL1xyXG4gICAgcHJpdmF0ZSBidWlsZFByZXZpZXcoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdyb3VwLmZpZWxkc1tncm91cC5zYW1wbGVJbmRleF0gPz8gZ3JvdXAuZmllbGRzWzBdO1xyXG4gICAgICAgIGlmICghc291cmNlKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuYnVpbGRQcmV2aWV3RmllbGQoc291cmNlLCBncm91cC5zdHlsZU1hcCk7XHJcblxyXG4gICAgICAgIGdyb3VwLmVsZW1lbnRzID0gZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGNsb25lKTtcclxuICAgICAgICBpZiAoIWdyb3VwLmVsZW1lbnRzLnNvbWUoKGUpID0+IGUua2V5ID09PSBncm91cC5vcGVuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgZ3JvdXAub3BlbkVsZW1lbnQgPSBncm91cC5lbGVtZW50c1swXT8ua2V5ID8/ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ3JvdXAucHJldmlld0ZpZWxkID0gY2xvbmU7XHJcbiAgICAgICAgZ3JvdXAucHJldmlld1JlY29yZCA9IHsgW2Nsb25lLk5hbWVdOiB0aGlzLmdldFByZXZpZXdJbml0aWFsVmFsdWUoY2xvbmUpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYWN0aXZlR3JvdXAoKTogRmllbGRTdHlsZUdyb3VwIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RoaXMuYWN0aXZlR3JvdXBJbmRleF0gPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RHcm91cChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVHcm91cEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RTdGF0ZShncm91cDogRmllbGRTdHlsZUdyb3VwLCBzdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ3JvdXAuc2VsZWN0ZWRTdGF0ZSA9IHN0YXRlS2V5O1xyXG4gICAgICAgIHRoaXMuc3R5bGVWZXJzaW9uKys7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRWxlbWVudChncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBncm91cC5vcGVuRWxlbWVudCA9IGdyb3VwLm9wZW5FbGVtZW50ID09PSBlbGVtZW50S2V5ID8gJycgOiBlbGVtZW50S2V5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDYW1iaWFuZG8gY2FtcGlvbmUgc2kgcmlsZWdnb25vIGkgc3VvaSBzdGlsaSByZWFsaSwgbWFudGVuZW5kbyBsZSBtb2RpZmljaGUgaW4gc29zcGVzbyAqL1xyXG4gICAgY2hhbmdlU2FtcGxlKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBncm91cC5zYW1wbGVJbmRleCA9IE51bWJlcihpbmRleCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkR3JvdXAoZ3JvdXApO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwRmllbGROYW1lcyhncm91cDogRmllbGRTdHlsZUdyb3VwKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gZ3JvdXAuZmllbGRzLm1hcCgoZikgPT4gZ2V0RmllbGREaXNwbGF5TmFtZShmKSkuam9pbignLCAnKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2FtcGxlRmllbGRMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLmFjdGl2ZUdyb3VwO1xyXG4gICAgICAgIGlmICghZykgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICBjb25zdCBmID0gZy5maWVsZHNbZy5zYW1wbGVJbmRleF0gPz8gZy5maWVsZHNbMF07XHJcbiAgICAgICAgcmV0dXJuIGYgPyBnZXRGaWVsZERpc3BsYXlOYW1lKGYpIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgcGVyc29uYWxpenphdGFcIlxyXG5cclxuICAgIC8vI3JlZ2lvbiBTY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIHNlbGVjdFRhYih0YWI6ICdnbG9iYWxlJyB8ICdwZXJzb25hbGl6emF0YScpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcclxuICAgICAgICAvLyBQYXNzYW5kbyBhbGxhIHNjaGVkYSBwZXIgdGlwb2xvZ2lhIGkgdmFsb3JpIGRldm9ubyBnacOgIGluY2x1ZGVyZSBsZSBtb2RpZmljaGUgZ2xvYmFsaVxyXG4gICAgICAgIGlmICh0YWIgPT09ICdwZXJzb25hbGl6emF0YScpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5yZWJ1aWxkR3JvdXAoZykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVidWlsZEdsb2JhbFByZXZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RHbG9iYWxTdGF0ZShzdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlID0gc3RhdGVLZXk7XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVHbG9iYWxFbGVtZW50KGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPSB0aGlzLmdsb2JhbE9wZW5FbGVtZW50ID09PSBlbGVtZW50S2V5ID8gJycgOiBlbGVtZW50S2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUdsb2JhbFNhbXBsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA9IE51bWJlcihpbmRleCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkR2xvYmFsUHJldmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnbG9iYWxTYW1wbGVGaWVsZCgpOiBCYXNlRmllbGQgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZWFibGVGaWVsZHNbdGhpcy5nbG9iYWxTYW1wbGVJbmRleF0gPz8gdGhpcy5zdHlsZWFibGVGaWVsZHNbMF0gPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJ1ZSBzZSBsJ2VsZW1lbnRvIGxvZ2ljbyBub24gZXNpc3RlIHN1bCBjYW1wbyBhdHR1YWxtZW50ZSBpbiBhbnRlcHJpbWEgKi9cclxuICAgIGlzR2xvYmFsRWxlbWVudE1pc3NpbmdPblNhbXBsZShlbGVtZW50S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmdsb2JhbFNhbXBsZUZpZWxkO1xyXG4gICAgICAgIGlmICghc2FtcGxlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlR2xvYmFsRWxlbWVudEtleXMoc2FtcGxlLCBlbGVtZW50S2V5KS5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkR2xvYmFsUHJldmlldygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmdsb2JhbFNhbXBsZUZpZWxkO1xyXG4gICAgICAgIGlmICghc2FtcGxlKSB7IHRoaXMuZ2xvYmFsUHJldmlld0ZpZWxkID0gbnVsbDsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1hcCA9IGdldEVmZmVjdGl2ZVN0eWxlTWFwKHNhbXBsZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKHNhbXBsZSwgbWFwKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmJ1aWxkUHJldmlld0ZpZWxkKHNhbXBsZSwgbWFwKTtcclxuICAgICAgICB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA9IGNsb25lO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsUHJldmlld1JlY29yZCA9IHsgW2Nsb25lLk5hbWVdOiB0aGlzLmdldFByZXZpZXdJbml0aWFsVmFsdWUoY2xvbmUpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICAvKiogUml2ZXJzYSBsZSBtb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvIHN1IHVuYSBtYXBwYSBzdGlsaSwgcmlzb2x0ZSBwZXIgcXVlbCBjYW1wbyAqL1xyXG4gICAgcHJpdmF0ZSBhcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKGZpZWxkOiBCYXNlRmllbGQsIG1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHR5cGVEZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgICAgICBpZiAoIXR5cGVEZWYpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGVudHJ5LnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGZpZWxkLCBnbG9iYWxLZXkpLmZvckVhY2goKHJlYWxLZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKG1hcCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTdHlsZUtleXNGb3JTYW1wbGUoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gW107IH1cclxuICAgICAgICByZXR1cm4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkubWFwKChrKSA9PiBrICsgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsb3JlIG1vc3RyYXRvIHBlciB1bmEgcHJvcHJpZXTDoCBnbG9iYWxlOiBxdWVsbG8gcmVhbGUgZGVsIGNhbXBpb25lIHBpw7kgbGUgbW9kaWZpY2hlICovXHJcbiAgICBnZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IGAke2VsZW1lbnRLZXl9fCR7dGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlfXwke3Byb3AudG9Mb3dlckNhc2UoKX1gO1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5nbG9iYWxPdmVycmlkZXMsIGVudHJ5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxPdmVycmlkZXNbZW50cnldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5cyA9IHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhzYW1wbGUsIGVsZW1lbnRLZXkpO1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3QgbWFwID0gZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKTtcclxuICAgICAgICByZXR1cm4gZ2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleXNbMF0gKyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVdID8/ICcnLCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSBgJHtlbGVtZW50S2V5fXwke3RoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZX18JHtwcm9wLnRvTG93ZXJDYXNlKCl9YDtcclxuICAgICAgICB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0gPSAodmFsdWUgPz8gJycpLnRyaW0oKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRHbG9iYWxQcmV2aWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRHbG9iYWxQcm9wZXJ0eShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNHbG9iYWxQcm9wZXJ0eVNldChlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUHJvcHJpZXTDoCBtb3N0cmF0ZSBuZWxsYSBzY2hlZGEgZ2xvYmFsZSBwZXIgdW4gZWxlbWVudG8gbG9naWNvICovXHJcbiAgICBnbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXk6IHN0cmluZyk6IEFycmF5PENzc1Byb3BlcnR5RGVmPiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDc3NQcm9wZXJ0eURlZj4gPSB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgID8gQ1NTX0FMTF9QUk9QRVJUSUVTLnNsaWNlKClcclxuICAgICAgICAgICAgOiBDU1NfQ09SRV9QUk9QRVJUSUVTLnNsaWNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZ2xvYmFsU2FtcGxlRmllbGQ7XHJcbiAgICAgICAgY29uc3QgdmFsb3JpemVkOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChzYW1wbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKTtcclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkuZm9yRWFjaCgocmVhbEtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VDc3NEZWNsYXJhdGlvbnMobWFwW3JlYWxLZXkgKyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVdID8/ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChkKSA9PiB7IGlmICghdmFsb3JpemVkLmluY2x1ZGVzKGQucHJvcCkpIHsgdmFsb3JpemVkLnB1c2goZC5wcm9wKTsgfSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzICYmIHBhcnRzWzBdID09PSBlbGVtZW50S2V5ICYmIHBhcnRzWzFdID09PSB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVcclxuICAgICAgICAgICAgICAgICYmIHRoaXMuZ2xvYmFsT3ZlcnJpZGVzW2VudHJ5XSAmJiAhdmFsb3JpemVkLmluY2x1ZGVzKHBhcnRzWzJdKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JpemVkLnB1c2gocGFydHNbMl0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHVzaFZhbG9yaXplZChyZXN1bHQsIHZhbG9yaXplZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTZXRQcm9wZXJ0aWVzQ291bnQoZWxlbWVudEtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHRoaXMuaXNHbG9iYWxQcm9wZXJ0eVNldChlbGVtZW50S2V5LCBwLnByb3ApKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgZ2xvYmFsZVwiXHJcblxyXG4gICAgLy8jcmVnaW9uIExldHR1cmEvc2NyaXR0dXJhIHByb3ByaWV0w6AgcGVyIHRpcG9sb2dpYVxyXG5cclxuICAgIC8qKiBDaGlhdmUgZGVsbGEgbWFwcGEgc3RpbGk6IFwiRWxlbWVudG9cIiArIFwiU3RhdG9cIiAoZXMuIElucHV0Rm9jdXNlZCkgKi9cclxuICAgIHN0eWxlS2V5KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRLZXkgKyBncm91cC5zZWxlY3RlZFN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcHJpZXTDoCBtb3N0cmF0ZSBwZXIgdW4gZWxlbWVudG86IHF1ZWxsZSBkaSBiYXNlLCBwacO5IHF1ZWxsZSBnacOgIHZhbG9yaXp6YXRlXHJcbiAgICAgKiAoYW5jaGUgc2Ugc2NyaXR0ZSBhIG1hbm8gZSBmdW9yaSBjYXRhbG9nbyksIHBpw7kgdHV0dGUgbGUgYWx0cmUgc2UgcmljaGllc3RvLlxyXG4gICAgICovXHJcbiAgICBwcm9wZXJ0aWVzRm9yKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IEFycmF5PENzc1Byb3BlcnR5RGVmPiB7XHJcbiAgICAgICAgY29uc3QgY3NzID0gZ3JvdXAuc3R5bGVNYXBbdGhpcy5zdHlsZUtleShncm91cCwgZWxlbWVudEtleSldID8/ICcnO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q3NzUHJvcGVydHlEZWY+ID0gZ3JvdXAuc2hvd0FsbFByb3BlcnRpZXNcclxuICAgICAgICAgICAgPyBDU1NfQUxMX1BST1BFUlRJRVMuc2xpY2UoKVxyXG4gICAgICAgICAgICA6IENTU19DT1JFX1BST1BFUlRJRVMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wdXNoVmFsb3JpemVkKHJlc3VsdCwgcGFyc2VDc3NEZWNsYXJhdGlvbnMoY3NzKS5tYXAoKGQpID0+IGQucHJvcCkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwdXNoVmFsb3JpemVkKHJlc3VsdDogQXJyYXk8Q3NzUHJvcGVydHlEZWY+LCB2YWxvcml6ZWQ6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICB2YWxvcml6ZWQuZm9yRWFjaCgocHJvcCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnNvbWUoKHApID0+IHAucHJvcCA9PT0gcHJvcCkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXRhbG9ndWVkID0gZ2V0Q3NzUHJvcGVydHlEZWYocHJvcCk7XHJcbiAgICAgICAgICAgIGlmIChjYXRhbG9ndWVkKSB7IHJlc3VsdC5wdXNoKGNhdGFsb2d1ZWQpOyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXN0b21Qcm9wZXJ0eURlZnNbcHJvcF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tUHJvcGVydHlEZWZzW3Byb3BdID0gYnVpbGRDdXN0b21Dc3NQcm9wZXJ0eURlZihwcm9wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmN1c3RvbVByb3BlcnR5RGVmc1twcm9wXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvcGVydGllc0NvdW50KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlQ3NzRGVjbGFyYXRpb25zKGdyb3VwLnN0eWxlTWFwW3RoaXMuc3R5bGVLZXkoZ3JvdXAsIGVsZW1lbnRLZXkpXSA/PyAnJykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByb3BlcnR5VmFsdWUoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBnZXRDc3NEZWNsYXJhdGlvbihncm91cC5zdHlsZU1hcFt0aGlzLnN0eWxlS2V5KGdyb3VwLCBlbGVtZW50S2V5KV0gPz8gJycsIHByb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFByb3BlcnR5VmFsdWUoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0eWxlS2V5KGdyb3VwLCBlbGVtZW50S2V5KTtcclxuICAgICAgICBjb25zdCBjbGVhbiA9ICh2YWx1ZSA/PyAnJykudHJpbSgpO1xyXG5cclxuICAgICAgICB0aGlzLndyaXRlSW50b01hcChncm91cC5zdHlsZU1hcCwga2V5LCBwcm9wLCBjbGVhbik7XHJcbiAgICAgICAgZ3JvdXAub3ZlcnJpZGVzW2Ake2tleX18JHtwcm9wLnRvTG93ZXJDYXNlKCl9YF0gPSBjbGVhbjtcclxuICAgICAgICB0aGlzLnN0eWxlVmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UHJvcGVydHkoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoZ3JvdXAsIGVsZW1lbnRLZXksIHByb3AsICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Byb3BlcnR5U2V0KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGdyb3VwLCBlbGVtZW50S2V5LCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gTGV0dHVyYS9zY3JpdHR1cmEgcHJvcHJpZXTDoCBwZXIgdGlwb2xvZ2lhXHJcblxyXG4gICAgLy8jcmVnaW9uIENvbnRyb2xsaSBjb2xvcmUgZSBtaXN1cmFcclxuXHJcbiAgICBjb2xvckhleCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGNzc0NvbG9yVG9IZXgodmFsdWUpOyB9XHJcbiAgICBjb2xvckFscGhhKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgeyByZXR1cm4gY3NzQ29sb3JUb0FscGhhUGVyY2VudCh2YWx1ZSk7IH1cclxuICAgIGJ1aWxkQ29sb3IoaGV4OiBzdHJpbmcsIGFscGhhOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gYnVpbGRDc3NDb2xvcihoZXgsIE51bWJlcihhbHBoYSkpOyB9XHJcblxyXG4gICAgLyoqIFBhcnRlIG51bWVyaWNhIGRpIHVuYSBtaXN1cmEgKFwiMTRweFwiIC0+IDE0KTsgaWwgbWluaW1vIGRlbCBjYXRhbG9nbyBzZSBub24gaW1wb3N0YXRhICovXHJcbiAgICBzaXplTnVtYmVyKHZhbHVlOiBzdHJpbmcsIGRlZmluaXRpb246IENzc1Byb3BlcnR5RGVmKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgeyByZXR1cm4gZGVmaW5pdGlvbi5taW4gPz8gMDsgfVxyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRTaXplKGRlZmluaXRpb246IENzc1Byb3BlcnR5RGVmLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09IG51bGwgfHwgaXNOYU4obnVtZXJpYykpIHsgcmV0dXJuICcnOyB9XHJcbiAgICAgICAgcmV0dXJuIGAke251bWVyaWN9JHtkZWZpbml0aW9uLnVuaXQgPz8gJyd9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQ29udHJvbGxpIGNvbG9yZSBlIG1pc3VyYVxyXG5cclxuICAgIC8vI3JlZ2lvbiBBcHBsaWNhemlvbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpdmVyc2Egc3VpIGNhbXBpIHNlbGV6aW9uYXRpIHNvbHRhbnRvIGxlIHByb3ByaWV0w6AgZWZmZXR0aXZhbWVudGUgdG9jY2F0ZTogcHJpbWEgcXVlbGxlXHJcbiAgICAgKiBnbG9iYWxpLCBwb2kgcXVlbGxlIGRlbGxhIHNpbmdvbGEgdGlwb2xvZ2lhLCBjaGUgcXVpbmRpIGhhbm5vIGxhIHByZWNlZGVuemEuIFR1dHRlIGxlIGFsdHJlXHJcbiAgICAgKiByZWdvbGUgZ2nDoCBwcmVzZW50aSBzdWkgc2luZ29saSBjYW1waSByZXN0YW5vIGludGF0dGUuXHJcbiAgICAgKi9cclxuICAgIGFwcGx5KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSB0aGlzLmNvbGxlY3RXcml0ZVRhcmdldHMoKTtcclxuICAgICAgICB0aGlzLmFic29yYkxlZ2FjeVdoZXJlTmVlZGVkKHRhcmdldHMpO1xyXG5cclxuICAgICAgICB0YXJnZXRzLmZvckVhY2goKHdyaXRlcywgZmllbGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICghbWFwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICB3cml0ZXMuZm9yRWFjaCgodmFsdWUsIGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKG1hcCwga2V5LCBwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwYW5kZSBsZSBtb2RpZmljaGUgaW4gc29zcGVzbyBpbiBzY3JpdHR1cmUgY29uY3JldGUgcGVyIGNhbXBvOiBwcmltYSBxdWVsbGUgZ2xvYmFsaSxcclxuICAgICAqIHBvaSBxdWVsbGUgZGVsbGEgc2luZ29sYSB0aXBvbG9naWEsIGNoZSBxdWluZGkgaGFubm8gbGEgcHJlY2VkZW56YS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb2xsZWN0V3JpdGVUYXJnZXRzKCk6IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXRzID0gbmV3IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IChmaWVsZDogQmFzZUZpZWxkLCBrZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0cy5oYXMoZmllbGQpKSB7IHRhcmdldHMuc2V0KGZpZWxkLCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpKTsgfVxyXG4gICAgICAgICAgICB0YXJnZXRzLmdldChmaWVsZCkuc2V0KGAke2tleX18JHtwcm9wfWAsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnN0eWxlYWJsZUZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlRGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoZmllbGQ/LkZpZWxkVHlwZSk7XHJcbiAgICAgICAgICAgIGlmICghdHlwZURlZikgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhmaWVsZCwgZ2xvYmFsS2V5KS5mb3JFYWNoKChyZWFsS2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZShmaWVsZCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhncm91cC5vdmVycmlkZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gbm90ZShmaWVsZCwga2V5LCBwcm9wLCBncm91cC5vdmVycmlkZXNbZW50cnldKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElsIENTUyBsZWdhY3kgdmllbmUgYXBwbGljYXRvIGRhaSB0ZW1wbGF0ZSBjb21lIHN0aWxlIGlubGluZSBlIGJhdHRlcmViYmUgbGUgcmVnb2xlXHJcbiAgICAgKiBpbmlldHRhdGU6IGRvdmUgbCdlZGl0b3Igc3RhIHBlciBzY3JpdmVyZSwgbG8gc2kgYXNzb3JiZSBuZWxsYSBtYXBwYSBwZXIgZWxlbWVudG8gZVxyXG4gICAgICogc2kgYXp6ZXJhIGxhIHByb3ByaWV0w6AgbGVnYWN5LiBSZXN0YW5vIGludGF0dGUgbGUgcHJvcHJpZXTDoCBsZWdhY3kgc3UgZWxlbWVudGkgbm9uIHRvY2NhdGkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWJzb3JiTGVnYWN5V2hlcmVOZWVkZWQodGFyZ2V0czogTWFwPEJhc2VGaWVsZCwgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcclxuICAgICAgICB0YXJnZXRzLmZvckVhY2goKHdyaXRlcywgZmllbGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLndyaXRlcy5rZXlzKCldLm1hcCgoZSkgPT4gdGhpcy5zcGxpdEVudHJ5KGUpLmtleSkpO1xyXG5cclxuICAgICAgICAgICAgKFsnTGFiZWxzdHlsZUNTUycsICdGaWVsZHN0eWxlQ1NTJ10gYXMgQXJyYXk8J0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnPikuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3NzID0gKGZpZWxkIGFzIGFueSlbbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNzcyB8fCAhU3RyaW5nKGNzcykudHJpbSgpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGxlZ2FjeVRhcmdldEtleShmaWVsZCwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCB8fCAha2V5cy5oYXModGFyZ2V0KSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBlbnN1cmVGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWFwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtZXJnZUxlZ2FjeVN0eWxlc0ludG9NYXAoZmllbGQsIG1hcCwgbmFtZSkuY29uc3VtZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIChmaWVsZCBhcyBhbnkpW25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoYXNDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICB8fCB0aGlzLmdyb3Vwcy5zb21lKChnKSA9PiBPYmplY3Qua2V5cyhnLm92ZXJyaWRlcykubGVuZ3RoID4gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNoYW5nZXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoXHJcbiAgICAgICAgICAgICsgdGhpcy5ncm91cHMucmVkdWNlKChuLCBnKSA9PiBuICsgT2JqZWN0LmtleXMoZy5vdmVycmlkZXMpLmxlbmd0aCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIEFwcGxpY2F6aW9uZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTdHJhdG8gY29tdW5lIGFsbGUgZHVlIHNjaGVkZVxyXG4gICAgLy8gSWwgdGVtcGxhdGUgZGVsbGUgcmlnaGUtcHJvcHJpZXTDoCDDqCB1bmljbzogcXVlc3RlIHByb3ByaWV0w6AgaW5zdHJhZGFubyBsZXR0dXJhIGVcclxuICAgIC8vIHNjcml0dHVyYSBzdWxsYSBzY2hlZGEgYXR0aXZhLCBldml0YW5kbyBkaSBkdXBsaWNhcmUgaWwgbWFya3VwIGRlaSBjb250cm9sbGkuXHJcblxyXG4gICAgZ2V0IGN1cnJlbnRFbGVtZW50cygpOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuZ2xvYmFsRWxlbWVudHMgOiAodGhpcy5hY3RpdmVHcm91cD8uZWxlbWVudHMgPz8gW10pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50U3RhdGVzKCk6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxTdGF0ZXMgOiAodGhpcy5hY3RpdmVHcm91cD8uZGVmLnN0YXRlcyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTZWxlY3RlZFN0YXRlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGUgOiAodGhpcy5hY3RpdmVHcm91cD8uc2VsZWN0ZWRTdGF0ZSA/PyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3VycmVudFN0YXRlKHN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLnNlbGVjdEdsb2JhbFN0YXRlKHN0YXRlS2V5KTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5zZWxlY3RTdGF0ZSh0aGlzLmFjdGl2ZUdyb3VwLCBzdGF0ZUtleSk7IH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudE9wZW5FbGVtZW50KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbE9wZW5FbGVtZW50IDogKHRoaXMuYWN0aXZlR3JvdXA/Lm9wZW5FbGVtZW50ID8/ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVDdXJyZW50RWxlbWVudChlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLnRvZ2dsZUdsb2JhbEVsZW1lbnQoZWxlbWVudEtleSk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMudG9nZ2xlRWxlbWVudCh0aGlzLmFjdGl2ZUdyb3VwLCBlbGVtZW50S2V5KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50U2hvd0FsbFByb3BlcnRpZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzIDogKHRoaXMuYWN0aXZlR3JvdXA/LnNob3dBbGxQcm9wZXJ0aWVzID8/IGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVDdXJyZW50U2hvd0FsbCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzID0gIXRoaXMuZ2xvYmFsU2hvd0FsbFByb3BlcnRpZXM7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMuYWN0aXZlR3JvdXAuc2hvd0FsbFByb3BlcnRpZXMgPSAhdGhpcy5hY3RpdmVHcm91cC5zaG93QWxsUHJvcGVydGllczsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJvd1Byb3BlcnRpZXMoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8Q3NzUHJvcGVydHlEZWY+IHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXAgPyB0aGlzLnByb3BlcnRpZXNGb3IodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByb3dDb3VudChlbGVtZW50S2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHJldHVybiB0aGlzLmdsb2JhbFNldFByb3BlcnRpZXNDb3VudChlbGVtZW50S2V5KTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwID8gdGhpcy5zZXRQcm9wZXJ0aWVzQ291bnQodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJvd0dldChlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScpIHsgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wKTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwID8gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXksIHByb3ApIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScpIHsgdGhpcy5zZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJvd0lzU2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93UmVzZXQoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBwcm9wLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbG9yZTogbGEgcGFzdGlnbGlhIGUgbG8gc2xpZGVyIGxhdm9yYW5vIGluc2llbWUgc3VsbG8gc3Rlc3NvIHZhbG9yZSAqL1xyXG4gICAgcm93U2V0Q29sb3JIZXgoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIGhleDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxwaGEgPSB0aGlzLmNvbG9yQWxwaGEodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIGFscGhhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0Q29sb3JBbHBoYShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZywgYWxwaGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMuY29sb3JIZXgodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIE51bWJlcihhbHBoYSkpKTtcclxuICAgIH1cclxuXHJcbiAgICByb3dTZXRTaXplKGVsZW1lbnRLZXk6IHN0cmluZywgZGVmaW5pdGlvbjogQ3NzUHJvcGVydHlEZWYsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBkZWZpbml0aW9uLnByb3AsIHRoaXMuYnVpbGRTaXplKGRlZmluaXRpb24sIHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFN0cmF0byBjb211bmUgYWxsZSBkdWUgc2NoZWRlXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYSBjb211bmVcclxuXHJcbiAgICBnZXQgY3VycmVudFNhbXBsZUZpZWxkcygpOiBBcnJheTxCYXNlRmllbGQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuc3R5bGVhYmxlRmllbGRzIDogKHRoaXMuYWN0aXZlR3JvdXA/LmZpZWxkcyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTYW1wbGVJbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5zYW1wbGVJbmRleCA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDdXJyZW50U2FtcGxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLmNoYW5nZUdsb2JhbFNhbXBsZShpbmRleCk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMuY2hhbmdlU2FtcGxlKHRoaXMuYWN0aXZlR3JvdXAsIGluZGV4KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50UHJldmlld0ZpZWxkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5wcmV2aWV3RmllbGQgPz8gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRQcmV2aWV3UmVjb3JkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdSZWNvcmQgOiAodGhpcy5hY3RpdmVHcm91cD8ucHJldmlld1JlY29yZCA/PyBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGlwb2xvZ2lhIGRlbCBjYW1wbyBtb3N0cmF0byBpbiBhbnRlcHJpbWEsIHBlciBzY2VnbGllcmUgaWwgdGVtcGxhdGUgZ2l1c3RvICovXHJcbiAgICBnZXQgY3VycmVudFByZXZpZXdUeXBlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmN1cnJlbnRQcmV2aWV3RmllbGQ/LkZpZWxkVHlwZSA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQW50ZXByaW1hIGNvbXVuZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBVdGlsaXTDoFxyXG5cclxuICAgIC8qKiBTY3JpdmUgKG8gcmltdW92ZSwgc2UgaWwgdmFsb3JlIMOoIHZ1b3RvKSB1bmEgcHJvcHJpZXTDoCBkZW50cm8gdW5hIG1hcHBhIHN0aWxpICovXHJcbiAgICBwcml2YXRlIHdyaXRlSW50b01hcChtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkID0gc2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleV0gPz8gJycsIHByb3AsIHZhbHVlKTtcclxuICAgICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgICAgICBtYXBba2V5XSA9IHVwZGF0ZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmltb3NzYSBkZWwgdHV0dG86IGlsIEpTT04gc2FsdmF0byByZXN0YSBjb21wYXR0b1xyXG4gICAgICAgICAgICBkZWxldGUgbWFwW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3BsaXRFbnRyeShlbnRyeTogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgcHJvcDogc3RyaW5nIH0ge1xyXG4gICAgICAgIGNvbnN0IGkgPSBlbnRyeS5sYXN0SW5kZXhPZignfCcpO1xyXG4gICAgICAgIHJldHVybiB7IGtleTogZW50cnkuc2xpY2UoMCwgaSksIHByb3A6IGVudHJ5LnNsaWNlKGkgKyAxKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQnlQcm9wKF9pbmRleDogbnVtYmVyLCBkZWZpbml0aW9uOiBDc3NQcm9wZXJ0eURlZik6IHN0cmluZyB7IHJldHVybiBkZWZpbml0aW9uLnByb3A7IH1cclxuICAgIHRyYWNrQnlLZXkoX2luZGV4OiBudW1iZXIsIGVudHJ5OiB7IGtleTogc3RyaW5nIH0pOiBzdHJpbmcgeyByZXR1cm4gZW50cnkua2V5OyB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFV0aWxpdMOgXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYVxyXG5cclxuICAgIC8qKiBDcmVhIGlsIGNhbXBvIGZpdHRpemlvIGRlbGwnYW50ZXByaW1hIGFnZ2FuY2lhbmRvZ2xpIGxhIG1hcHBhIHN0aWxpIHBhc3NhdGEgKi9cclxuICAgIHByaXZhdGUgYnVpbGRQcmV2aWV3RmllbGQoc291cmNlOiBCYXNlRmllbGQsIHN0eWxlTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogYW55IHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuc2FmZUNsb25lKHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgZGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoY2xvbmUuRmllbGRUeXBlKTtcclxuICAgICAgICBpZiAoZGVmKSB7IChjbG9uZSBhcyBhbnkpW2RlZi5zdHlsZVByb3BdID0gc3R5bGVNYXA7IH1cclxuXHJcbiAgICAgICAgLy8gSWwgbGVnYWN5IGUnIGdpYScgZGVudHJvIHN0eWxlTWFwOiBsYXNjaWFybG8gcXVpIGxvIHJpYXBwbGljaGVyZWJiZSBpbmxpbmUsXHJcbiAgICAgICAgLy8gY29wcmVuZG8gbGUgcmVnb2xlIGluaWV0dGF0ZSBlIG1vc3RyYW5kbyB1bidhbnRlcHJpbWEgZmFsc2FcclxuICAgICAgICBjbG9uZS5MYWJlbHN0eWxlQ1NTID0gbnVsbDtcclxuICAgICAgICBjbG9uZS5GaWVsZHN0eWxlQ1NTID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udHJvbE5hbWUgPSBjbG9uZS5MYWJlbCB8fCAncHJldmlld19maWVsZCc7XHJcbiAgICAgICAgY2xvbmUuTmFtZSA9IGNvbnRyb2xOYW1lO1xyXG5cclxuICAgICAgICB0aGlzLnByZXBhcmVUeXBlU3BlY2lmaWNQcmV2aWV3KGNsb25lKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdGhpcy5nZXRQcmV2aWV3SW5pdGlhbFZhbHVlKGNsb25lKTtcclxuICAgICAgICBjbG9uZS5Gb3JtRm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7IFtjb250cm9sTmFtZV06IFtpbml0aWFsVmFsdWVdIH0pO1xyXG4gICAgICAgIHJldHVybiBjbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFByZXZpZXdJbml0aWFsVmFsdWUoZmllbGQ6IEJhc2VGaWVsZCk6IGFueSB7XHJcbiAgICAgICAgc3dpdGNoIChOdW1iZXIoZmllbGQuRmllbGRUeXBlKSkge1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0FsbGVnYXRvJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydCb29sZWFubyddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaWVsZCBhcyBMYWJlbEZpZWxkKS5FdGljaGV0dGEgfHwgZmllbGQuRGVzY3JpcHRpb24gfHwgJ1Rlc3RvIGV0aWNoZXR0YSBkaSBlc2VtcGlvJztcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydFbGVuY28gZ2VuZXJpY28nXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLklzTXVsdGlDaG9pY2hlID8gW10gOiBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBpbW1hZ2luaSddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaWVsZCBhcyBJbWFnZVNlbGVjdG9yRmllbGQpLklzTXVsdGlDaG9pY2hlID8gW10gOiBudWxsO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29tcGxldGEgaWwgY2FtcG8gZGkgYW50ZXByaW1hIGNvbiBpIHZhbG9yaSBtaW5pbWkgcmljaGllc3RpIGRhaSBzaW5nb2xpIHRlbXBsYXRlICovXHJcbiAgICBwcml2YXRlIHByZXBhcmVUeXBlU3BlY2lmaWNQcmV2aWV3KGZpZWxkOiBCYXNlRmllbGQpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKE51bWJlcihmaWVsZC5GaWVsZFR5cGUpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnQWxsZWdhdG8nXToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWYgPSBmaWVsZCBhcyBBdHRhY2htZW50RmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFmLkFsbG93ZWRNaW1lVHlwZXMgfHwgYWYuQWxsb3dlZE1pbWVUeXBlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhZi5BbGxvd2VkTWltZVR5cGVzID0gQXZhaWxhYmxlRmlsZUV4dGVuc2lvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChBdmFpbGFibGVJbWFnZUV4dGVuc2lvbnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGV4dCkgPT4gZXh0LmtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0RhdGEgZS9vIG9yYSddOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZiA9IGZpZWxkIGFzIERhdGVGaWVsZDtcclxuICAgICAgICAgICAgICAgIGlmIChkZi5Jc09ubHlEYXRlID09IG51bGwpIHsgZGYuSXNPbmx5RGF0ZSA9IERhdGVUaW1lVHlwZUVudW1bJ1NvbG8gZGF0YSddOyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZiA9IGZpZWxkIGFzIExhYmVsRmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxmLkV0aWNoZXR0YSkgeyBsZi5FdGljaGV0dGEgPSBmaWVsZC5EZXNjcmlwdGlvbiB8fCAnVGVzdG8gZXRpY2hldHRhIGRpIGVzZW1waW8nOyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0Jvb2xlYW5vJ106IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJmID0gZmllbGQgYXMgQm9vbGVhbkZpZWxkO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJmLlByZXNldGF0aW9uVHlwZSA9PSBudWxsKSB7IGJmLlByZXNldGF0aW9uVHlwZSA9IEJvb2xQcmVzZW50YW50aW9FbnVtLkNoZWNrYm94OyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2FmZUNsb25lPFQ+KG9iajogVCk6IFQge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaiwgKGtleSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ0Zvcm1Gb3JtR3JvdXAnKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxyXG4gICAgICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIEFudGVwcmltYVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmZ2Utcm9vdFwiPlxyXG5cclxuICAgIDwhLS0gSW50ZXN0YXppb25lIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXJcIj5cclxuICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvbiBmZ2UtaGVhZGVyLWljb25cIiBuYW1lPVwicGFsZXR0ZVwiPjwvdG13LWljb24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXItdGV4dHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXItdGl0bGVcIj5HcmFmaWNhIGRlaSBjYW1waSBzZWxlemlvbmF0aTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWhlYWRlci1zdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3R5bGVhYmxlRmllbGRzLmxlbmd0aCB9fSBjYW1waSBtb2RpZmljYWJpbGlcclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2hhbmdlc0NvdW50ID4gMFwiPiAmbWlkZG90OyB7eyBjaGFuZ2VzQ291bnQgfX0gbW9kaWZpY2hlIGluIHNvc3Blc288L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1oZWFkZXItY2xvc2VcIiAoY2xpY2spPVwiY2FuY2VsKClcIiBtYXRUb29sdGlwPVwiQ2hpdWRpXCI+XHJcbiAgICAgICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgbmFtZT1cInhcIj48L3Rtdy1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBOZXNzdW5hIHRpcG9sb2dpYSBnZXN0aWJpbGUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmdlLWVtcHR5XCIgKm5nSWY9XCJzdHlsZWFibGVGaWVsZHMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgTmVzc3VubyBkZWkgY2FtcGkgc2VsZXppb25hdGkgaGEgdW5hIGdyYWZpY2EgY29uZmlndXJhYmlsZS5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZWFibGVGaWVsZHMubGVuZ3RoID4gMFwiPlxyXG5cclxuICAgICAgICA8IS0tIFNjaGVkZTogZ3JhZmljYSB2YWxpZGEgcGVyIHR1dHRpIC8gZGl2aXNhIHBlciB0aXBvbG9naWEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZnZS10YWJzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignZ2xvYmFsZScpXCI+XHJcbiAgICAgICAgICAgICAgICBHcmFmaWNhIGdsb2JhbGVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAncGVyc29uYWxpenphdGEnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ3BlcnNvbmFsaXp6YXRhJylcIj5cclxuICAgICAgICAgICAgICAgIEdyYWZpY2EgcGVyc29uYWxpenphdGFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtYm9keVwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSNyZWdpb24gQ09MT05OQSBTSU5JU1RSQSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1sZWZ0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnRlc3RhemlvbmUgc2NoZWRhIGdsb2JhbGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXNjb3BlLW5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTGUgbW9kaWZpY2hlIHNpIGFwcGxpY2FubyBhIDxzdHJvbmc+dHV0dGkgaSB7eyBzdHlsZWFibGVGaWVsZHMubGVuZ3RoIH19IGNhbXBpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlemlvbmF0aTwvc3Ryb25nPiwgZGkgcXVhbHNpYXNpIHRpcG9sb2dpYS4gR2xpIGVsZW1lbnRpIHF1aSBzb3R0byBzb25vIHF1ZWxsaSBjb211bmk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9nbmkgdGlwb2xvZ2lhIGxpIGFwcGxpY2EgYWwgcHJvcHJpbyBlbGVtZW50byBjb3JyaXNwb25kZW50ZS5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gSW50ZXN0YXppb25lIHNjaGVkYSBwZXIgdGlwb2xvZ2lhIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BlcnNvbmFsaXp6YXRhJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtdHlwZS10YWJzXCIgKm5nSWY9XCJncm91cHMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS10eXBlLXRhYlwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBhY3RpdmVHcm91cEluZGV4XCIgKGNsaWNrKT1cInNlbGVjdEdyb3VwKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5kZWYubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLXR5cGUtdGFiLWJhZGdlXCI+e3sgZ3JvdXAuZmllbGRzLmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtZ3JvdXAtZmllbGRzXCIgKm5nSWY9XCJhY3RpdmVHcm91cCBhcyBncm91cFwiIFttYXRUb29sdGlwXT1cImdyb3VwRmllbGROYW1lcyhncm91cClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBncm91cC5kZWYubGFiZWwgfX08L3N0cm9uZz4gJm1pZGRvdDsge3sgZ3JvdXBGaWVsZE5hbWVzKGdyb3VwKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXdhcm5pbmdcIiAqbmdJZj1cImFjdGl2ZUdyb3VwPy5oYXNEaWZmZXJlbmNlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvblwiIG5hbWU9XCJhbGVydC10cmlhbmdsZVwiPjwvdG13LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBjYW1waSBzZWxlemlvbmF0aSBwYXJ0b25vIGRhIGdyYWZpY2hlIGRpdmVyc2UuIFN0YWkgdmVkZW5kbyBpIHZhbG9yaSByZWFsaSBkaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzYW1wbGVGaWVsZExhYmVsIH19PC9zdHJvbmc+IOKAlCBjYW1iaWEgY2FtcG8gZGFsbCdhbnRlcHJpbWEgcGVyIHZlZGVyZSBpIHN1b2kuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJyYW5ubyBtb2RpZmljYXRlIHNvbG8gbGUgcHJvcHJpZXTDoCBjaGUgdG9jY2hpLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YXRvIHN1IGN1aSBzaSBzdGEgbGF2b3JhbmRvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1zdGF0ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1zdGF0ZXMtbGFiZWxcIj5TdGF0bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1zdGF0ZS1jaGlwXCIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIGN1cnJlbnRTdGF0ZXM7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlID09PSBzdGF0ZS5rZXlcIiAoY2xpY2spPVwic2V0Q3VycmVudFN0YXRlKHN0YXRlLmtleSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RhdGUubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRWxlbWVudGkgZ3JhZmljaSBlIHJlbGF0aXZlIHByb3ByaWV0w6AgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1lbGVtZW50XCIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgY3VycmVudEVsZW1lbnRzOyB0cmFja0J5OiB0cmFja0J5S2V5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1lbGVtZW50LWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVDdXJyZW50RWxlbWVudChlbGVtZW50LmtleSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uIGZnZS1lbGVtZW50LWNhcmV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJjdXJyZW50T3BlbkVsZW1lbnQgPT09IGVsZW1lbnQua2V5ID8gJ2NoZXZyb24tZG93bicgOiAnY2hldnJvbi1yaWdodCdcIj48L3Rtdy1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZ2UtZWxlbWVudC10aXRsZVwiPnt7IGVsZW1lbnQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1lbGVtZW50LW1pc3NpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgJiYgaXNHbG9iYWxFbGVtZW50TWlzc2luZ09uU2FtcGxlKGVsZW1lbnQua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIklsIGNhbXBvIG1vc3RyYXRvIGluIGFudGVwcmltYSBub24gaGEgcXVlc3RvIGVsZW1lbnRvOiBsYSBtb2RpZmljYSB2YWxlIGNvbXVucXVlIHBlciBnbGkgYWx0cmkgY2FtcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24gcHJlc2VudGUgcXVpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1lbGVtZW50LWNvdW50XCIgKm5nSWY9XCJyb3dDb3VudChlbGVtZW50LmtleSkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93Q291bnQoZWxlbWVudC5rZXkpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wc1wiICpuZ0lmPVwiY3VycmVudE9wZW5FbGVtZW50ID09PSBlbGVtZW50LmtleVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJvcC1yb3dcIiAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiByb3dQcm9wZXJ0aWVzKGVsZW1lbnQua2V5KTsgdHJhY2tCeTogdHJhY2tCeVByb3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZXRdPVwicm93SXNTZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wLWxhYmVsXCIgW21hdFRvb2x0aXBdPVwiZGVmaW5pdGlvbi5wcm9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlZmluaXRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wLWNvbnRyb2xcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29sb3JlOiBwYXN0aWdsaWEgKyBvcGFjaXTDoCArIHZhbG9yZSB0ZXN0dWFsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlZmluaXRpb24udHlwZSA9PT0gJ2NvbG9yJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiZmdlLWNvbG9yLXN3YXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbG9ySGV4KHJvd0dldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJyb3dTZXRDb2xvckhleChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImRlZmluaXRpb24ucHJvcFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmZ2Utc2xpZGVyXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sb3JBbHBoYShyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicm93U2V0Q29sb3JBbHBoYShlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk9wYWNpdMOgXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZmdlLXZhbHVlLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJub24gaW1wb3N0YXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicm93U2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3AsICRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWlzdXJhOiBzbGlkZXIgKyB2YWxvcmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICdzaXplJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZmdlLXNsaWRlciBmZ2Utc2xpZGVyLXdpZGVcIiBbbWluXT1cImRlZmluaXRpb24ubWluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImRlZmluaXRpb24ubWF4XCIgW3N0ZXBdPVwiZGVmaW5pdGlvbi5zdGVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2l6ZU51bWJlcihyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCksIGRlZmluaXRpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicm93U2V0U2l6ZShlbGVtZW50LmtleSwgZGVmaW5pdGlvbiwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmZ2UtdmFsdWUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIm5vbiBpbXBvc3RhdG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0dldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJyb3dTZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCwgJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbGVuY28gZGkgdmFsb3JpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVmaW5pdGlvbi50eXBlID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZnZS1zZWxlY3RcIiBbbmdNb2RlbF09XCJyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicm93U2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3AsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+bm9uIGltcG9zdGF0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBkZWZpbml0aW9uLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXN0byBsaWJlcm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICd0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmZ2UtdmFsdWUtaW5wdXQgZmdlLXZhbHVlLWlucHV0LXdpZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkZWZpbml0aW9uLnBsYWNlaG9sZGVyIHx8ICdub24gaW1wb3N0YXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInJvd1NldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1yZXNldFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJvd0lzU2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dSZXNldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQXp6ZXJhIHF1ZXN0YSBwcm9wcmlldMOgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvblwiIG5hbWU9XCJ4XCI+PC90bXctaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS10b2dnbGUtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZUN1cnJlbnRTaG93QWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50U2hvd0FsbFByb3BlcnRpZXMgPyAnTW9zdHJhIHNvbG8gbGUgcHJvcHJpZXTDoCBwcmluY2lwYWxpJyA6ICdBbHRyZSBwcm9wcmlldMOgLi4uJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tI2VuZHJlZ2lvbiBDT0xPTk5BIFNJTklTVFJBIC0tPlxyXG5cclxuICAgICAgICAgICAgPCEtLSNyZWdpb24gQ09MT05OQSBERVNUUkE6IGFudGVwcmltYSBsaXZlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXJpZ2h0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLXByZXZpZXctdGl0bGVcIj5BbnRlcHJpbWE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZnZS1zYW1wbGUtc2VsZWN0XCIgKm5nSWY9XCJjdXJyZW50U2FtcGxlRmllbGRzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50U2FtcGxlSW5kZXhcIiBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDdXJyZW50U2FtcGxlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZiBvZiBjdXJyZW50U2FtcGxlRmllbGRzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGlzcGxheU5hbWUoZikgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXByZXZpZXctc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICBTdGF0byBtb3N0cmF0bzogPHN0cm9uZz57eyBjdXJyZW50U2VsZWN0ZWRTdGF0ZSB9fTwvc3Ryb25nPiAmbWlkZG90O1xyXG4gICAgICAgICAgICAgICAgICAgIGlsIGNhbXBvIHNjZWx0byBzZXJ2ZSBzb2xvIGRhIGVzZW1waW9cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJldmlldy1jYW52YXNcIiAqbmdJZj1cImN1cnJlbnRQcmV2aWV3RmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dC1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQ2FtcG8gZGkgdGVzdG8nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGV4dC1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydBcmVhIGRpIHRlc3RvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQ2FtcG8gbnVtZXJpY28nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbnVtZXJpYy1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGJvb2xlYW4tZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0Jvb2xlYW5vJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Jvb2xlYW4tZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkYXRlLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydEYXRhIGUvbyBvcmEnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGF0ZS1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGF0dGFjaG1lbnQtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0FsbGVnYXRvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2F0dGFjaG1lbnQtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbC1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRXRpY2hldHRhJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bGlzdC12YWx1ZS1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRWxlbmNvIGdlbmVyaWNvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpc3QtdmFsdWUtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWFnZS1maWVsZC1zZWxlY3Rvci10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRWxlbmNvIGltbWFnaW5pJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ltYWdlLWZpZWxkLXNlbGVjdG9yLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8YWN0aW9uLWJ1dHRvbi1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQm90dG9uZSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cInt9XCIgW2luQ29uZmlnXT1cInRydWVcIiBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hY3Rpb24tYnV0dG9uLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmRQb2ludENvbmZpZ3VyYXRpb25dPVwiZW5kUG9pbnRDb25maWd1cmF0aW9uXCIgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaW1hZ2UtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmRQb2ludENvbmZpZ3VyYXRpb25dPVwiZW5kUG9pbnRDb25maWd1cmF0aW9uXCIgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tI2VuZHJlZ2lvbiBDT0xPTk5BIERFU1RSQSAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQ2FtcGkgZXNjbHVzaSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmZ2UtdW5zdXBwb3J0ZWRcIiAqbmdJZj1cInVuc3VwcG9ydGVkRmllbGRzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICBFc2NsdXNpIHBlcmNow6kgc2VuemEgZ3JhZmljYSBjb25maWd1cmFiaWxlOiB7eyB1bnN1cHBvcnRlZEZpZWxkcy5sZW5ndGggfX0gY2FtcGlcclxuICAgICAgICAoe3sgZGlzcGxheU5hbWUodW5zdXBwb3J0ZWRGaWVsZHNbMF0pIH19PHNwYW5cclxuICAgICAgICAgICAgKm5nSWY9XCJ1bnN1cHBvcnRlZEZpZWxkcy5sZW5ndGggPiAxXCI+LCAuLi48L3NwYW4+KVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBQdWxzYW50aSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmZ2UtZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+QW5udWxsYTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCIhaGFzQ2hhbmdlc1wiIChjbGljayk9XCJhcHBseSgpXCI+XHJcbiAgICAgICAgICAgIEFwcGxpY2EgYWkgY2FtcGkgc2VsZXppb25hdGlcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|