sf-crud 12.3.2 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/sf-crud.mjs +3252 -0
- package/fesm2022/sf-crud.mjs.map +1 -0
- package/{sf-crud.d.ts → index.d.ts} +5 -5
- package/lib/components/control/control.component.d.ts +67 -66
- package/lib/components/file-upload/file-upload.component.d.ts +34 -34
- package/lib/components/form/form.component.d.ts +63 -63
- package/lib/components/registro/registro.component.d.ts +109 -109
- package/lib/components/step/step.component.d.ts +27 -27
- package/lib/components/tablero/tablero.component.d.ts +53 -52
- package/lib/directives/format-address.pipe.d.ts +7 -7
- package/lib/sf-crud.component.d.ts +8 -8
- package/lib/sf-crud.module.d.ts +94 -90
- package/lib/sf-crud.routing.module.d.ts +7 -7
- package/lib/sf-crud.service.d.ts +135 -135
- package/lib/shared/models/Conditions.model.d.ts +32 -32
- package/lib/shared/models/Empresa.model.d.ts +11 -11
- package/lib/shared/models/Reason.model.d.ts +5 -5
- package/lib/shared/models/crud-config.model.d.ts +109 -110
- package/lib/shared/models/shema.model.d.ts +37 -37
- package/lib/shared/services/general.service.d.ts +20 -20
- package/lib/shared/services/notification.service.d.ts +26 -27
- package/lib/shared/services/step.service.d.ts +27 -27
- package/package.json +20 -15
- package/public-api.d.ts +12 -12
- package/bundles/sf-crud.umd.js +0 -3786
- package/bundles/sf-crud.umd.js.map +0 -1
- package/esm2015/lib/components/control/control.component.js +0 -394
- package/esm2015/lib/components/file-upload/file-upload.component.js +0 -143
- package/esm2015/lib/components/form/form.component.js +0 -289
- package/esm2015/lib/components/registro/registro.component.js +0 -757
- package/esm2015/lib/components/step/step.component.js +0 -79
- package/esm2015/lib/components/tablero/tablero.component.js +0 -220
- package/esm2015/lib/directives/format-address.pipe.js +0 -22
- package/esm2015/lib/sf-crud.component.js +0 -26
- package/esm2015/lib/sf-crud.module.js +0 -359
- package/esm2015/lib/sf-crud.routing.module.js +0 -23
- package/esm2015/lib/sf-crud.service.js +0 -531
- package/esm2015/lib/shared/models/Conditions.model.js +0 -81
- package/esm2015/lib/shared/models/Empresa.model.js +0 -2
- package/esm2015/lib/shared/models/Reason.model.js +0 -7
- package/esm2015/lib/shared/models/crud-config.model.js +0 -76
- package/esm2015/lib/shared/models/shema.model.js +0 -11
- package/esm2015/lib/shared/services/general.service.js +0 -74
- package/esm2015/lib/shared/services/notification.service.js +0 -83
- package/esm2015/lib/shared/services/step.service.js +0 -63
- package/esm2015/public-api.js +0 -16
- package/esm2015/sf-crud.js +0 -5
- package/fesm2015/sf-crud.js +0 -3134
- package/fesm2015/sf-crud.js.map +0 -1
|
@@ -1,757 +0,0 @@
|
|
|
1
|
-
import { Component, HostBinding, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
//import { ConfigRegistro, Operation, RequestChecking } from '../../shared/models/crud-config.model';
|
|
3
|
-
//import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
|
4
|
-
import { Operation, RequestChecking } from '../../shared/models/crud-config.model';
|
|
5
|
-
import { MessageService } from 'primeng/api';
|
|
6
|
-
import * as jsonpath from 'jsonpath';
|
|
7
|
-
import * as _ from "lodash";
|
|
8
|
-
import Swal from 'sweetalert2';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "../../shared/services/general.service";
|
|
11
|
-
import * as i2 from "@angular/router";
|
|
12
|
-
import * as i3 from "primeng/api";
|
|
13
|
-
import * as i4 from "../../sf-crud.service";
|
|
14
|
-
import * as i5 from "../../shared/services/step.service";
|
|
15
|
-
import * as i6 from "sf-pdfsign";
|
|
16
|
-
import * as i7 from "sf-simulador";
|
|
17
|
-
import * as i8 from "../../shared/services/notification.service";
|
|
18
|
-
import * as i9 from "../step/step.component";
|
|
19
|
-
import * as i10 from "../form/form.component";
|
|
20
|
-
import * as i11 from "primeng/dialog";
|
|
21
|
-
import * as i12 from "primeng/button";
|
|
22
|
-
import * as i13 from "primeng/toast";
|
|
23
|
-
import * as i14 from "@angular/common";
|
|
24
|
-
import * as i15 from "primeng/ripple";
|
|
25
|
-
export class RegistroComponent {
|
|
26
|
-
constructor(generalService, activeRoute, messageService, sfCrudService, stepService, sfPdfSignService, sfSimuladorService, notificationService, router) {
|
|
27
|
-
this.generalService = generalService;
|
|
28
|
-
this.activeRoute = activeRoute;
|
|
29
|
-
this.messageService = messageService;
|
|
30
|
-
this.sfCrudService = sfCrudService;
|
|
31
|
-
this.stepService = stepService;
|
|
32
|
-
this.sfPdfSignService = sfPdfSignService;
|
|
33
|
-
this.sfSimuladorService = sfSimuladorService;
|
|
34
|
-
this.notificationService = notificationService;
|
|
35
|
-
this.router = router;
|
|
36
|
-
this.idKatios = '';
|
|
37
|
-
this.trx = '';
|
|
38
|
-
this.id = '';
|
|
39
|
-
this.ids = [];
|
|
40
|
-
this.sendData = new EventEmitter();
|
|
41
|
-
this.onSubmit = new EventEmitter();
|
|
42
|
-
this.subsToKillOnDestroy = [];
|
|
43
|
-
this.isLocal = false;
|
|
44
|
-
this.displays = [];
|
|
45
|
-
this.firstLoad = true;
|
|
46
|
-
this.dialogElements = [];
|
|
47
|
-
this.items = [];
|
|
48
|
-
this.loading = { inProgress: true, target: undefined };
|
|
49
|
-
}
|
|
50
|
-
set idEntidad(value) {
|
|
51
|
-
this.idForm = value;
|
|
52
|
-
}
|
|
53
|
-
ngOnChanges(changes) {
|
|
54
|
-
if (this.idKatios && this.idForm && this.environment && (changes["idKatios"] || changes["idEntidad"])) {
|
|
55
|
-
this.sfCrudService.ids = this.ids;
|
|
56
|
-
this.sfCrudService.idKatios = this.idKatios;
|
|
57
|
-
this.sfCrudService.environment = this.environment;
|
|
58
|
-
this.generalService.idKatios = this.idKatios;
|
|
59
|
-
this.generalService.environment = this.environment;
|
|
60
|
-
this.sfPdfSignService.setEnviroments(this.environment);
|
|
61
|
-
this.sfSimuladorService.environments = this.environment;
|
|
62
|
-
this.sfSimuladorService.idKatios = this.idKatios;
|
|
63
|
-
this.loadConfigCrud();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
ngOnInit() {
|
|
67
|
-
this.cargarMascarasDirecciones();
|
|
68
|
-
this.instanceSubsStepService();
|
|
69
|
-
this.notificationSubscription = this.notificationService.notificationAdded$().subscribe(notification => {
|
|
70
|
-
var _a, _b;
|
|
71
|
-
if ((_a = notification === null || notification === void 0 ? void 0 : notification.requestChecking) === null || _a === void 0 ? void 0 : _a.useSwal) {
|
|
72
|
-
Swal.fire(notification.msg).then((res) => {
|
|
73
|
-
var _a, _b;
|
|
74
|
-
if (notification.msg.showCancelButton && res.isDismissed && ((_a = notification.requestChecking) === null || _a === void 0 ? void 0 : _a.cancelRedirect)) {
|
|
75
|
-
if (notification.requestChecking.cancelRedirect.toUpperCase() == "INICIO")
|
|
76
|
-
this.sfCrudService.redirectToInicio();
|
|
77
|
-
else
|
|
78
|
-
window.location.href = notification.requestChecking.cancelRedirect;
|
|
79
|
-
}
|
|
80
|
-
else if (res.isConfirmed && ((_b = notification.requestChecking) === null || _b === void 0 ? void 0 : _b.redirect)) {
|
|
81
|
-
if (notification.requestChecking.redirect.toUpperCase() == "INICIO")
|
|
82
|
-
this.sfCrudService.redirectToInicio();
|
|
83
|
-
else
|
|
84
|
-
window.location.href = notification.requestChecking.redirect;
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
else if ((notification === null || notification === void 0 ? void 0 : notification.msg) && ((_b = notification.requestChecking) === null || _b === void 0 ? void 0 : _b.redirect)) {
|
|
89
|
-
this.messageService.add(notification.msg);
|
|
90
|
-
if (notification.requestChecking.redirect.toUpperCase() == "INICIO")
|
|
91
|
-
this.sfCrudService.redirectToInicio();
|
|
92
|
-
else {
|
|
93
|
-
let newURL = this.sfCrudService.getURLRedirect(notification.requestChecking.redirect);
|
|
94
|
-
window.location.href = newURL;
|
|
95
|
-
window.location.reload();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
else if (notification === null || notification === void 0 ? void 0 : notification.msg) {
|
|
99
|
-
this.messageService.add(notification.msg);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
ngOnDestroy() {
|
|
104
|
-
if (this.notificationSubscription) {
|
|
105
|
-
this.notificationSubscription.unsubscribe();
|
|
106
|
-
}
|
|
107
|
-
this.subsToKillOnDestroy.forEach(sub => sub.unsubscribe());
|
|
108
|
-
this.stepService.reset();
|
|
109
|
-
this.sfCrudService.reset();
|
|
110
|
-
console.log("destroy");
|
|
111
|
-
}
|
|
112
|
-
instanceSubsStepService() {
|
|
113
|
-
this.subsToKillOnDestroy.push(this.stepService.customChildrenEvents$.subscribe((event) => {
|
|
114
|
-
if (!event)
|
|
115
|
-
return;
|
|
116
|
-
switch (event.name.toUpperCase()) {
|
|
117
|
-
case "ONCLICKEDEDITBUTTON":
|
|
118
|
-
this.onClickedEditButton(event.data.element, event.data.data, event.data.index);
|
|
119
|
-
break;
|
|
120
|
-
case "ONCLICKEDDELETEBUTTON":
|
|
121
|
-
this.deleteRow(event.data.element, event.data.index);
|
|
122
|
-
break;
|
|
123
|
-
case "ONCLICKEDADDBUTTON":
|
|
124
|
-
this.onClickedAddButton(event.data.element);
|
|
125
|
-
break;
|
|
126
|
-
case "ONCLICKEDADDRESS":
|
|
127
|
-
this.onClickedAddress(event.data.scope);
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
}));
|
|
131
|
-
this.subsToKillOnDestroy.push(this.stepService.requestApproval$.subscribe((value) => {
|
|
132
|
-
console.log(value);
|
|
133
|
-
if ((value === null || value === void 0 ? void 0 : value.desired) != undefined) {
|
|
134
|
-
if (value.desired < value.current) {
|
|
135
|
-
this.stepService.requestApproved = true;
|
|
136
|
-
this.sfCrudService.index = this.stepService.currentIndex;
|
|
137
|
-
this.scrollTop();
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
const operation = this.sfCrudService.getRegistro(this.indexCrud).operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
141
|
-
if (!this.validateData(operation, this.sfCrudService.getData(this.indexCrud), this.sfCrudService.getRegistro(this.indexCrud).conditions || []))
|
|
142
|
-
this.stepService.requestApproved = false;
|
|
143
|
-
else if (operation.method != null)
|
|
144
|
-
this.uploadInfoStep(value);
|
|
145
|
-
else if (operation.answerChecking) { //no tiene request, solo un mensaje
|
|
146
|
-
this.stepService.requestApproved = true;
|
|
147
|
-
this.loading.inProgress = false;
|
|
148
|
-
this.sfCrudService.formLoading = this.loading;
|
|
149
|
-
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("success", undefined, "Información subida correctamente", operation.answerChecking), {}, operation.answerChecking), operation.answerChecking);
|
|
150
|
-
this.sfCrudService.index = this.stepService.currentIndex;
|
|
151
|
-
this.scrollTop();
|
|
152
|
-
}
|
|
153
|
-
else { //no tiene nada configurado
|
|
154
|
-
this.stepService.requestApproved = true;
|
|
155
|
-
this.sfCrudService.index = this.stepService.currentIndex;
|
|
156
|
-
this.scrollTop();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}));
|
|
161
|
-
console.log("subs step service terminadas");
|
|
162
|
-
}
|
|
163
|
-
uploadInfoStep(position) {
|
|
164
|
-
this.loading.inProgress = true;
|
|
165
|
-
this.sfCrudService.formLoading = this.loading;
|
|
166
|
-
this.submit(position.current).then(() => {
|
|
167
|
-
var _a, _b, _c;
|
|
168
|
-
let tieneRedirect = ((_a = this.sfCrudService.currentOperation) === null || _a === void 0 ? void 0 : _a.answerChecking) !== undefined && ((_c = (_b = this.sfCrudService.currentOperation) === null || _b === void 0 ? void 0 : _b.answerChecking) === null || _c === void 0 ? void 0 : _c.redirect) !== undefined;
|
|
169
|
-
console.log(this.items.length);
|
|
170
|
-
if (this.items.length == 1) {
|
|
171
|
-
this.stepService.requestApproved = false;
|
|
172
|
-
//this.stepService.desiredIndex = undefined
|
|
173
|
-
this.sfCrudService.index = this.stepService.currentIndex;
|
|
174
|
-
}
|
|
175
|
-
else if (!tieneRedirect) {
|
|
176
|
-
this.advance(position.current, position.desired, false);
|
|
177
|
-
}
|
|
178
|
-
this.scrollTop();
|
|
179
|
-
})
|
|
180
|
-
.catch(() => {
|
|
181
|
-
this.stepService.requestApproved = false;
|
|
182
|
-
}).finally(() => {
|
|
183
|
-
this.loading.inProgress = false;
|
|
184
|
-
this.sfCrudService.formLoading = this.loading;
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
onClickBtnSubmit() {
|
|
188
|
-
this.stepService.requestApproval = this.indexCrud;
|
|
189
|
-
}
|
|
190
|
-
loadConfigCrud() {
|
|
191
|
-
this.loading.inProgress = true;
|
|
192
|
-
this.sfCrudService.formLoading = this.loading;
|
|
193
|
-
this.sfCrudService.dataExt = this.dataExt;
|
|
194
|
-
this.sfCrudService.crudLoaded = false;
|
|
195
|
-
if (this.loadSession()) {
|
|
196
|
-
this.sfCrudService.crudLoaded = true;
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
this.generalService.getCrudByEntidad(this.idKatios, this.idForm)
|
|
200
|
-
.then((res) => {
|
|
201
|
-
console.log("crud cargado");
|
|
202
|
-
this.sfCrudService.uiEsquemas = res.uiEsquemas;
|
|
203
|
-
this.sfCrudService.esquemas = res.esquemas;
|
|
204
|
-
this.sfCrudService.registros = res.registros;
|
|
205
|
-
this.customizeCompany(res.uiEsquemas);
|
|
206
|
-
this.sfCrudService.registros.forEach((_, i) => this.sfCrudService.setTrx("c", i));
|
|
207
|
-
this.loadData()
|
|
208
|
-
.then(() => {
|
|
209
|
-
this.setLabelSumbit();
|
|
210
|
-
this.sfCrudService.dataset.forEach((data, i) => {
|
|
211
|
-
var _a;
|
|
212
|
-
if (this.activeRoute.snapshot.queryParams["_idGWVADO"] && ((_a = data.ADO) === null || _a === void 0 ? void 0 : _a.dataProceso)) {
|
|
213
|
-
data.ADO.dataProceso.idProceso = this.activeRoute.snapshot.queryParams["_idGWVADO"];
|
|
214
|
-
}
|
|
215
|
-
if (this.activeRoute.snapshot.queryParams["_idADO"] && data.ADO) {
|
|
216
|
-
data.ADO.idTransaction = this.activeRoute.snapshot.queryParams["_idADO"];
|
|
217
|
-
}
|
|
218
|
-
this.sfCrudService.setDataSet(data, i);
|
|
219
|
-
});
|
|
220
|
-
})
|
|
221
|
-
.finally(() => {
|
|
222
|
-
let willExecuteRequest = this.advance(0, this.sfCrudService.uiEsquemas.length - 1, true);
|
|
223
|
-
this.createSteps(res.uiEsquemas);
|
|
224
|
-
this.sfCrudService.crudLoaded = true;
|
|
225
|
-
if (!willExecuteRequest) {
|
|
226
|
-
this.loading.inProgress = false;
|
|
227
|
-
this.sfCrudService.formLoading = this.loading;
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
}).catch((ex) => {
|
|
231
|
-
console.error(ex);
|
|
232
|
-
this.loading.inProgress = false;
|
|
233
|
-
this.sfCrudService.formLoading = this.loading;
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Step will advance until esquema is not completed
|
|
238
|
-
*/
|
|
239
|
-
advance(start, limit, executeRequest) {
|
|
240
|
-
var _a;
|
|
241
|
-
console.log("advance desde ", start, " hasta ", limit);
|
|
242
|
-
let i = start;
|
|
243
|
-
let op;
|
|
244
|
-
let willExecuteRequest = false;
|
|
245
|
-
let registro;
|
|
246
|
-
while (i < limit) {
|
|
247
|
-
registro = this.sfCrudService.getRegistro(i);
|
|
248
|
-
op = registro.operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
249
|
-
if (!this.validateData(op, this.sfCrudService.getData(i), registro.conditions || [], false))
|
|
250
|
-
break;
|
|
251
|
-
i++;
|
|
252
|
-
}
|
|
253
|
-
this.sfCrudService.index = i;
|
|
254
|
-
this.stepService.currentIndex = i;
|
|
255
|
-
this.stepService.desiredIndex = i;
|
|
256
|
-
console.log("advance", i);
|
|
257
|
-
this.stepService.requestApproved = true;
|
|
258
|
-
registro = this.sfCrudService.getRegistro(i);
|
|
259
|
-
let dataCurrentStep = this.sfCrudService.getData(i);
|
|
260
|
-
op = this.sfCrudService.getRegistro(i).operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
261
|
-
if (executeRequest && (this.activeRoute.snapshot.queryParams["_idGWVADO"] || this.activeRoute.snapshot.queryParams["_idADO"]) //Viene de ADO
|
|
262
|
-
&& dataCurrentStep.ADO && this.validateData(op, dataCurrentStep, (_a = registro.conditions) !== null && _a !== void 0 ? _a : [], false) //El step esta completo
|
|
263
|
-
) {
|
|
264
|
-
console.log("advance with approval", i);
|
|
265
|
-
this.stepService.requestApproval = i;
|
|
266
|
-
willExecuteRequest = true;
|
|
267
|
-
}
|
|
268
|
-
return willExecuteRequest;
|
|
269
|
-
}
|
|
270
|
-
loadSession() {
|
|
271
|
-
const wasLoaded = this.sfCrudService.loadSession();
|
|
272
|
-
if (wasLoaded) {
|
|
273
|
-
this.customizeCompany(this.sfCrudService.uiEsquemas);
|
|
274
|
-
this.stepService.currentIndex = this.sfCrudService.index;
|
|
275
|
-
this.createSteps(this.sfCrudService.uiEsquemas);
|
|
276
|
-
this.loading.inProgress = false;
|
|
277
|
-
this.sfCrudService.formLoading = this.loading;
|
|
278
|
-
}
|
|
279
|
-
return wasLoaded;
|
|
280
|
-
}
|
|
281
|
-
customizeCompany(uiEsquemas) {
|
|
282
|
-
var _a, _b, _c, _d, _e, _f;
|
|
283
|
-
this.sfCrudService.configEmpresa = (_a = uiEsquemas.find(ui => ui.general)) === null || _a === void 0 ? void 0 : _a.general;
|
|
284
|
-
this.logo = (_c = (_b = this.sfCrudService.configEmpresa) === null || _b === void 0 ? void 0 : _b.icons) === null || _c === void 0 ? void 0 : _c.carga;
|
|
285
|
-
if (this.sfCrudService.configEmpresa) {
|
|
286
|
-
if ((_d = this.sfCrudService.configEmpresa.colors) === null || _d === void 0 ? void 0 : _d.main)
|
|
287
|
-
this.color = this.sfCrudService.configEmpresa.colors.main;
|
|
288
|
-
if ((_e = this.sfCrudService.configEmpresa.colors) === null || _e === void 0 ? void 0 : _e.secondary)
|
|
289
|
-
this.color2 = this.sfCrudService.configEmpresa.colors.secondary;
|
|
290
|
-
if ((_f = this.sfCrudService.configEmpresa.colors) === null || _f === void 0 ? void 0 : _f.button)
|
|
291
|
-
this.colorButton = this.sfCrudService.configEmpresa.colors.button;
|
|
292
|
-
}
|
|
293
|
-
if (!this.colorButton)
|
|
294
|
-
this.colorButton = "blue";
|
|
295
|
-
if (!this.color2)
|
|
296
|
-
this.color2 = "blue";
|
|
297
|
-
if (!this.color)
|
|
298
|
-
this.color = "blue";
|
|
299
|
-
}
|
|
300
|
-
scrollTop() {
|
|
301
|
-
window.scroll({
|
|
302
|
-
top: 0,
|
|
303
|
-
left: 0,
|
|
304
|
-
behavior: 'smooth'
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
createSteps(uiEsquemas) {
|
|
308
|
-
this.items = [];
|
|
309
|
-
uiEsquemas.forEach((uiEsq, index) => {
|
|
310
|
-
if (uiEsq.step)
|
|
311
|
-
this.items.push({ label: uiEsq.step, routerLink: index, queryParamsHandling: "preserve" });
|
|
312
|
-
else
|
|
313
|
-
this.items.push({ label: `paso ${index}`, routerLink: index });
|
|
314
|
-
this.sfCrudService.getRegistro(index); //ver si tiene un change
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Instancia todos los esquemas, y realiza los requests para traer la data de todos los step.
|
|
319
|
-
* @param esquema
|
|
320
|
-
* @param registro
|
|
321
|
-
* @returns
|
|
322
|
-
*/
|
|
323
|
-
loadData() {
|
|
324
|
-
this.sfCrudService.esquemas.forEach((esquema, i) => {
|
|
325
|
-
const op = this.sfCrudService.registros[i].operations.find(x => x.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
326
|
-
this.sfCrudService.setDataSet(this.sfCrudService.createObject(esquema, op), i);
|
|
327
|
-
});
|
|
328
|
-
console.log("loadData");
|
|
329
|
-
return Promise.all(this.sfCrudService.registros.map((registro, i) => this.ids.length > 0 ? this.getInfoRegistro(registro, i, this.ids[i]) : Promise.resolve()));
|
|
330
|
-
}
|
|
331
|
-
getInfoRegistro(configRegistro, index, id) {
|
|
332
|
-
const op = configRegistro.operations.find(x => x.type == 'read');
|
|
333
|
-
if (!op)
|
|
334
|
-
return;
|
|
335
|
-
const url = this.sfCrudService.getURL(op, index, id);
|
|
336
|
-
return this.generalService.genericRequest(op.method, url)
|
|
337
|
-
.then((res) => {
|
|
338
|
-
let value = undefined;
|
|
339
|
-
if (res === null || res === void 0 ? void 0 : res.data) {
|
|
340
|
-
value = Array.isArray(res.data) ? res.data[0] : res.data;
|
|
341
|
-
}
|
|
342
|
-
else
|
|
343
|
-
value = Array.isArray(res) ? res[0] : res;
|
|
344
|
-
this.sfCrudService.applyObjectKeys(value, op.keysEsquema || [], configRegistro);
|
|
345
|
-
if (op.changeTrx)
|
|
346
|
-
op.changeTrx.forEach(x => this.sfCrudService.setTrx(x.trx, x.index));
|
|
347
|
-
console.log("getInfoRegistro", op.changeTrx);
|
|
348
|
-
})
|
|
349
|
-
.catch((error) => {
|
|
350
|
-
console.log(error);
|
|
351
|
-
let errorChecking;
|
|
352
|
-
if (Array.isArray(op.errorChecking))
|
|
353
|
-
errorChecking = op.errorChecking[0];
|
|
354
|
-
else
|
|
355
|
-
errorChecking = op.errorChecking;
|
|
356
|
-
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("error", "Formulario no cargado correctamente", "", errorChecking), error.error, errorChecking), errorChecking);
|
|
357
|
-
throw error;
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
setDefaultValue(value) {
|
|
361
|
-
var _a;
|
|
362
|
-
let data = null;
|
|
363
|
-
if (value.key && ((_a = this.sfCrudService.currentOperation) === null || _a === void 0 ? void 0 : _a.keys)) {
|
|
364
|
-
data = this.sfCrudService.getValueKey(this.sfCrudService.currentOperation.keys.find(k => k.key == value.key));
|
|
365
|
-
value = data;
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
switch (value) {
|
|
369
|
-
case '@uactivo':
|
|
370
|
-
data = `${this.user.UsuarioSistema.TDOC}-${this.user.UsuarioSistema.NDOC}`;
|
|
371
|
-
break;
|
|
372
|
-
case '@tdocactivo':
|
|
373
|
-
data = this.user.UsuarioSistema.TDOC;
|
|
374
|
-
break;
|
|
375
|
-
case '@ndocactivo':
|
|
376
|
-
data = this.user.UsuarioSistema.NDOC;
|
|
377
|
-
break;
|
|
378
|
-
case '@hoy':
|
|
379
|
-
data = new Date();
|
|
380
|
-
break;
|
|
381
|
-
default:
|
|
382
|
-
data = value;
|
|
383
|
-
break;
|
|
384
|
-
}
|
|
385
|
-
return data;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
get indexCrud() {
|
|
389
|
-
return this.stepService.currentIndex;
|
|
390
|
-
}
|
|
391
|
-
primeChecking() {
|
|
392
|
-
return new RequestChecking(undefined, undefined, false, undefined, undefined, false, undefined);
|
|
393
|
-
}
|
|
394
|
-
submit(index) {
|
|
395
|
-
this.sfCrudService.applyValuesOnEvent('onSubmit', this.sfCrudService.getEsquema(index), undefined, this.sfCrudService.getData(index));
|
|
396
|
-
let registro = this.sfCrudService.getRegistro(index);
|
|
397
|
-
console.log("trx actual: ", this.sfCrudService.getTrx(this.indexCrud));
|
|
398
|
-
const operation = registro.operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
399
|
-
let url = this.sfCrudService.getURL(operation, index);
|
|
400
|
-
return this.generalService.genericRequest(operation.method, url, this.sfCrudService.getData(index))
|
|
401
|
-
.then((res) => {
|
|
402
|
-
if (res === null)
|
|
403
|
-
res = {};
|
|
404
|
-
res = this.sfCrudService.applyObjectKeys(res, operation.keysEsquema || [], registro);
|
|
405
|
-
this.sfCrudService.setAnswers(res, this.indexCrud);
|
|
406
|
-
if (operation.changeTrx && Array.isArray(operation.changeTrx))
|
|
407
|
-
operation.changeTrx.forEach(x => this.sfCrudService.setTrx(x.trx, x.index));
|
|
408
|
-
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("success", undefined, "Información subida correctamente", operation.answerChecking), res, operation.answerChecking), operation.answerChecking);
|
|
409
|
-
return res;
|
|
410
|
-
})
|
|
411
|
-
.catch(err => {
|
|
412
|
-
console.error(err);
|
|
413
|
-
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("error", "Error no controlado", "Por favor comunicarse con el admin", operation.errorChecking), err.error, operation.errorChecking), operation.errorChecking);
|
|
414
|
-
throw new Error(err);
|
|
415
|
-
});
|
|
416
|
-
// return Promise.resolve({})
|
|
417
|
-
}
|
|
418
|
-
onCloseAddItem(index) {
|
|
419
|
-
const scope = this.dialogElements[index].scope.replaceAll('.properties', '');
|
|
420
|
-
const item = _.cloneDeep(this.dialogElements[index].data);
|
|
421
|
-
if (index == 0) {
|
|
422
|
-
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0].push(item);
|
|
423
|
-
}
|
|
424
|
-
else
|
|
425
|
-
jsonpath.query(this.dialogElements[index - 1].data, scope)[0].push(item);
|
|
426
|
-
}
|
|
427
|
-
deleteRow(element, indexElement) {
|
|
428
|
-
const scope = element.scope.replaceAll('.properties', '');
|
|
429
|
-
let indexDialog = this.dialogElements.length - 1;
|
|
430
|
-
if (indexDialog == -1)
|
|
431
|
-
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0].splice(indexElement, 1);
|
|
432
|
-
else {
|
|
433
|
-
indexDialog = indexDialog == 0 ? 1 : indexDialog;
|
|
434
|
-
jsonpath.query(this.dialogElements[indexDialog - 1].data, scope)[0].splice(indexElement, 1);
|
|
435
|
-
}
|
|
436
|
-
this.sfCrudService.applyValuesOnEvent('onChange', this.sfCrudService.getEsquema(this.indexCrud), element.scope.replace('$..properties.', ''), this.sfCrudService.getData(this.indexCrud));
|
|
437
|
-
}
|
|
438
|
-
onCloseEditRow(index) {
|
|
439
|
-
let scope = undefined;
|
|
440
|
-
try {
|
|
441
|
-
const iArray = this.dialogElements[index].index;
|
|
442
|
-
scope = this.dialogElements[index].scope.replaceAll('.properties', '');
|
|
443
|
-
const item = _.cloneDeep(this.dialogElements[index].data);
|
|
444
|
-
if (index == 0) {
|
|
445
|
-
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0][iArray] = item;
|
|
446
|
-
}
|
|
447
|
-
else {
|
|
448
|
-
jsonpath.query(this.dialogElements[index - 1].data, scope)[0][iArray] = item;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
catch (error) {
|
|
452
|
-
console.error(error);
|
|
453
|
-
console.log(this.dialogElements);
|
|
454
|
-
console.log(index);
|
|
455
|
-
console.log(scope);
|
|
456
|
-
console.log(this.indexCrud);
|
|
457
|
-
console.log(this.sfCrudService.getData(this.indexCrud));
|
|
458
|
-
throw error;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
validateData(operation, data, conditions, printErrors = true) {
|
|
462
|
-
var _a;
|
|
463
|
-
if (((_a = operation === null || operation === void 0 ? void 0 : operation.validations) === null || _a === void 0 ? void 0 : _a.type) == 'local') {
|
|
464
|
-
let err = this.sfCrudService.validateDataLocal(operation, data, conditions);
|
|
465
|
-
if (err.length != 0 && printErrors)
|
|
466
|
-
this.notificationService.addNotification({ severity: 'warn', detail: err.slice(0, 5).join('. ') }, this.primeChecking());
|
|
467
|
-
return err.length == 0;
|
|
468
|
-
}
|
|
469
|
-
return true;
|
|
470
|
-
}
|
|
471
|
-
onConfirm() {
|
|
472
|
-
this.messageService.clear('c');
|
|
473
|
-
}
|
|
474
|
-
onReject() {
|
|
475
|
-
this.messageService.clear('c');
|
|
476
|
-
}
|
|
477
|
-
onClickedAddress(scope) {
|
|
478
|
-
var _a;
|
|
479
|
-
let j = 1, k = 0;
|
|
480
|
-
let separador = (_a = jsonpath.query(this.sfCrudService.esquemas[this.indexCrud], scope)[0]) === null || _a === void 0 ? void 0 : _a.separador;
|
|
481
|
-
let dataPadre = this.dialogElements.length > 0 ? this.dialogElements[this.dialogElements.length - 1].data : this.sfCrudService.dataset[this.indexCrud];
|
|
482
|
-
let currentValue = jsonpath.query(dataPadre, scope.replaceAll('.properties', ''))[0];
|
|
483
|
-
let currentValues = currentValue === null || currentValue === void 0 ? void 0 : currentValue.split(separador);
|
|
484
|
-
let esquema = {
|
|
485
|
-
type: "object",
|
|
486
|
-
validations: {
|
|
487
|
-
type: "local",
|
|
488
|
-
required: []
|
|
489
|
-
},
|
|
490
|
-
properties: {
|
|
491
|
-
currentValue: {
|
|
492
|
-
type: "string",
|
|
493
|
-
default: currentValue
|
|
494
|
-
},
|
|
495
|
-
separador: {
|
|
496
|
-
type: "string",
|
|
497
|
-
default: separador
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
let uiesquema = { elements: [] };
|
|
502
|
-
let traductorTamaniosMascaras = {
|
|
503
|
-
"grande": "field col-12 md:col-4",
|
|
504
|
-
"pequeño": "field col-12 md:col-2",
|
|
505
|
-
"mediano": "field col-12 md:col-3",
|
|
506
|
-
};
|
|
507
|
-
this.cargarMascarasDirecciones().then(() => {
|
|
508
|
-
const op = this.sfCrudService.registros[this.indexCrud].operations.find(x => x.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
509
|
-
this.sfCrudService.mascaras.forEach(mascara => {
|
|
510
|
-
//generar el uiesquema de las direcciones
|
|
511
|
-
uiesquema.elements.push({
|
|
512
|
-
"type": "Label",
|
|
513
|
-
"class": "col-12 md:col-12",
|
|
514
|
-
"style": `font-size: medium; color:white; background: var(--primary-color) !important; border-radius: 10px; text-align: center;`,
|
|
515
|
-
"label": `Línea ${mascara.linea}`
|
|
516
|
-
});
|
|
517
|
-
uiesquema.elements.push({
|
|
518
|
-
"type": "HorizontalLayout",
|
|
519
|
-
"class": "p-fluid p-formgrid grid",
|
|
520
|
-
"elements": []
|
|
521
|
-
});
|
|
522
|
-
mascara.Campo.forEach(campo => {
|
|
523
|
-
if (campo.Tipo.toLocaleLowerCase() == "label") {
|
|
524
|
-
uiesquema.elements[j].elements.push({
|
|
525
|
-
"type": "Texto",
|
|
526
|
-
"class": "my-auto",
|
|
527
|
-
"label": campo.Valor,
|
|
528
|
-
"scope": `$..properties.${campo.Id}`,
|
|
529
|
-
"ngStyle": {
|
|
530
|
-
"font-size": "1.5rem"
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
uiesquema.elements[j].elements.push({
|
|
536
|
-
"type": "Control",
|
|
537
|
-
"class": campo.Tamaño ? traductorTamaniosMascaras[campo.Tamaño.toLocaleLowerCase()] : traductorTamaniosMascaras.mediano,
|
|
538
|
-
"scope": `$..properties.${campo.Id}`
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
//generar el esquema de las direcciones
|
|
542
|
-
if (campo.Tipo.toLocaleLowerCase() == "combo") {
|
|
543
|
-
let customOptions = [];
|
|
544
|
-
let valores = campo.Valores.split(",");
|
|
545
|
-
valores.forEach(valor => customOptions.push({ label: valor.split("-")[0], value: valor.split("-")[1] }));
|
|
546
|
-
esquema.properties[campo.Id] = {
|
|
547
|
-
type: "string",
|
|
548
|
-
subtype: "dropdown",
|
|
549
|
-
default: this.getDefaultValueDireccion(k, currentValues),
|
|
550
|
-
config: {
|
|
551
|
-
optionLabel: "label",
|
|
552
|
-
optionValue: "value",
|
|
553
|
-
customOptions: customOptions,
|
|
554
|
-
showClear: k >= 2
|
|
555
|
-
}
|
|
556
|
-
};
|
|
557
|
-
}
|
|
558
|
-
else if (campo.Tipo.toLocaleLowerCase() == "text" || campo.Tipo.toLocaleLowerCase() == "label") {
|
|
559
|
-
esquema.properties[campo.Id] = {
|
|
560
|
-
type: "string",
|
|
561
|
-
subtype: "input",
|
|
562
|
-
default: this.getDefaultValueDireccion(k, currentValues)
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
else if (campo.Tipo.toLocaleLowerCase() == "numeric") {
|
|
566
|
-
esquema.properties[campo.Id] = {
|
|
567
|
-
type: "numeric",
|
|
568
|
-
subtype: "decimal",
|
|
569
|
-
default: this.getDefaultValueDireccion(k, currentValues)
|
|
570
|
-
};
|
|
571
|
-
}
|
|
572
|
-
if (esquema.validations.required.length < 2) { //validar los primeros 2 campos
|
|
573
|
-
esquema.validations.required.push({
|
|
574
|
-
"field": `$..${campo.Id}`,
|
|
575
|
-
"message": `Por favor digite el campo N° ${esquema.validations.required.length + 1}`
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
k += 1;
|
|
579
|
-
});
|
|
580
|
-
j += 2;
|
|
581
|
-
});
|
|
582
|
-
const currentElement = {
|
|
583
|
-
data: this.sfCrudService.createObject(esquema, op),
|
|
584
|
-
uiEsquema: uiesquema,
|
|
585
|
-
esquema: esquema,
|
|
586
|
-
scope: scope,
|
|
587
|
-
index: 0,
|
|
588
|
-
isAddressDialog: true,
|
|
589
|
-
separador: separador,
|
|
590
|
-
operation: "address"
|
|
591
|
-
};
|
|
592
|
-
console.log(currentElement);
|
|
593
|
-
this.displays.push(true);
|
|
594
|
-
this.dialogElements.push(currentElement);
|
|
595
|
-
});
|
|
596
|
-
}
|
|
597
|
-
getDefaultValueDireccion(index, currentValues) {
|
|
598
|
-
let valoresLiterales = [];
|
|
599
|
-
this.sfCrudService.mascaras.forEach(mascara => {
|
|
600
|
-
mascara.Campo.forEach(campo => {
|
|
601
|
-
if (campo.Valor && campo.Tipo.toLocaleLowerCase() == "label")
|
|
602
|
-
valoresLiterales.push(campo.Valor);
|
|
603
|
-
});
|
|
604
|
-
});
|
|
605
|
-
let invalidCurrentValues = ["", null, undefined];
|
|
606
|
-
let temporalValue = currentValues && index < currentValues.length && currentValues.length > 1 && !invalidCurrentValues.includes(currentValues[index]) ? currentValues[index] : null;
|
|
607
|
-
valoresLiterales.forEach(valor => {
|
|
608
|
-
if (temporalValue === null || temporalValue === void 0 ? void 0 : temporalValue.startsWith(valor))
|
|
609
|
-
temporalValue = temporalValue.replace(valor, "");
|
|
610
|
-
});
|
|
611
|
-
return temporalValue;
|
|
612
|
-
}
|
|
613
|
-
onClickedEditButton(element, data, index) {
|
|
614
|
-
const esquema = _.cloneDeep(this.sfCrudService.getControl(element.scope, this.sfCrudService.getEsquema(this.indexCrud)));
|
|
615
|
-
esquema.type = "object";
|
|
616
|
-
const currentElement = {
|
|
617
|
-
data: _.cloneDeep(data),
|
|
618
|
-
uiEsquema: _.cloneDeep(element.elements[0]),
|
|
619
|
-
esquema: esquema,
|
|
620
|
-
scope: element.scope,
|
|
621
|
-
index: index,
|
|
622
|
-
operation: "u"
|
|
623
|
-
};
|
|
624
|
-
this.displays.push(true);
|
|
625
|
-
this.dialogElements.push(currentElement);
|
|
626
|
-
}
|
|
627
|
-
onClickedAddButton(element) {
|
|
628
|
-
const esquema = _.cloneDeep(this.sfCrudService.getControl(element.scope, this.sfCrudService.getEsquema(this.indexCrud)));
|
|
629
|
-
const op = this.sfCrudService.registros[this.indexCrud].operations.find(x => x.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
630
|
-
esquema.type = "object";
|
|
631
|
-
const currentElement = {
|
|
632
|
-
data: this.sfCrudService.createObject(esquema, op),
|
|
633
|
-
uiEsquema: _.cloneDeep(element.elements[0]),
|
|
634
|
-
esquema: esquema,
|
|
635
|
-
scope: element.scope,
|
|
636
|
-
index: 0,
|
|
637
|
-
operation: "c"
|
|
638
|
-
};
|
|
639
|
-
try {
|
|
640
|
-
currentElement.data.id = this.sfCrudService.getValue(element.scope, this.sfCrudService.getData(this.indexCrud)).length + 1;
|
|
641
|
-
}
|
|
642
|
-
catch (error) {
|
|
643
|
-
console.log("error agregando un id");
|
|
644
|
-
console.error(error);
|
|
645
|
-
}
|
|
646
|
-
this.displays.push(true);
|
|
647
|
-
this.dialogElements.push(currentElement);
|
|
648
|
-
}
|
|
649
|
-
onCloseAddress(index) {
|
|
650
|
-
var _a;
|
|
651
|
-
let separador = (_a = jsonpath.query(this.sfCrudService.esquemas[this.indexCrud], this.dialogElements[index].scope)[0]) === null || _a === void 0 ? void 0 : _a.separador;
|
|
652
|
-
//leer los campos de las mascaras, setear el string
|
|
653
|
-
let newValue = this.sfCrudService.armarNuevaDireccion("string", this.dialogElements[index].data, separador);
|
|
654
|
-
console.log(newValue);
|
|
655
|
-
let scope = this.dialogElements[index].scope.replaceAll('.properties', '');
|
|
656
|
-
console.log(scope);
|
|
657
|
-
if (index == 0) {
|
|
658
|
-
jsonpath.value(this.sfCrudService.getData(this.indexCrud), scope, newValue);
|
|
659
|
-
}
|
|
660
|
-
else {
|
|
661
|
-
//Actualizarlo en un dialog anterior. Se crea una nueva referencia para que el compilador detecte cambios en el objeto data y lo recargue
|
|
662
|
-
let newDataPreviousDialog = _.cloneDeep(this.dialogElements[index - 1].data);
|
|
663
|
-
jsonpath.value(newDataPreviousDialog, scope, newValue);
|
|
664
|
-
this.dialogElements[index - 1].data = newDataPreviousDialog;
|
|
665
|
-
}
|
|
666
|
-
this.stepService.desiredIndex = undefined;
|
|
667
|
-
this.stepService.requestApproved = true;
|
|
668
|
-
}
|
|
669
|
-
onCloseDialog(index) {
|
|
670
|
-
let validated = true;
|
|
671
|
-
if (this.dialogElements[index].esquema.validations) {
|
|
672
|
-
const op = new Operation();
|
|
673
|
-
op.validations = this.dialogElements[index].esquema.validations;
|
|
674
|
-
validated = this.validateData(op, this.dialogElements[index].data, this.sfCrudService.getRegistro(this.indexCrud).conditions || []);
|
|
675
|
-
}
|
|
676
|
-
if (validated) {
|
|
677
|
-
switch (this.dialogElements[index].operation) {
|
|
678
|
-
case "c":
|
|
679
|
-
this.onCloseAddItem(index);
|
|
680
|
-
break;
|
|
681
|
-
case "u":
|
|
682
|
-
this.onCloseEditRow(index);
|
|
683
|
-
break;
|
|
684
|
-
case "address":
|
|
685
|
-
this.onCloseAddress(index);
|
|
686
|
-
break;
|
|
687
|
-
}
|
|
688
|
-
this.removeDialogItem();
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
removeDialogItem() {
|
|
692
|
-
this.dialogElements.pop();
|
|
693
|
-
this.displays.pop();
|
|
694
|
-
}
|
|
695
|
-
setLabelSumbit() {
|
|
696
|
-
let x = { "c": { label: 'Guardar', icon: 'pi pi-save' },
|
|
697
|
-
"u": { label: 'Actualizar', icon: 'pi pi-sync' },
|
|
698
|
-
"d": { label: 'Eliminar', icon: 'pi pi-trash' }
|
|
699
|
-
};
|
|
700
|
-
this.btnSubmit = x[this.sfCrudService.getTrx(0)];
|
|
701
|
-
}
|
|
702
|
-
back() {
|
|
703
|
-
this.router.navigateByUrl(this.sfCrudService.registros[0].btnBack);
|
|
704
|
-
}
|
|
705
|
-
cargarMascarasDirecciones() {
|
|
706
|
-
if (this.sfCrudService.mascaras.length == 0) {
|
|
707
|
-
return this.generalService.genericRequest("GET", `${this.generalService.generales}/General/getConfiguracionKatios/${this.idKatios}`).then((res) => {
|
|
708
|
-
this.sfCrudService.mascaras = JSON.parse(res).RESPUESTA.MascarasDirecciones.Mascaras.Mascara;
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
return Promise.resolve(this.sfCrudService.mascaras);
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.ActivatedRoute }, { token: i3.MessageService }, { token: i4.SfCrudService }, { token: i5.StepService }, { token: i6.SfPdfsignService }, { token: i7.SfSimuladorService }, { token: i8.NotificationService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
715
|
-
RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", trx: "trx", id: "id", user: "user", dataExt: "dataExt", ids: "ids", environment: "environment", buttonsFooterTemplate: "buttonsFooterTemplate", idEntidad: "idEntidad" }, outputs: { sendData: "sendData", onSubmit: "onSubmit" }, host: { properties: { "style.--primary-color": "this.color", "style.--secondary-color": "this.color2", "style.--button-color": "this.colorButton" } }, providers: [MessageService], usesOnChanges: true, ngImport: i0, template: "<div class=\"card\">\r\n <!--TODO convertir en template y editarla en -->\r\n <h5 *ngIf=\"sfCrudService.registros.length == 1\" class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{sfCrudService.registros[0]?.label || idForm.replaceAll('_', ' ')}} {{ids.length > 0 ? '-' + ids[0] : ''}}</span>\r\n <button *ngIf=\"sfCrudService.registros[0]?.canBack\" pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngIf=\"items.length > 1\">\r\n <app-step [items]=\"items\"></app-step>\r\n </div>\r\n <div *ngIf=\"items.length == 1\">\r\n <app-form [data]=\"sfCrudService.dataset[0]\" [esquema]=\"sfCrudService.esquemas[0]\"\r\n [uiEsquema]=\"sfCrudService.uiEsquemas[0]\" [isDialog]=\"false\"></app-form>\r\n\r\n <!--renderizar un codigo personalizado desde el componente padre o renderizar el que se tiene por defecto-->\r\n <ng-container *ngTemplateOutlet=\"buttonsFooterTemplate || defaultButtonsFooterTemplate\"></ng-container>\r\n <ng-template #defaultButtonsFooterTemplate>\r\n <div class=\"card-footer mt-2\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\" (click)=\"onClickBtnSubmit()\"></button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<span *ngFor=\"let item of dialogElements; let $index=index\">\r\n <p-dialog [(visible)]=\"displays[$index]\" [modal]=\"true\" [header]=\"'Detalle'\" [closable]=\"false\">\r\n <!-- TODO header = currentElement.element.label ? currentElement.element.label: -->\r\n <app-form [data]=\"item.data\" [esquema]=\"item.esquema\" [uiEsquema]=\"item.uiEsquema\" [isDialog]=\"true\"\r\n [id]=\"ids[indexCrud]\" [isAddressDialog]=\"item.isAddressDialog === true\" [separador]=\"item.separador\"></app-form>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button icon=\"pi pi-times\" (onClick)=\"removeDialogItem()\" label=\"Cancelar\" ></p-button>\r\n <p-button icon=\"pi pi-check\" [disabled]=\"item.esquema.disabled === true\" (onClick)=\"onCloseDialog($index)\" label=\"Ok\" pAutoFocus\r\n [autofocus]=\"true\"></p-button>\r\n </ng-template>\r\n </p-dialog>\r\n</span>\r\n\r\n<p-toast *ngIf=\"dialogElements.length == 0\">\r\n <ng-template let-message pTemplate=\"message\">\r\n <div class=\"custom-toast\">\r\n <i class=\"pi\" [ngClass]=\"{\r\n 'pi-check-circle': message.severity === 'success',\r\n 'pi-info-circle': message.severity === 'info',\r\n 'pi-exclamation-triangle': message.severity === 'warn',\r\n 'pi-times-circle': message.severity === 'error'\r\n }\"></i>\r\n <div class=\"custom-toast-content\">\r\n <span class=\"custom-toast-detail\">{{message.detail}}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</p-toast>\r\n\r\n\r\n", styles: ["@media screen and (max-width: 600px){::ng-deep .p-toast{width:90vw!important;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:1}::ng-deep .p-dialog-mask .p-dialog{width:95vw}}@media screen and (min-width: 601px){::ng-deep .p-toast{width:25rem!important;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:1}}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-toast{padding:8px;display:-webkit-box;z-index:inherit;justify-content:center;width:100%}.custom-toast-detail{display:flex;font-family:sans-serif;font-size:1.05rem;font-weight:400;margin:.5rem 0 0 .5rem;width:80%}.custom-toast i{margin-right:.5rem;font-size:2rem;width:100%;height:100%}::ng-deep .p-toast-message{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}::ng-deep .p-toast .p-toast-message.p-toast-message-info{background:#B3E5FC;border:solid #0891cf;color:#0891cf;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message{border-radius:6px}::ng-deep .p-toast .p-toast-message.p-toast-message-warn{background:rgba(255,242,226,.7);border:solid #cc8925;color:#cc8925;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message.p-toast-message-error{background:#FFCDD2;border:solid #e60017;color:#e60017;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message.p-toast-message-success{background:#C8E6C9;border:solid #439446;color:#439446;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message .p-toast-icon-close{margin-top:1rem;margin-right:1.5rem}::ng-deep .p-toast .p-toast-message.p-toast-message-warn .p-toast-icon-close{color:#cc8925}::ng-deep .p-toast .p-toast-message.p-toast-message-info .p-toast-icon-close{color:#0891cf}::ng-deep .p-toast .p-toast-message.p-toast-message-error .p-toast-icon-close{color:#e60017}::ng-deep .p-toast .p-toast-message.p-toast-message-succes .p-toast-icon-close{color:#439446}\n"], components: [{ type: i9.StepComponent, selector: "app-step", inputs: ["items"] }, { type: i10.FormComponent, selector: "app-form", inputs: ["uiEsquema", "esquema", "data", "isDialog", "isAddressDialog", "separador"] }, { type: i11.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { type: i12.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i13.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i15.Ripple, selector: "[pRipple]" }, { type: i14.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
716
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, decorators: [{
|
|
717
|
-
type: Component,
|
|
718
|
-
args: [{
|
|
719
|
-
selector: 'sf-registro',
|
|
720
|
-
templateUrl: './registro.component.html',
|
|
721
|
-
providers: [MessageService],
|
|
722
|
-
entryComponents: [RegistroComponent],
|
|
723
|
-
styleUrls: ['./registro.component.css']
|
|
724
|
-
}]
|
|
725
|
-
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.ActivatedRoute }, { type: i3.MessageService }, { type: i4.SfCrudService }, { type: i5.StepService }, { type: i6.SfPdfsignService }, { type: i7.SfSimuladorService }, { type: i8.NotificationService }, { type: i2.Router }]; }, propDecorators: { color: [{
|
|
726
|
-
type: HostBinding,
|
|
727
|
-
args: ["style.--primary-color"]
|
|
728
|
-
}], color2: [{
|
|
729
|
-
type: HostBinding,
|
|
730
|
-
args: ["style.--secondary-color"]
|
|
731
|
-
}], colorButton: [{
|
|
732
|
-
type: HostBinding,
|
|
733
|
-
args: ["style.--button-color"]
|
|
734
|
-
}], idKatios: [{
|
|
735
|
-
type: Input
|
|
736
|
-
}], trx: [{
|
|
737
|
-
type: Input
|
|
738
|
-
}], id: [{
|
|
739
|
-
type: Input
|
|
740
|
-
}], user: [{
|
|
741
|
-
type: Input
|
|
742
|
-
}], dataExt: [{
|
|
743
|
-
type: Input
|
|
744
|
-
}], ids: [{
|
|
745
|
-
type: Input
|
|
746
|
-
}], environment: [{
|
|
747
|
-
type: Input
|
|
748
|
-
}], buttonsFooterTemplate: [{
|
|
749
|
-
type: Input
|
|
750
|
-
}], sendData: [{
|
|
751
|
-
type: Output
|
|
752
|
-
}], onSubmit: [{
|
|
753
|
-
type: Output
|
|
754
|
-
}], idEntidad: [{
|
|
755
|
-
type: Input
|
|
756
|
-
}] } });
|
|
757
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUE0RCxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLHFHQUFxRztBQUNyRyxpRkFBaUY7QUFDakYsT0FBTyxFQUFtQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHcEgsT0FBTyxFQUFZLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQztBQU1yQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLElBQTJCLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVd0RCxNQUFNLE9BQU8saUJBQWlCO0lBa0M1QixZQUNVLGNBQThCLEVBQzlCLFdBQTJCLEVBQzNCLGNBQThCLEVBQy9CLGFBQTRCLEVBQzNCLFdBQXdCLEVBQ3hCLGdCQUFrQyxFQUNsQyxrQkFBc0MsRUFDdEMsbUJBQXdDLEVBQ3hDLE1BQWM7UUFSZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtC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O1NBQ0g7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNyRCxDQUFDOzsrR0F6dEJVLGlCQUFpQjttR0FBakIsaUJBQWlCLGdjQUpqQixDQUFDLGNBQWMsQ0FBQywrQ0N2QjdCLG1qR0FxREE7NEZEMUJhLGlCQUFpQjtrQkFQN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUMzQixlQUFlLEVBQUUsbUJBQW1CO29CQUNwQyxTQUFTLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztpQkFDeEM7NFVBR3VDLEtBQUs7c0JBQTFDLFdBQVc7dUJBQUMsdUJBQXVCO2dCQUNJLE1BQU07c0JBQTdDLFdBQVc7dUJBQUMseUJBQXlCO2dCQUNELFdBQVc7c0JBQS9DLFdBQVc7dUJBQUMsc0JBQXNCO2dCQUMxQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQU9NLFNBQVM7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vaW1wb3J0IHsgQ29uZmlnUmVnaXN0cm8sIE9wZXJhdGlvbiwgUmVxdWVzdENoZWNraW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9jcnVkLWNvbmZpZy5tb2RlbCc7XHJcbi8vaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25maWdSZWdpc3RybywgQ3J1ZENvbmZpZywgS2V5LCBPcGVyYXRpb24sIFJlcXVlc3RDaGVja2luZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvY3J1ZC1jb25maWcubW9kZWwnO1xyXG4vL2ltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9nZW5lcmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBqc29ucGF0aCBmcm9tICdqc29ucGF0aCc7XHJcbmltcG9ydCB7IExvYWRpbmcsIFNmQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZi1jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZlBkZnNpZ25TZXJ2aWNlIH0gZnJvbSAnc2YtcGRmc2lnbic7XHJcbmltcG9ydCB7IFNmU2ltdWxhZG9yU2VydmljZSB9IGZyb20gJ3NmLXNpbXVsYWRvcic7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvQ29uZGl0aW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IFN0ZXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0ZXAuc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgU3dhbCwgeyBTd2VldEFsZXJ0T3B0aW9ucyB9IGZyb20gJ3N3ZWV0YWxlcnQyJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZi1yZWdpc3RybycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lzdHJvLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXHJcbiAgZW50cnlDb21wb25lbnRzOiBbUmVnaXN0cm9Db21wb25lbnRdLFxyXG4gIHN0eWxlVXJsczogWycuL3JlZ2lzdHJvLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVnaXN0cm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95e1xyXG5cclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLXByaW1hcnktY29sb3JcIikgY29sb3IhOiBzdHJpbmc7XHJcbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1zZWNvbmRhcnktY29sb3JcIikgY29sb3IyITogc3RyaW5nO1xyXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLi0tYnV0dG9uLWNvbG9yXCIpIGNvbG9yQnV0dG9uITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlkS2F0aW9zOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB0cng6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB1c2VyOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YUV4dDogYW55O1xyXG4gIEBJbnB1dCgpIGlkczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogYW55O1xyXG4gIEBJbnB1dCgpIGJ1dHRvbnNGb290ZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIHNlbmREYXRhOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblN1Ym1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblxyXG4gIHB1YmxpYyBidG5TdWJtaXQ6IGFueTtcclxuICBub3RpZmljYXRpb25TdWJzY3JpcHRpb246IGFueTtcclxuICBzdWJzVG9LaWxsT25EZXN0cm95OiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzZXQgaWRFbnRpZGFkKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaWRGb3JtID0gdmFsdWVcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpZEZvcm0hOiBzdHJpbmc7XHJcbiAgcHVibGljIGlzTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZGlzcGxheXM6IGJvb2xlYW5bXT1bXTtcclxuICBwdWJsaWMgZmlyc3RMb2FkID0gdHJ1ZTtcclxuICBwdWJsaWMgbG9nbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBkaWFsb2dFbGVtZW50czogRGlhbG9nRWxlbWVudFtdPVtdO1xyXG4gIHByaXZhdGUgbG9hZGluZyE6TG9hZGluZztcclxuICBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHB1YmxpYyBzZkNydWRTZXJ2aWNlOiBTZkNydWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGVwU2VydmljZTogU3RlcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNmUGRmU2lnblNlcnZpY2U6IFNmUGRmc2lnblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNmU2ltdWxhZG9yU2VydmljZTogU2ZTaW11bGFkb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxyXG4gICkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0ge2luUHJvZ3Jlc3M6IHRydWUsIHRhcmdldDogdW5kZWZpbmVkfTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5pZEthdGlvcyAmJiB0aGlzLmlkRm9ybSAmJiB0aGlzLmVudmlyb25tZW50ICAmJiAoY2hhbmdlc1tcImlkS2F0aW9zXCJdIHx8IGNoYW5nZXNbXCJpZEVudGlkYWRcIl0pKXtcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmlkcyA9IHRoaXMuaWRzXHJcbiAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5pZEthdGlvcyA9IHRoaXMuaWRLYXRpb3NcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmVudmlyb25tZW50ID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmlkS2F0aW9zID0gdGhpcy5pZEthdGlvc1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmVudmlyb25tZW50ID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLnNmUGRmU2lnblNlcnZpY2Uuc2V0RW52aXJvbWVudHModGhpcy5lbnZpcm9ubWVudClcclxuICAgICAgdGhpcy5zZlNpbXVsYWRvclNlcnZpY2UuZW52aXJvbm1lbnRzID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLnNmU2ltdWxhZG9yU2VydmljZS5pZEthdGlvcyA9IHRoaXMuaWRLYXRpb3NcclxuXHJcbiAgICAgIHRoaXMubG9hZENvbmZpZ0NydWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYXJnYXJNYXNjYXJhc0RpcmVjY2lvbmVzKClcclxuICAgIHRoaXMuaW5zdGFuY2VTdWJzU3RlcFNlcnZpY2UoKTtcclxuICAgIHRoaXMubm90aWZpY2F0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm5vdGlmaWNhdGlvbkFkZGVkJCgpLnN1YnNjcmliZShub3RpZmljYXRpb24gPT4ge1xyXG4gICAgICAgIGlmKG5vdGlmaWNhdGlvbj8ucmVxdWVzdENoZWNraW5nPy51c2VTd2FsKXtcclxuICAgICAgICAgIFN3YWwuZmlyZShub3RpZmljYXRpb24ubXNnIGFzIFN3ZWV0QWxlcnRPcHRpb25zKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubXNnIGFzIFN3ZWV0QWxlcnRPcHRpb25zKS5zaG93Q2FuY2VsQnV0dG9uICYmIHJlcy5pc0Rpc21pc3NlZCAmJiBub3RpZmljYXRpb24ucmVxdWVzdENoZWNraW5nPy5jYW5jZWxSZWRpcmVjdCkge1xyXG4gICAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24ucmVxdWVzdENoZWNraW5nLmNhbmNlbFJlZGlyZWN0LnRvVXBwZXJDYXNlKCkgPT0gXCJJTklDSU9cIikgdGhpcy5zZkNydWRTZXJ2aWNlLnJlZGlyZWN0VG9JbmljaW8oKVxyXG4gICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmhyZWYgPSBub3RpZmljYXRpb24ucmVxdWVzdENoZWNraW5nLmNhbmNlbFJlZGlyZWN0XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmlzQ29uZmlybWVkICYmIG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmc/LnJlZGlyZWN0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmcucmVkaXJlY3QudG9VcHBlckNhc2UoKSA9PSBcIklOSUNJT1wiKSB0aGlzLnNmQ3J1ZFNlcnZpY2UucmVkaXJlY3RUb0luaWNpbygpXHJcbiAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmcucmVkaXJlY3RcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm90aWZpY2F0aW9uPy5tc2cgJiYgbm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZz8ucmVkaXJlY3Qpe1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQobm90aWZpY2F0aW9uLm1zZyk7XHJcbiAgICAgICAgICBpZiAobm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZy5yZWRpcmVjdC50b1VwcGVyQ2FzZSgpID09IFwiSU5JQ0lPXCIpIHRoaXMuc2ZDcnVkU2VydmljZS5yZWRpcmVjdFRvSW5pY2lvKClcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbmV3VVJMID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldFVSTFJlZGlyZWN0KG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmcucmVkaXJlY3QpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbmV3VVJMXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub3RpZmljYXRpb24/Lm1zZyl7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZChub3RpZmljYXRpb24ubXNnKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubm90aWZpY2F0aW9uU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN1YnNUb0tpbGxPbkRlc3Ryb3kuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpXHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlc2V0KClcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5yZXNldCgpXHJcbiAgICBjb25zb2xlLmxvZyhcImRlc3Ryb3lcIilcclxuICB9XHJcblxyXG4gIGluc3RhbmNlU3Vic1N0ZXBTZXJ2aWNlKCl7XHJcbiAgICB0aGlzLnN1YnNUb0tpbGxPbkRlc3Ryb3kucHVzaCh0aGlzLnN0ZXBTZXJ2aWNlLmN1c3RvbUNoaWxkcmVuRXZlbnRzJC5zdWJzY3JpYmUoKGV2ZW50OiB7bmFtZTogc3RyaW5nLCBkYXRhOiBhbnl9KSA9PiB7XHJcbiAgICAgICAgaWYgKCFldmVudCkgcmV0dXJuO1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIFwiT05DTElDS0VERURJVEJVVFRPTlwiOlxyXG4gICAgICAgICAgICB0aGlzLm9uQ2xpY2tlZEVkaXRCdXR0b24oZXZlbnQuZGF0YS5lbGVtZW50LCBldmVudC5kYXRhLmRhdGEsIGV2ZW50LmRhdGEuaW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIk9OQ0xJQ0tFRERFTEVURUJVVFRPTlwiOlxyXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZVJvdyhldmVudC5kYXRhLmVsZW1lbnQsIGV2ZW50LmRhdGEuaW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIk9OQ0xJQ0tFREFEREJVVFRPTlwiOlxyXG4gICAgICAgICAgICB0aGlzLm9uQ2xpY2tlZEFkZEJ1dHRvbihldmVudC5kYXRhLmVsZW1lbnQpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIk9OQ0xJQ0tFREFERFJFU1NcIjpcclxuICAgICAgICAgICAgdGhpcy5vbkNsaWNrZWRBZGRyZXNzKGV2ZW50LmRhdGEuc2NvcGUpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpXHJcblxyXG4gICAgICB0aGlzLnN1YnNUb0tpbGxPbkRlc3Ryb3kucHVzaCh0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZhbCQuc3Vic2NyaWJlKCh2YWx1ZSkgPT57XHJcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpXHJcbiAgICAgICAgaWYgKHZhbHVlPy5kZXNpcmVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLmRlc2lyZWQgPCB2YWx1ZS5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcFNlcnZpY2UucmVxdWVzdEFwcHJvdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmluZGV4ID0gdGhpcy5zdGVwU2VydmljZS5jdXJyZW50SW5kZXhcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID10aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8odGhpcy5pbmRleENydWQpLm9wZXJhdGlvbnMuZmluZChvcCA9PiBvcC50eXBlLnN0YXJ0c1dpdGgodGhpcy5zZkNydWRTZXJ2aWNlLmdldFRyeCh0aGlzLmluZGV4Q3J1ZCkpKSFcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0YShvcGVyYXRpb24sIHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSwgdGhpcy5zZkNydWRTZXJ2aWNlLmdldFJlZ2lzdHJvKHRoaXMuaW5kZXhDcnVkKS5jb25kaXRpb25zIHx8IFtdKSkgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZWxzZSBpZihvcGVyYXRpb24ubWV0aG9kICE9IG51bGwpIHRoaXMudXBsb2FkSW5mb1N0ZXAodmFsdWUpXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5hbnN3ZXJDaGVja2luZyl7IC8vbm8gdGllbmUgcmVxdWVzdCwgc29sbyB1biBtZW5zYWplXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLmluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZm9ybUxvYWRpbmcgPSB0aGlzLmxvYWRpbmc7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuZXJhdGVNZXNzYWdlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmdlbkRlZmF1bHRNZXNzYWdlKFwic3VjY2Vzc1wiLCB1bmRlZmluZWQsIFwiSW5mb3JtYWNpw7NuIHN1YmlkYSBjb3JyZWN0YW1lbnRlXCIsIG9wZXJhdGlvbi5hbnN3ZXJDaGVja2luZyksIHt9LCBvcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmcpLFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFuc3dlckNoZWNraW5nXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuaW5kZXggPSB0aGlzLnN0ZXBTZXJ2aWNlLmN1cnJlbnRJbmRleFxyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wKClcclxuICAgICAgICAgICAgfWVsc2V7Ly9ubyB0aWVuZSBuYWRhIGNvbmZpZ3VyYWRvXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmluZGV4ID0gdGhpcy5zdGVwU2VydmljZS5jdXJyZW50SW5kZXhcclxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KSlcclxuICAgIGNvbnNvbGUubG9nKFwic3VicyBzdGVwIHNlcnZpY2UgdGVybWluYWRhc1wiKVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkSW5mb1N0ZXAocG9zaXRpb246IHtjdXJyZW50OiBudW1iZXIsIGRlc2lyZWQ6IG51bWJlcn0pe1xyXG4gICAgdGhpcy5sb2FkaW5nLmluUHJvZ3Jlc3MgPSB0cnVlXHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZm9ybUxvYWRpbmcgPSB0aGlzLmxvYWRpbmdcclxuICAgIHRoaXMuc3VibWl0KHBvc2l0aW9uLmN1cnJlbnQpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBsZXQgdGllbmVSZWRpcmVjdCA9IHRoaXMuc2ZDcnVkU2VydmljZS5jdXJyZW50T3BlcmF0aW9uPy5hbnN3ZXJDaGVja2luZyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc2ZDcnVkU2VydmljZS5jdXJyZW50T3BlcmF0aW9uPy5hbnN3ZXJDaGVja2luZz8ucmVkaXJlY3QgIT09IHVuZGVmaW5lZFxyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLml0ZW1zLmxlbmd0aClcclxuICAgICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IGZhbHNlXHJcbiAgICAgICAgLy90aGlzLnN0ZXBTZXJ2aWNlLmRlc2lyZWRJbmRleCA9IHVuZGVmaW5lZFxyXG4gICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5pbmRleCA9IHRoaXMuc3RlcFNlcnZpY2UuY3VycmVudEluZGV4XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXRpZW5lUmVkaXJlY3Qpe1xyXG4gICAgICAgIHRoaXMuYWR2YW5jZShwb3NpdGlvbi5jdXJyZW50LCBwb3NpdGlvbi5kZXNpcmVkLCBmYWxzZSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNjcm9sbFRvcCgpXHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSBmYWxzZVxyXG5cclxuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvYWRpbmcuaW5Qcm9ncmVzcyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZ30pXHJcbiAgfVxyXG5cclxuICBvbkNsaWNrQnRuU3VibWl0KCkge1xyXG4gICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92YWwgPSB0aGlzLmluZGV4Q3J1ZFxyXG4gIH1cclxuXHJcbiAgbG9hZENvbmZpZ0NydWQoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcuaW5Qcm9ncmVzcyA9IHRydWVcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZztcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5kYXRhRXh0ID0gdGhpcy5kYXRhRXh0XHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuY3J1ZExvYWRlZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMubG9hZFNlc3Npb24oKSkge1xyXG4gICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuY3J1ZExvYWRlZCA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdldENydWRCeUVudGlkYWQodGhpcy5pZEthdGlvcywgdGhpcy5pZEZvcm0pXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3J1ZCBjYXJnYWRvXCIpXHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLnVpRXNxdWVtYXMgPSByZXMudWlFc3F1ZW1hc1xyXG4gICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5lc3F1ZW1hcyA9IHJlcy5lc3F1ZW1hc1xyXG4gICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5yZWdpc3Ryb3MgPSByZXMucmVnaXN0cm9zXHJcbiAgICAgICAgdGhpcy5jdXN0b21pemVDb21wYW55KHJlcy51aUVzcXVlbWFzKVxyXG4gICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5yZWdpc3Ryb3MuZm9yRWFjaCgoXywgaSkgPT4gdGhpcy5zZkNydWRTZXJ2aWNlLnNldFRyeChcImNcIiwgaSkpXHJcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRMYWJlbFN1bWJpdCgpXHJcbiAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZGF0YXNldC5mb3JFYWNoKChkYXRhLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiX2lkR1dWQURPXCJdICYmIGRhdGEuQURPPy5kYXRhUHJvY2Vzbyl7XHJcbiAgICAgICAgICAgICAgZGF0YS5BRE8uZGF0YVByb2Nlc28uaWRQcm9jZXNvID0gdGhpcy5hY3RpdmVSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcIl9pZEdXVkFET1wiXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiX2lkQURPXCJdICYmIGRhdGEuQURPKXtcclxuICAgICAgICAgICAgICBkYXRhLkFETy5pZFRyYW5zYWN0aW9uID0gdGhpcy5hY3RpdmVSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcIl9pZEFET1wiXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5zZXREYXRhU2V0KGRhdGEsIGkpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgd2lsbEV4ZWN1dGVSZXF1ZXN0ID0gdGhpcy5hZHZhbmNlKDAsIHRoaXMuc2ZDcnVkU2VydmljZS51aUVzcXVlbWFzLmxlbmd0aCAtIDEsIHRydWUpXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RlcHMocmVzLnVpRXNxdWVtYXMpXHJcbiAgICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5jcnVkTG9hZGVkID0gdHJ1ZVxyXG4gICAgICAgICAgICBpZiAoIXdpbGxFeGVjdXRlUmVxdWVzdCl7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLmluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZm9ybUxvYWRpbmcgPSB0aGlzLmxvYWRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KS5jYXRjaCgoZXgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGV4KVxyXG4gICAgICAgIHRoaXMubG9hZGluZy5pblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmZvcm1Mb2FkaW5nID0gdGhpcy5sb2FkaW5nXHJcbiAgICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RlcCB3aWxsIGFkdmFuY2UgdW50aWwgZXNxdWVtYSBpcyBub3QgY29tcGxldGVkXHJcbiAgICovXHJcbiAgYWR2YW5jZShzdGFydDogbnVtYmVyLCBsaW1pdDogbnVtYmVyLCBleGVjdXRlUmVxdWVzdDogYm9vbGVhbikge1xyXG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlIGRlc2RlIFwiLCBzdGFydCwgXCIgaGFzdGEgXCIsIGxpbWl0KVxyXG4gICAgbGV0IGkgPSBzdGFydFxyXG4gICAgbGV0IG9wO1xyXG4gICAgbGV0IHdpbGxFeGVjdXRlUmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgbGV0IHJlZ2lzdHJvO1xyXG4gICAgd2hpbGUgKGkgPCBsaW1pdCl7XHJcbiAgICAgIHJlZ2lzdHJvID10aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaSlcclxuICAgICAgIG9wID0gcmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KGkpKSkhXHJcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZURhdGEob3AsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKGkpLCByZWdpc3Ryby5jb25kaXRpb25zIHx8IFtdLCBmYWxzZSkpIGJyZWFrO1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmluZGV4ID0gaVxyXG4gICAgdGhpcy5zdGVwU2VydmljZS5jdXJyZW50SW5kZXggPSBpXHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLmRlc2lyZWRJbmRleCA9IGlcclxuICAgIGNvbnNvbGUubG9nKFwiYWR2YW5jZVwiLCBpKVxyXG4gICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSB0cnVlXHJcbiAgICByZWdpc3RybyA9dGhpcy5zZkNydWRTZXJ2aWNlLmdldFJlZ2lzdHJvKGkpXHJcbiAgICBsZXQgZGF0YUN1cnJlbnRTdGVwID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEoaSlcclxuICAgIG9wID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldFJlZ2lzdHJvKGkpLm9wZXJhdGlvbnMuZmluZChvcCA9PiBvcC50eXBlLnN0YXJ0c1dpdGgodGhpcy5zZkNydWRTZXJ2aWNlLmdldFRyeChpKSkpIVxyXG4gICAgaWYgKGV4ZWN1dGVSZXF1ZXN0ICYmICh0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiX2lkR1dWQURPXCJdIHx8IHRoaXMuYWN0aXZlUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJfaWRBRE9cIl0pIC8vVmllbmUgZGUgQURPXHJcbiAgICAgICYmIGRhdGFDdXJyZW50U3RlcC5BRE8gJiYgdGhpcy52YWxpZGF0ZURhdGEob3AsIGRhdGFDdXJyZW50U3RlcCwgcmVnaXN0cm8uY29uZGl0aW9ucyA/PyBbXSwgZmFsc2UpIC8vRWwgc3RlcCBlc3RhIGNvbXBsZXRvXHJcbiAgICApIHtcclxuICAgICAgY29uc29sZS5sb2coXCJhZHZhbmNlIHdpdGggYXBwcm92YWxcIiwgaSlcclxuICAgICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92YWwgPSBpXHJcbiAgICAgIHdpbGxFeGVjdXRlUmVxdWVzdCA9IHRydWVcclxuICAgIH1cclxuICAgIHJldHVybiB3aWxsRXhlY3V0ZVJlcXVlc3Q7XHJcbiAgfVxyXG4gIGxvYWRTZXNzaW9uKCkge1xyXG4gICAgY29uc3Qgd2FzTG9hZGVkID0gdGhpcy5zZkNydWRTZXJ2aWNlLmxvYWRTZXNzaW9uKClcclxuICAgIGlmICh3YXNMb2FkZWQpe1xyXG4gICAgICB0aGlzLmN1c3RvbWl6ZUNvbXBhbnkodGhpcy5zZkNydWRTZXJ2aWNlLnVpRXNxdWVtYXMpXHJcbiAgICAgIHRoaXMuc3RlcFNlcnZpY2UuY3VycmVudEluZGV4ID0gdGhpcy5zZkNydWRTZXJ2aWNlLmluZGV4XHJcbiAgICAgIHRoaXMuY3JlYXRlU3RlcHModGhpcy5zZkNydWRTZXJ2aWNlLnVpRXNxdWVtYXMpXHJcbiAgICAgIHRoaXMubG9hZGluZy5pblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdhc0xvYWRlZFxyXG4gIH1cclxuXHJcbiAgY3VzdG9taXplQ29tcGFueSh1aUVzcXVlbWFzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmNvbmZpZ0VtcHJlc2EgPSB1aUVzcXVlbWFzLmZpbmQodWkgPT4gdWkuZ2VuZXJhbCk/LmdlbmVyYWxcclxuICAgIHRoaXMubG9nbyA9IHRoaXMuc2ZDcnVkU2VydmljZS5jb25maWdFbXByZXNhPy5pY29ucz8uY2FyZ2E7XHJcbiAgICBpZih0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYSl7XHJcbiAgICAgIGlmICh0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnM/Lm1haW4pIHRoaXMuY29sb3IgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnMubWFpblxyXG4gICAgICBpZiAodGhpcy5zZkNydWRTZXJ2aWNlLmNvbmZpZ0VtcHJlc2EuY29sb3JzPy5zZWNvbmRhcnkpIHRoaXMuY29sb3IyID0gdGhpcy5zZkNydWRTZXJ2aWNlLmNvbmZpZ0VtcHJlc2EuY29sb3JzLnNlY29uZGFyeVxyXG4gICAgICBpZiAodGhpcy5zZkNydWRTZXJ2aWNlLmNvbmZpZ0VtcHJlc2EuY29sb3JzPy5idXR0b24pIHRoaXMuY29sb3JCdXR0b24gPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnMuYnV0dG9uXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuY29sb3JCdXR0b24pIHRoaXMuY29sb3JCdXR0b24gPSBcImJsdWVcIjtcclxuICAgIGlmICghdGhpcy5jb2xvcjIpIHRoaXMuY29sb3IyID0gXCJibHVlXCI7XHJcbiAgICBpZiAoIXRoaXMuY29sb3IpIHRoaXMuY29sb3IgPSBcImJsdWVcIjtcclxuICB9XHJcblxyXG4gIHNjcm9sbFRvcCgpe1xyXG4gICAgd2luZG93LnNjcm9sbCh7XHJcbiAgICAgIHRvcDogMCxcclxuICAgICAgbGVmdDogMCxcclxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVN0ZXBzKHVpRXNxdWVtYXM6IGFueVtdKXtcclxuICAgIHRoaXMuaXRlbXMgPSBbXVxyXG4gICAgdWlFc3F1ZW1hcy5mb3JFYWNoKCh1aUVzcSwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKHVpRXNxLnN0ZXApIHRoaXMuaXRlbXMucHVzaCh7bGFiZWw6IHVpRXNxLnN0ZXAsIHJvdXRlckxpbms6IGluZGV4LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcInByZXNlcnZlXCJ9KVxyXG4gICAgICBlbHNlIHRoaXMuaXRlbXMucHVzaCh7bGFiZWw6IGBwYXNvICR7aW5kZXh9YCwgcm91dGVyTGluazogaW5kZXh9KVxyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmdldFJlZ2lzdHJvKGluZGV4KSAvL3ZlciBzaSB0aWVuZSB1biBjaGFuZ2VcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnN0YW5jaWEgdG9kb3MgbG9zIGVzcXVlbWFzLCB5IHJlYWxpemEgbG9zIHJlcXVlc3RzIHBhcmEgdHJhZXIgbGEgZGF0YSBkZSB0b2RvcyBsb3Mgc3RlcC5cclxuICAgKiBAcGFyYW0gZXNxdWVtYVxyXG4gICAqIEBwYXJhbSByZWdpc3Ryb1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgbG9hZERhdGEoKXtcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5lc3F1ZW1hcy5mb3JFYWNoKChlc3F1ZW1hLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvc1tpXS5vcGVyYXRpb25zLmZpbmQoeCA9PiB4LnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KGkpKSlcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLnNldERhdGFTZXQodGhpcy5zZkNydWRTZXJ2aWNlLmNyZWF0ZU9iamVjdChlc3F1ZW1hLCBvcCksIGkpXHJcbiAgICB9KVxyXG4gICAgY29uc29sZS5sb2coXCJsb2FkRGF0YVwiKVxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuc2ZDcnVkU2VydmljZS5yZWdpc3Ryb3MubWFwKChyZWdpc3RybywgaSkgPT4gdGhpcy5pZHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0SW5mb1JlZ2lzdHJvKHJlZ2lzdHJvLCBpLCB0aGlzLmlkc1tpXSk6IFByb21pc2UucmVzb2x2ZSgpKSlcclxuICB9XHJcblxyXG4gIGdldEluZm9SZWdpc3Rybyhjb25maWdSZWdpc3RybzogQ29uZmlnUmVnaXN0cm8sIGluZGV4OiBudW1iZXIsIGlkOiBhbnkpIHtcclxuXHJcbiAgICBjb25zdCBvcCA9IGNvbmZpZ1JlZ2lzdHJvLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZSA9PSAncmVhZCcpO1xyXG4gICAgaWYgKCFvcCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldFVSTChvcCwgaW5kZXgsIGlkKVxyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3Qob3AubWV0aG9kLCB1cmwpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZFxyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpe1xyXG4gICAgICAgICAgdmFsdWUgPSAgQXJyYXkuaXNBcnJheShyZXMuZGF0YSkgPyByZXMuZGF0YVswXSA6IHJlcy5kYXRhXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJlcykgPyByZXNbMF06IHJlc1xyXG5cclxuICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlPYmplY3RLZXlzKHZhbHVlLCBvcC5rZXlzRXNxdWVtYSB8fCBbXSwgY29uZmlnUmVnaXN0cm8pXHJcbiAgICAgICAgaWYgKG9wLmNoYW5nZVRyeCkgb3AuY2hhbmdlVHJ4LmZvckVhY2goeCA9PiAgdGhpcy5zZkNydWRTZXJ2aWNlLnNldFRyeCh4LnRyeCwgeC5pbmRleCkpXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImdldEluZm9SZWdpc3Ryb1wiLCBvcC5jaGFuZ2VUcngpXHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcilcclxuICAgICAgICBsZXQgZXJyb3JDaGVja2luZztcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcC5lcnJvckNoZWNraW5nKSkgZXJyb3JDaGVja2luZyA9IG9wLmVycm9yQ2hlY2tpbmdbMF1cclxuICAgICAgICBlbHNlIGVycm9yQ2hlY2tpbmcgPSBvcC5lcnJvckNoZWNraW5nXHJcblxyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24odGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmdlbmVyYXRlTWVzc2FnZShcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZW5EZWZhdWx0TWVzc2FnZShcImVycm9yXCIsIFwiRm9ybXVsYXJpbyBubyBjYXJnYWRvIGNvcnJlY3RhbWVudGVcIiwgXCJcIiwgZXJyb3JDaGVja2luZyksIGVycm9yLmVycm9yLCBlcnJvckNoZWNraW5nKSxcclxuICAgICAgICAgIGVycm9yQ2hlY2tpbmdcclxuICAgICAgICApO1xyXG4gICAgICAgIHRocm93IGVycm9yXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG5cclxuICBzZXREZWZhdWx0VmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgaWYgKHZhbHVlLmtleSAmJiB0aGlzLnNmQ3J1ZFNlcnZpY2UuY3VycmVudE9wZXJhdGlvbj8ua2V5cyl7XHJcbiAgICAgIGRhdGEgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VmFsdWVLZXkodGhpcy5zZkNydWRTZXJ2aWNlLmN1cnJlbnRPcGVyYXRpb24ua2V5cy5maW5kKGsgPT4gay5rZXkgPT0gdmFsdWUua2V5KSlcclxuICAgICAgdmFsdWUgPSBkYXRhXHJcbiAgICB9ZWxzZXtcclxuICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICAgIGRhdGEgPSBgJHt0aGlzLnVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQ30tJHt0aGlzLnVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQ31gXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdAdGRvY2FjdGl2byc6XHJcbiAgICAgICAgICBkYXRhID0gdGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLlRET0NcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0BuZG9jYWN0aXZvJzpcclxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQ1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgICBkYXRhID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZGF0YVxyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgZ2V0IGluZGV4Q3J1ZCgpe1xyXG4gICAgcmV0dXJuIHRoaXMuc3RlcFNlcnZpY2UuY3VycmVudEluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHJpbWVDaGVja2luZygpe1xyXG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q2hlY2tpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZClcclxuICB9XHJcblxyXG4gIHN1Ym1pdChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvblN1Ym1pdCcsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXRFc3F1ZW1hKGluZGV4KSwgdW5kZWZpbmVkLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YShpbmRleCkpXHJcbiAgICBsZXQgcmVnaXN0cm8gPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaW5kZXgpXHJcbiAgICBjb25zb2xlLmxvZyhcInRyeCBhY3R1YWw6IFwiICx0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KHRoaXMuaW5kZXhDcnVkKSlcclxuICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KHRoaXMuaW5kZXhDcnVkKSkpIVxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldFVSTChvcGVyYXRpb24sIGluZGV4KVxyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdChvcGVyYXRpb24ubWV0aG9kLCB1cmwsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKGluZGV4KSlcclxuICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgPT09IG51bGwpIHJlcyA9IHt9XHJcbiAgICAgICAgICByZXMgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlPYmplY3RLZXlzKHJlcywgb3BlcmF0aW9uLmtleXNFc3F1ZW1hIHx8IFtdLCByZWdpc3RybylcclxuICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5zZXRBbnN3ZXJzKHJlcywgdGhpcy5pbmRleENydWQpXHJcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLmNoYW5nZVRyeCAmJiBBcnJheS5pc0FycmF5KG9wZXJhdGlvbi5jaGFuZ2VUcngpKSBvcGVyYXRpb24uY2hhbmdlVHJ4LmZvckVhY2goeCA9PiAgdGhpcy5zZkNydWRTZXJ2aWNlLnNldFRyeCh4LnRyeCwgeC5pbmRleCkpXHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZW5lcmF0ZU1lc3NhZ2UoXHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZW5EZWZhdWx0TWVzc2FnZShcInN1Y2Nlc3NcIiwgdW5kZWZpbmVkLCBcIkluZm9ybWFjacOzbiBzdWJpZGEgY29ycmVjdGFtZW50ZVwiLCBvcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmcpLCByZXMsIG9wZXJhdGlvbi5hbnN3ZXJDaGVja2luZyksXHJcbiAgICAgICAgICAgIG9wZXJhdGlvbi5hbnN3ZXJDaGVja2luZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbihcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmdlbmVyYXRlTWVzc2FnZSh0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuRGVmYXVsdE1lc3NhZ2UoXCJlcnJvclwiLCBcIkVycm9yIG5vIGNvbnRyb2xhZG9cIiwgXCJQb3IgZmF2b3IgY29tdW5pY2Fyc2UgY29uIGVsIGFkbWluXCIsb3BlcmF0aW9uLmVycm9yQ2hlY2tpbmcpLCBlcnIuZXJyb3IsIG9wZXJhdGlvbi5lcnJvckNoZWNraW5nKVxyXG4gICAgICAgICAgICAsIG9wZXJhdGlvbi5lcnJvckNoZWNraW5nXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIC8vIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pXHJcbiAgfVxyXG5cclxuICBvbkNsb3NlQWRkSXRlbShpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzY29wZSA9ICh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5zY29wZSBhcyBhbnkpLnJlcGxhY2VBbGwoJy5wcm9wZXJ0aWVzJywgJycpXHJcbiAgICBjb25zdCBpdGVtID0gXy5jbG9uZURlZXAodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0uZGF0YSk7XHJcbiAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICBqc29ucGF0aC5xdWVyeSh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YSh0aGlzLmluZGV4Q3J1ZCksIHNjb3BlKVswXS5wdXNoKGl0ZW0pXHJcbiAgICB9XHJcbiAgICBlbHNlIGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXggLSAxXS5kYXRhLCBzY29wZSlbMF0ucHVzaChpdGVtKVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlUm93KGVsZW1lbnQ6IGFueSwgaW5kZXhFbGVtZW50OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNjb3BlID0gZWxlbWVudC5zY29wZS5yZXBsYWNlQWxsKCcucHJvcGVydGllcycsICcnKVxyXG4gICAgbGV0IGluZGV4RGlhbG9nID0gdGhpcy5kaWFsb2dFbGVtZW50cy5sZW5ndGggLSAxXHJcblxyXG4gICAgaWYgKGluZGV4RGlhbG9nID09IC0xKSAoanNvbnBhdGgucXVlcnkodGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5pbmRleENydWQpLCBzY29wZSlbMF0gYXMgYW55W10pLnNwbGljZShpbmRleEVsZW1lbnQsIDEpXHJcbiAgICBlbHNlIHtcclxuICAgICAgaW5kZXhEaWFsb2cgPSBpbmRleERpYWxvZyA9PSAwID8gMTogaW5kZXhEaWFsb2c7XHJcbiAgICAgIChqc29ucGF0aC5xdWVyeSh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4RGlhbG9nIC0gMV0uZGF0YSwgc2NvcGUpWzBdIGFzIGFueVtdKS5zcGxpY2UoaW5kZXhFbGVtZW50LCAxKVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmFwcGx5VmFsdWVzT25FdmVudCgnb25DaGFuZ2UnLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RXNxdWVtYSh0aGlzLmluZGV4Q3J1ZCksIGVsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJyksIHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSlcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VFZGl0Um93KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGxldCBzY29wZSA9IHVuZGVmaW5lZFxyXG4gICAgdHJ5e1xyXG4gICAgICBjb25zdCBpQXJyYXkgPSB0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5pbmRleFxyXG4gICAgICBzY29wZSA9ICh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5zY29wZSBhcyBhbnkpLnJlcGxhY2VBbGwoJy5wcm9wZXJ0aWVzJywgJycpXHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBfLmNsb25lRGVlcCh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5kYXRhKTtcclxuICAgICAgaWYgKGluZGV4ID09IDApIHtcclxuICAgICAgICBqc29ucGF0aC5xdWVyeSh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YSh0aGlzLmluZGV4Q3J1ZCksIHNjb3BlKVswXVtpQXJyYXldID0gaXRlbVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXggLSAxXS5kYXRhLCBzY29wZSlbMF1baUFycmF5XSA9IGl0ZW1cclxuICAgICAgfVxyXG4gICAgfWNhdGNoIChlcnJvcil7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZGlhbG9nRWxlbWVudHMpXHJcbiAgICAgIGNvbnNvbGUubG9nKGluZGV4KVxyXG4gICAgICBjb25zb2xlLmxvZyhzY29wZSlcclxuICAgICAgY29uc29sZS5sb2codGhpcy5pbmRleENydWQpXHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSlcclxuICAgICAgdGhyb3cgZXJyb3JcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURhdGEob3BlcmF0aW9uOiBPcGVyYXRpb24sIGRhdGE6IGFueSwgY29uZGl0aW9uczogQ29uZGl0aW9uW10sIHByaW50RXJyb3JzOmJvb2xlYW49dHJ1ZSkge1xyXG4gICAgaWYgKG9wZXJhdGlvbj8udmFsaWRhdGlvbnM/LnR5cGUgPT0gJ2xvY2FsJykge1xyXG4gICAgICBsZXQgZXJyID0gdGhpcy5zZkNydWRTZXJ2aWNlLnZhbGlkYXRlRGF0YUxvY2FsKG9wZXJhdGlvbiwgZGF0YSwgY29uZGl0aW9ucyk7XHJcbiAgICAgIGlmIChlcnIubGVuZ3RoICE9IDAgJiYgcHJpbnRFcnJvcnMpIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oeyBzZXZlcml0eTogJ3dhcm4nLCBkZXRhaWw6IGVyci5zbGljZSgwLCA1KS5qb2luKCcuICcpfSwgdGhpcy5wcmltZUNoZWNraW5nKCkpXHJcbiAgICAgIHJldHVybiBlcnIubGVuZ3RoID09IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uQ29uZmlybSgpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNsZWFyKCdjJyk7XHJcbiAgfVxyXG5cclxuICBvblJlamVjdCgpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcignYycpO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja2VkQWRkcmVzcyhzY29wZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgaiA9IDEsIGsgPSAwO1xyXG4gICAgbGV0IHNlcGFyYWRvciA9IGpzb25wYXRoLnF1ZXJ5KHRoaXMuc2ZDcnVkU2VydmljZS5lc3F1ZW1hc1t0aGlzLmluZGV4Q3J1ZF0sIHNjb3BlKVswXT8uc2VwYXJhZG9yXHJcbiAgICBsZXQgZGF0YVBhZHJlID0gdGhpcy5kaWFsb2dFbGVtZW50cy5sZW5ndGggPiAwID8gdGhpcy5kaWFsb2dFbGVtZW50c1t0aGlzLmRpYWxvZ0VsZW1lbnRzLmxlbmd0aCAtIDFdLmRhdGEgOiB0aGlzLnNmQ3J1ZFNlcnZpY2UuZGF0YXNldFt0aGlzLmluZGV4Q3J1ZF07XHJcbiAgICBsZXQgY3VycmVudFZhbHVlID0ganNvbnBhdGgucXVlcnkoZGF0YVBhZHJlLCBzY29wZS5yZXBsYWNlQWxsKCcucHJvcGVydGllcycsICcnKSlbMF1cclxuICAgIGxldCBjdXJyZW50VmFsdWVzID0gY3VycmVudFZhbHVlPy5zcGxpdChzZXBhcmFkb3IpXHJcbiAgICBsZXQgZXNxdWVtYTogYW55ID0ge1xyXG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxyXG4gICAgICB2YWxpZGF0aW9uczoge1xyXG4gICAgICAgIHR5cGU6IFwibG9jYWxcIixcclxuICAgICAgICByZXF1aXJlZDogW1xyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgcHJvcGVydGllczoge1xyXG4gICAgICAgIGN1cnJlbnRWYWx1ZToge1xyXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcclxuICAgICAgICAgIGRlZmF1bHQ6IGN1cnJlbnRWYWx1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2VwYXJhZG9yOiB7XHJcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgZGVmYXVsdDogc2VwYXJhZG9yXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVpZXNxdWVtYToge2VsZW1lbnRzOiBhbnlbXX0gPXtlbGVtZW50czogW119XHJcblxyXG4gICAgbGV0IHRyYWR1Y3RvclRhbWFuaW9zTWFzY2FyYXM6IGFueSA9IHtcclxuICAgICAgXCJncmFuZGVcIjogXCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIixcclxuICAgICAgXCJwZXF1ZcOxb1wiOiBcImZpZWxkIGNvbC0xMiBtZDpjb2wtMlwiLFxyXG4gICAgICBcIm1lZGlhbm9cIjogXCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIixcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5jYXJnYXJNYXNjYXJhc0RpcmVjY2lvbmVzKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvc1t0aGlzLmluZGV4Q3J1ZF0ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlLnN0YXJ0c1dpdGgodGhpcy5zZkNydWRTZXJ2aWNlLmdldFRyeCh0aGlzLmluZGV4Q3J1ZCkpKVxyXG4gICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UubWFzY2FyYXMuZm9yRWFjaChtYXNjYXJhID0+IHtcclxuICAgICAgICAvL2dlbmVyYXIgZWwgdWllc3F1ZW1hIGRlIGxhcyBkaXJlY2Npb25lc1xyXG4gICAgICAgIHVpZXNxdWVtYS5lbGVtZW50cy5wdXNoKHtcclxuICAgICAgICAgIFwidHlwZVwiOiBcIkxhYmVsXCIsXHJcbiAgICAgICAgICBcImNsYXNzXCI6IFwiY29sLTEyIG1kOmNvbC0xMlwiLFxyXG4gICAgICAgICAgXCJzdHlsZVwiOiBgZm9udC1zaXplOiBtZWRpdW07IGNvbG9yOndoaXRlOyBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yKSAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7YCxcclxuICAgICAgICAgIFwibGFiZWxcIjogYEzDrW5lYSAke21hc2NhcmEubGluZWF9YFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdWllc3F1ZW1hLmVsZW1lbnRzLnB1c2goe1xyXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiSG9yaXpvbnRhbExheW91dFwiLFxyXG4gICAgICAgICAgXCJjbGFzc1wiOiBcInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIsXHJcbiAgICAgICAgICBcImVsZW1lbnRzXCI6IFtdXHJcbiAgICAgICAgfSlcclxuICAgICAgICBtYXNjYXJhLkNhbXBvLmZvckVhY2goY2FtcG8gPT4ge1xyXG4gICAgICAgICAgaWYgKGNhbXBvLlRpcG8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcImxhYmVsXCIpe1xyXG4gICAgICAgICAgICB1aWVzcXVlbWEuZWxlbWVudHNbal0uZWxlbWVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiVGV4dG9cIixcclxuICAgICAgICAgICAgICBcImNsYXNzXCI6IFwibXktYXV0b1wiLFxyXG4gICAgICAgICAgICAgIFwibGFiZWxcIjogY2FtcG8uVmFsb3IsXHJcbiAgICAgICAgICAgICAgXCJzY29wZVwiOiBgJC4ucHJvcGVydGllcy4ke2NhbXBvLklkfWAsXHJcbiAgICAgICAgICAgICAgXCJuZ1N0eWxlXCI6IHtcclxuICAgICAgICAgICAgICAgIFwiZm9udC1zaXplXCI6IFwiMS41cmVtXCJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHVpZXNxdWVtYS5lbGVtZW50c1tqXS5lbGVtZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb250cm9sXCIsXHJcbiAgICAgICAgICAgICAgXCJjbGFzc1wiOiBjYW1wby5UYW1hw7FvID8gdHJhZHVjdG9yVGFtYW5pb3NNYXNjYXJhc1tjYW1wby5UYW1hw7FvLnRvTG9jYWxlTG93ZXJDYXNlKCldOiB0cmFkdWN0b3JUYW1hbmlvc01hc2NhcmFzLm1lZGlhbm8sXHJcbiAgICAgICAgICAgICAgXCJzY29wZVwiOiBgJC4ucHJvcGVydGllcy4ke2NhbXBvLklkfWBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL2dlbmVyYXIgZWwgZXNxdWVtYSBkZSBsYXMgZGlyZWNjaW9uZXNcclxuICAgICAgICAgIGlmIChjYW1wby5UaXBvLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJjb21ib1wiKXtcclxuICAgICAgICAgICAgbGV0IGN1c3RvbU9wdGlvbnM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgbGV0IHZhbG9yZXMgPSBjYW1wby5WYWxvcmVzLnNwbGl0KFwiLFwiKVxyXG4gICAgICAgICAgICB2YWxvcmVzLmZvckVhY2godmFsb3IgPT4gY3VzdG9tT3B0aW9ucy5wdXNoKHtsYWJlbDogdmFsb3Iuc3BsaXQoXCItXCIpWzBdLCB2YWx1ZTogdmFsb3Iuc3BsaXQoXCItXCIpWzFdfSkpXHJcblxyXG4gICAgICAgICAgICBlc3F1ZW1hLnByb3BlcnRpZXNbY2FtcG8uSWRdID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogXCJkcm9wZG93blwiLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlRGlyZWNjaW9uKGssIGN1cnJlbnRWYWx1ZXMpLFxyXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw6IFwibGFiZWxcIixcclxuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlOiBcInZhbHVlXCIsXHJcbiAgICAgICAgICAgICAgICBjdXN0b21PcHRpb25zOiBjdXN0b21PcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NsZWFyOiBrID49IDJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGNhbXBvLlRpcG8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcInRleHRcInx8IGNhbXBvLlRpcG8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcImxhYmVsXCIpe1xyXG4gICAgICAgICAgICBlc3F1ZW1hLnByb3BlcnRpZXNbY2FtcG8uSWRdID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogXCJpbnB1dFwiLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlRGlyZWNjaW9uKGssIGN1cnJlbnRWYWx1ZXMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGNhbXBvLlRpcG8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcIm51bWVyaWNcIil7XHJcbiAgICAgICAgICAgIGVzcXVlbWEucHJvcGVydGllc1tjYW1wby5JZF0gPSB7XHJcbiAgICAgICAgICAgICAgdHlwZTogXCJudW1lcmljXCIsXHJcblx0XHRcdFx0ICAgICAgc3VidHlwZTogXCJkZWNpbWFsXCIsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5nZXREZWZhdWx0VmFsdWVEaXJlY2Npb24oaywgY3VycmVudFZhbHVlcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChlc3F1ZW1hLnZhbGlkYXRpb25zLnJlcXVpcmVkLmxlbmd0aCA8IDIpey8vdmFsaWRhciBsb3MgcHJpbWVyb3MgMiBjYW1wb3NcclxuICAgICAgICAgICAgZXNxdWVtYS52YWxpZGF0aW9ucy5yZXF1aXJlZC5wdXNoKHtcclxuICAgICAgICAgICAgICBcImZpZWxkXCI6IGAkLi4ke2NhbXBvLklkfWAsXHJcbiAgICAgICAgICAgICAgXCJtZXNzYWdlXCI6IGBQb3IgZmF2b3IgZGlnaXRlIGVsIGNhbXBvIE7CsCAke2VzcXVlbWEudmFsaWRhdGlvbnMucmVxdWlyZWQubGVuZ3RoICsgMX1gXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBrICs9IDFcclxuICAgICAgICB9KVxyXG4gICAgICAgIGogKz0gMlxyXG4gICAgICB9KVxyXG5cclxuICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB7XHJcbiAgICAgICAgZGF0YTogdGhpcy5zZkNydWRTZXJ2aWNlLmNyZWF0ZU9iamVjdChlc3F1ZW1hLCBvcCksXHJcbiAgICAgICAgdWlFc3F1ZW1hOiB1aWVzcXVlbWEsXHJcbiAgICAgICAgZXNxdWVtYTogZXNxdWVtYSxcclxuICAgICAgICBzY29wZTogc2NvcGUsXHJcbiAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgaXNBZGRyZXNzRGlhbG9nOiB0cnVlLFxyXG4gICAgICAgIHNlcGFyYWRvcjogc2VwYXJhZG9yLFxyXG4gICAgICAgIG9wZXJhdGlvbjogXCJhZGRyZXNzXCJcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhjdXJyZW50RWxlbWVudClcclxuICAgICAgdGhpcy5kaXNwbGF5cy5wdXNoKHRydWUpXHJcbiAgICAgIHRoaXMuZGlhbG9nRWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZURpcmVjY2lvbihpbmRleDogbnVtYmVyLCBjdXJyZW50VmFsdWVzPzogc3RyaW5nW10pe1xyXG4gICAgbGV0IHZhbG9yZXNMaXRlcmFsZXM6IHN0cmluZ1tdID0gW11cclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5tYXNjYXJhcy5mb3JFYWNoKG1hc2NhcmEgPT4ge1xyXG4gICAgICBtYXNjYXJhLkNhbXBvLmZvckVhY2goY2FtcG8gPT4ge1xyXG4gICAgICAgIGlmIChjYW1wby5WYWxvciAmJiBjYW1wby5UaXBvLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJsYWJlbFwiKSB2YWxvcmVzTGl0ZXJhbGVzLnB1c2goY2FtcG8uVmFsb3IpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gICAgbGV0IGludmFsaWRDdXJyZW50VmFsdWVzID0gW1wiXCIsIG51bGwsIHVuZGVmaW5lZF1cclxuICAgIGxldCB0ZW1wb3JhbFZhbHVlOiBzdHJpbmcgfCBudWxsID0gY3VycmVudFZhbHVlcyAmJiBpbmRleCA8IGN1cnJlbnRWYWx1ZXMubGVuZ3RoICYmIGN1cnJlbnRWYWx1ZXMubGVuZ3RoID4gMSAmJiAhaW52YWxpZEN1cnJlbnRWYWx1ZXMuaW5jbHVkZXMoY3VycmVudFZhbHVlc1tpbmRleF0pID8gY3VycmVudFZhbHVlc1tpbmRleF06IG51bGxcclxuICAgIHZhbG9yZXNMaXRlcmFsZXMuZm9yRWFjaCh2YWxvciA9PiB7XHJcbiAgICAgIGlmICh0ZW1wb3JhbFZhbHVlPy5zdGFydHNXaXRoKHZhbG9yKSkgdGVtcG9yYWxWYWx1ZSA9IHRlbXBvcmFsVmFsdWUucmVwbGFjZSh2YWxvciwgXCJcIilcclxuICAgIH0pXHJcbiAgICByZXR1cm4gdGVtcG9yYWxWYWx1ZVxyXG4gIH1cclxuXHJcbiAgb25DbGlja2VkRWRpdEJ1dHRvbihlbGVtZW50OiBhbnksIGRhdGE6IGFueSwgaW5kZXg6bnVtYmVyKXtcclxuICAgIGNvbnN0IGVzcXVlbWEgPSBfLmNsb25lRGVlcCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0Q29udHJvbChlbGVtZW50LnNjb3BlLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RXNxdWVtYSh0aGlzLmluZGV4Q3J1ZCkpKTtcclxuICAgIGVzcXVlbWEudHlwZSA9IFwib2JqZWN0XCJcclxuICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0ge1xyXG4gICAgICBkYXRhOiBfLmNsb25lRGVlcChkYXRhKSxcclxuICAgICAgdWlFc3F1ZW1hOiBfLmNsb25lRGVlcChlbGVtZW50LmVsZW1lbnRzWzBdKSxcclxuICAgICAgZXNxdWVtYTogZXNxdWVtYSxcclxuICAgICAgc2NvcGU6IGVsZW1lbnQuc2NvcGUsXHJcbiAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgb3BlcmF0aW9uOiBcInVcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNwbGF5cy5wdXNoKHRydWUpXHJcbiAgICB0aGlzLmRpYWxvZ0VsZW1lbnRzLnB1c2goY3VycmVudEVsZW1lbnQpXHJcbiAgfVxyXG5cclxuICBvbkNsaWNrZWRBZGRCdXR0b24oZWxlbWVudDogYW55KXtcclxuICAgIGNvbnN0IGVzcXVlbWEgPSBfLmNsb25lRGVlcCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0Q29udHJvbChlbGVtZW50LnNjb3BlLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RXNxdWVtYSh0aGlzLmluZGV4Q3J1ZCkpKTtcclxuICAgIGNvbnN0IG9wID0gdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvc1t0aGlzLmluZGV4Q3J1ZF0ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlLnN0YXJ0c1dpdGgodGhpcy5zZkNydWRTZXJ2aWNlLmdldFRyeCh0aGlzLmluZGV4Q3J1ZCkpKVxyXG4gICAgZXNxdWVtYS50eXBlID0gXCJvYmplY3RcIlxyXG4gICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB7XHJcbiAgICAgIGRhdGE6IHRoaXMuc2ZDcnVkU2VydmljZS5jcmVhdGVPYmplY3QoZXNxdWVtYSwgb3ApLFxyXG4gICAgICB1aUVzcXVlbWE6IF8uY2xvbmVEZWVwKGVsZW1lbnQuZWxlbWVudHNbMF0pLFxyXG4gICAgICBlc3F1ZW1hOiBlc3F1ZW1hLFxyXG4gICAgICBzY29wZTogZWxlbWVudC5zY29wZSxcclxuICAgICAgaW5kZXg6IDAsXHJcbiAgICAgIG9wZXJhdGlvbjogXCJjXCJcclxuICAgIH1cclxuICAgIHRyeXtcclxuICAgICAgY3VycmVudEVsZW1lbnQuZGF0YS5pZCA9IHRoaXMuc2ZDcnVkU2VydmljZS5nZXRWYWx1ZShlbGVtZW50LnNjb3BlLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YSh0aGlzLmluZGV4Q3J1ZCkpLmxlbmd0aCArIDFcclxuICAgIH1jYXRjaChlcnJvcil7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgYWdyZWdhbmRvIHVuIGlkXCIpXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc3BsYXlzLnB1c2godHJ1ZSlcclxuICAgIHRoaXMuZGlhbG9nRWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudClcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VBZGRyZXNzKGluZGV4OiBudW1iZXIpe1xyXG4gICAgbGV0IHNlcGFyYWRvciA9IGpzb25wYXRoLnF1ZXJ5KHRoaXMuc2ZDcnVkU2VydmljZS5lc3F1ZW1hc1t0aGlzLmluZGV4Q3J1ZF0sIHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLnNjb3BlKVswXT8uc2VwYXJhZG9yXHJcbiAgICAvL2xlZXIgbG9zIGNhbXBvcyBkZSBsYXMgbWFzY2FyYXMsIHNldGVhciBlbCBzdHJpbmdcclxuICAgIGxldCBuZXdWYWx1ZSA9IHRoaXMuc2ZDcnVkU2VydmljZS5hcm1hck51ZXZhRGlyZWNjaW9uKFwic3RyaW5nXCIsIHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLmRhdGEsIHNlcGFyYWRvcilcclxuICAgIGNvbnNvbGUubG9nKG5ld1ZhbHVlKVxyXG4gICAgbGV0IHNjb3BlID0gdGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0uc2NvcGUucmVwbGFjZUFsbCgnLnByb3BlcnRpZXMnLCAnJylcclxuICAgIGNvbnNvbGUubG9nKHNjb3BlKVxyXG4gICAgaWYgKGluZGV4ID09IDApIHtcclxuICAgICAganNvbnBhdGgudmFsdWUodGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5pbmRleENydWQpLCBzY29wZSwgbmV3VmFsdWUpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9BY3R1YWxpemFybG8gZW4gdW4gZGlhbG9nIGFudGVyaW9yLiBTZSBjcmVhIHVuYSBudWV2YSByZWZlcmVuY2lhIHBhcmEgcXVlIGVsIGNvbXBpbGFkb3IgZGV0ZWN0ZSBjYW1iaW9zIGVuIGVsIG9iamV0byBkYXRhIHkgbG8gcmVjYXJndWVcclxuICAgICAgbGV0IG5ld0RhdGFQcmV2aW91c0RpYWxvZyA9IF8uY2xvbmVEZWVwKHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXggLSAxXS5kYXRhKTtcclxuICAgICAganNvbnBhdGgudmFsdWUobmV3RGF0YVByZXZpb3VzRGlhbG9nLCBzY29wZSwgbmV3VmFsdWUpXHJcbiAgICAgIHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXggLSAxXS5kYXRhID0gbmV3RGF0YVByZXZpb3VzRGlhbG9nO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGVwU2VydmljZS5kZXNpcmVkSW5kZXggPSB1bmRlZmluZWRcclxuICAgIHRoaXMuc3RlcFNlcnZpY2UucmVxdWVzdEFwcHJvdmVkID10cnVlXHJcbiAgfVxyXG5cclxuICBvbkNsb3NlRGlhbG9nKGluZGV4OiBudW1iZXIpe1xyXG4gICAgbGV0IHZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0uZXNxdWVtYS52YWxpZGF0aW9ucyl7XHJcbiAgICAgIGNvbnN0IG9wID0gbmV3IE9wZXJhdGlvbigpXHJcbiAgICAgIG9wLnZhbGlkYXRpb25zID0gdGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0uZXNxdWVtYS52YWxpZGF0aW9uc1xyXG4gICAgICB2YWxpZGF0ZWQgPSB0aGlzLnZhbGlkYXRlRGF0YShvcCwgdGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0uZGF0YSwgdGhpcy5zZkNydWRTZXJ2aWNlLmdldFJlZ2lzdHJvKHRoaXMuaW5kZXhDcnVkKS5jb25kaXRpb25zIHx8IFtdKVxyXG4gICAgfVxyXG4gICAgaWYgKHZhbGlkYXRlZCl7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleF0ub3BlcmF0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcImNcIjpcclxuICAgICAgICAgIHRoaXMub25DbG9zZUFkZEl0ZW0oaW5kZXgpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwidVwiOlxyXG4gICAgICAgICAgdGhpcy5vbkNsb3NlRWRpdFJvdyhpbmRleClcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XHJcbiAgICAgICAgICB0aGlzLm9uQ2xvc2VBZGRyZXNzKGluZGV4KVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW1vdmVEaWFsb2dJdGVtKClcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByZW1vdmVEaWFsb2dJdGVtKCl7XHJcbiAgICB0aGlzLmRpYWxvZ0VsZW1lbnRzLnBvcCgpXHJcbiAgICB0aGlzLmRpc3BsYXlzLnBvcCgpXHJcbiAgfVxyXG5cclxuICBzZXRMYWJlbFN1bWJpdCgpIHtcclxuICAgIGxldCB4OiBhbnkgPSB7XCJjXCI6IHsgbGFiZWw6ICdHdWFyZGFyJywgaWNvbjogJ3BpIHBpLXNhdmUnIH0sXHJcbiAgICAgIFwidVwiOiB7IGxhYmVsOiAnQWN0dWFsaXphcicsIGljb246ICdwaSBwaS1zeW5jJyB9LFxyXG4gICAgICBcImRcIjogeyBsYWJlbDogJ0VsaW1pbmFyJywgaWNvbjogJ3BpIHBpLXRyYXNoJyB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idG5TdWJtaXQgPSB4W3RoaXMuc2ZDcnVkU2VydmljZS5nZXRUcngoMCldXHJcbiAgfVxyXG5cclxuICBiYWNrKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLnNmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zWzBdLmJ0bkJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXJnYXJNYXNjYXJhc0RpcmVjY2lvbmVzKCl7XHJcbiAgICBpZiAodGhpcy5zZkNydWRTZXJ2aWNlLm1hc2NhcmFzLmxlbmd0aCA9PSAwKXtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QoXCJHRVRcIiwgYCR7dGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmFsZXN9L0dlbmVyYWwvZ2V0Q29uZmlndXJhY2lvbkthdGlvcy8ke3RoaXMuaWRLYXRpb3N9YCkudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UubWFzY2FyYXMgPSBKU09OLnBhcnNlKHJlcykuUkVTUFVFU1RBLk1hc2NhcmFzRGlyZWNjaW9uZXMuTWFzY2FyYXMuTWFzY2FyYVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNmQ3J1ZFNlcnZpY2UubWFzY2FyYXMpXHJcbiAgfVxyXG59XHJcblxyXG5cclxuaW50ZXJmYWNlIERpYWxvZ0VsZW1lbnR7ZGF0YTogYW55XHJcbiAgdWlFc3F1ZW1hOiBhbnksXHJcbiAgZXNxdWVtYTogU2hlbWEsXHJcbiAgIHNjb3BlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsXHJcbiAgIG9wZXJhdGlvbjogc3RyaW5nLC8vXCJjXCIgfCBcInVcIiB8IFwiYWRkcmVzc1wiXHJcbiAgIGlzQWRkcmVzc0RpYWxvZz86IGJvb2xlYW5cclxuICB9XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICA8IS0tVE9ETyBjb252ZXJ0aXIgZW4gdGVtcGxhdGUgeSBlZGl0YXJsYSBlbiAtLT5cclxuICAgIDxoNSAqbmdJZj1cInNmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zLmxlbmd0aCA9PSAxXCIgY2xhc3M9XCJjYXJkLWhlYWRlciBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICA8c3Bhbj57e3NmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zWzBdPy5sYWJlbCB8fCBpZEZvcm0ucmVwbGFjZUFsbCgnXycsICcgJyl9fSB7e2lkcy5sZW5ndGggPiAwID8gJy0nICsgaWRzWzBdIDogJyd9fTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2ZDcnVkU2VydmljZS5yZWdpc3Ryb3NbMF0/LmNhbkJhY2tcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hcnJvdy1sZWZ0XCIgKGNsaWNrKT1cImJhY2soKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9oNT5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgPGFwcC1zdGVwIFtpdGVtc109XCJpdGVtc1wiPjwvYXBwLXN0ZXA+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtcy5sZW5ndGggPT0gMVwiPlxyXG4gICAgICAgIDxhcHAtZm9ybSBbZGF0YV09XCJzZkNydWRTZXJ2aWNlLmRhdGFzZXRbMF1cIiBbZXNxdWVtYV09XCJzZkNydWRTZXJ2aWNlLmVzcXVlbWFzWzBdXCJcclxuICAgICAgICBbdWlFc3F1ZW1hXT1cInNmQ3J1ZFNlcnZpY2UudWlFc3F1ZW1hc1swXVwiIFtpc0RpYWxvZ109XCJmYWxzZVwiPjwvYXBwLWZvcm0+XHJcblxyXG4gICAgICAgIDwhLS1yZW5kZXJpemFyIHVuIGNvZGlnbyBwZXJzb25hbGl6YWRvIGRlc2RlIGVsIGNvbXBvbmVudGUgcGFkcmUgbyByZW5kZXJpemFyIGVsIHF1ZSBzZSB0aWVuZSBwb3IgZGVmZWN0by0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zRm9vdGVyVGVtcGxhdGUgfHwgZGVmYXVsdEJ1dHRvbnNGb290ZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEJ1dHRvbnNGb290ZXJUZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIG10LTJcIiAqbmdJZj1cImJ0blN1Ym1pdFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIFtpY29uXT1cImJ0blN1Ym1pdC5pY29uXCIgW2xhYmVsXT1cImJ0blN1Ym1pdC5sYWJlbFwiIChjbGljayk9XCJvbkNsaWNrQnRuU3VibWl0KClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRpYWxvZ0VsZW1lbnRzOyBsZXQgJGluZGV4PWluZGV4XCI+XHJcbiAgICA8cC1kaWFsb2cgWyh2aXNpYmxlKV09XCJkaXNwbGF5c1skaW5kZXhdXCIgW21vZGFsXT1cInRydWVcIiBbaGVhZGVyXT1cIidEZXRhbGxlJ1wiIFtjbG9zYWJsZV09XCJmYWxzZVwiPlxyXG4gICAgICAgIDwhLS0gVE9ETyBoZWFkZXIgPSBjdXJyZW50RWxlbWVudC5lbGVtZW50LmxhYmVsID8gY3VycmVudEVsZW1lbnQuZWxlbWVudC5sYWJlbDogLS0+XHJcbiAgICAgICAgPGFwcC1mb3JtIFtkYXRhXT1cIml0ZW0uZGF0YVwiIFtlc3F1ZW1hXT1cIml0ZW0uZXNxdWVtYVwiIFt1aUVzcXVlbWFdPVwiaXRlbS51aUVzcXVlbWFcIiBbaXNEaWFsb2ddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJpZHNbaW5kZXhDcnVkXVwiIFtpc0FkZHJlc3NEaWFsb2ddPVwiaXRlbS5pc0FkZHJlc3NEaWFsb2cgPT09IHRydWVcIiBbc2VwYXJhZG9yXT1cIml0ZW0uc2VwYXJhZG9yXCI+PC9hcHAtZm9ybT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxwLWJ1dHRvbiBpY29uPVwicGkgcGktdGltZXNcIiAob25DbGljayk9XCJyZW1vdmVEaWFsb2dJdGVtKClcIiBsYWJlbD1cIkNhbmNlbGFyXCIgPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgIDxwLWJ1dHRvbiBpY29uPVwicGkgcGktY2hlY2tcIiBbZGlzYWJsZWRdPVwiaXRlbS5lc3F1ZW1hLmRpc2FibGVkID09PSB0cnVlXCIgKG9uQ2xpY2spPVwib25DbG9zZURpYWxvZygkaW5kZXgpXCIgbGFiZWw9XCJPa1wiIHBBdXRvRm9jdXNcclxuICAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwidHJ1ZVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC1kaWFsb2c+XHJcbjwvc3Bhbj5cclxuXHJcbjxwLXRvYXN0ICpuZ0lmPVwiZGlhbG9nRWxlbWVudHMubGVuZ3RoID09IDBcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtbWVzc2FnZSBwVGVtcGxhdGU9XCJtZXNzYWdlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10b2FzdFwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpXCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ3BpLWNoZWNrLWNpcmNsZSc6IG1lc3NhZ2Uuc2V2ZXJpdHkgPT09ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICdwaS1pbmZvLWNpcmNsZSc6IG1lc3NhZ2Uuc2V2ZXJpdHkgPT09ICdpbmZvJyxcclxuICAgICAgICAgICAgICAgICdwaS1leGNsYW1hdGlvbi10cmlhbmdsZSc6IG1lc3NhZ2Uuc2V2ZXJpdHkgPT09ICd3YXJuJyxcclxuICAgICAgICAgICAgICAgICdwaS10aW1lcy1jaXJjbGUnOiBtZXNzYWdlLnNldmVyaXR5ID09PSAnZXJyb3InXHJcbiAgICAgICAgICAgIH1cIj48L2k+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdG9hc3QtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tdG9hc3QtZGV0YWlsXCI+e3ttZXNzYWdlLmRldGFpbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvcC10b2FzdD5cclxuXHJcblxyXG4iXX0=
|