general-library-union 2.4.57 → 2.4.59
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/README.md +27 -27
- package/esm2022/public-api.mjs +4 -1
- package/esm2022/src/app/core/componentes/inicio-component/inicio-component.component.mjs +3 -3
- package/esm2022/src/app/core/servicios/utils.service.mjs +5 -1
- package/esm2022/src/app/layout/app.topbar.component.mjs +3 -3
- package/esm2022/src/app/publico/pages/timeout/timeout.page.mjs +3 -3
- package/esm2022/src/app/seguridad/constantes/ConstantesGenerales.mjs +30 -0
- package/esm2022/src/app/seguridad/modelos/ColumnaFuenteModel.mjs +9 -0
- package/esm2022/src/app/seguridad/modelos/ColumnaWraperModel.mjs +6 -0
- package/esm2022/src/app/seguridad/modelos/ForeingWraperModel.mjs +6 -0
- package/esm2022/src/app/seguridad/modelos/JoinFromModel.mjs +5 -0
- package/esm2022/src/app/seguridad/modelos/LlaveForaneaModel.mjs +7 -0
- package/esm2022/src/app/seguridad/modelos/ObjetoReporteModel.mjs +6 -0
- package/esm2022/src/app/seguridad/modelos/TablaFromModel.mjs +5 -0
- package/esm2022/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.mjs +696 -0
- package/esm2022/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.mjs +3 -3
- package/esm2022/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.mjs +107 -0
- package/esm2022/src/app/webcommon/services/reportes.service.mjs +43 -1
- package/fesm2022/general-library-union.mjs +913 -60
- package/fesm2022/general-library-union.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/app/core/servicios/utils.service.d.ts +1 -0
- package/src/app/layout/app.menuitem.component.d.ts +1 -1
- package/src/app/seguridad/constantes/ConstantesGenerales.d.ts +25 -0
- package/src/app/seguridad/modelos/ColumnaFuenteModel.d.ts +8 -0
- package/src/app/seguridad/modelos/ColumnaWraperModel.d.ts +6 -0
- package/src/app/seguridad/modelos/ForeingWraperModel.d.ts +6 -0
- package/src/app/seguridad/modelos/JoinFromModel.d.ts +4 -0
- package/src/app/seguridad/modelos/LlaveForaneaModel.d.ts +6 -0
- package/src/app/seguridad/modelos/ObjetoReporteModel.d.ts +5 -0
- package/src/app/seguridad/modelos/TablaFromModel.d.ts +4 -0
- package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.d.ts +118 -0
- package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.d.ts +32 -0
- package/src/app/webcommon/services/reportes.service.d.ts +16 -0
|
@@ -0,0 +1,696 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { ColumnaFuenteModel } from '../../../seguridad/modelos/ColumnaFuenteModel';
|
|
3
|
+
import { FuenteDatoModel } from '../../../seguridad/modelos/FuenteDato';
|
|
4
|
+
import { ReporteColumnaModel } from '../../../seguridad/modelos/ReporteColumna';
|
|
5
|
+
import { TablaFromModel } from '../../../seguridad/modelos/TablaFromModel';
|
|
6
|
+
import { JoinFromModel } from '../../../seguridad/modelos/JoinFromModel';
|
|
7
|
+
import { ForeingWraperModel } from '../../../seguridad/modelos/ForeingWraperModel';
|
|
8
|
+
import { GeneralModel } from '../../../seguridad/modelos/GeneralModel';
|
|
9
|
+
import { ColumnaWraperModel } from '../../../seguridad/modelos/ColumnaWraperModel';
|
|
10
|
+
import { ConfirmationService, MessageService } from 'primeng/api';
|
|
11
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
12
|
+
import { ConstantesGenerales } from '../../../seguridad/constantes/ConstantesGenerales';
|
|
13
|
+
import { ButtonModule } from 'primeng/button';
|
|
14
|
+
import { ConfirmPopupModule } from 'primeng/confirmpopup';
|
|
15
|
+
import { InputTextareaModule } from 'primeng/inputtextarea';
|
|
16
|
+
import { InputTextModule } from 'primeng/inputtext';
|
|
17
|
+
import { CommonModule, NgIf } from '@angular/common';
|
|
18
|
+
import { AccordionModule } from 'primeng/accordion';
|
|
19
|
+
import { DropdownModule } from 'primeng/dropdown';
|
|
20
|
+
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
21
|
+
import { TableModule } from 'primeng/table';
|
|
22
|
+
import { GeneralPipe } from '../../pipes/general.pipe';
|
|
23
|
+
import { TablaGeneralComponent } from '../../../core/componentes/tabla-general/tabla-general.component';
|
|
24
|
+
import { FiltroGeneralComponent } from '../../../core/componentes/filtro-general/filtro-general.component';
|
|
25
|
+
import { SplitButtonModule } from 'primeng/splitbutton';
|
|
26
|
+
import { TabViewModule } from 'primeng/tabview';
|
|
27
|
+
import { StepsModule } from 'primeng/steps';
|
|
28
|
+
import { PopupTablasFuenteComponent } from '../../popups/popup-tablas-fuente/popup-tablas-fuente.component';
|
|
29
|
+
import { CheckboxModule } from 'primeng/checkbox';
|
|
30
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
31
|
+
import * as i0 from "@angular/core";
|
|
32
|
+
import * as i1 from "../../../core/servicios/menu.service";
|
|
33
|
+
import * as i2 from "./../../../core/servicios/toast.service";
|
|
34
|
+
import * as i3 from "../../services/reportes.service";
|
|
35
|
+
import * as i4 from "../../../shared/servicios/general.service";
|
|
36
|
+
import * as i5 from "../../../core/servicios/utils.service";
|
|
37
|
+
import * as i6 from "primeng/api";
|
|
38
|
+
import * as i7 from "@ngx-translate/core";
|
|
39
|
+
import * as i8 from "primeng/tooltip";
|
|
40
|
+
import * as i9 from "primeng/checkbox";
|
|
41
|
+
import * as i10 from "primeng/steps";
|
|
42
|
+
import * as i11 from "primeng/tabview";
|
|
43
|
+
import * as i12 from "primeng/splitbutton";
|
|
44
|
+
import * as i13 from "primeng/button";
|
|
45
|
+
import * as i14 from "primeng/inputtext";
|
|
46
|
+
import * as i15 from "@angular/forms";
|
|
47
|
+
import * as i16 from "primeng/table";
|
|
48
|
+
import * as i17 from "primeng/inputtextarea";
|
|
49
|
+
export class FuenteReporteComponent {
|
|
50
|
+
menuService;
|
|
51
|
+
notificationBusService;
|
|
52
|
+
reportesSvc;
|
|
53
|
+
generalSvc;
|
|
54
|
+
utilsService;
|
|
55
|
+
confirmationService;
|
|
56
|
+
translateService;
|
|
57
|
+
messageService;
|
|
58
|
+
fuente = new FuenteDatoModel();
|
|
59
|
+
vistaVisualizar;
|
|
60
|
+
tablasFrom = []; // from TablaFrom
|
|
61
|
+
joinsFrom = []; //from JoinFrom
|
|
62
|
+
columnas = [];
|
|
63
|
+
listaColumnas = [];
|
|
64
|
+
listaJoin = [];
|
|
65
|
+
col1;
|
|
66
|
+
col2;
|
|
67
|
+
campos = [];
|
|
68
|
+
camposSeleccionar = [];
|
|
69
|
+
mostrarSeleccionar;
|
|
70
|
+
campoFormula = new ColumnaFuenteModel();
|
|
71
|
+
actual;
|
|
72
|
+
tabPrincipal;
|
|
73
|
+
basico;
|
|
74
|
+
seleccionGeneral;
|
|
75
|
+
foraneas = [];
|
|
76
|
+
descripcion;
|
|
77
|
+
query;
|
|
78
|
+
paginador = [];
|
|
79
|
+
filtro = new FuenteDatoModel();
|
|
80
|
+
paginator = {
|
|
81
|
+
rows: 10,
|
|
82
|
+
totalRecords: 0,
|
|
83
|
+
};
|
|
84
|
+
columns = [];
|
|
85
|
+
filters = [];
|
|
86
|
+
loading;
|
|
87
|
+
menu = [];
|
|
88
|
+
items = [];
|
|
89
|
+
mapaMensajes = new Map();
|
|
90
|
+
popupTablasFuenteUI;
|
|
91
|
+
constructor(menuService, notificationBusService, reportesSvc, generalSvc, utilsService, confirmationService, translateService, messageService) {
|
|
92
|
+
this.menuService = menuService;
|
|
93
|
+
this.notificationBusService = notificationBusService;
|
|
94
|
+
this.reportesSvc = reportesSvc;
|
|
95
|
+
this.generalSvc = generalSvc;
|
|
96
|
+
this.utilsService = utilsService;
|
|
97
|
+
this.confirmationService = confirmationService;
|
|
98
|
+
this.translateService = translateService;
|
|
99
|
+
this.messageService = messageService;
|
|
100
|
+
}
|
|
101
|
+
ngOnInit() {
|
|
102
|
+
this.listaColumnas = [];
|
|
103
|
+
this.campos = [];
|
|
104
|
+
this.listaJoin = [];
|
|
105
|
+
this.columnas = [];
|
|
106
|
+
this.tablasFrom = [];
|
|
107
|
+
this.camposSeleccionar = [];
|
|
108
|
+
this.joinsFrom = [];
|
|
109
|
+
this.actual = 0;
|
|
110
|
+
this.menuService.setBreadcrumb([{ label: 'Fuente Reporte' }]);
|
|
111
|
+
this.columns = [
|
|
112
|
+
{
|
|
113
|
+
field: 'descripcion',
|
|
114
|
+
header: this.translateService.instant('descripcion'),
|
|
115
|
+
width: 100,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
this.filters = [
|
|
119
|
+
{
|
|
120
|
+
field: 'descripcion',
|
|
121
|
+
header: this.translateService.instant('descripcion'),
|
|
122
|
+
matchMode: 'contains',
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
this.initStep();
|
|
126
|
+
}
|
|
127
|
+
async load(event) {
|
|
128
|
+
try {
|
|
129
|
+
this.loading = true;
|
|
130
|
+
this.colocarFiltro();
|
|
131
|
+
this.filtro.paginacionRegistroInicial = event?.first != null ? event?.first : 0,
|
|
132
|
+
this.filtro.paginacionRegistroFinal = event?.rows != null ? event?.rows : 10,
|
|
133
|
+
this.paginador = await this.reportesSvc.consultarFuenteDato(this.filtro).toPromise();
|
|
134
|
+
this.paginator.totalRecords = await this.reportesSvc.cantidadFuenteDato(this.filtro).toPromise();
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
console.error(e);
|
|
138
|
+
}
|
|
139
|
+
this.loading = false;
|
|
140
|
+
}
|
|
141
|
+
colocarFiltro() {
|
|
142
|
+
this.filtro.origen = ("F");
|
|
143
|
+
this.filtro.descripcion = (null);
|
|
144
|
+
if (this.utilsService.isNotBlank(this.descripcion)) {
|
|
145
|
+
this.filtro.descripcion = (ConstantesGenerales.PORCENTAJE + this.descripcion + ConstantesGenerales.PORCENTAJE);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
limpiarCampos() {
|
|
149
|
+
this.descripcion = null;
|
|
150
|
+
}
|
|
151
|
+
async siguiente() {
|
|
152
|
+
try {
|
|
153
|
+
if (this.validarWizard()) {
|
|
154
|
+
if (this.actual < 3) {
|
|
155
|
+
if (this.actual == 0) {
|
|
156
|
+
this.foraneas = [];
|
|
157
|
+
if (this.tablasFrom.length == 0) { // No selecciono ninguna tabla
|
|
158
|
+
this.notificationBusService.showInfo("Debe seleccionar al menos un objeto.");
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
else if (this.tablasFrom.length == 1) { // Solo selecciono una, por eso no hay que generar joins.
|
|
162
|
+
this.actual++;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
let nombresTablas = [];
|
|
166
|
+
for (let tabla of this.tablasFrom) {
|
|
167
|
+
if (!nombresTablas.includes(tabla.tabla)) {
|
|
168
|
+
nombresTablas.push(tabla.tabla);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this.foraneas = [];
|
|
172
|
+
//List<LlaveForanea>
|
|
173
|
+
let llaves = await this.reportesSvc.getLlaves(nombresTablas).toPromise();
|
|
174
|
+
for (let i = 0; i < this.tablasFrom.length; i++) {
|
|
175
|
+
for (let j = 0; j < this.tablasFrom.length; j++) {
|
|
176
|
+
for (let foranea of llaves) {
|
|
177
|
+
if (foranea.tabla1 == (this.tablasFrom[i].tabla) && foranea.tabla2 == (this.tablasFrom[j].tabla)) {
|
|
178
|
+
let nuevo = new ForeingWraperModel();
|
|
179
|
+
nuevo.alias1 = (this.tablasFrom[i].alias);
|
|
180
|
+
nuevo.alias2 = (this.tablasFrom[j].alias);
|
|
181
|
+
nuevo.llave = (foranea);
|
|
182
|
+
this.foraneas.push(nuevo);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Cargo las columnas para los siguientes procesos.
|
|
189
|
+
this.columnas = [];
|
|
190
|
+
this.listaColumnas = [];
|
|
191
|
+
this.camposSeleccionar = [];
|
|
192
|
+
for (let from of this.tablasFrom) {
|
|
193
|
+
//ReporteColumnaDTO
|
|
194
|
+
let ta = new ReporteColumnaModel();
|
|
195
|
+
ta.reporteFuente = (from.tabla);
|
|
196
|
+
//List<ReporteColumnaDTO>
|
|
197
|
+
let nuevas = await this.generalSvc.queryForList(new GeneralModel('ReporteColumnaDTO', 'Reportes.consultarColumnas', false, ta)).toPromise();
|
|
198
|
+
this.cargarListasColumnas(nuevas, from.alias);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
this.actual++;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.terminarPasos();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
console.error(e);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async cargarListasColumnas(nuevas, alias) {
|
|
213
|
+
for (let col of nuevas) {
|
|
214
|
+
col.reporteFuente = (alias);
|
|
215
|
+
this.columnas.push(col);
|
|
216
|
+
this.listaColumnas.push({ value: col.reporteFuente + '.' + col.nombre, label: col.reporteFuente + '.' + col.nombre });
|
|
217
|
+
let campo = new ColumnaWraperModel();
|
|
218
|
+
campo.columna = col;
|
|
219
|
+
campo.alias = col.nombre;
|
|
220
|
+
this.camposSeleccionar.push(campo);
|
|
221
|
+
}
|
|
222
|
+
console.log('camposSeleccionar', this.camposSeleccionar);
|
|
223
|
+
}
|
|
224
|
+
async terminarPasos() {
|
|
225
|
+
let camposSql = "";
|
|
226
|
+
let i = 0;
|
|
227
|
+
for (let col of this.camposSeleccionar) {
|
|
228
|
+
if (col.seleccionado) {
|
|
229
|
+
camposSql += (i == 0 ? "" : ",") + col.columna.nombre + " as " + col.alias;
|
|
230
|
+
i++;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
this.fuente.whereJoin = (this.generarSqlJoin());
|
|
234
|
+
this.fuente.fromSql = (this.generarSqlFrom());
|
|
235
|
+
let where = "";
|
|
236
|
+
let estaBlancoWhereJoin = this.fuente.whereJoin == null || "" == (this.fuente.whereJoin);
|
|
237
|
+
let estaBlancoWhereAdicional = this.fuente.whereAdicional == null || "" == (this.fuente.whereAdicional);
|
|
238
|
+
if (!estaBlancoWhereJoin || !estaBlancoWhereAdicional) {
|
|
239
|
+
where = " \nWHERE ";
|
|
240
|
+
if (!estaBlancoWhereJoin && !estaBlancoWhereAdicional) {
|
|
241
|
+
where += this.fuente.whereJoin + " AND \n(" + this.fuente.whereAdicional + ")";
|
|
242
|
+
}
|
|
243
|
+
else if (!estaBlancoWhereJoin) {
|
|
244
|
+
where += this.fuente.whereJoin;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
where += this.fuente.whereAdicional;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
console.log('where', where);
|
|
251
|
+
try {
|
|
252
|
+
let sql = "SELECT \n" + camposSql + " \nFROM \n" + this.fuente.fromSql + where;
|
|
253
|
+
await this.reportesSvc.validarQuery(sql).toPromise();
|
|
254
|
+
this.fuente.query = (sql);
|
|
255
|
+
this.query = sql;
|
|
256
|
+
this.tabPrincipal = 0;
|
|
257
|
+
this.construirColumnas();
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
console.error(e);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async adicionarForanea(evento) {
|
|
264
|
+
try {
|
|
265
|
+
//ForeingWraper
|
|
266
|
+
let foranea = evento.data;
|
|
267
|
+
for (let rel of foranea.llave.relaciones) {
|
|
268
|
+
let par = rel.split(":");
|
|
269
|
+
let join = new JoinFromModel();
|
|
270
|
+
join.columna1 = (foranea.alias1 + "." + par[0]);
|
|
271
|
+
join.columna2 = (foranea.alias2 + "." + par[1]);
|
|
272
|
+
this.joinsFrom.push(join);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
console.error(e);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
async eliminar() {
|
|
280
|
+
this.confirmationService.confirm({
|
|
281
|
+
target: event.target,
|
|
282
|
+
message: this.translateService.instant('mensaje_alerta'),
|
|
283
|
+
icon: 'confirmar',
|
|
284
|
+
accept: () => {
|
|
285
|
+
this.setRespuesta(true);
|
|
286
|
+
},
|
|
287
|
+
reject: () => {
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
async setRespuesta(respuesta) {
|
|
292
|
+
try {
|
|
293
|
+
if (respuesta) {
|
|
294
|
+
this.reportesSvc.eliminarFuenteDatosConHijos(this.fuente).toPromise();
|
|
295
|
+
this.fuente = null;
|
|
296
|
+
this.notificationBusService.showInfo("La fuente ha sido eliminada.");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch (e) {
|
|
300
|
+
console.error(e);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
anterior() {
|
|
304
|
+
if (this.actual > 0)
|
|
305
|
+
this.actual--;
|
|
306
|
+
}
|
|
307
|
+
async validarQuery() {
|
|
308
|
+
try {
|
|
309
|
+
if (this.utilsService.validarTextoSQL(this.query, true, true, 8000, true)) {
|
|
310
|
+
this.reportesSvc.validarQuery(this.query);
|
|
311
|
+
this.notificationBusService.showInfo("El query esta correcto.");
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
//Validador.adicionarMensaje("fuenteForm:tab:query", e.getMessage());
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
adicionarJoin() {
|
|
319
|
+
try {
|
|
320
|
+
if (this.col1 != null && this.col2 != null) {
|
|
321
|
+
// TODO: Falta validar el tipo
|
|
322
|
+
let nuevo = new JoinFromModel();
|
|
323
|
+
nuevo.columna1 = (this.col1);
|
|
324
|
+
nuevo.columna2 = (this.col2);
|
|
325
|
+
this.joinsFrom.push(nuevo);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
this.notificationBusService.showWarning("Debe seleccionar dos campos");
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
console.error(e);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
eliminarJoin(ae) {
|
|
336
|
+
try {
|
|
337
|
+
//let join = (JoinFrom) ((UIParameter) ae.getComponent().findComponent("join")).getValue();
|
|
338
|
+
this.joinsFrom.filter((data) => data === ae.data);
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
console.error(e);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
eliminarTabla(ae) {
|
|
345
|
+
try {
|
|
346
|
+
//TablaFrom tabla = (TablaFrom) ((UIParameter) ae.getComponent().findComponent("tabla")).getValue();
|
|
347
|
+
this.tablasFrom.filter((data) => data === ae);
|
|
348
|
+
this.notificationBusService.showWarning("Falta eliminar las columnas de la tabla ???");
|
|
349
|
+
}
|
|
350
|
+
catch (e) {
|
|
351
|
+
console.error(e);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
buscarTabla() {
|
|
355
|
+
this.popupTablasFuenteUI.buscarTabla("fuenteUI.tablaSeleccionada");
|
|
356
|
+
}
|
|
357
|
+
setTablaSeleccionada(tablaSeleccionada) {
|
|
358
|
+
try {
|
|
359
|
+
let tablas = [];
|
|
360
|
+
for (let tabla of this.tablasFrom) {
|
|
361
|
+
if (!tablas.includes(tabla.tabla)) {
|
|
362
|
+
tablas.push(tabla.tabla);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
this.cargarTablaEnLista(tablaSeleccionada);
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
console.error(e);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
cargarTablaEnLista(tabla) {
|
|
372
|
+
let par = tabla.split("_");
|
|
373
|
+
let alias = par[0];
|
|
374
|
+
let i = 1;
|
|
375
|
+
let tablaTemp = new TablaFromModel();
|
|
376
|
+
tablaTemp.alias = alias;
|
|
377
|
+
while (this.tablasFrom.includes(tablaTemp)) {
|
|
378
|
+
alias = tabla + (i++);
|
|
379
|
+
}
|
|
380
|
+
let tem = new TablaFromModel();
|
|
381
|
+
tem.tabla = tabla;
|
|
382
|
+
tem.alias = alias;
|
|
383
|
+
this.tablasFrom.push(tem);
|
|
384
|
+
return alias;
|
|
385
|
+
}
|
|
386
|
+
cambioJoin(ce) {
|
|
387
|
+
try {
|
|
388
|
+
this.listaJoin = [];
|
|
389
|
+
let nuevo = ce.value;
|
|
390
|
+
if (nuevo != null) {
|
|
391
|
+
//ReporteColumnaDTO
|
|
392
|
+
let act = null;
|
|
393
|
+
for (let col of this.columnas) {
|
|
394
|
+
if (nuevo.equals(col.reporteFuente + "." + col.nombre)) {
|
|
395
|
+
act = col;
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
for (let col of this.columnas) {
|
|
400
|
+
if (!col.reporteFuente.startsWith(act.reporteFuente) && col.tipoDato == (act.tipoDato) && col.orden == (act.orden)) {
|
|
401
|
+
let val = col.reporteFuente + "." + col.nombre;
|
|
402
|
+
this.listaJoin.push({ value: val, key: val });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
catch (e) {
|
|
408
|
+
console.error(e);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
editarCampo(evento) {
|
|
412
|
+
try {
|
|
413
|
+
let col = evento.data;
|
|
414
|
+
this.campoFormula = col;
|
|
415
|
+
let vars = [];
|
|
416
|
+
for (let campo of this.campos) {
|
|
417
|
+
let var1;
|
|
418
|
+
var1.nombre = (campo.nombre);
|
|
419
|
+
var1.tipo = (campo.tipoDato);
|
|
420
|
+
vars.push(var1);
|
|
421
|
+
}
|
|
422
|
+
//getBean(EditorFormulaUI.class).editar(col.getSintaxis(), "fuenteUI.formula", vars);
|
|
423
|
+
}
|
|
424
|
+
catch (e) {
|
|
425
|
+
console.error(e);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
editarWhere() {
|
|
429
|
+
try {
|
|
430
|
+
let vars = [];
|
|
431
|
+
for (let col of this.columnas) {
|
|
432
|
+
//VariableFormula
|
|
433
|
+
let var1;
|
|
434
|
+
var1.nombre = (col.reporteFuente + "." + col.nombre);
|
|
435
|
+
var1.tipo(col.tipoDato);
|
|
436
|
+
vars.push(var1);
|
|
437
|
+
}
|
|
438
|
+
//getBean(EditorFormulaUI.class).editar(fuente.getWhereAdicional(), "fuenteUI.fuente.whereAdicional", vars);
|
|
439
|
+
}
|
|
440
|
+
catch (e) {
|
|
441
|
+
console.error(e);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
setFormula(formula) {
|
|
445
|
+
if (this.campoFormula != null) {
|
|
446
|
+
this.campoFormula.sintaxis = (formula);
|
|
447
|
+
}
|
|
448
|
+
this.campoFormula = null;
|
|
449
|
+
}
|
|
450
|
+
adicionarColumnas() {
|
|
451
|
+
for (let col of this.camposSeleccionar) {
|
|
452
|
+
col.seleccionado = (false);
|
|
453
|
+
}
|
|
454
|
+
this.mostrarSeleccionar = true;
|
|
455
|
+
}
|
|
456
|
+
agregarSeleccionados() {
|
|
457
|
+
try {
|
|
458
|
+
for (let col of this.camposSeleccionar) {
|
|
459
|
+
if (col.seleccionado) {
|
|
460
|
+
//ColumnaFuenteDTO
|
|
461
|
+
let campo = new ColumnaFuenteModel();
|
|
462
|
+
campo.fuenteDato = (this.fuente.llave);
|
|
463
|
+
campo.nombre = (col.columna.nombre);
|
|
464
|
+
campo.sintaxis = (col.columna.nombre);
|
|
465
|
+
this.campos.push(campo);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
this.ocultarSeleccionar();
|
|
469
|
+
}
|
|
470
|
+
catch (e) {
|
|
471
|
+
console.error(e);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
ocultarSeleccionar() {
|
|
475
|
+
this.mostrarSeleccionar = false;
|
|
476
|
+
}
|
|
477
|
+
async verDetalle(evento) {
|
|
478
|
+
try {
|
|
479
|
+
this.vistaVisualizar = 'mantenimiento';
|
|
480
|
+
let fuenteDatoDTO = evento;
|
|
481
|
+
this.fuente = new FuenteDatoModel();
|
|
482
|
+
this.fuente.llave = (fuenteDatoDTO.llave);
|
|
483
|
+
this.fuente = await this.reportesSvc.consultarUnicaFuenteDato(this.fuente).toPromise();
|
|
484
|
+
if (this.fuente.query2 != null) {
|
|
485
|
+
this.query = this.fuente.query + this.fuente.query2;
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
this.query = this.fuente.query;
|
|
489
|
+
}
|
|
490
|
+
//ColumnaFuenteDTO
|
|
491
|
+
let col = new ColumnaFuenteModel();
|
|
492
|
+
col.fuenteDato = (this.fuente.llave);
|
|
493
|
+
this.campos = await this.reportesSvc.consultarColumnasFuente(col).toPromise();
|
|
494
|
+
this.actual = 0;
|
|
495
|
+
this.menuService.setBreadcrumb([{ label: 'Fuente Reporte', }, { label: 'Mantenimiento Fuente' }]);
|
|
496
|
+
this.cargasOpciones();
|
|
497
|
+
}
|
|
498
|
+
catch (e) {
|
|
499
|
+
console.error(e);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
nuevo() {
|
|
503
|
+
try {
|
|
504
|
+
this.vistaVisualizar = 'mantenimiento';
|
|
505
|
+
this.fuente = new FuenteDatoModel();
|
|
506
|
+
this.fuente.origen = ("F");
|
|
507
|
+
this.campos = null;
|
|
508
|
+
this.query = null;
|
|
509
|
+
this.tabPrincipal = 0;
|
|
510
|
+
this.actual = 0;
|
|
511
|
+
this.menuService.setBreadcrumb([{ label: 'Fuente Reporte', }, { label: 'Mantenimiento Fuente' }]);
|
|
512
|
+
this.cargasOpciones();
|
|
513
|
+
}
|
|
514
|
+
catch (e) {
|
|
515
|
+
console.error(e);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
cargasOpciones() {
|
|
519
|
+
this.menu = [{ label: this.translateService.instant('link_eliminar'), icon: 'glyphicons glyphicons-bin', visible: this.fuente.llave != null, command: (event) => { this.eliminar(); } },
|
|
520
|
+
{ label: this.translateService.instant('link_validar'), icon: 'glyphicons glyphicons-print', command: (event) => { this.validarQuery(); } },
|
|
521
|
+
{ label: this.translateService.instant('link_generar'), icon: 'glyphicons glyphicons-bell', visible: this.fuente.llave != null, command: (event) => { this.construirColumnas(); } },
|
|
522
|
+
];
|
|
523
|
+
}
|
|
524
|
+
regresar() {
|
|
525
|
+
this.vistaVisualizar = null;
|
|
526
|
+
this.ngOnInit();
|
|
527
|
+
}
|
|
528
|
+
validar() {
|
|
529
|
+
let res = true;
|
|
530
|
+
res = res && this.utilsService.validarCampoObligatorio(this.fuente.descripcion);
|
|
531
|
+
res = res && (this.utilsService.validarTextoSQL(this.query, true, true, 8000, true) == null);
|
|
532
|
+
return res;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Registra/actualiza la informacion general de la fuente de datos
|
|
536
|
+
*/
|
|
537
|
+
async guardar() {
|
|
538
|
+
try {
|
|
539
|
+
if (this.validar()) {
|
|
540
|
+
if (this.query.length > 4000) {
|
|
541
|
+
this.fuente.query = (this.query.substring(0, 3999));
|
|
542
|
+
this.fuente.query2 = (this.query.substring(3999, this.query.length));
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
this.fuente.query = (this.query);
|
|
546
|
+
this.fuente.query2 = (null);
|
|
547
|
+
}
|
|
548
|
+
if (this.fuente.llave == null) {
|
|
549
|
+
this.fuente.llave = (this.utilsService.generarLlave());
|
|
550
|
+
await this.reportesSvc.insertarFuenteDato(this.fuente).toPromise();
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
await this.reportesSvc.actualizarFuenteDato(this.fuente).toPromise();
|
|
554
|
+
}
|
|
555
|
+
this.notificationBusService.showInfo("Los cambios han sido guardados");
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
catch (e) {
|
|
559
|
+
console.error(e);
|
|
560
|
+
}
|
|
561
|
+
} //guardar
|
|
562
|
+
/**
|
|
563
|
+
* Registra/actualiza las columnas generados para la fuente de datos como registros de tipo 'ColumnaFuente'
|
|
564
|
+
*/
|
|
565
|
+
async guardarCampos() {
|
|
566
|
+
try {
|
|
567
|
+
if (this.fuente.llave == null) {
|
|
568
|
+
this.notificationBusService.showInfo("Por favor diligencie primero los datos de la fuente");
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (this.validarCampos()) {
|
|
572
|
+
await this.reportesSvc.actualizarColumnasFuente(this.fuente, this.campos).toPromise();
|
|
573
|
+
this.notificationBusService.showInfo("Se han guardado los campos");
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
catch (e) {
|
|
577
|
+
console.error(e);
|
|
578
|
+
}
|
|
579
|
+
} //guardarCampos
|
|
580
|
+
/**
|
|
581
|
+
* Verifica que los valores asociados a los campos para la creacion de las columnas de la fuente sean válidos
|
|
582
|
+
* @return false en caso de que los valores asignados a los campos sean nulos o no sean palabras válidas de acuerdo
|
|
583
|
+
* con las condiciones dadas por ValidadorUtil.validarPalabra()),
|
|
584
|
+
* en caso contrario retorna true
|
|
585
|
+
*/
|
|
586
|
+
validarCampos() {
|
|
587
|
+
for (let col of this.campos) {
|
|
588
|
+
if (col.nombre == null || !this.utilsService.validarPalabra(col.nombre)) {
|
|
589
|
+
this.notificationBusService.showInfo("Nombre no valido (" + col.nombre + ")");
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return true;
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Construye las columnas de la fuente de datos, con base en los campos obtenidos
|
|
597
|
+
* de la consulta SQL asociada
|
|
598
|
+
*/
|
|
599
|
+
async construirColumnas() {
|
|
600
|
+
try {
|
|
601
|
+
this.campos = await this.reportesSvc.getColumnasSql(this.query).toPromise();
|
|
602
|
+
}
|
|
603
|
+
catch (e) {
|
|
604
|
+
console.error(e);
|
|
605
|
+
}
|
|
606
|
+
} //construirColumnas
|
|
607
|
+
validarWizard() {
|
|
608
|
+
let alias = [];
|
|
609
|
+
for (let tabla of this.tablasFrom) {
|
|
610
|
+
if (alias.includes(tabla.alias)) {
|
|
611
|
+
this.notificationBusService.showInfo("No se puede repetir el alias de las tablas.");
|
|
612
|
+
return false;
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
alias.push(tabla.alias);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
alias = [];
|
|
619
|
+
for (let col of this.camposSeleccionar) {
|
|
620
|
+
if (col.seleccionado) {
|
|
621
|
+
if (alias.includes(col.alias)) {
|
|
622
|
+
this.notificationBusService.showInfo("No se puede repetir el alias de las columnas.");
|
|
623
|
+
return false;
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
alias.push(col.alias);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
return true;
|
|
631
|
+
}
|
|
632
|
+
generarSqlFrom() {
|
|
633
|
+
let res = "";
|
|
634
|
+
let i = 0;
|
|
635
|
+
for (let tabla of this.tablasFrom) {
|
|
636
|
+
res += (i == 0 ? "" : ",") + tabla.tabla + " " + tabla.alias;
|
|
637
|
+
i++;
|
|
638
|
+
}
|
|
639
|
+
return res;
|
|
640
|
+
}
|
|
641
|
+
generarSqlJoin() {
|
|
642
|
+
let res = "";
|
|
643
|
+
let i = 0;
|
|
644
|
+
for (let join of this.joinsFrom) {
|
|
645
|
+
res += (i == 0 ? "" : " AND ") + join.columna1 + " = " + join.columna2;
|
|
646
|
+
i++;
|
|
647
|
+
}
|
|
648
|
+
return res;
|
|
649
|
+
}
|
|
650
|
+
//IMPLEMENTACION STEPER
|
|
651
|
+
initStep() {
|
|
652
|
+
this.mapaMensajes.set(0, 'Seleccione las tablas o vistas de donde desea obtener la informacion.');
|
|
653
|
+
this.mapaMensajes.set(1, 'Indique de que manera se relaccionan los objetos entre si.');
|
|
654
|
+
this.mapaMensajes.set(2, 'Indique los filtros adicionales que desee realizar sobre la informacion.');
|
|
655
|
+
this.mapaMensajes.set(3, 'Campos');
|
|
656
|
+
this.items = [
|
|
657
|
+
{
|
|
658
|
+
label: this.translateService.instant('from'),
|
|
659
|
+
routerLink: 'personal',
|
|
660
|
+
title: 'Seleccione las tablas o vistas de donde desea obtener la informacion.'
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
label: this.translateService.instant('join'),
|
|
664
|
+
routerLink: 'personal',
|
|
665
|
+
title: 'Indique de que manera se relaccionan los objetos entre si.'
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
label: this.translateService.instant('where'),
|
|
669
|
+
routerLink: 'personal',
|
|
670
|
+
title: 'Indique los filtros adicionales que desee realizar sobre la informacion.'
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
label: this.translateService.instant('campos'),
|
|
674
|
+
routerLink: 'confirmation',
|
|
675
|
+
}
|
|
676
|
+
];
|
|
677
|
+
}
|
|
678
|
+
actualizarSeleccion(booleanogeneral) {
|
|
679
|
+
this.camposSeleccionar.forEach((elemento) => {
|
|
680
|
+
elemento.seleccionado = booleanogeneral;
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
todosSeleccionados() {
|
|
684
|
+
return this.camposSeleccionar.every(elemento => elemento.seleccionado);
|
|
685
|
+
}
|
|
686
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FuenteReporteComponent, deps: [{ token: i1.MenuService }, { token: i2.ToastService }, { token: i3.ReportesService }, { token: i4.GeneralService }, { token: i5.UtilsService }, { token: i6.ConfirmationService }, { token: i7.TranslateService }, { token: i6.MessageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
687
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: FuenteReporteComponent, isStandalone: true, selector: "app-fuente-reporte", providers: [MessageService, ConfirmationService], viewQueries: [{ propertyName: "popupTablasFuenteUI", first: true, predicate: ["popupTablasFuenteUI"], descendants: true }], ngImport: i0, template: "@if(vistaVisualizar == null){\r\n<h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n<div class=\"flex justify-content-between align-items-center mb-3\">\r\n <app-filtro-general [filtros]=\"filters\" [datatable]=\"tablaGeneral\">\r\n <ng-template let-form>\r\n <ng-container [formGroup]=\"form\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"descripcion\" formControlName=\"descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"descripcion\">{{'filtro' | translate}}</label>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </app-filtro-general>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevo()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n</div>\r\n<app-tabla-general #tablaGeneral [columns]=\"columns\" [value]=\"paginador\" [rows]=\"paginator.rows\"\r\n [totalRecords]=\"paginator.totalRecords\" (onLoad)=\"load($event)\" (onRowSelect)=\"verDetalle($event)\"\r\n [loading]=\"loading\"></app-tabla-general>\r\n}\r\n@if(vistaVisualizar != null){\r\n<div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <button pButton pRipple (click)=\"regresar()\" label=\"Regresar\" icon=\"pi pi-chevron-left\"\r\n class=\"p-button-text font-semibold\"></button>\r\n</div>\r\n<p-tabView>\r\n <p-tabPanel header=\"{{ 'fuente'| translate}}\">\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div>\r\n\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"peso\" [(ngModel)]=\"fuente.descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"peso\">{{'nombre' | translate}}</label>\r\n </span>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea [(ngModel)]=\"query\"\r\n autofocus [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardar()\">\r\n </button>\r\n <p-splitButton class=\"ml-2\" label=\"Acciones Evaluadores\" icon=\"glyphicons glyphicons-list\"\r\n [model]=\"menu\"></p-splitButton>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCampos()\">\r\n </button>\r\n </div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"campos\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"false\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\"\r\n dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'nombre' | translate}}</th>\r\n <th style=\"width:25%\">{{'sintaxis' | translate}}</th>\r\n <th style=\"width:25%\">{{'tipo' | translate}} de {{'dato' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width:25%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.nombre \" class=\"w-full\">\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n\r\n\r\n <p-tabPanel header=\"{{ 'wizard'| translate}}\">\r\n <p-steps [model]=\"items\" [readonly]=\"false\" [activeIndex]=\"actual\"></p-steps>\r\n <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <p-button (onClick)=\"anterior()\" [rounded]=\"true\" icon=\"pi pi-angle-left\" class=\"p-button-secondary\"\r\n pTooltip=\"Anterior\" tooltipPosition=\"top\" placeholder=\"Top\" [disabled]=\"actual <= 0\" />\r\n <p-button (onClick)=\"siguiente()\" [rounded]=\"true\" icon=\"pi pi-angle-right\" class=\"p-button-secondary\"\r\n [pTooltip]=\"actual === 3 ? 'Terminar': 'Siguiente'\" tooltipPosition=\"top\" placeholder=\"Top\" />\r\n </div>\r\n <div class=\"cardInstrucciones mt-4 mb-3\">\r\n <div class=\"flex\">\r\n <div class=\"icono\">\r\n <i class=\"pi pi-bell\"></i>\r\n </div>\r\n <div class=\"contenedor\">\r\n <label>{{mapaMensajes?.get(actual)}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <button pButton label=\"{{'link_anterior' | translate}}\" icon=\"pi pi-plus\" (click)=\"anterior()\" *ngIf=\"actual > 0\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <button pButton label=\"{{'link_siguiente' | translate}}\" icon=\"pi pi-plus\" (click)=\"siguiente()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div> -->\r\n @if(actual === 0){\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton label=\"{{'fuente' | translate}}\" icon=\"pi pi-plus\" (click)=\"buscarTabla()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"tablasFrom\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\"\r\n scrollDirection=\"horizontal\" styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\"\r\n editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\"\r\n dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'tabla' | translate}}</th>\r\n <th style=\"width:25%\">{{'alias' | translate}}</th>\r\n <th style=\"width:25%\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.tabla}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias}}\r\n </td>\r\n <td class=\"flex justify-content-end\">\r\n <div>\r\n <!-- ELIMINAR -->\r\n <button pButton pRipple type=\"button\" pDeleteEditableRow icon=\"pi pi-trash\"\r\n (click)=\"eliminarTabla(tabla)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n }\r\n @if(actual == 1){\r\n\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"foraneas\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.alias1}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias2}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.llave.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n @if(actual == 2){\r\n\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'where'| translate}}</h5>\r\n </div>\r\n\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"fuente.whereAdicional\" autofocus [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\"\r\n (click)=\"editarWhere()\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n }\r\n @if(actual == 3){\r\n\r\n <p-table id=\"tabla_lista_tipo_entidad\" [value]=\"camposSeleccionar\" [scrollable]=\"true\"\r\n [totalRecords]=\"camposSeleccionar.length\" scrollDirection=\"both\" scrollDirection=\"horizontal\"\r\n responsiveLayout=\"scroll\" scrollDirection=\"horizontal\" [paginator]=\"camposSeleccionar.length > 10\"\r\n [rows]=\"10\" [rowsPerPageOptions]=\"[10, 20, 30]\" styleClass=\"p-datatable-striped\"\r\n [showCurrentPageReport]=\"true\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\" dataKey=\"alias\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\" alignFrozen=\"left\" pFrozenColumn>\r\n <p-checkbox [style]=\"{'margin-left': '1%','margin-right':'1%'}\" [(ngModel)]=\"seleccionGeneral\"\r\n [binary]=\"true\" [ngModel]=\"todosSeleccionados()\"\r\n (ngModelChange)=\"actualizarSeleccion($event)\"></p-checkbox>\r\n <span style=\"margin-left:1%\">{{'tabla' | translate}}</span>\r\n </th>\r\n <th style=\"width:25%\">{{'columna' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla>\r\n <tr>\r\n <td style=\"width:25%\">\r\n <p-checkbox class=\"mr-2 \" [(ngModel)]=\"tabla.seleccionado\" [binary]=\"true\" inputId=\"binary\">\r\n </p-checkbox>\r\n {{tabla.columna.reporteFuente}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.columna.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n\r\n </p-tabPanel>\r\n</p-tabView>\r\n\r\n}\r\n\r\n<app-popup-tablas-fuente #popupTablasFuenteUI\r\n (aplicarDestinoOcultar)=\"setTablaSeleccionada($event)\"></app-popup-tablas-fuente>", styles: [":host ::ng-deep .botonCircular{background:var(--color-85);border:solid 1px var(--color-85);color:var(--color-400)}\n"], dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: PopupTablasFuenteComponent, selector: "app-popup-tablas-fuente", outputs: ["aplicarDestinoOcultar"] }, { kind: "ngmodule", type: StepsModule }, { kind: "component", type: i10.Steps, selector: "p-steps", inputs: ["activeIndex", "model", "readonly", "style", "styleClass", "exact"], outputs: ["activeIndexChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i11.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i11.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "ngmodule", type: SplitButtonModule }, { kind: "component", type: i12.SplitButton, selector: "p-splitButton", inputs: ["model", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "icon", "iconPos", "label", "tooltip", "tooltipOptions", "style", "styleClass", "menuStyle", "menuStyleClass", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions", "buttonProps", "menuButtonProps", "autofocus", "disabled", "tabindex", "menuButtonDisabled", "buttonDisabled"], outputs: ["onClick", "onMenuHide", "onMenuShow", "onDropdownClick"] }, { kind: "directive", type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i13.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i14.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i16.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i16.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i16.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "component", type: TablaGeneralComponent, selector: "app-tabla-general", inputs: ["dataKey", "value", "columns", "rows", "totalRecords", "loading", "ocultarFraccionador"], outputs: ["onLoad", "onRowSelect"] }, { kind: "component", type: FiltroGeneralComponent, selector: "app-filtro-general", inputs: ["filtros", "datatable"], outputs: ["metodoRegresar", "metodoRegresarAdicional"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i15.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i17.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ConfirmPopupModule }] });
|
|
688
|
+
}
|
|
689
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FuenteReporteComponent, decorators: [{
|
|
690
|
+
type: Component,
|
|
691
|
+
args: [{ selector: 'app-fuente-reporte', standalone: true, imports: [TooltipModule, CheckboxModule, PopupTablasFuenteComponent, StepsModule, CommonModule, TabViewModule, SplitButtonModule, NgIf, TranslateModule, InputTextModule, CommonModule, AccordionModule, DropdownModule, FormsModule, TableModule, TablaGeneralComponent, FiltroGeneralComponent, ButtonModule, ReactiveFormsModule, GeneralPipe, InputTextareaModule, ConfirmPopupModule, ButtonModule], providers: [MessageService, ConfirmationService], template: "@if(vistaVisualizar == null){\r\n<h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n<div class=\"flex justify-content-between align-items-center mb-3\">\r\n <app-filtro-general [filtros]=\"filters\" [datatable]=\"tablaGeneral\">\r\n <ng-template let-form>\r\n <ng-container [formGroup]=\"form\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"descripcion\" formControlName=\"descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"descripcion\">{{'filtro' | translate}}</label>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </app-filtro-general>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevo()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n</div>\r\n<app-tabla-general #tablaGeneral [columns]=\"columns\" [value]=\"paginador\" [rows]=\"paginator.rows\"\r\n [totalRecords]=\"paginator.totalRecords\" (onLoad)=\"load($event)\" (onRowSelect)=\"verDetalle($event)\"\r\n [loading]=\"loading\"></app-tabla-general>\r\n}\r\n@if(vistaVisualizar != null){\r\n<div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <button pButton pRipple (click)=\"regresar()\" label=\"Regresar\" icon=\"pi pi-chevron-left\"\r\n class=\"p-button-text font-semibold\"></button>\r\n</div>\r\n<p-tabView>\r\n <p-tabPanel header=\"{{ 'fuente'| translate}}\">\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div>\r\n\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"peso\" [(ngModel)]=\"fuente.descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"peso\">{{'nombre' | translate}}</label>\r\n </span>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea [(ngModel)]=\"query\"\r\n autofocus [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardar()\">\r\n </button>\r\n <p-splitButton class=\"ml-2\" label=\"Acciones Evaluadores\" icon=\"glyphicons glyphicons-list\"\r\n [model]=\"menu\"></p-splitButton>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCampos()\">\r\n </button>\r\n </div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"campos\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"false\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\"\r\n dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'nombre' | translate}}</th>\r\n <th style=\"width:25%\">{{'sintaxis' | translate}}</th>\r\n <th style=\"width:25%\">{{'tipo' | translate}} de {{'dato' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width:25%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.nombre \" class=\"w-full\">\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n\r\n\r\n <p-tabPanel header=\"{{ 'wizard'| translate}}\">\r\n <p-steps [model]=\"items\" [readonly]=\"false\" [activeIndex]=\"actual\"></p-steps>\r\n <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <p-button (onClick)=\"anterior()\" [rounded]=\"true\" icon=\"pi pi-angle-left\" class=\"p-button-secondary\"\r\n pTooltip=\"Anterior\" tooltipPosition=\"top\" placeholder=\"Top\" [disabled]=\"actual <= 0\" />\r\n <p-button (onClick)=\"siguiente()\" [rounded]=\"true\" icon=\"pi pi-angle-right\" class=\"p-button-secondary\"\r\n [pTooltip]=\"actual === 3 ? 'Terminar': 'Siguiente'\" tooltipPosition=\"top\" placeholder=\"Top\" />\r\n </div>\r\n <div class=\"cardInstrucciones mt-4 mb-3\">\r\n <div class=\"flex\">\r\n <div class=\"icono\">\r\n <i class=\"pi pi-bell\"></i>\r\n </div>\r\n <div class=\"contenedor\">\r\n <label>{{mapaMensajes?.get(actual)}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <button pButton label=\"{{'link_anterior' | translate}}\" icon=\"pi pi-plus\" (click)=\"anterior()\" *ngIf=\"actual > 0\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <button pButton label=\"{{'link_siguiente' | translate}}\" icon=\"pi pi-plus\" (click)=\"siguiente()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div> -->\r\n @if(actual === 0){\r\n <div class=\"flex justify-content-end mb-2\">\r\n <button pButton label=\"{{'fuente' | translate}}\" icon=\"pi pi-plus\" (click)=\"buscarTabla()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"tablasFrom\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\"\r\n scrollDirection=\"horizontal\" styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\"\r\n editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\"\r\n dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'tabla' | translate}}</th>\r\n <th style=\"width:25%\">{{'alias' | translate}}</th>\r\n <th style=\"width:25%\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.tabla}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias}}\r\n </td>\r\n <td class=\"flex justify-content-end\">\r\n <div>\r\n <!-- ELIMINAR -->\r\n <button pButton pRipple type=\"button\" pDeleteEditableRow icon=\"pi pi-trash\"\r\n (click)=\"eliminarTabla(tabla)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n }\r\n @if(actual == 1){\r\n\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"foraneas\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.alias1}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias2}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.llave.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n @if(actual == 2){\r\n\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'where'| translate}}</h5>\r\n </div>\r\n\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"fuente.whereAdicional\" autofocus [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\"\r\n (click)=\"editarWhere()\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n }\r\n @if(actual == 3){\r\n\r\n <p-table id=\"tabla_lista_tipo_entidad\" [value]=\"camposSeleccionar\" [scrollable]=\"true\"\r\n [totalRecords]=\"camposSeleccionar.length\" scrollDirection=\"both\" scrollDirection=\"horizontal\"\r\n responsiveLayout=\"scroll\" scrollDirection=\"horizontal\" [paginator]=\"camposSeleccionar.length > 10\"\r\n [rows]=\"10\" [rowsPerPageOptions]=\"[10, 20, 30]\" styleClass=\"p-datatable-striped\"\r\n [showCurrentPageReport]=\"true\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\" dataKey=\"alias\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\" alignFrozen=\"left\" pFrozenColumn>\r\n <p-checkbox [style]=\"{'margin-left': '1%','margin-right':'1%'}\" [(ngModel)]=\"seleccionGeneral\"\r\n [binary]=\"true\" [ngModel]=\"todosSeleccionados()\"\r\n (ngModelChange)=\"actualizarSeleccion($event)\"></p-checkbox>\r\n <span style=\"margin-left:1%\">{{'tabla' | translate}}</span>\r\n </th>\r\n <th style=\"width:25%\">{{'columna' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla>\r\n <tr>\r\n <td style=\"width:25%\">\r\n <p-checkbox class=\"mr-2 \" [(ngModel)]=\"tabla.seleccionado\" [binary]=\"true\" inputId=\"binary\">\r\n </p-checkbox>\r\n {{tabla.columna.reporteFuente}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.columna.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n\r\n </p-tabPanel>\r\n</p-tabView>\r\n\r\n}\r\n\r\n<app-popup-tablas-fuente #popupTablasFuenteUI\r\n (aplicarDestinoOcultar)=\"setTablaSeleccionada($event)\"></app-popup-tablas-fuente>", styles: [":host ::ng-deep .botonCircular{background:var(--color-85);border:solid 1px var(--color-85);color:var(--color-400)}\n"] }]
|
|
692
|
+
}], ctorParameters: () => [{ type: i1.MenuService }, { type: i2.ToastService }, { type: i3.ReportesService }, { type: i4.GeneralService }, { type: i5.UtilsService }, { type: i6.ConfirmationService }, { type: i7.TranslateService }, { type: i6.MessageService }], propDecorators: { popupTablasFuenteUI: [{
|
|
693
|
+
type: ViewChild,
|
|
694
|
+
args: ['popupTablasFuenteUI']
|
|
695
|
+
}] } });
|
|
696
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZnVlbnRlLXJlcG9ydGUvZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZnVlbnRlLXJlcG9ydGUvZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxtQkFBbUIsRUFBWSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1B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QWlCLEVBQUMsSUFBSSxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxhQUNwWCxDQUFDLGNBQWMsRUFBQyxtQkFBbUIsQ0FBQzsrUkFzQ2IsbUJBQW1CO3NCQUFwRCxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29sdW1uYUZ1ZW50ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvQ29sdW1uYUZ1ZW50ZU1vZGVsJztcclxuaW1wb3J0IHsgRnVlbnRlRGF0b01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvRnVlbnRlRGF0byc7XHJcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlQ29sdW1uYSc7XHJcbmltcG9ydCB7IFRhYmxhRnJvbU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvVGFibGFGcm9tTW9kZWwnO1xyXG5pbXBvcnQgeyBKb2luRnJvbU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvSm9pbkZyb21Nb2RlbCc7XHJcbmltcG9ydCB7IFJlcG9ydGVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMbGF2ZUZvcmFuZWFNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0xsYXZlRm9yYW5lYU1vZGVsJztcclxuaW1wb3J0IHsgRm9yZWluZ1dyYXBlck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvRm9yZWluZ1dyYXBlck1vZGVsJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljaW9zL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEdlbmVyYWxNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0dlbmVyYWxNb2RlbCc7XHJcbmltcG9ydCB7IENvbHVtbmFXcmFwZXJNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0NvbHVtbmFXcmFwZXJNb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25zdGFudGVzR2VuZXJhbGVzIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL2NvbnN0YW50ZXMvQ29uc3RhbnRlc0dlbmVyYWxlcyc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgQ29uZmlybVBvcHVwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb25maXJtcG9wdXAnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHRhcmVhJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBBY2NvcmRpb25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2FjY29yZGlvbic7XHJcbmltcG9ydCB7IERyb3Bkb3duTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUYWJsZU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2dlbmVyYWwucGlwZSc7XHJcbmltcG9ydCB7IFRhYmxhR2VuZXJhbENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9uZW50ZXMvdGFibGEtZ2VuZXJhbC90YWJsYS1nZW5lcmFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpbHRyb0dlbmVyYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvbmVudGVzL2ZpbHRyby1nZW5lcmFsL2ZpbHRyby1nZW5lcmFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3BsaXRCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwbGl0YnV0dG9uJztcclxuaW1wb3J0IHsgVGFiVmlld01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFidmlldyc7XHJcbmltcG9ydCB7IFN0ZXBzTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zdGVwcyc7XHJcbmltcG9ydCB7IFBvcHVwVGFibGFzRnVlbnRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcG9wdXBzL3BvcHVwLXRhYmxhcy1mdWVudGUvcG9wdXAtdGFibGFzLWZ1ZW50ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcclxuXHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdhcHAtZnVlbnRlLXJlcG9ydGUnLFxyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0aW1wb3J0czogW1Rvb2x0aXBNb2R1bGUsQ2hlY2tib3hNb2R1bGUsUG9wdXBUYWJsYXNGdWVudGVDb21wb25lbnQsU3RlcHNNb2R1bGUsQ29tbW9uTW9kdWxlLFRhYlZpZXdNb2R1bGUsU3BsaXRCdXR0b25Nb2R1bGUsTmdJZixUcmFuc2xhdGVNb2R1bGUsIElucHV0VGV4dE1vZHVsZSxDb21tb25Nb2R1bGUsIEFjY29yZGlvbk1vZHVsZSwgRHJvcGRvd25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBUYWJsZU1vZHVsZSwgVGFibGFHZW5lcmFsQ29tcG9uZW50LCBGaWx0cm9HZW5lcmFsQ29tcG9uZW50LCBCdXR0b25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEdlbmVyYWxQaXBlLCBJbnB1dFRleHRhcmVhTW9kdWxlLCBDb25maXJtUG9wdXBNb2R1bGUsIEJ1dHRvbk1vZHVsZV0sXHJcblx0cHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2UsQ29uZmlybWF0aW9uU2VydmljZV0sXHJcblx0dGVtcGxhdGVVcmw6ICcuL2Z1ZW50ZS1yZXBvcnRlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybDogJy4vZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGdWVudGVSZXBvcnRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblx0cHVibGljIGZ1ZW50ZTogRnVlbnRlRGF0b01vZGVsID0gbmV3IEZ1ZW50ZURhdG9Nb2RlbCgpO1xyXG5cdHB1YmxpYyB2aXN0YVZpc3VhbGl6YXI6IHN0cmluZ1xyXG5cdHB1YmxpYyB0YWJsYXNGcm9tOiBUYWJsYUZyb21Nb2RlbFtdID0gW107IC8vIGZyb20gVGFibGFGcm9tXHJcblx0cHVibGljIGpvaW5zRnJvbTogSm9pbkZyb21Nb2RlbFtdID0gW107ICAgLy9mcm9tIEpvaW5Gcm9tIFxyXG5cdHB1YmxpYyBjb2x1bW5hczogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcblx0cHVibGljIGxpc3RhQ29sdW1uYXM6IGFueVtdID0gW107XHJcblx0cHVibGljIGxpc3RhSm9pbjogYW55W10gPSBbXTtcclxuXHRwdWJsaWMgY29sMTogc3RyaW5nO1xyXG5cdHB1YmxpYyBjb2wyOiBzdHJpbmc7XHJcblx0cHVibGljIGNhbXBvczogQ29sdW1uYUZ1ZW50ZU1vZGVsW10gPSBbXTtcclxuXHRwdWJsaWMgY2FtcG9zU2VsZWNjaW9uYXI6IENvbHVtbmFXcmFwZXJNb2RlbFtdID0gW107XHJcblx0cHVibGljIG1vc3RyYXJTZWxlY2Npb25hcjogYm9vbGVhbjtcclxuXHRwdWJsaWMgY2FtcG9Gb3JtdWxhOiBDb2x1bW5hRnVlbnRlTW9kZWwgPSBuZXcgQ29sdW1uYUZ1ZW50ZU1vZGVsKCk7XHJcblx0cHVibGljIGFjdHVhbDogbnVtYmVyO1xyXG5cdHB1YmxpYyB0YWJQcmluY2lwYWw6IG51bWJlcjtcclxuXHRwdWJsaWMgYmFzaWNvOiBib29sZWFuO1xyXG5cdHB1YmxpYyBzZWxlY2Npb25HZW5lcmFsOiBib29sZWFuO1xyXG5cdHB1YmxpYyBmb3JhbmVhczogYW55W10gPSBbXTtcclxuXHRwdWJsaWMgZGVzY3JpcGNpb246IHN0cmluZztcclxuXHRwdWJsaWMgcXVlcnk6IHN0cmluZztcclxuXHRwdWJsaWMgcGFnaW5hZG9yOiBGdWVudGVEYXRvTW9kZWxbXSA9IFtdO1xyXG5cdHB1YmxpYyBmaWx0cm86IEZ1ZW50ZURhdG9Nb2RlbCA9IG5ldyBGdWVudGVEYXRvTW9kZWwoKTtcclxuXHRwdWJsaWMgcGFnaW5hdG9yID0ge1xyXG5cdFx0cm93czogMTAsXHJcblx0XHR0b3RhbFJlY29yZHM6IDAsXHJcblx0fTtcclxuXHRwdWJsaWMgY29sdW1ucyA6IGFueVtdID0gW107XHJcbiAgXHRwdWJsaWMgZmlsdGVycyA6IGFueVtdID0gW107XHJcblx0cHVibGljIGxvYWRpbmcgOiBib29sZWFuO1xyXG5cdHB1YmxpYyBtZW51OiBNZW51SXRlbVtdID0gW107XHJcblx0cHVibGljIGl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblx0cHVibGljIG1hcGFNZW5zYWplczogTWFwPG51bWJlcixzdHJpbmc+ID0gbmV3IE1hcDxudW1iZXIsc3RyaW5nPigpO1xyXG5cdEBWaWV3Q2hpbGQoJ3BvcHVwVGFibGFzRnVlbnRlVUknKSBwb3B1cFRhYmxhc0Z1ZW50ZVVJOiBQb3B1cFRhYmxhc0Z1ZW50ZUNvbXBvbmVudDtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBtZW51U2VydmljZTogTWVudVNlcnZpY2UscHJpdmF0ZSBub3RpZmljYXRpb25CdXNTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsIHByaXZhdGUgcmVwb3J0ZXNTdmM6IFJlcG9ydGVzU2VydmljZSwgcHJpdmF0ZSBnZW5lcmFsU3ZjOiBHZW5lcmFsU2VydmljZSwgcHJpdmF0ZSB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSwgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcblx0XHRwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlKSB7IH1cclxuXHJcblx0bmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmxpc3RhQ29sdW1uYXMgPSBbXTtcclxuXHRcdHRoaXMuY2FtcG9zID0gW107XHJcblx0XHR0aGlzLmxpc3RhSm9pbiA9IFtdO1xyXG5cdFx0dGhpcy5jb2x1bW5hcyA9IFtdO1xyXG5cdFx0dGhpcy50YWJsYXNGcm9tID0gW107XHJcblx0XHR0aGlzLmNhbXBvc1NlbGVjY2lvbmFyID0gW107XHJcblx0XHR0aGlzLmpvaW5zRnJvbSA9IFtdO1xyXG5cdFx0dGhpcy5hY3R1YWwgPSAwO1xyXG5cdFx0dGhpcy5tZW51U2VydmljZS5zZXRCcmVhZGNydW1iKFt7IGxhYmVsOiAnRnVlbnRlIFJlcG9ydGUnIH1dKTtcclxuXHRcdHRoaXMuY29sdW1ucyA9IFtcclxuXHRcdCAge1xyXG5cdFx0XHRmaWVsZDogICdkZXNjcmlwY2lvbicsXHJcblx0XHRcdGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2Rlc2NyaXBjaW9uJyksXHJcblx0XHRcdHdpZHRoOiAxMDAsXHJcblx0XHQgIH0sXHJcblx0XHRdO1xyXG5cdFx0dGhpcy5maWx0ZXJzID0gW1xyXG5cdFx0ICB7XHJcblx0XHRcdGZpZWxkOiAnZGVzY3JpcGNpb24nLFxyXG5cdFx0XHRoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdkZXNjcmlwY2lvbicpLFxyXG5cdFx0XHRtYXRjaE1vZGU6ICdjb250YWlucycsXHJcblx0XHQgIH1cclxuXHRcdF07XHJcblx0XHR0aGlzLmluaXRTdGVwKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgbG9hZChldmVudCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0dGhpcy5sb2FkaW5nID10cnVlO1xyXG5cdFx0XHR0aGlzLmNvbG9jYXJGaWx0cm8oKTtcclxuXHRcdFx0dGhpcy5maWx0cm8ucGFnaW5hY2lvblJlZ2lzdHJvSW5pY2lhbCA9IGV2ZW50Py5maXJzdCAhPSBudWxsID8gZXZlbnQ/LmZpcnN0IDogMCxcclxuXHRcdFx0XHR0aGlzLmZpbHRyby5wYWdpbmFjaW9uUmVnaXN0cm9GaW5hbCA9IGV2ZW50Py5yb3dzICE9IG51bGwgPyBldmVudD8ucm93cyA6IDEwLFxyXG5cdFx0XHRcdHRoaXMucGFnaW5hZG9yID0gYXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy5jb25zdWx0YXJGdWVudGVEYXRvKHRoaXMuZmlsdHJvKS50b1Byb21pc2UoKTtcclxuXHRcdFx0dGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gYXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy5jYW50aWRhZEZ1ZW50ZURhdG8odGhpcy5maWx0cm8pLnRvUHJvbWlzZSgpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5sb2FkaW5nID1mYWxzZTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBjb2xvY2FyRmlsdHJvKCkge1xyXG5cdFx0dGhpcy5maWx0cm8ub3JpZ2VuID0gKFwiRlwiKTtcclxuXHRcdHRoaXMuZmlsdHJvLmRlc2NyaXBjaW9uID0gKG51bGwpO1xyXG5cdFx0aWYgKHRoaXMudXRpbHNTZXJ2aWNlLmlzTm90QmxhbmsodGhpcy5kZXNjcmlwY2lvbikpIHtcclxuXHRcdFx0dGhpcy5maWx0cm8uZGVzY3JpcGNpb24gPSAoQ29uc3RhbnRlc0dlbmVyYWxlcy5QT1JDRU5UQUpFICsgdGhpcy5kZXNjcmlwY2lvbiArIENvbnN0YW50ZXNHZW5lcmFsZXMuUE9SQ0VOVEFKRSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHVibGljIGxpbXBpYXJDYW1wb3MoKSB7XHJcblx0XHR0aGlzLmRlc2NyaXBjaW9uID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBzaWd1aWVudGUoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAodGhpcy52YWxpZGFyV2l6YXJkKCkpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5hY3R1YWwgPCAzKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5hY3R1YWwgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmZvcmFuZWFzID0gW107XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnRhYmxhc0Zyb20ubGVuZ3RoID09IDApIHsgLy8gTm8gc2VsZWNjaW9ubyBuaW5ndW5hIHRhYmxhXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiRGViZSBzZWxlY2Npb25hciBhbCBtZW5vcyB1biBvYmpldG8uXCIpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnRhYmxhc0Zyb20ubGVuZ3RoID09IDEpIHsgLy8gU29sbyBzZWxlY2Npb25vIHVuYSwgcG9yIGVzbyBubyBoYXkgcXVlIGdlbmVyYXIgam9pbnMuXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5hY3R1YWwrKztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgbm9tYnJlc1RhYmxhcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IHRhYmxhIG9mIHRoaXMudGFibGFzRnJvbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFub21icmVzVGFibGFzLmluY2x1ZGVzKHRhYmxhLnRhYmxhKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRub21icmVzVGFibGFzLnB1c2godGFibGEudGFibGEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZvcmFuZWFzID0gW107XHJcblx0XHRcdFx0XHRcdFx0Ly9MaXN0PExsYXZlRm9yYW5lYT4gXHJcblx0XHRcdFx0XHRcdFx0bGV0IGxsYXZlczogTGxhdmVGb3JhbmVhTW9kZWxbXSA9IGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuZ2V0TGxhdmVzKG5vbWJyZXNUYWJsYXMpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJsYXNGcm9tLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMudGFibGFzRnJvbS5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JhbmVhIG9mIGxsYXZlcykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmb3JhbmVhLnRhYmxhMSA9PSAodGhpcy50YWJsYXNGcm9tW2ldLnRhYmxhKSAmJiBmb3JhbmVhLnRhYmxhMiA9PSAodGhpcy50YWJsYXNGcm9tW2pdLnRhYmxhKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG51ZXZvOiBGb3JlaW5nV3JhcGVyTW9kZWwgPSBuZXcgRm9yZWluZ1dyYXBlck1vZGVsKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWV2by5hbGlhczEgPSAodGhpcy50YWJsYXNGcm9tW2ldLmFsaWFzKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51ZXZvLmFsaWFzMiA9ICh0aGlzLnRhYmxhc0Zyb21bal0uYWxpYXMpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVldm8ubGxhdmUgPSAoZm9yYW5lYSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmZvcmFuZWFzLnB1c2gobnVldm8pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIENhcmdvIGxhcyBjb2x1bW5hcyBwYXJhIGxvcyBzaWd1aWVudGVzIHByb2Nlc29zLlxyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5jb2x1bW5hcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxpc3RhQ29sdW1uYXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0dGhpcy5jYW1wb3NTZWxlY2Npb25hciA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJvbSBvZiB0aGlzLnRhYmxhc0Zyb20pIHtcclxuXHRcdFx0XHRcdFx0XHQvL1JlcG9ydGVDb2x1bW5hRFRPIFxyXG5cdFx0XHRcdFx0XHRcdGxldCB0YSA9IG5ldyBSZXBvcnRlQ29sdW1uYU1vZGVsKCk7XHJcblx0XHRcdFx0XHRcdFx0dGEucmVwb3J0ZUZ1ZW50ZSA9IChmcm9tLnRhYmxhKTtcclxuXHRcdFx0XHRcdFx0XHQvL0xpc3Q8UmVwb3J0ZUNvbHVtbmFEVE8+IFxyXG5cdFx0XHRcdFx0XHRcdGxldCBudWV2YXM6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhbFN2Yy5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCAnUmVwb3J0ZXMuY29uc3VsdGFyQ29sdW1uYXMnLCBmYWxzZSwgdGEpKS50b1Byb21pc2UoKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmNhcmdhckxpc3Rhc0NvbHVtbmFzKG51ZXZhcywgZnJvbS5hbGlhcyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLmFjdHVhbCsrO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnRlcm1pbmFyUGFzb3MoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgY2FyZ2FyTGlzdGFzQ29sdW1uYXMobnVldmFzOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10sIGFsaWFzOiBzdHJpbmcpIHtcclxuXHRcdGZvciAobGV0IGNvbCBvZiBudWV2YXMpIHtcclxuXHRcdFx0Y29sLnJlcG9ydGVGdWVudGUgPSAoYWxpYXMpO1xyXG5cdFx0XHR0aGlzLmNvbHVtbmFzLnB1c2goY29sKTtcclxuXHRcdFx0dGhpcy5saXN0YUNvbHVtbmFzLnB1c2goeyB2YWx1ZTogY29sLnJlcG9ydGVGdWVudGUgKyAnLicgKyBjb2wubm9tYnJlLCBsYWJlbDogY29sLnJlcG9ydGVGdWVudGUgKyAnLicgKyBjb2wubm9tYnJlIH0pO1xyXG5cdFx0XHRsZXQgY2FtcG8gPSBuZXcgQ29sdW1uYVdyYXBlck1vZGVsKCk7XHJcblx0XHRcdGNhbXBvLmNvbHVtbmEgPSBjb2w7XHJcblx0XHRcdGNhbXBvLmFsaWFzID0gY29sLm5vbWJyZTtcclxuXHRcdFx0dGhpcy5jYW1wb3NTZWxlY2Npb25hci5wdXNoKGNhbXBvKTtcclxuXHRcdH1cclxuXHRcdGNvbnNvbGUubG9nKCdjYW1wb3NTZWxlY2Npb25hcicsdGhpcy5jYW1wb3NTZWxlY2Npb25hcik7XHJcblx0XHRcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyB0ZXJtaW5hclBhc29zKCkge1xyXG5cdFx0bGV0IGNhbXBvc1NxbCA9IFwiXCI7XHJcblx0XHRsZXQgaSA9IDA7XHJcblx0XHRmb3IgKGxldCBjb2wgb2YgdGhpcy5jYW1wb3NTZWxlY2Npb25hcikge1xyXG5cdFx0XHRpZiAoY29sLnNlbGVjY2lvbmFkbykge1xyXG5cdFx0XHRcdGNhbXBvc1NxbCArPSAoaSA9PSAwID8gXCJcIiA6IFwiLFwiKSArIGNvbC5jb2x1bW5hLm5vbWJyZSArIFwiIGFzIFwiICsgY29sLmFsaWFzO1xyXG5cdFx0XHRcdGkrKztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZnVlbnRlLndoZXJlSm9pbiA9ICh0aGlzLmdlbmVyYXJTcWxKb2luKCkpO1xyXG5cdFx0dGhpcy5mdWVudGUuZnJvbVNxbCA9ICh0aGlzLmdlbmVyYXJTcWxGcm9tKCkpO1xyXG5cdFx0bGV0IHdoZXJlID0gXCJcIjtcclxuXHRcdGxldCBlc3RhQmxhbmNvV2hlcmVKb2luOiBib29sZWFuID0gdGhpcy5mdWVudGUud2hlcmVKb2luID09IG51bGwgfHwgXCJcIiA9PSAodGhpcy5mdWVudGUud2hlcmVKb2luKTtcclxuXHRcdGxldCBlc3RhQmxhbmNvV2hlcmVBZGljaW9uYWw6IGJvb2xlYW4gPSB0aGlzLmZ1ZW50ZS53aGVyZUFkaWNpb25hbCA9PSBudWxsIHx8IFwiXCIgPT0gKHRoaXMuZnVlbnRlLndoZXJlQWRpY2lvbmFsKTtcclxuXHRcdGlmICghZXN0YUJsYW5jb1doZXJlSm9pbiB8fCAhZXN0YUJsYW5jb1doZXJlQWRpY2lvbmFsKSB7XHJcblx0XHRcdHdoZXJlID0gXCIgXFxuV0hFUkUgXCI7XHJcblx0XHRcdGlmICghZXN0YUJsYW5jb1doZXJlSm9pbiAmJiAhZXN0YUJsYW5jb1doZXJlQWRpY2lvbmFsKSB7XHJcblx0XHRcdFx0d2hlcmUgKz0gdGhpcy5mdWVudGUud2hlcmVKb2luICsgXCIgQU5EIFxcbihcIiArIHRoaXMuZnVlbnRlLndoZXJlQWRpY2lvbmFsICsgXCIpXCI7XHJcblx0XHRcdH0gZWxzZSBpZiAoIWVzdGFCbGFuY29XaGVyZUpvaW4pIHtcclxuXHRcdFx0XHR3aGVyZSArPSB0aGlzLmZ1ZW50ZS53aGVyZUpvaW47XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0d2hlcmUgKz0gdGhpcy5mdWVudGUud2hlcmVBZGljaW9uYWw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGNvbnNvbGUubG9nKCd3aGVyZScsd2hlcmUpO1xyXG5cdFx0XHJcblx0XHR0cnkge1xyXG5cdFx0XHRsZXQgc3FsID0gXCJTRUxFQ1QgXFxuXCIgKyBjYW1wb3NTcWwgKyBcIiBcXG5GUk9NIFxcblwiICsgdGhpcy5mdWVudGUuZnJvbVNxbCArIHdoZXJlO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLnZhbGlkYXJRdWVyeShzcWwpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHR0aGlzLmZ1ZW50ZS5xdWVyeSA9IChzcWwpO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5ID0gc3FsO1xyXG5cdFx0XHR0aGlzLnRhYlByaW5jaXBhbCA9IDA7XHJcblx0XHRcdHRoaXMuY29uc3RydWlyQ29sdW1uYXMoKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBhZGljaW9uYXJGb3JhbmVhKGV2ZW50bykge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Ly9Gb3JlaW5nV3JhcGVyIFxyXG5cdFx0XHRsZXQgZm9yYW5lYTogRm9yZWluZ1dyYXBlck1vZGVsID0gZXZlbnRvLmRhdGE7XHJcblx0XHRcdGZvciAobGV0IHJlbCBvZiBmb3JhbmVhLmxsYXZlLnJlbGFjaW9uZXMpIHtcclxuXHRcdFx0XHRsZXQgcGFyID0gcmVsLnNwbGl0KFwiOlwiKTtcclxuXHRcdFx0XHRsZXQgam9pbiA9IG5ldyBKb2luRnJvbU1vZGVsKCk7XHJcblx0XHRcdFx0am9pbi5jb2x1bW5hMSA9IChmb3JhbmVhLmFsaWFzMSArIFwiLlwiICsgcGFyWzBdKTtcclxuXHRcdFx0XHRqb2luLmNvbHVtbmEyID0gKGZvcmFuZWEuYWxpYXMyICsgXCIuXCIgKyBwYXJbMV0pO1xyXG5cdFx0XHRcdHRoaXMuam9pbnNGcm9tLnB1c2goam9pbik7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBlbGltaW5hcigpIHtcclxuXHRcdHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuXHRcdFx0dGFyZ2V0OiBldmVudC50YXJnZXQsXHJcblx0XHRcdG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdtZW5zYWplX2FsZXJ0YScpLFxyXG5cdFx0XHRpY29uOiAnY29uZmlybWFyJyxcclxuXHRcdFx0YWNjZXB0OiAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5zZXRSZXNwdWVzdGEodHJ1ZSlcclxuXHRcdFx0fSxcclxuXHRcdFx0cmVqZWN0OiAoKSA9PiB7XHJcblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBzZXRSZXNwdWVzdGEocmVzcHVlc3RhOiBib29sZWFuKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAocmVzcHVlc3RhKSB7XHJcblx0XHRcdFx0dGhpcy5yZXBvcnRlc1N2Yy5lbGltaW5hckZ1ZW50ZURhdG9zQ29uSGlqb3ModGhpcy5mdWVudGUpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHRcdHRoaXMuZnVlbnRlID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJMYSBmdWVudGUgaGEgc2lkbyBlbGltaW5hZGEuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYW50ZXJpb3IoKSB7XHJcblx0XHRpZiAodGhpcy5hY3R1YWwgPiAwKVxyXG5cdFx0XHR0aGlzLmFjdHVhbC0tO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIHZhbGlkYXJRdWVyeSgpIHtcclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRpZiAodGhpcy51dGlsc1NlcnZpY2UudmFsaWRhclRleHRvU1FMKHRoaXMucXVlcnksIHRydWUsIHRydWUsIDgwMDAsIHRydWUpKSB7XHJcblx0XHRcdFx0dGhpcy5yZXBvcnRlc1N2Yy52YWxpZGFyUXVlcnkodGhpcy5xdWVyeSk7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiRWwgcXVlcnkgZXN0YSBjb3JyZWN0by5cIik7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Ly9WYWxpZGFkb3IuYWRpY2lvbmFyTWVuc2FqZShcImZ1ZW50ZUZvcm06dGFiOnF1ZXJ5XCIsIGUuZ2V0TWVzc2FnZSgpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhZGljaW9uYXJKb2luKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKHRoaXMuY29sMSAhPSBudWxsICYmIHRoaXMuY29sMiAhPSBudWxsKSB7XHJcblx0XHRcdFx0Ly8gVE9ETzogRmFsdGEgdmFsaWRhciBlbCB0aXBvXHJcblx0XHRcdFx0bGV0IG51ZXZvID0gbmV3IEpvaW5Gcm9tTW9kZWwoKTtcclxuXHRcdFx0XHRudWV2by5jb2x1bW5hMSA9ICh0aGlzLmNvbDEpO1xyXG5cdFx0XHRcdG51ZXZvLmNvbHVtbmEyID0gKHRoaXMuY29sMik7XHJcblx0XHRcdFx0dGhpcy5qb2luc0Zyb20ucHVzaChudWV2byk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRGViZSBzZWxlY2Npb25hciBkb3MgY2FtcG9zXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZWxpbWluYXJKb2luKGFlKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvL2xldCAgam9pbiA9IChKb2luRnJvbSkgKChVSVBhcmFtZXRlcikgYWUuZ2V0Q29tcG9uZW50KCkuZmluZENvbXBvbmVudChcImpvaW5cIikpLmdldFZhbHVlKCk7XHJcblx0XHRcdHRoaXMuam9pbnNGcm9tLmZpbHRlcigoZGF0YSkgPT4gZGF0YSA9PT0gYWUuZGF0YSk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZWxpbWluYXJUYWJsYShhZSkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Ly9UYWJsYUZyb20gdGFibGEgPSAoVGFibGFGcm9tKSAoKFVJUGFyYW1ldGVyKSBhZS5nZXRDb21wb25lbnQoKS5maW5kQ29tcG9uZW50KFwidGFibGFcIikpLmdldFZhbHVlKCk7XHJcblx0XHRcdHRoaXMudGFibGFzRnJvbS5maWx0ZXIoKGRhdGEpID0+IGRhdGEgPT09IGFlKTtcclxuXHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRmFsdGEgZWxpbWluYXIgbGFzIGNvbHVtbmFzIGRlIGxhIHRhYmxhID8/P1wiKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBidXNjYXJUYWJsYSgpIHtcclxuXHRcdHRoaXMucG9wdXBUYWJsYXNGdWVudGVVSS5idXNjYXJUYWJsYShcImZ1ZW50ZVVJLnRhYmxhU2VsZWNjaW9uYWRhXCIpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHNldFRhYmxhU2VsZWNjaW9uYWRhKHRhYmxhU2VsZWNjaW9uYWRhOiBzdHJpbmcpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGxldCB0YWJsYXMgPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgdGFibGEgb2YgdGhpcy50YWJsYXNGcm9tKSB7XHJcblx0XHRcdFx0aWYgKCF0YWJsYXMuaW5jbHVkZXModGFibGEudGFibGEpKSB7XHJcblx0XHRcdFx0XHR0YWJsYXMucHVzaCh0YWJsYS50YWJsYSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuY2FyZ2FyVGFibGFFbkxpc3RhKHRhYmxhU2VsZWNjaW9uYWRhKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2FyZ2FyVGFibGFFbkxpc3RhKHRhYmxhOiBzdHJpbmcpIHtcclxuXHRcdGxldCBwYXIgPSB0YWJsYS5zcGxpdChcIl9cIik7XHJcblx0XHRsZXQgYWxpYXMgPSBwYXJbMF07XHJcblx0XHRsZXQgaSA9IDE7XHJcblx0XHRsZXQgdGFibGFUZW1wID0gbmV3IFRhYmxhRnJvbU1vZGVsKClcclxuXHRcdHRhYmxhVGVtcC5hbGlhcyA9IGFsaWFzO1xyXG5cdFx0d2hpbGUgKHRoaXMudGFibGFzRnJvbS5pbmNsdWRlcyh0YWJsYVRlbXApKSB7XHJcblx0XHRcdGFsaWFzID0gdGFibGEgKyAoaSsrKTtcclxuXHRcdH1cclxuXHRcdGxldCB0ZW0gPSBuZXcgVGFibGFGcm9tTW9kZWwoKTtcclxuXHRcdHRlbS50YWJsYSA9IHRhYmxhO1xyXG5cdFx0dGVtLmFsaWFzID0gYWxpYXM7XHJcblx0XHR0aGlzLnRhYmxhc0Zyb20ucHVzaCh0ZW0pO1xyXG5cdFx0cmV0dXJuIGFsaWFzO1xyXG5cdH1cclxuXHJcblxyXG5cclxuXHRwdWJsaWMgY2FtYmlvSm9pbihjZSkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0dGhpcy5saXN0YUpvaW4gPSBbXTtcclxuXHRcdFx0bGV0IG51ZXZvID0gY2UudmFsdWU7XHJcblx0XHRcdGlmIChudWV2byAhPSBudWxsKSB7XHJcblx0XHRcdFx0Ly9SZXBvcnRlQ29sdW1uYURUTyBcclxuXHRcdFx0XHRsZXQgYWN0OiBSZXBvcnRlQ29sdW1uYU1vZGVsID0gbnVsbDtcclxuXHRcdFx0XHRmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5hcykge1xyXG5cdFx0XHRcdFx0aWYgKG51ZXZvLmVxdWFscyhjb2wucmVwb3J0ZUZ1ZW50ZSArIFwiLlwiICsgY29sLm5vbWJyZSkpIHtcclxuXHRcdFx0XHRcdFx0YWN0ID0gY29sO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY29sdW1uYXMpIHtcclxuXHRcdFx0XHRcdGlmICghY29sLnJlcG9ydGVGdWVudGUuc3RhcnRzV2l0aChhY3QucmVwb3J0ZUZ1ZW50ZSkgJiYgY29sLnRpcG9EYXRvID09IChhY3QudGlwb0RhdG8pICYmIGNvbC5vcmRlbiA9PSAoYWN0Lm9yZGVuKSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgdmFsID0gY29sLnJlcG9ydGVGdWVudGUgKyBcIi5cIiArIGNvbC5ub21icmU7XHJcblx0XHRcdFx0XHRcdHRoaXMubGlzdGFKb2luLnB1c2goeyB2YWx1ZTogdmFsLCBrZXk6IHZhbCB9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBlZGl0YXJDYW1wbyhldmVudG8pIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGxldCBjb2w6IENvbHVtbmFGdWVudGVNb2RlbCA9IGV2ZW50by5kYXRhO1xyXG5cdFx0XHR0aGlzLmNhbXBvRm9ybXVsYSA9IGNvbDtcclxuXHRcdFx0bGV0IHZhcnMgPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgY2FtcG8gb2YgdGhpcy5jYW1wb3MpIHtcclxuXHRcdFx0XHRsZXQgdmFyMTogYW55O1xyXG5cdFx0XHRcdHZhcjEubm9tYnJlID0gKGNhbXBvLm5vbWJyZSk7XHJcblx0XHRcdFx0dmFyMS50aXBvID0gKGNhbXBvLnRpcG9EYXRvKTtcclxuXHRcdFx0XHR2YXJzLnB1c2godmFyMSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9nZXRCZWFuKEVkaXRvckZvcm11bGFVSS5jbGFzcykuZWRpdGFyKGNvbC5nZXRTaW50YXhpcygpLCBcImZ1ZW50ZVVJLmZvcm11bGFcIiwgdmFycyk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZWRpdGFyV2hlcmUoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRsZXQgdmFycyA9IFtdO1xyXG5cdFx0XHRmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5hcykge1xyXG5cdFx0XHRcdC8vVmFyaWFibGVGb3JtdWxhIFxyXG5cdFx0XHRcdGxldCB2YXIxO1xyXG5cdFx0XHRcdHZhcjEubm9tYnJlID0gKGNvbC5yZXBvcnRlRnVlbnRlICsgXCIuXCIgKyBjb2wubm9tYnJlKTtcclxuXHRcdFx0XHR2YXIxLnRpcG8oY29sLnRpcG9EYXRvKTtcclxuXHRcdFx0XHR2YXJzLnB1c2godmFyMSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9nZXRCZWFuKEVkaXRvckZvcm11bGFVSS5jbGFzcykuZWRpdGFyKGZ1ZW50ZS5nZXRXaGVyZUFkaWNpb25hbCgpLCBcImZ1ZW50ZVVJLmZ1ZW50ZS53aGVyZUFkaWNpb25hbFwiLCB2YXJzKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXRGb3JtdWxhKGZvcm11bGEpIHtcclxuXHRcdGlmICh0aGlzLmNhbXBvRm9ybXVsYSAhPSBudWxsKSB7XHJcblx0XHRcdHRoaXMuY2FtcG9Gb3JtdWxhLnNpbnRheGlzID0gKGZvcm11bGEpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jYW1wb0Zvcm11bGEgPSBudWxsO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFkaWNpb25hckNvbHVtbmFzKCkge1xyXG5cdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIpIHtcclxuXHRcdFx0Y29sLnNlbGVjY2lvbmFkbyA9IChmYWxzZSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLm1vc3RyYXJTZWxlY2Npb25hciA9IHRydWU7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYWdyZWdhclNlbGVjY2lvbmFkb3MoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRmb3IgKGxldCBjb2wgb2YgdGhpcy5jYW1wb3NTZWxlY2Npb25hcikge1xyXG5cdFx0XHRcdGlmIChjb2wuc2VsZWNjaW9uYWRvKSB7XHJcblx0XHRcdFx0XHQvL0NvbHVtbmFGdWVudGVEVE8gXHJcblx0XHRcdFx0XHRsZXQgY2FtcG8gPSBuZXcgQ29sdW1uYUZ1ZW50ZU1vZGVsKCk7XHJcblx0XHRcdFx0XHRjYW1wby5mdWVudGVEYXRvID0gKHRoaXMuZnVlbnRlLmxsYXZlKTtcclxuXHRcdFx0XHRcdGNhbXBvLm5vbWJyZSA9IChjb2wuY29sdW1uYS5ub21icmUpO1xyXG5cdFx0XHRcdFx0Y2FtcG8uc2ludGF4aXMgPSAoY29sLmNvbHVtbmEubm9tYnJlKTtcclxuXHRcdFx0XHRcdHRoaXMuY2FtcG9zLnB1c2goY2FtcG8pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLm9jdWx0YXJTZWxlY2Npb25hcigpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIG9jdWx0YXJTZWxlY2Npb25hcigpIHtcclxuXHRcdHRoaXMubW9zdHJhclNlbGVjY2lvbmFyID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgdmVyRGV0YWxsZShldmVudG8pIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMudmlzdGFWaXN1YWxpemFyID0gJ21hbnRlbmltaWVudG8nO1xyXG5cdFx0XHRsZXQgZnVlbnRlRGF0b0RUTyA9IGV2ZW50bztcclxuXHRcdFx0dGhpcy5mdWVudGUgPSBuZXcgRnVlbnRlRGF0b01vZGVsKCk7XHJcblx0XHRcdHRoaXMuZnVlbnRlLmxsYXZlID0gKGZ1ZW50ZURhdG9EVE8ubGxhdmUpO1xyXG5cdFx0XHR0aGlzLmZ1ZW50ZSA9IGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuY29uc3VsdGFyVW5pY2FGdWVudGVEYXRvKHRoaXMuZnVlbnRlKS50b1Byb21pc2UoKTtcclxuXHRcdFx0aWYgKHRoaXMuZnVlbnRlLnF1ZXJ5MiAhPSBudWxsKSB7XHJcblx0XHRcdFx0dGhpcy5xdWVyeSA9IHRoaXMuZnVlbnRlLnF1ZXJ5ICsgdGhpcy5mdWVudGUucXVlcnkyO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMucXVlcnkgPSB0aGlzLmZ1ZW50ZS5xdWVyeTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvL0NvbHVtbmFGdWVudGVEVE8gXHJcblx0XHRcdGxldCBjb2wgPSBuZXcgQ29sdW1uYUZ1ZW50ZU1vZGVsKCk7XHJcblx0XHRcdGNvbC5mdWVudGVEYXRvID0gKHRoaXMuZnVlbnRlLmxsYXZlKTtcclxuXHRcdFx0dGhpcy5jYW1wb3MgPSBhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmNvbnN1bHRhckNvbHVtbmFzRnVlbnRlKGNvbCkudG9Qcm9taXNlKCk7XHJcblx0XHRcdHRoaXMuYWN0dWFsID0gMDtcclxuXHRcdFx0dGhpcy5tZW51U2VydmljZS5zZXRCcmVhZGNydW1iKFt7IGxhYmVsOiAnRnVlbnRlIFJlcG9ydGUnLCB9LCB7bGFiZWw6ICdNYW50ZW5pbWllbnRvIEZ1ZW50ZSd9XSk7XHJcblx0XHRcdHRoaXMuY2FyZ2FzT3BjaW9uZXMoKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBudWV2bygpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMudmlzdGFWaXN1YWxpemFyID0gJ21hbnRlbmltaWVudG8nO1xyXG5cdFx0XHR0aGlzLmZ1ZW50ZSA9IG5ldyBGdWVudGVEYXRvTW9kZWwoKTtcclxuXHRcdFx0dGhpcy5mdWVudGUub3JpZ2VuID0gKFwiRlwiKTtcclxuXHRcdFx0dGhpcy5jYW1wb3MgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5ID0gbnVsbDtcclxuXHRcdFx0dGhpcy50YWJQcmluY2lwYWwgPSAwO1xyXG5cdFx0XHR0aGlzLmFjdHVhbCA9IDA7XHJcblx0XHRcdHRoaXMubWVudVNlcnZpY2Uuc2V0QnJlYWRjcnVtYihbeyBsYWJlbDogJ0Z1ZW50ZSBSZXBvcnRlJywgfSwge2xhYmVsOiAnTWFudGVuaW1pZW50byBGdWVudGUnfV0pO1xyXG5cdFx0XHR0aGlzLmNhcmdhc09wY2lvbmVzKCk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYXJnYXNPcGNpb25lcygpe1xyXG5cdFx0dGhpcy5tZW51PSBbe2xhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlua19lbGltaW5hcicpLCBpY29uOiAnZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpbicsIHZpc2libGU6IHRoaXMuZnVlbnRlLmxsYXZlICE9IG51bGwsIGNvbW1hbmQ6IChldmVudCkgPT4ge3RoaXMuZWxpbWluYXIoKX19LFxyXG5cdFx0e2xhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlua192YWxpZGFyJyksIGljb246ICdnbHlwaGljb25zIGdseXBoaWNvbnMtcHJpbnQnLCBjb21tYW5kOiAoZXZlbnQpID0+IHt0aGlzLnZhbGlkYXJRdWVyeSgpfX0sXHJcblx0XHR7bGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaW5rX2dlbmVyYXInKSwgaWNvbjogJ2dseXBoaWNvbnMgZ2x5cGhpY29ucy1iZWxsJyx2aXNpYmxlOiB0aGlzLmZ1ZW50ZS5sbGF2ZSAhPSBudWxsLCBjb21tYW5kOiAoZXZlbnQpID0+IHt0aGlzLmNvbnN0cnVpckNvbHVtbmFzKCl9fSxcclxuXHRcdF1cclxuXHR9XHJcblxyXG5cdHJlZ3Jlc2FyKCl7XHJcblx0XHR0aGlzLnZpc3RhVmlzdWFsaXphciA9IG51bGw7XHJcblx0XHR0aGlzLm5nT25Jbml0KCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHZhbGlkYXIoKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgcmVzID0gdHJ1ZTtcclxuXHRcdHJlcyA9IHJlcyAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmZ1ZW50ZS5kZXNjcmlwY2lvbik7XHJcblx0XHRyZXMgPSByZXMgJiYgKHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJUZXh0b1NRTCh0aGlzLnF1ZXJ5LCB0cnVlLCB0cnVlLCA4MDAwLCB0cnVlKSA9PSBudWxsKTtcclxuXHRcdHJldHVybiByZXM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWdpc3RyYS9hY3R1YWxpemEgbGEgaW5mb3JtYWNpb24gZ2VuZXJhbCBkZSBsYSBmdWVudGUgZGUgZGF0b3NcclxuXHQgKi9cclxuXHRwdWJsaWMgYXN5bmMgZ3VhcmRhcigpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmICh0aGlzLnZhbGlkYXIoKSkge1xyXG5cdFx0XHRcdGlmICh0aGlzLnF1ZXJ5Lmxlbmd0aCA+IDQwMDApIHtcclxuXHRcdFx0XHRcdHRoaXMuZnVlbnRlLnF1ZXJ5ID0gKHRoaXMucXVlcnkuc3Vic3RyaW5nKDAsIDM5OTkpKTtcclxuXHRcdFx0XHRcdHRoaXMuZnVlbnRlLnF1ZXJ5MiA9ICh0aGlzLnF1ZXJ5LnN1YnN0cmluZygzOTk5LCB0aGlzLnF1ZXJ5Lmxlbmd0aCkpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLmZ1ZW50ZS5xdWVyeSA9ICh0aGlzLnF1ZXJ5KTtcclxuXHRcdFx0XHRcdHRoaXMuZnVlbnRlLnF1ZXJ5MiA9IChudWxsKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmZ1ZW50ZS5sbGF2ZSA9PSBudWxsKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZ1ZW50ZS5sbGF2ZSA9ICh0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKSk7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmluc2VydGFyRnVlbnRlRGF0byh0aGlzLmZ1ZW50ZSkudG9Qcm9taXNlKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuYWN0dWFsaXphckZ1ZW50ZURhdG8odGhpcy5mdWVudGUpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJMb3MgY2FtYmlvcyBoYW4gc2lkbyBndWFyZGFkb3NcIik7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9Ly9ndWFyZGFyXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdHJhL2FjdHVhbGl6YSBsYXMgY29sdW1uYXMgZ2VuZXJhZG9zIHBhcmEgbGEgZnVlbnRlIGRlIGRhdG9zIGNvbW8gcmVnaXN0cm9zIGRlIHRpcG8gJ0NvbHVtbmFGdWVudGUnXHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGd1YXJkYXJDYW1wb3MoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAodGhpcy5mdWVudGUubGxhdmUgPT0gbnVsbCkge1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIlBvciBmYXZvciBkaWxpZ2VuY2llIHByaW1lcm8gbG9zIGRhdG9zIGRlIGxhIGZ1ZW50ZVwiKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMudmFsaWRhckNhbXBvcygpKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy5hY3R1YWxpemFyQ29sdW1uYXNGdWVudGUodGhpcy5mdWVudGUsIHRoaXMuY2FtcG9zKS50b1Byb21pc2UoKTtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJTZSBoYW4gZ3VhcmRhZG8gbG9zIGNhbXBvc1wiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH0vL2d1YXJkYXJDYW1wb3NcclxuXHJcblx0LyoqXHJcblx0ICogVmVyaWZpY2EgcXVlIGxvcyB2YWxvcmVzIGFzb2NpYWRvcyBhIGxvcyBjYW1wb3MgcGFyYSBsYSBjcmVhY2lvbiBkZSBsYXMgY29sdW1uYXMgZGUgbGEgZnVlbnRlIHNlYW4gdsOhbGlkb3NcclxuXHQgKiBAcmV0dXJuIGZhbHNlIGVuIGNhc28gZGUgcXVlIGxvcyB2YWxvcmVzIGFzaWduYWRvcyBhIGxvcyBjYW1wb3Mgc2VhbiBudWxvcyBvIG5vIHNlYW4gcGFsYWJyYXMgdsOhbGlkYXMgZGUgYWN1ZXJkbyBcclxuXHQgKiBjb24gbGFzIGNvbmRpY2lvbmVzIGRhZGFzIHBvciBWYWxpZGFkb3JVdGlsLnZhbGlkYXJQYWxhYnJhKCkpLFxyXG5cdCAqIGVuIGNhc28gY29udHJhcmlvIHJldG9ybmEgdHJ1ZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgdmFsaWRhckNhbXBvcygpIHtcclxuXHRcdGZvciAobGV0IGNvbCBvZiB0aGlzLmNhbXBvcykge1xyXG5cdFx0XHRpZiAoY29sLm5vbWJyZSA9PSBudWxsIHx8ICF0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyUGFsYWJyYShjb2wubm9tYnJlKSkge1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIk5vbWJyZSBubyB2YWxpZG8gKFwiICsgY29sLm5vbWJyZSArIFwiKVwiKTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnV5ZSBsYXMgY29sdW1uYXMgZGUgbGEgZnVlbnRlIGRlIGRhdG9zLCBjb24gYmFzZSBlbiBsb3MgY2FtcG9zIG9idGVuaWRvcyBcclxuXHQgKiBkZSBsYSBjb25zdWx0YSBTUUwgYXNvY2lhZGFcclxuXHQgKi9cclxuXHRwdWJsaWMgYXN5bmMgY29uc3RydWlyQ29sdW1uYXMoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLmNhbXBvcyA9IGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuZ2V0Q29sdW1uYXNTcWwodGhpcy5xdWVyeSkudG9Qcm9taXNlKCk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fS8vY29uc3RydWlyQ29sdW1uYXNcclxuXHJcblxyXG5cclxuXHRwcml2YXRlIHZhbGlkYXJXaXphcmQoKSB7XHJcblx0XHRsZXQgYWxpYXM6IHN0cmluZ1tdID0gW107XHJcblx0XHRmb3IgKGxldCB0YWJsYSBvZiB0aGlzLnRhYmxhc0Zyb20pIHtcclxuXHRcdFx0aWYgKGFsaWFzLmluY2x1ZGVzKHRhYmxhLmFsaWFzKSkge1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIk5vIHNlIHB1ZWRlIHJlcGV0aXIgZWwgYWxpYXMgZGUgbGFzIHRhYmxhcy5cIik7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFsaWFzLnB1c2godGFibGEuYWxpYXMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRhbGlhcyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIpIHtcclxuXHRcdFx0aWYgKGNvbC5zZWxlY2Npb25hZG8pIHtcclxuXHRcdFx0XHRpZiAoYWxpYXMuaW5jbHVkZXMoY29sLmFsaWFzKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiTm8gc2UgcHVlZGUgcmVwZXRpciBlbCBhbGlhcyBkZSBsYXMgY29sdW1uYXMuXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhbGlhcy5wdXNoKGNvbC5hbGlhcyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdlbmVyYXJTcWxGcm9tKCkge1xyXG5cdFx0bGV0IHJlcyA9IFwiXCI7XHJcblx0XHRsZXQgaSA9IDA7XHJcblx0XHRmb3IgKGxldCB0YWJsYSBvZiB0aGlzLnRhYmxhc0Zyb20pIHtcclxuXHRcdFx0cmVzICs9IChpID09IDAgPyBcIlwiIDogXCIsXCIpICsgdGFibGEudGFibGEgKyBcIiBcIiArIHRhYmxhLmFsaWFzO1xyXG5cdFx0XHRpKys7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZW5lcmFyU3FsSm9pbigpIHtcclxuXHRcdGxldCByZXMgPSBcIlwiO1xyXG5cdFx0bGV0IGkgPSAwO1xyXG5cdFx0Zm9yIChsZXQgam9pbiBvZiB0aGlzLmpvaW5zRnJvbSkge1xyXG5cdFx0XHRyZXMgKz0gKGkgPT0gMCA/IFwiXCIgOiBcIiBBTkQgXCIpICsgam9pbi5jb2x1bW5hMSArIFwiID0gXCIgKyBqb2luLmNvbHVtbmEyO1xyXG5cdFx0XHRpKys7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzO1xyXG5cdH1cclxuXHJcblx0Ly9JTVBMRU1FTlRBQ0lPTiBTVEVQRVJcclxuXHRpbml0U3RlcCgpe1xyXG5cdFx0dGhpcy5tYXBhTWVuc2FqZXMuc2V0KDAsJ1NlbGVjY2lvbmUgbGFzIHRhYmxhcyBvIHZpc3RhcyBkZSBkb25kZSBkZXNlYSBvYnRlbmVyIGxhIGluZm9ybWFjaW9uLicpXHJcblx0XHR0aGlzLm1hcGFNZW5zYWplcy5zZXQoMSwnSW5kaXF1ZSBkZSBxdWUgbWFuZXJhIHNlIHJlbGFjY2lvbmFuIGxvcyBvYmpldG9zIGVudHJlIHNpLicpXHJcblx0XHR0aGlzLm1hcGFNZW5zYWplcy5zZXQoMiwnSW5kaXF1ZSBsb3MgZmlsdHJvcyBhZGljaW9uYWxlcyBxdWUgZGVzZWUgcmVhbGl6YXIgc29icmUgbGEgaW5mb3JtYWNpb24uJylcclxuXHRcdHRoaXMubWFwYU1lbnNhamVzLnNldCgzLCdDYW1wb3MnKVxyXG5cdFx0dGhpcy5pdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdmcm9tJyksXHJcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rOiAncGVyc29uYWwnLFxyXG5cdFx0XHRcdHRpdGxlOidTZWxlY2Npb25lIGxhcyB0YWJsYXMgbyB2aXN0YXMgZGUgZG9uZGUgZGVzZWEgb2J0ZW5lciBsYSBpbmZvcm1hY2lvbi4nXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnam9pbicpLFxyXG5cdFx0XHRcdHJvdXRlckxpbms6ICdwZXJzb25hbCcsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luZGlxdWUgZGUgcXVlIG1hbmVyYSBzZSByZWxhY2Npb25hbiBsb3Mgb2JqZXRvcyBlbnRyZSBzaS4nXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnd2hlcmUnKSxcclxuXHRcdFx0XHRyb3V0ZXJMaW5rOiAncGVyc29uYWwnLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmRpcXVlIGxvcyBmaWx0cm9zIGFkaWNpb25hbGVzIHF1ZSBkZXNlZSByZWFsaXphciBzb2JyZSBsYSBpbmZvcm1hY2lvbi4nXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY2FtcG9zJyksXHJcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rOiAnY29uZmlybWF0aW9uJyxcclxuXHRcdFx0XHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcblx0fVxyXG5cclxuXHRhY3R1YWxpemFyU2VsZWNjaW9uKGJvb2xlYW5vZ2VuZXJhbDogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy5jYW1wb3NTZWxlY2Npb25hci5mb3JFYWNoKChlbGVtZW50bykgPT4ge1xyXG5cdFx0XHRlbGVtZW50by5zZWxlY2Npb25hZG8gPSBib29sZWFub2dlbmVyYWw7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHRvZG9zU2VsZWNjaW9uYWRvcygpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmNhbXBvc1NlbGVjY2lvbmFyLmV2ZXJ5KGVsZW1lbnRvID0+IGVsZW1lbnRvLnNlbGVjY2lvbmFkbyk7XHJcblx0fVxyXG5cclxuXHJcbn1cclxuIiwiQGlmKHZpc3RhVmlzdWFsaXphciA9PSBudWxsKXtcclxuPGgxPnt7J2Z1ZW50ZScgfCB0cmFuc2xhdGV9fSB7eydyZXBvcnRlJ3wgdHJhbnNsYXRlfX08L2gxPlxyXG48ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgPGFwcC1maWx0cm8tZ2VuZXJhbCBbZmlsdHJvc109XCJmaWx0ZXJzXCIgW2RhdGF0YWJsZV09XCJ0YWJsYUdlbmVyYWxcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWZvcm0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtZmxvYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBhdXRvZm9jdXMgdHlwZT1cInRleHRcIiBpZD1cImRlc2NyaXBjaW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXNjcmlwY2lvblwiPnt7J2ZpbHRybycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2FwcC1maWx0cm8tZ2VuZXJhbD5cclxuICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm8oKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPGFwcC10YWJsYS1nZW5lcmFsICN0YWJsYUdlbmVyYWwgW2NvbHVtbnNdPVwiY29sdW1uc1wiIFt2YWx1ZV09XCJwYWdpbmFkb3JcIiBbcm93c109XCJwYWdpbmF0b3Iucm93c1wiXHJcbiAgICBbdG90YWxSZWNvcmRzXT1cInBhZ2luYXRvci50b3RhbFJlY29yZHNcIiAob25Mb2FkKT1cImxvYWQoJGV2ZW50KVwiIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlKCRldmVudClcIlxyXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiPjwvYXBwLXRhYmxhLWdlbmVyYWw+XHJcbn1cclxuQGlmKHZpc3RhVmlzdWFsaXphciAhPSBudWxsKXtcclxuPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgIDxoMT57eydmdWVudGUnIHwgdHJhbnNsYXRlfX0ge3sncmVwb3J0ZSd8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJyZWdyZXNhcigpXCIgbGFiZWw9XCJSZWdyZXNhclwiIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIlxyXG4gICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkXCI+PC9idXR0b24+XHJcbjwvZGl2PlxyXG48cC10YWJWaWV3PlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sgJ2Z1ZW50ZSd8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cclxuICAgICAgICAgICAgICAgIDxoNT48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ib29rXCI+PC9pPnt7J2RhdG9zJ3wgdHJhbnNsYXRlfX0ge3snYmFzaWNvcyd8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMiBsZzpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtZmxvYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgYXV0b2ZvY3VzIHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwZXNvXCIgWyhuZ01vZGVsKV09XCJmdWVudGUuZGVzY3JpcGNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBlc29cIj57eydub21icmUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyIGxnOmNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1mbG9hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGxcIiBpZD1cImZsb2F0LWlucHV0XCIgcm93cz1cIjVcIiBjb2xzPVwiMzBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInF1ZXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCI+IDwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXNjcmlwY2lvblwiPnt7J2NvbnN1bHRhJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWZsb3BweS1zYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyKClcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPHAtc3BsaXRCdXR0b24gY2xhc3M9XCJtbC0yXCIgbGFiZWw9XCJBY2Npb25lcyBFdmFsdWFkb3Jlc1wiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm1lbnVcIj48L3Atc3BsaXRCdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItMlwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1mbG9wcHktc2F2ZVwiXHJcbiAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyQ2FtcG9zKClcIj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtdGFibGUgI3RhYmxhR2VuZXJhbEVudHJhZGEgaWQ9XCJ0YWJsYV9saXN0YV90aXBvX2VudGlkYWRcIiBbdmFsdWVdPVwiY2FtcG9zXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbj1cImJvdGhcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHNjcm9sbERpcmVjdGlvbj1cImhvcml6b250YWxcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwiZmFsc2VcIiBlZGl0TW9kZT1cInJvd1wiXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBbbGF6eV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eydub21icmUnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eyd0aXBvJyB8IHRyYW5zbGF0ZX19IGRlIHt7J2RhdG8nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY2FtcG8gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cImNhbXBvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5ub21icmUgXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjI1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLnRpcG9EYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjI1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLnRpcG9EYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuXHJcblxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sgJ3dpemFyZCd8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgPHAtc3RlcHMgW21vZGVsXT1cIml0ZW1zXCIgW3JlYWRvbmx5XT1cImZhbHNlXCIgW2FjdGl2ZUluZGV4XT1cImFjdHVhbFwiPjwvcC1zdGVwcz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxwLWJ1dHRvbiAob25DbGljayk9XCJhbnRlcmlvcigpXCIgW3JvdW5kZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1hbmdsZS1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgcFRvb2x0aXA9XCJBbnRlcmlvclwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHBsYWNlaG9sZGVyPVwiVG9wXCIgW2Rpc2FibGVkXT1cImFjdHVhbCA8PSAwXCIgLz5cclxuICAgICAgICAgICAgPHAtYnV0dG9uIChvbkNsaWNrKT1cInNpZ3VpZW50ZSgpXCIgW3JvdW5kZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1hbmdsZS1yaWdodFwiIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJhY3R1YWwgID09PSAzID8gJ1Rlcm1pbmFyJzogJ1NpZ3VpZW50ZSdcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiBwbGFjZWhvbGRlcj1cIlRvcFwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRJbnN0cnVjY2lvbmVzIG10LTQgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1iZWxsXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVuZWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e21hcGFNZW5zYWplcz8uZ2V0KGFjdHVhbCl9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfYW50ZXJpb3InIHwgdHJhbnNsYXRlfX1cIiAgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwiYW50ZXJpb3IoKVwiICpuZ0lmPVwiYWN0dWFsID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfc2lndWllbnRlJyB8IHRyYW5zbGF0ZX19XCIgIGljb249XCJwaSBwaS1wbHVzXCIgKGNsaWNrKT1cInNpZ3VpZW50ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICBAaWYoYWN0dWFsID09PSAwKXtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snZnVlbnRlJyB8IHRyYW5zbGF0ZX19XCIgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwiYnVzY2FyVGFibGEoKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlICN0YWJsYUdlbmVyYWxFbnRyYWRhIGlkPVwidGFibGFfbGlzdGFfdGlwb19lbnRpZGFkXCIgW3ZhbHVlXT1cInRhYmxhc0Zyb21cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbj1cImJvdGhcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIiBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgW2xhenldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MjUlXCI+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXRhYmxhIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwidGFibGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLnRhYmxhfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLmFsaWFzfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJUYWJsYSh0YWJsYSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYoYWN0dWFsID09IDEpe1xyXG5cclxuICAgICAgICA8cC10YWJsZSAjdGFibGFHZW5lcmFsRW50cmFkYSBpZD1cInRhYmxhX2xpc3RhX3RpcG9fZW50aWRhZFwiIFt2YWx1ZV09XCJmb3JhbmVhc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJib3RoXCIgc2Nyb2xsRGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCJcclxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIiBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBlZGl0TW9kZT1cInJvd1wiXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBbbGF6eV09XCJ0cnVlXCIgZGF0YUtleT1cImxsYXZlXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eycnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPnt7JycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MjUlXCI+e3snJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXRhYmxhIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJ0YWJsYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjI1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLmFsaWFzMX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t0YWJsYS5hbGlhczJ9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFibGEubGxhdmUubm9tYnJlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZihhY3R1YWwgPT0gMil7XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aDU+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eyd3aGVyZSd8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMiBsZzpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtZmxvYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsXCIgaWQ9XCJmbG9hdC1pbnB1dFwiIHJvd3M9XCI1XCIgY29scz1cIjMwXCIgcElucHV0VGV4dGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZnVlbnRlLndoZXJlQWRpY2lvbmFsXCIgYXV0b2ZvY3VzIFthdXRvUmVzaXplXT1cInRydWVcIj4gPC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NyaXBjaW9uXCI+e3snY29uc3VsdGEnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWZsb3BweS1zYXZlXCIgbGFiZWw9XCJ7eydsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0YXJXaGVyZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYoYWN0dWFsID09IDMpe1xyXG5cclxuICAgICAgICA8cC10YWJsZSBpZD1cInRhYmxhX2xpc3RhX3RpcG9fZW50aWRhZFwiIFt2YWx1ZV09XCJjYW1wb3NTZWxlY2Npb25hclwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImNhbXBvc1NlbGVjY2lvbmFyLmxlbmd0aFwiIHNjcm9sbERpcmVjdGlvbj1cImJvdGhcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCJcclxuICAgICAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHNjcm9sbERpcmVjdGlvbj1cImhvcml6b250YWxcIiBbcGFnaW5hdG9yXT1cImNhbXBvc1NlbGVjY2lvbmFyLmxlbmd0aCA+IDEwXCJcclxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxMCwgMjAsIDMwXVwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCIgZWRpdE1vZGU9XCJyb3dcIlxyXG4gICAgICAgICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgW2xhenldPVwiZmFsc2VcIiBkYXRhS2V5PVwiYWxpYXNcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiIGFsaWduRnJvemVuPVwibGVmdFwiIHBGcm96ZW5Db2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IFtzdHlsZV09XCJ7J21hcmdpbi1sZWZ0JzogJzElJywnbWFyZ2luLXJpZ2h0JzonMSUnfVwiIFsobmdNb2RlbCldPVwic2VsZWNjaW9uR2VuZXJhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIiBbbmdNb2RlbF09XCJ0b2Rvc1NlbGVjY2lvbmFkb3MoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhY3R1YWxpemFyU2VsZWNjaW9uKCRldmVudClcIj48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MSVcIj57eyd0YWJsYScgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtdGFibGE+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IGNsYXNzPVwibXItMiBcIiBbKG5nTW9kZWwpXT1cInRhYmxhLnNlbGVjY2lvbmFkb1wiIFtiaW5hcnldPVwidHJ1ZVwiIGlucHV0SWQ9XCJiaW5hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLmNvbHVtbmEucmVwb3J0ZUZ1ZW50ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t0YWJsYS5jb2x1bW5hLm5vbWJyZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbjwvcC10YWJWaWV3PlxyXG5cclxufVxyXG5cclxuPGFwcC1wb3B1cC10YWJsYXMtZnVlbnRlICNwb3B1cFRhYmxhc0Z1ZW50ZVVJXHJcbiAgICAoYXBsaWNhckRlc3Rpbm9PY3VsdGFyKT1cInNldFRhYmxhU2VsZWNjaW9uYWRhKCRldmVudClcIj48L2FwcC1wb3B1cC10YWJsYXMtZnVlbnRlPiJdfQ==
|