dmencu 1.0.32 → 1.0.34

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.
Files changed (29) hide show
  1. package/dist/server/server/Copiar (1) procedures-dmencu.d.ts +11 -0
  2. package/dist/server/server/Copiar (1) procedures-dmencu.js +1531 -0
  3. package/dist/server/server/Copiar (2) procedures-dmencu.d.ts +11 -0
  4. package/dist/server/server/Copiar (2) procedures-dmencu.js +1655 -0
  5. package/dist/server/server/app-dmencu.js +8 -8
  6. package/dist/server/server/procedures-dmencu.js +18 -5
  7. package/dist/server/server/procedures-dmencu_raquel.d.ts +11 -0
  8. package/dist/server/server/procedures-dmencu_raquel.js +1655 -0
  9. package/dist/server/server/table-varcal.d.ts +1 -0
  10. package/dist/server/server/table-varcal.js +25 -0
  11. package/dist/server/server/table-variables_c.d.ts +2 -0
  12. package/dist/server/server/table-variables_c.js +23 -0
  13. package/install/roles.tab +4 -2
  14. package/install/roles_permisos.tab +22 -0
  15. package/package.json +1 -1
  16. package/dist/server/server/table-inconsistencias_no_cumple_condicion.d.ts +0 -2
  17. package/dist/server/server/table-inconsistencias_no_cumple_condicion.js +0 -31
  18. package/dist/server/server/table-inconsistencias_no_cumplen_condicion.d.ts +0 -3
  19. package/dist/server/server/table-inconsistencias_no_cumplen_condicion.js +0 -38
  20. package/dist/server/server/table-momento_consistencia_tarea_rol.d.ts +0 -2
  21. package/dist/server/server/table-momento_consistencia_tarea_rol.js +0 -34
  22. package/dist/server/server/table-momento_consistencia_tarea_roles.d.ts +0 -2
  23. package/dist/server/server/table-momento_consistencia_tarea_roles.js +0 -33
  24. package/dist/server/server/table-roles copy.d.ts +0 -2
  25. package/dist/server/server/table-roles copy.js +0 -33
  26. package/dist/server/server/table-tareas_tem_fin_campo copy.d.ts +0 -3
  27. package/dist/server/server/table-tareas_tem_fin_campo copy.js +0 -46
  28. package/dist/server/server/table-tem copy.d.ts +0 -3
  29. package/dist/server/server/table-tem copy.js +0 -238
@@ -0,0 +1,1655 @@
1
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
+ if (k2 === undefined) k2 = k;
3
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
+ desc = { enumerable: true, get: function() { return m[k]; } };
6
+ }
7
+ Object.defineProperty(o, k2, desc);
8
+ }) : (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ o[k2] = m[k];
11
+ }));
12
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
+ };
15
+ (function (factory) {
16
+ if (typeof module === "object" && typeof module.exports === "object") {
17
+ var v = factory(require, exports);
18
+ if (v !== undefined) module.exports = v;
19
+ }
20
+ else if (typeof define === "function" && define.amd) {
21
+ define(["require", "exports", "like-ar", "./types-dmencu", "procesamiento", "pg-promise-strict", "best-globals", "fs", "expre-parser", "./table-tareas_tem", "console"], factory);
22
+ }
23
+ })(function (require, exports) {
24
+ "use strict";
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ProceduresDmEncu = exports.ACCION_PASAR_PROIE = exports.setHdrQuery = exports.getOperativoActual = exports.setMaxAgenerar = exports.setGenerarIdEncFun = void 0;
27
+ const likeAr = require("like-ar");
28
+ __exportStar(require("./types-dmencu"), exports);
29
+ const procesamiento_1 = require("procesamiento");
30
+ const pg_promise_strict_1 = require("pg-promise-strict");
31
+ const best_globals_1 = require("best-globals");
32
+ const fs_1 = require("fs");
33
+ const ExpresionParser = require("expre-parser");
34
+ const table_tareas_tem_1 = require("./table-tareas_tem");
35
+ const console_1 = require("console");
36
+ var path = require('path');
37
+ var sqlTools = require('sql-tools');
38
+ var discrepances = require('discrepances');
39
+ const formPrincipal = 'F:F1';
40
+ const ESTADO_POSTERIOR_CARGA = 'C';
41
+ const ESTADO_POSTERIOR_DESCARGA = 'D';
42
+ var generarIdEncFun;
43
+ var maxAGenerar = 50;
44
+ const setGenerarIdEncFun = (fun) => generarIdEncFun = fun;
45
+ exports.setGenerarIdEncFun = setGenerarIdEncFun;
46
+ const setMaxAgenerar = (max) => maxAGenerar = max;
47
+ exports.setMaxAgenerar = setMaxAgenerar;
48
+ (0, exports.setGenerarIdEncFun)((area, index) => area.toString() + (index + 10).toString());
49
+ (0, exports.setMaxAgenerar)(100);
50
+ const getOperativoActual = async (context) => {
51
+ var _a;
52
+ var be = context.be;
53
+ var result = await be.procedure.table_data.coreFunction(context, { table: `parametros`, fixedFields: [] });
54
+ if ((_a = result[0]) === null || _a === void 0 ? void 0 : _a.operativo) {
55
+ return result[0].operativo;
56
+ }
57
+ else {
58
+ throw Error('no se configuró un operativo en la tabla parámetros');
59
+ }
60
+ };
61
+ exports.getOperativoActual = getOperativoActual;
62
+ function createStructure(context, tableName) {
63
+ var be = context.be;
64
+ var mainTableDef = be.tableStructures[tableName](context);
65
+ var getPkFromTableDef = function getPkFromTableDef(tableDef) {
66
+ return tableDef.primaryKey.map(function (pk) {
67
+ return { fieldName: pk };
68
+ });
69
+ };
70
+ var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
71
+ // return tableDef.foreignKeys? tableDef.foreignKeys.map(fk=>fk.fields): [];
72
+ let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
73
+ return parentFk ? parentFk.fields : [];
74
+ };
75
+ var struct = {
76
+ tableName: mainTableDef.name,
77
+ pkFields: getPkFromTableDef(mainTableDef),
78
+ childTables: []
79
+ };
80
+ if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
81
+ mainTableDef.detailTables.forEach(function (detailTable) {
82
+ struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
83
+ });
84
+ }
85
+ return struct;
86
+ }
87
+ var getSettersAndParametersForReaNoReaResumenEstado = (funParams) => {
88
+ let { tarea, respuestasUAPrincipal, setters, params } = funParams;
89
+ let { resumenEstadoSup, codNoReaSup, codReaSup, resumenEstado, codNoRea, codRea } = respuestasUAPrincipal;
90
+ setters = setters.concat([
91
+ `resumen_estado${tarea == 'supe' ? '_sup' : ''}=$${params.length + 1}`,
92
+ `norea${tarea == 'supe' ? '_sup' : ''}=$${params.length + 2}`,
93
+ `rea${tarea == 'supe' ? '_sup' : ''}=$${params.length + 3}`
94
+ ]);
95
+ params = params.concat([
96
+ tarea == 'supe' ? resumenEstadoSup : resumenEstado,
97
+ tarea == 'supe' ? codNoReaSup : codNoRea,
98
+ tarea == 'supe' ? codReaSup : codRea
99
+ ]);
100
+ return { setters, params };
101
+ };
102
+ var guardarEncuestaEnTem = async (context, operativo, idEnc, respuestasUAPrincipal, tarea) => {
103
+ var { params, setters } = getSettersAndParametersForReaNoReaResumenEstado({
104
+ tarea,
105
+ respuestasUAPrincipal,
106
+ setters: [`json_encuesta = $3`, `fecha_modif_encuesta = current_timestamp`],
107
+ params: [operativo, idEnc, respuestasUAPrincipal]
108
+ });
109
+ return await context.client.query(`update tem
110
+ set ${setters.join(',')}
111
+ where operativo= $1 and enc = $2
112
+ returning 'ok'`, params).fetchUniqueRow();
113
+ };
114
+ var simularGuardadoDeEncuestaDesdeAppEscritorio = async (context, operativo, enc, tarea, json_encuesta) => {
115
+ var be = context.be;
116
+ const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
117
+ return await be.procedure.dm_forpkraiz_descargar.coreFunction(context, {
118
+ operativo: operativo,
119
+ persistentes: {
120
+ respuestas: {
121
+ [UA_PRINCIPAL]: {
122
+ [enc]: json_encuesta
123
+ }
124
+ },
125
+ informacionHdr: {
126
+ [enc]: {
127
+ tarea: {
128
+ tarea
129
+ }
130
+ }
131
+ }
132
+ }
133
+ });
134
+ };
135
+ var getHdrQuery = function getHdrQuery(quotedCondViv, context) {
136
+ return `
137
+ with ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)} as
138
+ (select t.enc, t.json_encuesta as respuestas, t.resumen_estado as "resumenEstado",
139
+ jsonb_build_object(
140
+ 'dominio' , dominio ,
141
+ 'nomcalle' , nomcalle ,
142
+ 'sector' , sector ,
143
+ 'edificio' , edificio ,
144
+ 'entrada' , entrada ,
145
+ 'nrocatastral' , nrocatastral ,
146
+ 'piso' , piso ,
147
+ 'departamento' , departamento ,
148
+ 'habitacion' , habitacion ,
149
+ 'casa' , casa ,
150
+ 'prioridad' , reserva+1 ,
151
+ 'observaciones' , tt.carga_observaciones ,
152
+ 'cita' , cita ,
153
+ 'carga' , t.area
154
+ ) as tem, t.area,
155
+ --TODO: GENERALIZAR
156
+ jsonb_build_object(
157
+ 'tarea', tt.tarea,
158
+ 'fecha_asignacion', fecha_asignacion,
159
+ 'asignado', asignado,
160
+ 'main_form', main_form
161
+ ) as tarea,
162
+ min(fecha_asignacion) as fecha_asignacion
163
+ from tem t left join tareas_tem tt on (t.operativo = tt.operativo and t.enc = tt.enc and t.tarea_actual = tt.tarea)
164
+ left join tareas ta on t.tarea_actual = ta.tarea
165
+ where t.habilitada and ${quotedCondViv}
166
+ group by t.enc, t.json_encuesta, t.resumen_estado, dominio, nomcalle,sector,edificio, entrada, nrocatastral, piso,departamento,habitacion,casa,reserva,tt.carga_observaciones, cita, t.area, tt.tarea, fecha_asignacion, asignado, main_form
167
+ )
168
+ select jsonb_build_object(
169
+ 'viviendas', ${(0, pg_promise_strict_1.jsono)(`select enc, respuestas, jsonb_build_object('resumenEstado',"resumenEstado") as otras from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}`, 'enc', `otras || coalesce(respuestas,'{}'::jsonb)`)}
170
+ ) as respuestas,
171
+ ${(0, pg_promise_strict_1.json)(`
172
+ select area as carga, observaciones_hdr as observaciones, min(fecha_asignacion) as fecha
173
+ from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)} inner join areas using (area)
174
+ group by area, observaciones_hdr`, 'fecha')} as cargas,
175
+ ${(0, pg_promise_strict_1.jsono)(`select enc, jsonb_build_object('tem', tem, 'tarea', tarea) as otras from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}`, 'enc', `otras ||'{}'::jsonb`)}
176
+ as "informacionHdr"
177
+ `;
178
+ };
179
+ var setHdrQuery = (myFun) => getHdrQuery = myFun;
180
+ exports.setHdrQuery = setHdrQuery;
181
+ const getUAPrincipal = async (client, operativo) => (await client.query(`select unidad_analisis
182
+ from unidad_analisis
183
+ where operativo= $1 and principal
184
+ `, [operativo]).fetchUniqueValue()).value;
185
+ var funcionesConocidas = {};
186
+ var compiler = new ExpresionParser.Compiler({
187
+ language: 'js',
188
+ varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
189
+ funWrapper: (functionName) => {
190
+ if (!funcionesConocidas[functionName]) {
191
+ console.log(functionName);
192
+ funcionesConocidas[functionName] = true;
193
+ }
194
+ return `helpers.funs.${functionName}`;
195
+ }
196
+ });
197
+ function compilarExpresion(expresion) {
198
+ return compiler.toCode(ExpresionParser.parse(expresion
199
+ .replace(/\bis distinct from\b/gi, ' <> ')
200
+ .replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
201
+ .replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
202
+ }
203
+ function compilarExpresiones(casillero) {
204
+ var _a, _b;
205
+ if (!casillero) {
206
+ return;
207
+ }
208
+ if (casillero.data.expresion_habilitar) {
209
+ casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
210
+ }
211
+ if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
212
+ var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
213
+ if (partes.length > 1) {
214
+ var precondicion = partes[0];
215
+ var valor = partes.slice(1).join('=>');
216
+ casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
217
+ }
218
+ else {
219
+ casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
220
+ }
221
+ }
222
+ for (var casilleroInterno of casillero.childs)
223
+ compilarExpresiones(casilleroInterno);
224
+ }
225
+ const generarTareasTemFaltantes = async (context, operativo) => await context.client.query(`
226
+ insert into tareas_tem (operativo, enc, tarea)
227
+ select ta.operativo, ta.enc, ta.tarea
228
+ from (select ta.*, t.enc,t.area from tareas ta, tem t where ta.operativo=t.operativo) ta
229
+ where ta.operativo = $1
230
+ and not (ta.operativo, ta.enc, ta.tarea) in (select operativo, enc, tarea from tareas_tem)
231
+ order by 1,3,2;
232
+ `, [operativo]).execute();
233
+ exports.ACCION_PASAR_PROIE = 'encuestas_procesamiento_pasar';
234
+ exports.ProceduresDmEncu = [
235
+ {
236
+ action: 'operativo_estructura_completa',
237
+ parameters: [
238
+ { name: 'operativo', typeName: 'text', references: 'operativos' },
239
+ ],
240
+ resultOk: 'desplegarFormulario',
241
+ coreFunction: async function (context, parameters) {
242
+ var be = context.be;
243
+ var result = await context.client.query(`select casilleros_jerarquizados($1) as formularios,
244
+ ${(0, pg_promise_strict_1.jsono)(`select unidad_analisis, padre, pk_agregada, '{}'::jsonb as hijas from unidad_analisis where operativo = $2`, 'unidad_analisis')} as unidades_analisis
245
+ `, [parameters.operativo, parameters.operativo]).fetchUniqueRow();
246
+ likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
247
+ // Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
248
+ var resultHermanos = await context.client.query(`
249
+ select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero boton, bf.casillero, bf.padre, fp.casillero, fp.unidad_analisis
250
+ from casilleros o left join casilleros bf
251
+ on bf.tipoc='BF'
252
+ and bf.casillero = 'BF_'||o.casillero
253
+ and bf.operativo = o.operativo
254
+ left join casilleros fp
255
+ on fp.id_casillero = bf.padre
256
+ and fp.operativo = bf.operativo
257
+ where o.tipoc = 'F'
258
+ and o.unidad_analisis = fp.unidad_analisis
259
+ and o.operativo = $1`, [parameters.operativo]).fetchAll();
260
+ resultHermanos.rows.forEach(row => {
261
+ result.row.formularios[row.id_formulario].data.hermano = true;
262
+ });
263
+ function completarUA(ua, idUa, uAs) {
264
+ if (ua.padre) {
265
+ uAs[ua.padre].hijas[idUa] = ua;
266
+ }
267
+ else {
268
+ ua.principal = true;
269
+ }
270
+ }
271
+ likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
272
+ var { con_rea_hogar: conReaHogar, config_sorteo: configSorteo, habilitacion_boton_formulario: habilitacionBotonFormulario, permite_generar_muestra: permiteGenerarMuestra } = (await context.client.query(`
273
+ select config_sorteo, con_rea_hogar, habilitacion_boton_formulario, permite_generar_muestra
274
+ from operativos
275
+ where operativo = $1
276
+ `, [parameters.operativo]).fetchUniqueRow()).row;
277
+ let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
278
+ .map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
279
+ .plain();
280
+ if (configSorteo) {
281
+ likeAr(configSorteo).forEach((configSorteoFormulario) => {
282
+ configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
283
+ configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
284
+ });
285
+ }
286
+ if (habilitacionBotonFormulario) {
287
+ likeAr(habilitacionBotonFormulario).forEach((form) => {
288
+ form.expr_habilitar_boton_js = compilarExpresion(form.expr_habilitar_boton);
289
+ });
290
+ }
291
+ return { timestamp: be.caches.timestampEstructura, ...result.row, operativo: parameters.operativo, conReaHogar, configSorteo, habilitacionBotonFormulario, permiteGenerarMuestra, noReas: be.caches.tableContent.no_rea, noReasSup: be.caches.tableContent.no_rea_sup };
292
+ }
293
+ },
294
+ {
295
+ action: 'generar_formularios',
296
+ parameters: [
297
+ { name: 'annio', typeName: 'integer', references: 'annio' },
298
+ { name: 'mes', typeName: 'integer', references: 'mes' },
299
+ { name: 'lote', typeName: 'integer', references: 'lotes' },
300
+ ],
301
+ coreFunction: async function (context, parameters) {
302
+ var be = context.be;
303
+ const OPERATIVO = await (0, exports.getOperativoActual)(context);
304
+ let resultUA = await context.client.query(`select *
305
+ from unidad_analisis
306
+ where principal = true and operativo = $1
307
+ `, [OPERATIVO]).fetchOneRowIfExists();
308
+ if (resultUA.rowCount === 0) {
309
+ throw new Error('No se configuró una unidad de analisis como principal');
310
+ }
311
+ let row = resultUA.row;
312
+ let resultPreguntas = await be.procedure.preguntas_ua_traer.coreFunction(context, row);
313
+ var contenedorVacio = {};
314
+ resultPreguntas.forEach(function (defPregunta) {
315
+ contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
316
+ });
317
+ contenedorVacio.annio = parameters.annio;
318
+ contenedorVacio.mes = parameters.mes;
319
+ contenedorVacio.lote = parameters.lote;
320
+ var result = await context.client.query(`select debe_haber.id_caso, s as id
321
+ from (select lote, armar_id(annio, mes, lote, s) as id_caso, s
322
+ from (select annio,mes,lote, cant_cues from lotes where (annio,mes,lote)=($2,$3,$4)) r, lateral generate_series(1,cant_cues) s
323
+ ) debe_haber left join defgen hay on hay.id_caso = debe_haber.id_caso and hay.operativo=$1
324
+ where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
325
+ var params = { operativo: OPERATIVO };
326
+ for (var i = 0; i < result.rowCount; i++) {
327
+ await be.procedure.caso_guardar.coreFunction(context, (0, best_globals_1.changing)(params, { id_caso: result.rows[i].id_caso, datos_caso: (0, best_globals_1.changing)(contenedorVacio, { id: result.rows[i].id }) }));
328
+ }
329
+ return { agregadas: result.rowCount };
330
+ }
331
+ },
332
+ {
333
+ action: 'upload_file',
334
+ progress: true,
335
+ parameters: [
336
+ { name: 'id_adjunto', typeName: 'integer' },
337
+ { name: 'nombre', typeName: 'text' },
338
+ ],
339
+ files: { count: 1 },
340
+ coreFunction: function (context, parameters, files) {
341
+ let be = context.be;
342
+ let client = context.client;
343
+ context.informProgress({ message: be.messages.fileUploaded });
344
+ let file = files[0];
345
+ let ext = path.extname(file.path).substr(1);
346
+ let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
347
+ let filename = parameters.nombre || originalFilename;
348
+ let newPath = 'local-attachments/file-';
349
+ var createResponse = function createResponse(adjuntoRow) {
350
+ let resultado = {
351
+ message: 'La subida se realizó correctamente (update)',
352
+ nombre: adjuntoRow.nombre,
353
+ nombre_original: adjuntoRow.nombre_original,
354
+ ext: adjuntoRow.ext,
355
+ fecha: adjuntoRow.fecha,
356
+ hora: adjuntoRow.hora,
357
+ id_adjunto: adjuntoRow.id_adjunto
358
+ };
359
+ return resultado;
360
+ };
361
+ var moveFile = function moveFile(file, id_adjunto, extension) {
362
+ fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
363
+ };
364
+ return Promise.resolve().then(function () {
365
+ if (parameters.id_adjunto) {
366
+ return context.client.query(`update adjuntos set nombre= $1,nombre_original = $2, ext = $3, ruta = concat('local-attachments/file-',$4::text,'.',$3::text), fecha = now(), hora = date_trunc('seconds',current_timestamp-current_date)
367
+ where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
368
+ return createResponse(result.row);
369
+ }).then(function (resultado) {
370
+ moveFile(file, resultado.id_adjunto, resultado.ext);
371
+ return resultado;
372
+ });
373
+ }
374
+ else {
375
+ return context.client.query(`insert into adjuntos (nombre, nombre_original, ext, fecha, hora) values ($1,$2,$3,now(), date_trunc('seconds',current_timestamp-current_date)) returning *`, [filename, originalFilename, ext]).fetchUniqueRow().then(function (result) {
376
+ return context.client.query(`update adjuntos set ruta = concat('local-attachments/file-',id_adjunto::text,'.',ext)
377
+ where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
378
+ return createResponse(result.row);
379
+ }).then(function (resultado) {
380
+ moveFile(file, resultado.id_adjunto, resultado.ext);
381
+ return resultado;
382
+ });
383
+ });
384
+ }
385
+ }).catch(function (err) {
386
+ throw err;
387
+ });
388
+ }
389
+ },
390
+ {
391
+ action: 'caso_guardar',
392
+ parameters: [
393
+ { name: 'operativo', typeName: 'text', references: 'operativos' },
394
+ { name: 'id_caso', typeName: 'text' },
395
+ { name: 'datos_caso', typeName: 'jsonb' },
396
+ ],
397
+ definedIn: 'dmencu',
398
+ //@ts-ignore especifico el tipo de los parámetros
399
+ coreFunction: async function (context, parameters, newClient) {
400
+ var client = newClient || context.client;
401
+ var datos_json = parameters.datos_caso;
402
+ var be = context.be;
403
+ var tableStructures_app = be.tableStructures;
404
+ var struct_dmencu = createStructure(context, procesamiento_1.OperativoGenerator.mainTD);
405
+ datos_json['operativo'] = parameters.operativo;
406
+ datos_json[procesamiento_1.OperativoGenerator.mainTDPK] = parameters.id_caso;
407
+ function completar_ult_pk_en_arr(ult_pk, ua_arr) {
408
+ var con_pk_completa = ua_arr;
409
+ if (ua_arr && ua_arr.length >= 1) {
410
+ con_pk_completa = con_pk_completa.map((una_ua, i) => {
411
+ una_ua[ult_pk] = i + 1;
412
+ return una_ua;
413
+ });
414
+ }
415
+ ;
416
+ return con_pk_completa;
417
+ }
418
+ function recorrer_datos_agregando_pks(datosj) {
419
+ for (var keyName in datosj) {
420
+ var datoK = datosj[keyName];
421
+ if (datoK instanceof Array && datoK.length >= 1) {
422
+ var pk = tableStructures_app[keyName](context).primaryKey;
423
+ var ult_pk = pk[pk.length - 1];
424
+ datoK = completar_ult_pk_en_arr(ult_pk, datoK);
425
+ datoK.forEach((elemI) => {
426
+ elemI = recorrer_datos_agregando_pks(elemI);
427
+ });
428
+ }
429
+ ;
430
+ if (keyName.startsWith('$') || keyName.startsWith('_')) {
431
+ delete datosj[keyName];
432
+ }
433
+ }
434
+ return datosj;
435
+ }
436
+ datos_json = recorrer_datos_agregando_pks(datos_json);
437
+ delete datos_json.codRea;
438
+ delete datos_json.codNoRea;
439
+ delete datos_json.resumenEstado;
440
+ delete datos_json.codReaSup;
441
+ delete datos_json.codNoReaSup;
442
+ delete datos_json.resumenEstadoSup;
443
+ if (Object.keys(datos_json).length > 2) {
444
+ var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
445
+ return await queries.reduce(function (promise, query) {
446
+ return promise.then(function () {
447
+ return client.query(query).execute().then(function (result) {
448
+ return 'ok';
449
+ });
450
+ });
451
+ }, Promise.resolve()).then(function () {
452
+ return "ok";
453
+ }).catch(function (err) {
454
+ console.log("caso_guardar ENTRA EN EL CATCH: ", err);
455
+ throw err;
456
+ });
457
+ }
458
+ else {
459
+ return 'vacio';
460
+ }
461
+ }
462
+ },
463
+ {
464
+ action: 'caso_traer',
465
+ parameters: [
466
+ //{name:'formulario' , typeName:'text'},
467
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
468
+ { name: 'id_caso', typeName: 'text' },
469
+ ],
470
+ resultOk: 'goToEnc',
471
+ definedIn: 'dmencu',
472
+ coreFunction: async function (context, parameters) {
473
+ var client = context.client;
474
+ var struct_dmencu = createStructure(context, procesamiento_1.OperativoGenerator.mainTD);
475
+ var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, vivienda: parameters.id_caso }, struct_dmencu);
476
+ var result = await client.query(sql).fetchUniqueValue();
477
+ var response = {
478
+ operativo: parameters.operativo,
479
+ vivienda: parameters.id_caso,
480
+ datos_caso: result.value,
481
+ //formulario: formPrincipal,
482
+ };
483
+ return response;
484
+ }
485
+ },
486
+ {
487
+ action: 'caso_traer_o_crear',
488
+ parameters: [
489
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
490
+ { name: 'id_caso', typeName: 'text' },
491
+ ],
492
+ resultOk: 'goToEnc',
493
+ // bitacora:{always:true},
494
+ coreFunction: async function (context, parameters) {
495
+ var be = context.be;
496
+ try {
497
+ var result = await be.procedure['caso_traer'].coreFunction(context, parameters);
498
+ return result;
499
+ }
500
+ catch (err) {
501
+ var json = await be.procedure['caso_preparar'].coreFunction(context, parameters);
502
+ await be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
503
+ return await be.procedure['caso_traer'].coreFunction(context, parameters);
504
+ }
505
+ }
506
+ },
507
+ {
508
+ action: 'pasar_json2ua',
509
+ parameters: [],
510
+ coreFunction: async function (context, _parameters) {
511
+ /* GENERALIZAR: */
512
+ var be = context.be;
513
+ /* FIN-GENERALIZAR: */
514
+ const OPERATIVO = await (0, exports.getOperativoActual)(context);
515
+ let resultMain = await context.client.query(`SELECT * FROM ${procesamiento_1.OperativoGenerator.mainTD} LIMIT 1`).fetchAll();
516
+ if (resultMain.rowCount > 0) {
517
+ console.log('HAY DATOS', resultMain.rows);
518
+ throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
519
+ }
520
+ let resultJson = await context.client.query(`SELECT operativo, enc id_caso, json_encuesta datos_caso from tem
521
+ WHERE operativo=$1 and resumen_estado is distinct from 'vacio' and json_encuesta is not null
522
+ order by enc `, [OPERATIVO]).fetchAll();
523
+ var procedureGuardar = be.procedure.caso_guardar;
524
+ if (procedureGuardar.definedIn != 'dmencu') {
525
+ throw new Error('hay que sobreescribir caso_guardar');
526
+ }
527
+ return Promise.all(resultJson.rows.map(async function (row) {
528
+ let resultado = `id caso ${row.id_caso}: `;
529
+ try {
530
+ await be.inTransaction(null, async function (client) {
531
+ resultado += await procedureGuardar.coreFunction(context, row, client);
532
+ });
533
+ }
534
+ catch (err) {
535
+ let errMessage = resultado + "json2ua error. " + err;
536
+ resultado = errMessage;
537
+ console.log(errMessage);
538
+ }
539
+ if (resultado.includes('ok')) {
540
+ var { datos_caso, vivienda, operativo } = await be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
541
+ var verQueGrabo = { datos_caso, vivienda, operativo };
542
+ try {
543
+ discrepances.showAndThrow(verQueGrabo, row);
544
+ }
545
+ catch (err) {
546
+ console.log(verQueGrabo, row);
547
+ }
548
+ }
549
+ return resultado;
550
+ })).catch(function (err) {
551
+ throw err;
552
+ }).then(function (result) {
553
+ return result;
554
+ });
555
+ }
556
+ },
557
+ {
558
+ action: 'dm_forpkraiz_cargar',
559
+ parameters: [
560
+ { name: 'operativo', typeName: 'text' },
561
+ { name: 'vivienda', typeName: 'text' },
562
+ { name: 'tarea', typeName: 'text', references: "tareas" },
563
+ ],
564
+ coreFunction: async function (context, parameters) {
565
+ var be = context.be;
566
+ var { operativo, vivienda, tarea } = parameters;
567
+ var main_form = (await context.client.query(`select main_form
568
+ from tareas
569
+ where operativo= $1 and tarea=$2`, [operativo, tarea]).fetchUniqueValue()).value;
570
+ var condviv = ` t.operativo= $1 and t.enc =$2`;
571
+ var soloLectura = !!(await context.client.query(`select *
572
+ from tareas_tem join estados using (operativo, estado) --pk estado verificada
573
+ where operativo= $1 and enc = $2 and (
574
+ cargado_dm is not null or
575
+ not permite_editar_encuesta and asignado <> ${context.be.db.quoteLiteral(context.user.idper)}
576
+ )`, [operativo, vivienda]).fetchOneRowIfExists()).rowCount;
577
+ var { row } = await context.client.query(getHdrQuery(condviv, context), [operativo, vivienda]).fetchUniqueRow();
578
+ row.informacionHdr[vivienda].tarea = {
579
+ tarea,
580
+ main_form
581
+ };
582
+ return {
583
+ ...row,
584
+ operativo,
585
+ soloLectura,
586
+ idPer: context.user.idper,
587
+ cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })), 'carga'),
588
+ timestampEstructura: be.caches.timestampEstructura
589
+ };
590
+ }
591
+ },
592
+ {
593
+ action: 'dm_forpkraiz_descargar',
594
+ parameters: [
595
+ { name: 'operativo', typeName: 'text' },
596
+ { name: 'persistentes', typeName: 'jsonb' },
597
+ ],
598
+ coreFunction: async function (context, parameters) {
599
+ var be = context.be;
600
+ var { operativo, persistentes } = parameters;
601
+ const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
602
+ await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
603
+ if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
604
+ throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
605
+ }
606
+ await guardarEncuestaEnTem(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
607
+ //guardar paralelamente en tablas ua
608
+ var procedureGuardar = be.procedure.caso_guardar;
609
+ let resultado = `id enc ${idEnc}: `;
610
+ let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
611
+ let errMessage;
612
+ try {
613
+ await be.inTransaction(null, async function (client) {
614
+ resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
615
+ });
616
+ }
617
+ catch (err) {
618
+ errMessage = resultado + "dm_forpkraiz_descargar. " + err;
619
+ resultado = errMessage;
620
+ console.log(errMessage);
621
+ }
622
+ await context.client.query(`update tem
623
+ set pase_tabla= $3
624
+ where operativo= $1 and enc = $2
625
+ returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
626
+ }).array());
627
+ return 'ok';
628
+ }
629
+ },
630
+ {
631
+ action: 'dm_sincronizar',
632
+ parameters: [
633
+ { name: 'persistentes', typeName: 'jsonb' },
634
+ ],
635
+ coreFunction: async function (context, parameters) {
636
+ const OPERATIVO = await (0, exports.getOperativoActual)(context);
637
+ var be = context.be;
638
+ var { persistentes } = parameters;
639
+ var num_sincro = 0;
640
+ var token = persistentes === null || persistentes === void 0 ? void 0 : persistentes.token;
641
+ if (!token) {
642
+ token = (await be.procedure.token_get.coreFunction(context, {
643
+ useragent: context.session.req.useragent,
644
+ username: context.username
645
+ })).token;
646
+ }
647
+ var { value } = await context.client.query(`
648
+ INSERT INTO sincronizaciones (token, usuario, datos)
649
+ VALUES ($1,$2,$3)
650
+ RETURNING sincro
651
+ `, [token, context.username, persistentes]).fetchUniqueValue();
652
+ num_sincro = value;
653
+ var condviv = `
654
+ tt.operativo= $1
655
+ and asignado = $2
656
+ and tt.operacion='cargar'
657
+ and (tt.cargado_dm is null or tt.cargado_dm = ${context.be.db.quoteLiteral(token)})
658
+ `;
659
+ const UA_PRINCIPAL = await getUAPrincipal(context.client, OPERATIVO);
660
+ if (persistentes) {
661
+ await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
662
+ var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
663
+ var puedoGuardarEnTEM = true;
664
+ var { params, setters } = getSettersAndParametersForReaNoReaResumenEstado({
665
+ tarea,
666
+ respuestasUAPrincipal,
667
+ setters: [
668
+ `estado = ${context.be.db.quoteLiteral(ESTADO_POSTERIOR_DESCARGA)}`,
669
+ `cargado_dm=null`
670
+ ],
671
+ params: [OPERATIVO, idEnc, tarea, token]
672
+ });
673
+ var queryTareasTem = await context.client.query(`update tareas_tem
674
+ set ${setters.join(',')}
675
+ where operativo= $1 and enc = $2 and tarea = $3 and cargado_dm = $4
676
+ returning 'ok'`, params).fetchOneRowIfExists();
677
+ puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
678
+ if (puedoGuardarEnTEM) {
679
+ await guardarEncuestaEnTem(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
680
+ //guardar paralelamente en tablas ua
681
+ var procedureGuardar = be.procedure.caso_guardar;
682
+ let resultado = `id enc ${idEnc}: `;
683
+ let param_guardar = { operativo: OPERATIVO, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
684
+ let errMessage;
685
+ try {
686
+ await be.inTransaction(null, async function (client) {
687
+ resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
688
+ });
689
+ }
690
+ catch (err) {
691
+ errMessage = resultado + "dm_forpkraiz_descargar. " + err;
692
+ resultado = errMessage;
693
+ console.log(errMessage);
694
+ }
695
+ await context.client.query(`update tem
696
+ set pase_tabla= $3
697
+ where operativo= $1 and enc = $2
698
+ returning 'ok'`, [OPERATIVO, idEnc, resultado]).fetchUniqueRow();
699
+ }
700
+ else {
701
+ await fs_1.promises.appendFile('local-recibido-sin-token.txt', JSON.stringify({ now: new Date(), user: context.username, idCaso: idEnc, vivienda: respuestasUAPrincipal }) + '\n\n', 'utf8');
702
+ }
703
+ }).array());
704
+ }
705
+ var { row } = await context.client.query(getHdrQuery(condviv, context), [OPERATIVO, context.user.idper]).fetchUniqueRow();
706
+ await context.client.query(`update tareas_tem tt
707
+ set estado = $4, cargado_dm=$3::text
708
+ where ${condviv}
709
+ returning enc`, [OPERATIVO, parameters.enc ? parameters.enc : context.user.idper, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
710
+ return {
711
+ ...row,
712
+ operativo: OPERATIVO,
713
+ soloLectura: false,
714
+ token,
715
+ num_sincro,
716
+ idper: context.user.idper,
717
+ cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null, estado_carga: 'relevamiento' })), 'carga')
718
+ };
719
+ }
720
+ },
721
+ {
722
+ action: 'dm_backup',
723
+ parameters: [
724
+ { name: 'token', typeName: 'text' },
725
+ { name: 'tem', typeName: 'jsonb' },
726
+ ],
727
+ unlogged: true,
728
+ coreFunction: async function (context, parameters) {
729
+ var { be, client } = context;
730
+ const OPERATIVO = await (0, exports.getOperativoActual)(context);
731
+ var num_sincro = 0;
732
+ var token = parameters.token;
733
+ if (token == null) {
734
+ return { ok: 'ok:N/T' };
735
+ }
736
+ else {
737
+ var { rowCount } = await client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
738
+ if (!rowCount) {
739
+ return { ok: 'ok:N/T' };
740
+ }
741
+ }
742
+ if (parameters.tem) {
743
+ await Promise.all(likeAr(parameters.tem).map(async (backup) => {
744
+ context.client.query(`update tem
745
+ set json_backup = $3, fecha_backup = current_timestamp
746
+ where operativo= $1 and enc = $2 and json_backup is distinct from $4
747
+ returning 'ok'`, [OPERATIVO, backup.forPkRaiz.vivienda, backup.respuestasRaiz, backup.respuestasRaiz]).fetchOneRowIfExists();
748
+ }).array());
749
+ }
750
+ return {
751
+ ok: 'ok'
752
+ };
753
+ }
754
+ },
755
+ {
756
+ action: 'consistir_vivienda',
757
+ parameters: [
758
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
759
+ { name: 'vivienda', typeName: 'text' },
760
+ ],
761
+ coreFunction: async function (context, parameters) {
762
+ var { be, client } = context;
763
+ let param_proc = {
764
+ operativo: parameters.operativo,
765
+ id_caso: parameters.vivienda
766
+ };
767
+ let errMessage;
768
+ let resultado;
769
+ try {
770
+ resultado = await be.procedure.consistir_encuesta.coreFunction(context, param_proc, client);
771
+ }
772
+ catch (err) {
773
+ errMessage = " consistir_vivienda. " + err;
774
+ console.log(errMessage);
775
+ }
776
+ console.log('****** consistir_vivienda resultado:', resultado);
777
+ return {
778
+ ok: 'ok'
779
+ };
780
+ }
781
+ },
782
+ {
783
+ action: 'dm_rescatar',
784
+ parameters: [
785
+ { name: 'localStorageItem', typeName: 'jsonb' },
786
+ { name: 'localStorageItemKey', typeName: 'text' },
787
+ ],
788
+ unlogged: true,
789
+ coreFunction: async function (context, params) {
790
+ var { localStorageItemKey, localStorageItem } = params;
791
+ try {
792
+ console.log(localStorageItem);
793
+ await fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
794
+ return 'ok';
795
+ }
796
+ catch (err) {
797
+ console.log('ERROR', err);
798
+ throw err;
799
+ }
800
+ }
801
+ },
802
+ {
803
+ action: 'operativo_get',
804
+ parameters: [],
805
+ unlogged: true,
806
+ coreFunction: async function (context, _parameters) {
807
+ return (0, exports.getOperativoActual)(context);
808
+ }
809
+ },
810
+ {
811
+ action: 'get_random_free_case',
812
+ parameters: [{ name: 'operativo', typeName: 'text' }],
813
+ coreFunction: async function (context, params) {
814
+ const minsToExpire = 30;
815
+ const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
816
+ const enc = await context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
817
+ await context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
818
+ return enc.value;
819
+ }
820
+ },
821
+ {
822
+ action: 'muestra_generar',
823
+ parameters: [
824
+ { name: 'operativo', typeName: 'text', references: "operativos" },
825
+ { name: 'area', typeName: 'integer', references: "areas" },
826
+ { name: 'dominio', typeName: 'integer', defaultValue: 3 },
827
+ { name: 'cant_encuestas', typeName: 'integer' },
828
+ ],
829
+ coreFunction: async function (context, params) {
830
+ const be = context.be;
831
+ var { permite_generar_muestra } = (await context.client.query(`
832
+ select permite_generar_muestra
833
+ from operativos
834
+ where operativo = $1
835
+ `, [params.operativo]).fetchUniqueRow()).row;
836
+ if (permite_generar_muestra) {
837
+ var temTableDef = be.tableStructures['tem'](context);
838
+ for (let i = 0; i < Math.min(params.cant_encuestas, maxAGenerar); i++) {
839
+ let enc = generarIdEncFun(params.area, i);
840
+ await context.client.query(`
841
+ INSERT into tem (operativo, enc, area, dominio, habilitada) values ($1, $2, $3, $4, $5)
842
+ on conflict (${sqlTools.quoteIdentArray(temTableDef.primaryKey).join(',')}) do nothing`, [params.operativo, enc, params.area, params.dominio, true])
843
+ .execute();
844
+ }
845
+ await generarTareasTemFaltantes(context, params.operativo);
846
+ return 'ok';
847
+ }
848
+ else {
849
+ throw Error("el operativo no permite generar muestra");
850
+ }
851
+ }
852
+ },
853
+ {
854
+ action: 'encuesta_blanquear_previsualizar',
855
+ parameters: [
856
+ { name: 'operativo', typeName: 'text', references: "operativos" },
857
+ { name: 'enc', typeName: 'text' },
858
+ ],
859
+ roles: ['coor_proc', 'admin'],
860
+ resultOk: 'mostrar_encuesta_a_blanquear_contenido',
861
+ coreFunction: async function (context, params) {
862
+ try {
863
+ var result = await context.client.query(`
864
+ select *
865
+ from tem
866
+ where operativo = $1 and enc = $2 --pk verificada
867
+ `, [params.operativo, params.enc]).fetchUniqueRow();
868
+ }
869
+ catch (err) {
870
+ throw Error(`No se encontró la encuesta ${params.enc} para el operativo ${params.operativo}. ${err.message}`);
871
+ }
872
+ return { casoTem: result.row };
873
+ }
874
+ },
875
+ {
876
+ action: 'encuesta_blanquear',
877
+ parameters: [
878
+ { name: 'operativo', typeName: 'text', references: "operativos" },
879
+ { name: 'enc', typeName: 'text' },
880
+ ],
881
+ roles: ['coor_proc', 'admin'],
882
+ coreFunction: async function (context, params) {
883
+ var be = context.be;
884
+ await context.client.query(`delete
885
+ from ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}
886
+ where operativo=$1 and ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
887
+ `, [params.operativo, params.enc]).execute();
888
+ //paso a encu para guardar en historial
889
+ await context.client.query(`
890
+ update tem
891
+ set
892
+ tarea_actual = 'encu'
893
+ where operativo = $1 and enc = $2 --pk verificada
894
+ returning *
895
+ `, [params.operativo, params.enc]).fetchUniqueRow();
896
+ await context.client.query(`
897
+ delete
898
+ from tareas_tem
899
+ where operativo = $1 and enc = $2
900
+ `, [params.operativo, params.enc]).execute();
901
+ await generarTareasTemFaltantes(context, params.operativo);
902
+ //reseteo tem (no se guarda historial porque tarea_actual es null)
903
+ //guardo backup por las dudas
904
+ await context.client.query(`
905
+ update tem
906
+ set
907
+ json_backup = json_encuesta, json_encuesta = null, tarea_actual = null,
908
+ fecha_modif_encuesta = null, fecha_backup = current_timestamp, modificado = null,
909
+ resumen_estado = null, resumen_estado_sup = null, supervision_dirigida = null,
910
+ pase_tabla = null, rea = null, norea = null, rea_sup = null, norea_sup = null
911
+ where operativo = $1 and enc = $2 --pk verificada
912
+ returning *
913
+ `, [params.operativo, params.enc]).fetchUniqueRow();
914
+ await context.client.query(`
915
+ delete
916
+ from inconsistencias
917
+ where operativo = $1 and ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
918
+ `, [params.operativo, params.enc]).execute();
919
+ await context.client.query(`
920
+ delete
921
+ from in_con_var
922
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
923
+ `, [params.operativo, params.enc]).execute();
924
+ await context.client.query(`
925
+ delete
926
+ from inconsistencias_ultimas
927
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
928
+ `, [params.operativo, params.enc]).execute();
929
+ return `la encuesta ${params.enc} se blanqueó correctamente`;
930
+ }
931
+ },
932
+ {
933
+ action: 'accion_tareas_tem_ejecutar',
934
+ parameters: [
935
+ { name: 'operativo', typeName: 'text' },
936
+ { name: 'tarea', typeName: 'text' },
937
+ { name: 'enc', typeName: 'text' },
938
+ { name: 'condicion', typeName: 'text' },
939
+ { name: 'accion', typeName: 'jsonb' },
940
+ ],
941
+ coreFunction: async function (context, params) {
942
+ var be = context.be;
943
+ var accion = params.accion;
944
+ var cumple = (await context.client.query(`select accion_cumple_condicion($5, $6, $7, $8, (
945
+ select condicion
946
+ from estados_acciones
947
+ where operativo = $1 and estado = $2 and eaccion = $3 and estado_destino = $4
948
+ )
949
+ )`, [
950
+ params.operativo,
951
+ accion.estado,
952
+ accion.eaccion,
953
+ accion.estado_destino,
954
+ params.operativo,
955
+ accion.estado,
956
+ params.enc,
957
+ accion.eaccion,
958
+ ]).fetchUniqueValue()).value;
959
+ if (!cumple) {
960
+ throw Error(`No se pudo ejecutar la acción, no se cumple la condición "${params.condicion}" o bien el estado está desactualizado, refresque la grilla.`);
961
+ }
962
+ var result = await context.client.query(`
963
+ UPDATE tareas_tem
964
+ set estado = $4
965
+ where operativo=$1
966
+ and enc=$2
967
+ and tarea = $3
968
+ returning *`, [
969
+ params.operativo,
970
+ params.enc,
971
+ params.tarea,
972
+ accion.estado_destino
973
+ ]).fetchUniqueRow();
974
+ if (accion.nombre_procedure) {
975
+ if (be.procedure[accion.nombre_procedure]) {
976
+ await be.procedure[accion.nombre_procedure].coreFunction(context, params);
977
+ }
978
+ else {
979
+ throw Error(`No existe el procedure "${accion.nombre_procedure}" definido en la tabla "estados_acciones" para el
980
+ operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
981
+ }
982
+ }
983
+ // BUSCO PASE DE TAREA
984
+ var tareaSiguiente = (await context.client.query(`select *
985
+ from tareas_proximas
986
+ where
987
+ operativo = $1 and
988
+ tarea = $2 and estado = $3 and
989
+ tarea_cumple_condicion($4, $5, $6, $7, condicion)
990
+ order by orden
991
+ limit 1`, [
992
+ params.operativo,
993
+ params.tarea,
994
+ accion.estado_destino,
995
+ params.operativo,
996
+ params.tarea,
997
+ accion.estado_destino,
998
+ params.enc
999
+ ]).fetchOneRowIfExists()).row;
1000
+ if (tareaSiguiente) {
1001
+ await context.client.query(`
1002
+ update tem
1003
+ set tarea_actual = $3
1004
+ where operativo = $1 and enc = $2
1005
+ returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino]).fetchUniqueRow();
1006
+ let autoAsignado = tareaSiguiente.registra_recepcionista ? context.user.idper : null;
1007
+ let q = context.be.db.quoteLiteral;
1008
+ await context.client.query(`
1009
+ update tareas_tem
1010
+ set ts_entrada = current_timestamp, adelantar = null, estado = $4
1011
+ ${autoAsignado ?
1012
+ ", recepcionista=" + q(autoAsignado)
1013
+ : ""}
1014
+ where operativo = $1 and enc = $2 and tarea = $3
1015
+ returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino, tareaSiguiente.estado_destino]).fetchUniqueRow();
1016
+ if (tareaSiguiente.nombre_procedure) {
1017
+ await be.procedure[tareaSiguiente.nombre_procedure].coreFunction(context, params);
1018
+ }
1019
+ }
1020
+ // FIN PASE DE TAREA
1021
+ return "ok";
1022
+ }
1023
+ },
1024
+ {
1025
+ action: 'encuesta_carga_preparar',
1026
+ parameters: [
1027
+ { name: 'operativo', typeName: 'text' },
1028
+ { name: 'tarea', typeName: 'text' },
1029
+ { name: 'enc', typeName: 'text' },
1030
+ ],
1031
+ coreFunction: async function (context, params) {
1032
+ await context.client.query(`
1033
+ UPDATE tareas_tem
1034
+ set operacion = 'cargar'
1035
+ where operativo=$1 and tarea= $2 and enc=$3
1036
+ returning *`, [params.operativo, params.tarea, params.enc])
1037
+ .fetchUniqueRow();
1038
+ return 'ok';
1039
+ }
1040
+ },
1041
+ {
1042
+ action: 'encuesta_disponibilizar',
1043
+ parameters: [
1044
+ { name: 'operativo', typeName: 'text' },
1045
+ { name: 'tarea', typeName: 'text' },
1046
+ { name: 'enc', typeName: 'text' },
1047
+ ],
1048
+ coreFunction: async function (context, params) {
1049
+ await context.client.query(`
1050
+ UPDATE tareas_tem
1051
+ set asignado = null
1052
+ where operativo=$1 and tarea= $2 and enc=$3
1053
+ returning *`, [params.operativo, params.tarea, params.enc])
1054
+ .fetchUniqueRow();
1055
+ return 'ok';
1056
+ }
1057
+ },
1058
+ {
1059
+ action: 'encuesta_no_cargar',
1060
+ parameters: [
1061
+ { name: 'operativo', typeName: 'text' },
1062
+ { name: 'tarea', typeName: 'text' },
1063
+ { name: 'enc', typeName: 'text' },
1064
+ ],
1065
+ coreFunction: async function (context, params) {
1066
+ await context.client.query(`
1067
+ UPDATE tareas_tem
1068
+ set operacion = null
1069
+ where operativo=$1 and tarea= $2 and enc=$3
1070
+ returning *`, [params.operativo, params.tarea, params.enc])
1071
+ .fetchUniqueRow();
1072
+ return 'ok';
1073
+ }
1074
+ },
1075
+ {
1076
+ action: 'encuesta_descarga_preparar',
1077
+ parameters: [
1078
+ { name: 'operativo', typeName: 'text' },
1079
+ { name: 'tarea', typeName: 'text' },
1080
+ { name: 'enc', typeName: 'text' },
1081
+ ],
1082
+ coreFunction: async function (context, params) {
1083
+ await context.client.query(`
1084
+ UPDATE tareas_tem
1085
+ set operacion = 'descargar'
1086
+ where operativo=$1 and tarea= $2 and enc=$3
1087
+ returning *`, [params.operativo, params.tarea, params.enc])
1088
+ .fetchUniqueRow();
1089
+ return 'ok';
1090
+ }
1091
+ },
1092
+ {
1093
+ action: 'encuesta_no_descargar',
1094
+ parameters: [
1095
+ { name: 'operativo', typeName: 'text' },
1096
+ { name: 'tarea', typeName: 'text' },
1097
+ { name: 'enc', typeName: 'text' },
1098
+ ],
1099
+ coreFunction: async function (context, params) {
1100
+ await context.client.query(`
1101
+ UPDATE tareas_tem
1102
+ set operacion = 'cargar'
1103
+ where operativo=$1 and tarea= $2 and enc=$3
1104
+ returning *`, [params.operativo, params.tarea, params.enc])
1105
+ .fetchUniqueRow();
1106
+ return 'ok';
1107
+ }
1108
+ },
1109
+ {
1110
+ action: 'encuesta_analizar',
1111
+ parameters: [
1112
+ { name: 'operativo', typeName: 'text' },
1113
+ { name: 'tarea', typeName: 'text' },
1114
+ { name: 'enc', typeName: 'text' },
1115
+ ],
1116
+ coreFunction: async function (context, params) {
1117
+ var be = context.be;
1118
+ await be.procedure.consistir_encuesta.coreFunction(context, { operativo: params.operativo, id_caso: params.enc });
1119
+ return 'ok';
1120
+ }
1121
+ },
1122
+ {
1123
+ action: 'encuesta_verificar',
1124
+ parameters: [
1125
+ { name: 'operativo', typeName: 'text' },
1126
+ { name: 'tarea', typeName: 'text' },
1127
+ { name: 'enc', typeName: 'text' },
1128
+ ],
1129
+ coreFunction: async function (context, params) {
1130
+ await context.client.query(`
1131
+ UPDATE tareas_tem
1132
+ set verificado = '1'
1133
+ where operativo=$1 and tarea= $2 and enc=$3
1134
+ returning *`, [params.operativo, params.tarea, params.enc])
1135
+ .fetchUniqueRow();
1136
+ return 'ok';
1137
+ }
1138
+ },
1139
+ {
1140
+ action: 'encuesta_no_verificar',
1141
+ parameters: [
1142
+ { name: 'operativo', typeName: 'text' },
1143
+ { name: 'tarea', typeName: 'text' },
1144
+ { name: 'enc', typeName: 'text' },
1145
+ ],
1146
+ coreFunction: async function (context, params) {
1147
+ await context.client.query(`
1148
+ UPDATE tareas_tem
1149
+ set verificado = null
1150
+ where operativo=$1 and tarea= $2 and enc=$3
1151
+ returning *`, [params.operativo, params.tarea, params.enc])
1152
+ .fetchUniqueRow();
1153
+ return 'ok';
1154
+ }
1155
+ },
1156
+ {
1157
+ action: 'encuesta_cerrar',
1158
+ parameters: [
1159
+ { name: 'operativo', typeName: 'text' },
1160
+ { name: 'tarea', typeName: 'text' },
1161
+ { name: 'enc', typeName: 'text' },
1162
+ ],
1163
+ coreFunction: async function (context, params) {
1164
+ await context.client.query(`
1165
+ UPDATE tareas_tem
1166
+ set verificado = '1', asignado = $4
1167
+ where operativo=$1 and tarea= $2 and enc=$3
1168
+ returning *`, [params.operativo, params.tarea, params.enc, context.user.idper])
1169
+ .fetchUniqueRow();
1170
+ return 'ok';
1171
+ }
1172
+ },
1173
+ {
1174
+ action: 'encuesta_no_cerrar',
1175
+ parameters: [
1176
+ { name: 'operativo', typeName: 'text' },
1177
+ { name: 'tarea', typeName: 'text' },
1178
+ { name: 'enc', typeName: 'text' },
1179
+ ],
1180
+ coreFunction: async function (context, params) {
1181
+ await context.client.query(`
1182
+ UPDATE tareas_tem
1183
+ set verificado = null
1184
+ where operativo=$1 and tarea= $2 and enc=$3
1185
+ returning *`, [params.operativo, params.tarea, params.enc])
1186
+ .fetchUniqueRow();
1187
+ return 'ok';
1188
+ }
1189
+ },
1190
+ {
1191
+ action: 'encuesta_supervisar_presencial',
1192
+ parameters: [
1193
+ { name: 'operativo', typeName: 'text' },
1194
+ { name: 'enc', typeName: 'text' },
1195
+ { name: 'tarea', typeName: 'text' },
1196
+ ],
1197
+ coreFunction: async function (context, params) {
1198
+ await context.client.query(`
1199
+ UPDATE tem
1200
+ set tarea_actual = $3, supervision_dirigida = $4
1201
+ where operativo=$1 and enc=$2
1202
+ returning *`, [params.operativo, params.enc, 'supe', 1])
1203
+ .fetchUniqueRow();
1204
+ return 'ok';
1205
+ }
1206
+ },
1207
+ {
1208
+ action: 'encuesta_supervisar_telefonica',
1209
+ parameters: [
1210
+ { name: 'operativo', typeName: 'text' },
1211
+ { name: 'enc', typeName: 'text' },
1212
+ { name: 'tarea', typeName: 'text' },
1213
+ ],
1214
+ coreFunction: async function (context, params) {
1215
+ await context.client.query(`
1216
+ UPDATE tem
1217
+ set tarea_actual = $3, supervision_dirigida = $4
1218
+ where operativo=$1 and enc=$2
1219
+ returning *`, [params.operativo, params.enc, 'supe', 2])
1220
+ .fetchUniqueRow();
1221
+ return 'ok';
1222
+ }
1223
+ },
1224
+ {
1225
+ action: 'encuesta_no_supervisar',
1226
+ parameters: [
1227
+ { name: 'operativo', typeName: 'text' },
1228
+ { name: 'enc', typeName: 'text' },
1229
+ { name: 'tarea', typeName: 'text' },
1230
+ ],
1231
+ coreFunction: async function (context, params) {
1232
+ await context.client.query(`
1233
+ UPDATE tem
1234
+ set tarea_actual = $3, supervision_dirigida = null
1235
+ where operativo=$1 and enc=$2
1236
+ returning *`, [params.operativo, params.enc, 'finc'])
1237
+ .fetchUniqueRow();
1238
+ return 'ok';
1239
+ }
1240
+ },
1241
+ {
1242
+ action: 'encuesta_pasar_a_anac',
1243
+ parameters: [
1244
+ { name: 'operativo', typeName: 'text' },
1245
+ { name: 'enc', typeName: 'text' },
1246
+ { name: 'tarea', typeName: 'text' },
1247
+ ],
1248
+ coreFunction: async function (context, params) {
1249
+ await context.client.query(`
1250
+ UPDATE tareas_tem
1251
+ set estado = 'CC'
1252
+ where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
1253
+ `, [params.operativo, params.enc, 'anac', 'proc'])
1254
+ .execute();
1255
+ await context.client.query(`
1256
+ UPDATE tem
1257
+ set tarea_actual = $3
1258
+ where operativo=$1 and enc=$2
1259
+ returning *`, [params.operativo, params.enc, 'anac'])
1260
+ .fetchUniqueRow();
1261
+ return 'ok';
1262
+ }
1263
+ },
1264
+ {
1265
+ action: 'encuesta_no_pasar_a_anac',
1266
+ parameters: [
1267
+ { name: 'operativo', typeName: 'text' },
1268
+ { name: 'enc', typeName: 'text' },
1269
+ { name: 'tarea', typeName: 'text' },
1270
+ ],
1271
+ coreFunction: async function (context, params) {
1272
+ await context.client.query(`
1273
+ UPDATE tareas_tem
1274
+ set estado = 'A'
1275
+ where operativo=$1 and enc=$2 and tarea= $3
1276
+ returning *`, [params.operativo, params.enc, 'proc'])
1277
+ .fetchUniqueRow();
1278
+ await context.client.query(`
1279
+ UPDATE tareas_tem
1280
+ set estado = '0D'
1281
+ where operativo=$1 and enc=$2 and tarea= $3
1282
+ returning *`, [params.operativo, params.enc, 'anac'])
1283
+ .fetchUniqueRow();
1284
+ await context.client.query(`
1285
+ UPDATE tem
1286
+ set tarea_actual = $3
1287
+ where operativo=$1 and enc=$2
1288
+ returning *`, [params.operativo, params.enc, 'proc'])
1289
+ .fetchUniqueRow();
1290
+ return 'ok';
1291
+ }
1292
+ },
1293
+ {
1294
+ action: 'encuesta_devolver_proc_desde_anac',
1295
+ parameters: [
1296
+ { name: 'operativo', typeName: 'text' },
1297
+ { name: 'enc', typeName: 'text' },
1298
+ { name: 'tarea', typeName: 'text' },
1299
+ ],
1300
+ coreFunction: async function (context, params) {
1301
+ var be = context.be;
1302
+ await be.procedure.encuesta_verificar.coreFunction(context, params);
1303
+ await context.client.query(`
1304
+ UPDATE tareas_tem
1305
+ set estado = 'A'
1306
+ where operativo=$1 and enc=$2 and tarea= $3
1307
+ returning *`, [params.operativo, params.enc, 'proc'])
1308
+ .fetchUniqueRow();
1309
+ await context.client.query(`
1310
+ UPDATE tem
1311
+ set tarea_actual = $3
1312
+ where operativo=$1 and enc=$2
1313
+ returning *`, [params.operativo, params.enc, 'proc'])
1314
+ .fetchUniqueRow();
1315
+ return 'ok';
1316
+ }
1317
+ },
1318
+ {
1319
+ action: 'encuesta_no_devolver_proc_desde_anac',
1320
+ parameters: [
1321
+ { name: 'operativo', typeName: 'text' },
1322
+ { name: 'enc', typeName: 'text' },
1323
+ { name: 'tarea', typeName: 'text' },
1324
+ ],
1325
+ coreFunction: async function (context, params) {
1326
+ var be = context.be;
1327
+ await context.client.query(`
1328
+ UPDATE tareas_tem
1329
+ set estado = 'CC'
1330
+ where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
1331
+ `, [params.operativo, params.enc, 'anac', 'proc'])
1332
+ .execute();
1333
+ await be.procedure.encuesta_no_verificar.coreFunction(context, params);
1334
+ return 'ok';
1335
+ }
1336
+ },
1337
+ {
1338
+ action: 'encuesta_recuperar_desde_anac',
1339
+ parameters: [
1340
+ { name: 'operativo', typeName: 'text' },
1341
+ { name: 'enc', typeName: 'text' },
1342
+ { name: 'tarea', typeName: 'text' },
1343
+ ],
1344
+ coreFunction: async function (context, params) {
1345
+ var be = context.be;
1346
+ var { operativo, enc, tarea } = params;
1347
+ await be.procedure.encuesta_verificar.coreFunction(context, params);
1348
+ await context.client.query(`
1349
+ update tem
1350
+ set tarea_actual = $3
1351
+ where operativo = $1 and enc = $2
1352
+ returning *`, [operativo, enc, 'recu'])
1353
+ .fetchUniqueRow();
1354
+ return 'ok';
1355
+ }
1356
+ },
1357
+ {
1358
+ action: 'encuesta_no_recuperar_desde_anac',
1359
+ parameters: [
1360
+ { name: 'operativo', typeName: 'text' },
1361
+ { name: 'enc', typeName: 'text' },
1362
+ { name: 'tarea', typeName: 'text' },
1363
+ ],
1364
+ coreFunction: async function (context, params) {
1365
+ var be = context.be;
1366
+ var { operativo, enc, tarea } = params;
1367
+ await context.client.query(`
1368
+ update tem
1369
+ set tarea_actual = $4
1370
+ where operativo = $1 and enc = $2 and tarea_actual = $3
1371
+ returning *`, [operativo, enc, 'recu', 'anac'])
1372
+ .fetchUniqueRow();
1373
+ await be.procedure.encuesta_no_verificar.coreFunction(context, params);
1374
+ return 'ok';
1375
+ }
1376
+ },
1377
+ {
1378
+ action: 'encuesta_forzar_tarea',
1379
+ parameters: [
1380
+ { name: 'operativo', typeName: 'text' },
1381
+ { name: 'enc', typeName: 'text' },
1382
+ { name: 'tarea_actual', typeName: 'text' },
1383
+ { name: 'tarea_nueva', typeName: 'text' },
1384
+ ],
1385
+ coreFunction: async function (context, params) {
1386
+ var { operativo, enc, tarea_actual, tarea_nueva } = params;
1387
+ await context.client.query(`
1388
+ update tem
1389
+ set tarea_actual = $4
1390
+ where operativo = $1 and enc = $2 and tarea_actual = $3
1391
+ returning *`, [operativo, enc, tarea_actual, tarea_nueva])
1392
+ .fetchUniqueRow();
1393
+ await context.client.query(`
1394
+ update tareas_tem
1395
+ set estado = 'V'
1396
+ where operativo = $1 and enc = $2 and tarea = $3
1397
+ returning *`, [operativo, enc, tarea_actual])
1398
+ .fetchUniqueRow();
1399
+ await context.client.query(`
1400
+ update tareas_tem
1401
+ set estado = '0D'
1402
+ where operativo = $1 and enc = $2 and tarea = $3
1403
+ returning *`, [operativo, enc, tarea_nueva])
1404
+ .fetchUniqueRow();
1405
+ return 'ok';
1406
+ }
1407
+ },
1408
+ {
1409
+ action: 'encuesta_habilitar_deshabilitar',
1410
+ parameters: [
1411
+ { name: 'operativo', typeName: 'text' },
1412
+ { name: 'enc', typeName: 'text' },
1413
+ ],
1414
+ coreFunction: async function (context, params) {
1415
+ await context.client.query(`
1416
+ UPDATE tem
1417
+ set habilitada = not habilitada
1418
+ where operativo=$1 and enc=$2
1419
+ returning *`, [params.operativo, params.enc])
1420
+ .fetchUniqueRow();
1421
+ return 'ok';
1422
+ }
1423
+ },
1424
+ {
1425
+ action: exports.ACCION_PASAR_PROIE,
1426
+ parameters: [],
1427
+ coreFunction: async function (context, _params) {
1428
+ let parametros = (await context.client.query(`
1429
+ select * from parametros where unico_registro`, []).fetchUniqueRow()).row;
1430
+ var select = `select t.operativo, t.enc, t.tarea_actual, tt.ts_entrada
1431
+ from tareas_tem tt join tem t using (operativo,enc)
1432
+ where tt.operativo=$1 and tt.tarea= $2 and (${(0, table_tareas_tem_1.getDiasAPasarQuery)('tt')} <= 0 or coalesce(tt.adelantar,false)) and tt.tarea = t.tarea_actual
1433
+ `;
1434
+ await context.client.query(`
1435
+ UPDATE tareas_tem tt
1436
+ set estado = 'V'
1437
+ from (${select}) aux
1438
+ where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
1439
+ returning *`, [parametros.operativo, 'finc', 'finc'])
1440
+ .fetchAll();
1441
+ //TODO asignar en procesamiento
1442
+ await context.client.query(`
1443
+ UPDATE tareas_tem tt
1444
+ set estado = 'A'
1445
+ from (${select}) aux
1446
+ where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
1447
+ returning *`, [parametros.operativo, 'finc', 'proc'])
1448
+ .fetchAll();
1449
+ await context.client.query(`
1450
+ update tem t
1451
+ set tarea_actual = 'proc'
1452
+ from (${select}) aux
1453
+ where t.operativo = aux.operativo and t.enc = aux.enc
1454
+ returning *`, [parametros.operativo, 'finc']).fetchAll();
1455
+ return 'ok';
1456
+ }
1457
+ },
1458
+ {
1459
+ action: 'intercambiar_encuestas',
1460
+ parameters: [
1461
+ { name: 'enc1', references: 'tem', typeName: 'text' },
1462
+ { name: 'rea1', typeName: 'integer' },
1463
+ { name: 'cantPerEnc1', typeName: 'integer' },
1464
+ { name: 'enc2', typeName: 'text' },
1465
+ { name: 'rea2', typeName: 'integer' },
1466
+ { name: 'cantPerEnc2', typeName: 'integer' },
1467
+ { name: 'paso', typeName: 'integer' },
1468
+ { name: 'confirma', typeName: 'boolean', defaultValue: false, label: 'Confirma intercambio de los datos entre las encuestas? ' },
1469
+ ],
1470
+ roles: ['coor_proc', 'coor_campo', 'admin'],
1471
+ progress: true,
1472
+ coreFunction: async function (context, params) {
1473
+ /**
1474
+ * Para controlar:
1475
+ * - que las hogares, personas, etc estén intercambiadas
1476
+ * * tanto en el json
1477
+ * * como en las TDs
1478
+ * - cosas que se calculan por la app? cuales? (resumen_estado, rea y norea)
1479
+ */
1480
+ var param_cantper = [params.cantPerEnc1, params.cantPerEnc2];
1481
+ var param_rea = [params.rea1, params.rea2];
1482
+ if (!params.confirma) {
1483
+ throw new Error('No confirmó intercambio');
1484
+ }
1485
+ if (!params.enc1 || !params.enc2) {
1486
+ throw new Error('Error, Falta ingresar un numero de encuesta!');
1487
+ }
1488
+ if (params.enc1 == params.enc2) {
1489
+ throw new Error('Error, enc1 y enc2 deben ser distintos!');
1490
+ }
1491
+ if ([1, 2].includes(params.paso)) {
1492
+ throw new Error('Error, paso debe ser 1(eliminar datos ) )o 2 (intercambio y regeneracion datos)');
1493
+ }
1494
+ if (params.paso == 1) {
1495
+ param_cantper.forEach((nper, i) => {
1496
+ if (!nper) {
1497
+ throw new Error(`Error, Cantidad de Personas Total de enc${i + 1}, no esta ingresado!`);
1498
+ }
1499
+ });
1500
+ }
1501
+ param_rea.forEach((r, i) => {
1502
+ if (!r) {
1503
+ throw new Error(`Error, rea de enc${i + 1}, no esta ingresado!`);
1504
+ }
1505
+ });
1506
+ // CONTROLAR QUE NINGUNA DE LAS 2 encuestas ESTE CARGADA, ABIERTA FALTA
1507
+ const OPERATIVO = await (0, exports.getOperativoActual)(context);
1508
+ const UA_PRINC = context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD);
1509
+ const pk_UA_PRINC = context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK);
1510
+ const datos_control = (await context.client.query(`
1511
+ select ${pk_UA_PRINC}, rea, count(*)np
1512
+ from tem t left join personas p on t.operativo=p.operativo and t.enc=p.${pk_UA_PRINC}
1513
+ where p.operativo=$1 and ${pk_UA_PRINC} IN ($2,$3)
1514
+ group by ${pk_UA_PRINC}, rea
1515
+ order by ${pk_UA_PRINC}
1516
+ `, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
1517
+ datos_control.forEach((dc, i) => {
1518
+ if (param_cantper[i] !== dc.np) {
1519
+ var xmens = `Error, no coincide la cantidad de personas de enc${i + 1}`;
1520
+ throw new Error(xmens);
1521
+ }
1522
+ ;
1523
+ if (param_rea[i] !== dc.rea) {
1524
+ var xmens = `Error, no coincide la rea de enc${i + 1}`;
1525
+ throw new Error(xmens);
1526
+ }
1527
+ ;
1528
+ });
1529
+ var datos_tem = (await context.client.query(`
1530
+ select t.enc, tarea_actual, json_encuesta, estado
1531
+ from tem t left join tareas_tem tt on t.operativo=tt.operativo and t.enc=tt.enc and t.tarea_actual=tt.tarea
1532
+ where t.operativo=$1 and t.enc in ($2,$3)
1533
+ order by t.enc
1534
+ `, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
1535
+ //FALTA controlar estado y tarea_actual
1536
+ /*
1537
+ datos_tem.forEach((dt,i)=>{
1538
+ if (!(['P'].includes(dt[i].estado)|| ['proc','finc','anac'].includes(dt[i].tarea_actual))) {
1539
+ var xmens=`Error, solo se puede intercambiar encuestas en tarea proc, finc, anac or en estado P, enc${i+1}`;
1540
+ throw new Error(xmens);
1541
+ }
1542
+ })
1543
+ */
1544
+ if (datos_tem.length != 2) {
1545
+ throw new Error('Error, No se encontraron 2 encuestas');
1546
+ }
1547
+ else {
1548
+ if (params.paso == 1) {
1549
+ // limpia las TDs
1550
+ for (let dtem of datos_tem) {
1551
+ await context.client.query(`delete from ${UA_PRINC} where operativo=$1 and ${pk_UA_PRINC}=$2`, [OPERATIVO, dtem.enc]).execute();
1552
+ }
1553
+ }
1554
+ else if (params.paso == 2) {
1555
+ const cant_viv = (await context.client.query(`
1556
+ select count(*) nviv
1557
+ from ${pk_UA_PRINC}
1558
+ where p.operativo=$1 and ${pk_UA_PRINC} IN ($2,$3)
1559
+ `, [OPERATIVO, params.enc1, params.enc2]).fetchUniqueValue()).value;
1560
+ if (cant_viv == 0) {
1561
+ //simula guardado
1562
+ let enc1 = datos_tem[0];
1563
+ let enc2 = datos_tem[1];
1564
+ await simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc1.enc, enc2.tarea_actual, enc2.json_encuesta);
1565
+ await simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc2.enc, enc1.tarea_actual, enc1.json_encuesta);
1566
+ //hacer intercambio del estado, asignado de la encuesta
1567
+ await context.client.query(`update tareas_tem
1568
+ set estado=$4,asignado=$5
1569
+ where operativo=$1 and enc=$2 and tarea=$3 `, [OPERATIVO, enc1.enc, enc2.tarea_actual, enc2.estado, enc2.asignado]).execute();
1570
+ await context.client.query(`update tareas_tem
1571
+ set estado=$4,asignado=$5
1572
+ where operativo=$1 and enc=$2 and tarea=$3 `, [OPERATIVO, enc2.enc, enc1.tarea_actual, enc1.estado, enc1.asignado]).execute();
1573
+ //registrar valor anterior en backup
1574
+ }
1575
+ else {
1576
+ throw new Error('Error, Falta realizar paso 1!');
1577
+ }
1578
+ }
1579
+ else {
1580
+ throw new Error('Error, paso no considerado!');
1581
+ }
1582
+ }
1583
+ return (`Listo paso ${params.paso}. Intercambio realizado entre las encuestas ${params.enc1} y ${params.enc2}. Por favor consista la encuesta`);
1584
+ }
1585
+ },
1586
+ {
1587
+ action: 'encuestador_dms_mostrar',
1588
+ parameters: [
1589
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1590
+ { name: 'encuestador', typeName: 'text' },
1591
+ ],
1592
+ roles: ['coor_proc', 'admin'],
1593
+ resultOk: 'mostrar_encuestas_a_blanquear',
1594
+ coreFunction: async function (context, params) {
1595
+ var result = await context.client.query(`
1596
+ select *
1597
+ from tareas_tem
1598
+ where operativo=$1 and asignado = $2 and cargado_dm is not null
1599
+ order by cargado_dm
1600
+ `, [params.operativo, params.encuestador])
1601
+ .fetchAll();
1602
+ if (result.rowCount == 0) {
1603
+ throw Error(`No se encontraron encuestas cargadas en un DM para el operativo ${params.operativo}, encuestador ${params.encuestador}`);
1604
+ }
1605
+ return { rows: result.rows, operativo: params.operativo };
1606
+ }
1607
+ },
1608
+ {
1609
+ action: 'dm_blanquear',
1610
+ parameters: [
1611
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1612
+ { name: 'token', typeName: 'text' },
1613
+ ],
1614
+ roles: ['coor_proc', 'admin'],
1615
+ coreFunction: async function (context, params) {
1616
+ var be = context.be;
1617
+ const UA_PRINCIPAL = await getUAPrincipal(context.client, params.operativo);
1618
+ let tareasTemResult = await context.client.query(`
1619
+ UPDATE tareas_tem
1620
+ set cargado_dm = null, operacion = 'descargar', estado = $3
1621
+ where operativo=$1 and cargado_dm = $2
1622
+ returning *`, [params.operativo, params.token, ESTADO_POSTERIOR_DESCARGA])
1623
+ .fetchAll();
1624
+ if (tareasTemResult.rowCount == 0) {
1625
+ throw (0, console_1.error)('No se blanqueó ninguna encuesta');
1626
+ }
1627
+ for (let tt of tareasTemResult.rows) {
1628
+ tt.result_blanqueo = `enc ${tt.enc} se blanqueó correctamente.`;
1629
+ let resultBackup = await context.client.query(`
1630
+ UPDATE tem
1631
+ set json_encuesta = json_backup, fecha_modif_encuesta = fecha_backup
1632
+ where operativo=$1 and enc=$2 and fecha_backup > coalesce(fecha_modif_encuesta, '1900-01-01') and json_backup is not null
1633
+ returning *`, [tt.operativo, tt.enc])
1634
+ .fetchOneRowIfExists();
1635
+ if (resultBackup.rowCount) {
1636
+ tt.result_blanqueo += ` Se restableció el backup con fecha ${resultBackup.row.fecha_backup.toYmdHms()}.`;
1637
+ var { params: queryParams, setters } = getSettersAndParametersForReaNoReaResumenEstado({
1638
+ tarea: tt.tarea,
1639
+ respuestasUAPrincipal: resultBackup.row.json_encuesta,
1640
+ setters: [],
1641
+ params: [tt.operativo, tt.enc, tt.tarea]
1642
+ });
1643
+ await context.client.query(`update tareas_tem
1644
+ set ${setters.join(',')}
1645
+ where operativo= $1 and enc = $2 and tarea = $3
1646
+ returning 'ok'`, queryParams).fetchUniqueRow();
1647
+ await simularGuardadoDeEncuestaDesdeAppEscritorio(context, resultBackup.row.operativo, resultBackup.row.enc, tt.tarea, resultBackup.row.json_encuesta);
1648
+ }
1649
+ }
1650
+ return tareasTemResult.rows;
1651
+ }
1652
+ },
1653
+ ];
1654
+ });
1655
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1kbWVuY3VfcmFxdWVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci9wcm9jZWR1cmVzLWRtZW5jdV9yYXF1ZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7OztJQUliLGtDQUFrQztJQUNsQyxpREFBK0I7SUFHL0IsaURBQWtEO0lBRWxELHlEQUE4QztJQUU5QywrQ0FBNkM7SUFDN0MsMkJBQW1DO0lBRW5DLGdEQUFnRDtJQUdoRCx5REFBd0Q7SUFDeEQscUNBQWdDO0lBR2hDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEMsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztJQUU3QixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztJQUNuQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztJQUl0QyxJQUFJLGVBQWdDLENBQUM7SUFFckMsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFBO0lBRWIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQW1CLEVBQUMsRUFBRSxDQUNyRCxlQUFlLEdBQUcsR0FBRyxDQUFDO0lBRGIsUUFBQSxrQkFBa0Isc0JBQ0w7SUFFbkIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFVLEVBQUMsRUFBRSxDQUN4QyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBRFQsUUFBQSxjQUFjLGtCQUNMO0lBRXRCLElBQUEsMEJBQWtCLEVBQUMsQ0FBQyxJQUFXLEVBQUMsS0FBWSxFQUFDLEVBQUUsQ0FBQSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENB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QyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7b0JBQ3pKLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEMsQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCwgVGFibGVEZWZpbml0aW9ucyB9IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmVDb250ZXh0LCBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBGb3JlaWduS2V5IH0gZnJvbSBcIm1ldGEtZW5jXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgSWRVbmlkYWRBbmFsaXNpcywgVW5pZGFkQW5hbGlzaXMsIEVzdGFkb0FjY2lvbiwgSWRFbmMsIElkVGFyZWEsIFJlc3B1ZXN0YXNSYWl6LCBJZE9wZXJhdGl2byB9IGZyb20gXCIuLi91bmxvZ2dlZC90aXBvc1wiO1xyXG5cclxuaW1wb3J0IHtPcGVyYXRpdm9HZW5lcmF0b3IgfSBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5cclxuaW1wb3J0IHtqc29uLCBqc29ub30gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQge2NoYW5naW5nLCBkYXRlIH0gZnJvbSAnYmVzdC1nbG9iYWxzJztcclxuaW1wb3J0IHtwcm9taXNlcyBhcyAgZnN9IGZyb20gXCJmc1wiO1xyXG5cclxuaW1wb3J0ICogYXMgRXhwcmVzaW9uUGFyc2VyIGZyb20gJ2V4cHJlLXBhcnNlcic7XHJcbmltcG9ydCB7IHRhcmVhcyB9IGZyb20gXCIuL3RhYmxlLXRhcmVhc1wiO1xyXG5pbXBvcnQgeyBwcmVwZW5kTGlzdGVuZXIgfSBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBnZXREaWFzQVBhc2FyUXVlcnkgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNfdGVtXCI7XHJcbmltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJ2bVwiO1xyXG5cclxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBzcWxUb29scyA9IHJlcXVpcmUoJ3NxbC10b29scycpO1xyXG5cclxudmFyIGRpc2NyZXBhbmNlcyA9IHJlcXVpcmUoJ2Rpc2NyZXBhbmNlcycpO1xyXG5cclxuY29uc3QgZm9ybVByaW5jaXBhbCA9ICdGOkYxJztcclxuXHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfQ0FSR0EgPSAnQyc7XHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EgPSAnRCc7XHJcblxyXG5leHBvcnQgdHlwZSBnZW5lcmFySWRFbmNGdW4gPSAoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+c3RyaW5nXHJcblxyXG52YXIgZ2VuZXJhcklkRW5jRnVuOiBnZW5lcmFySWRFbmNGdW47ICBcclxuXHJcbnZhciBtYXhBR2VuZXJhciA9IDUwXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0R2VuZXJhcklkRW5jRnVuID0gKGZ1bjpnZW5lcmFySWRFbmNGdW4pPT5cclxuICAgIGdlbmVyYXJJZEVuY0Z1biA9IGZ1bjtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNYXhBZ2VuZXJhciA9IChtYXg6bnVtYmVyKT0+XHJcbiAgICBtYXhBR2VuZXJhciA9IG1heDtcclxuXHJcbnNldEdlbmVyYXJJZEVuY0Z1bigoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+YXJlYS50b1N0cmluZygpICsgKGluZGV4KzEwKS50b1N0cmluZygpKTtcclxuXHJcbnNldE1heEFnZW5lcmFyKDEwMCk7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3BlcmF0aXZvQWN0dWFsID0gYXN5bmMgKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUucHJvY2VkdXJlLnRhYmxlX2RhdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQse3RhYmxlOiBgcGFyYW1ldHJvc2AsIGZpeGVkRmllbGRzOltdfSk7XHJcbiAgICBpZihyZXN1bHRbMF0/Lm9wZXJhdGl2byl7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFswXS5vcGVyYXRpdm9cclxuICAgIH1lbHNle1xyXG4gICAgICAgIHRocm93IEVycm9yICgnbm8gc2UgY29uZmlndXLDsyB1biBvcGVyYXRpdm8gZW4gbGEgdGFibGEgcGFyw6FtZXRyb3MnKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qZGVmaW5pY2nDs24gZGUgZXN0cnVjdHVyYSBjb21wbGV0YSwgY3VhbmRvIGV4aXN0YSBpbmctZW5jIGhheSBxdWUgcG9uZXJsbyBhaMOtKi8gXHJcbnR5cGUgRXN0cnVjdHVyYVRhYmxhPXt0YWJsZU5hbWU6c3RyaW5nLCBwa0ZpZWxkczp7ZmllbGROYW1lOnN0cmluZ31bXSwgY2hpbGRUYWJsZXM6RXN0cnVjdHVyYVRhYmxhW119O1xyXG5mdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCB0YWJsZU5hbWU6c3RyaW5nKXtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiA9IGJlLnRhYmxlU3RydWN0dXJlc1t0YWJsZU5hbWVdKGNvbnRleHQpO1xyXG4gICAgdmFyIGdldFBrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0UGtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24ocGspe1xyXG4gICAgICAgICAgICByZXR1cm4ge2ZpZWxkTmFtZTpwa307XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24sIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nKXtcclxuICAgICAgICAvLyByZXR1cm4gdGFibGVEZWYuZm9yZWlnbktleXM/IHRhYmxlRGVmLmZvcmVpZ25LZXlzLm1hcChmaz0+ZmsuZmllbGRzKTogW107XHJcbiAgICAgICAgbGV0IHBhcmVudEZrID0gKDxGb3JlaWduS2V5W10+IHRhYmxlRGVmLmZvcmVpZ25LZXlzKS5maW5kKGZrPT5may5yZWZlcmVuY2VzID09IHBhcmVudFRhYmxlTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudEZrPyBwYXJlbnRGay5maWVsZHM6IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdDpFc3RydWN0dXJhVGFibGE9e1xyXG4gICAgICAgIHRhYmxlTmFtZTptYWluVGFibGVEZWYubmFtZSxcclxuICAgICAgICBwa0ZpZWxkczpnZXRQa0Zyb21UYWJsZURlZihtYWluVGFibGVEZWYpLFxyXG4gICAgICAgIGNoaWxkVGFibGVzOltdXHJcbiAgICB9O1xyXG4gICAgaWYobWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcyAmJiBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmxlbmd0aCl7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRldGFpbFRhYmxlKXtcclxuICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2luZyhcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHtma0ZpZWxkczogZ2V0RmtGcm9tVGFibGVEZWYoYmUudGFibGVTdHJ1Y3R1cmVzW2RldGFpbFRhYmxlLnRhYmxlXShjb250ZXh0KSwgdGFibGVOYW1lKX1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG4vKiBmaW4gZGVmaW5pY2lvbiBlc3RydWN0dXJhIGNvbXBsZXRhICovXHJcblxyXG50eXBlIEFueU9iamVjdCA9IHtbazpzdHJpbmddOmFueX1cclxuXHJcbnZhciBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyA9IChmdW5QYXJhbXM6e3RhcmVhOklkVGFyZWEsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgc2V0dGVyczpzdHJpbmdbXSwgcGFyYW1zOmFueVtdfSk9PntcclxuICAgIGxldCB7dGFyZWEscmVzcHVlc3Rhc1VBUHJpbmNpcGFsLHNldHRlcnMscGFyYW1zfSA9IGZ1blBhcmFtcztcclxuICAgIGxldCB7cmVzdW1lbkVzdGFkb1N1cCwgY29kTm9SZWFTdXAsIGNvZFJlYVN1cCwgcmVzdW1lbkVzdGFkbywgY29kTm9SZWEsIGNvZFJlYX0gPSByZXNwdWVzdGFzVUFQcmluY2lwYWw7XHJcbiAgICBzZXR0ZXJzID0gc2V0dGVycy5jb25jYXQoW1xyXG4gICAgICAgIGByZXN1bWVuX2VzdGFkbyR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMX1gLFxyXG4gICAgICAgIGBub3JlYSR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMn1gLFxyXG4gICAgICAgIGByZWEke3RhcmVhPT0nc3VwZSc/J19zdXAnOicnfT0kJHtwYXJhbXMubGVuZ3RoKzN9YFxyXG4gICAgXSlcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5jb25jYXQoW1xyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/cmVzdW1lbkVzdGFkb1N1cDpyZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/Y29kTm9SZWFTdXA6Y29kTm9SZWEsXHJcbiAgICAgICAgdGFyZWE9PSdzdXBlJz9jb2RSZWFTdXA6Y29kUmVhXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB7c2V0dGVycyxwYXJhbXN9XHJcbn1cclxuXHJcbnZhciBndWFyZGFyRW5jdWVzdGFFblRlbSA9IGFzeW5jIChjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzpJZE9wZXJhdGl2bywgaWRFbmM6SWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgdGFyZWE6SWRUYXJlYSk9PntcclxuICAgIHZhciB7cGFyYW1zLHNldHRlcnN9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgIHRhcmVhLFxyXG4gICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxcclxuICAgICAgICBzZXR0ZXJzOiBbYGpzb25fZW5jdWVzdGEgPSAkM2AsIGBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IGN1cnJlbnRfdGltZXN0YW1wYF0sXHJcbiAgICAgICAgcGFyYW1zOiBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG59XHJcblxyXG52YXIgc2ltdWxhckd1YXJkYWRvRGVFbmN1ZXN0YURlc2RlQXBwRXNjcml0b3JpbyA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0ICxvcGVyYXRpdm86IHN0cmluZywgZW5jOiBJZEVuYywgdGFyZWE6IElkVGFyZWEsIGpzb25fZW5jdWVzdGE6YW55ICk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgb3BlcmF0aXZvKTtcclxuICAgIHJldHVybiBhd2FpdCBiZS5wcm9jZWR1cmUuZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86b3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgcGVyc2lzdGVudGVzOntcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIFtVQV9QUklOQ0lQQUxdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmNdOiBqc29uX2VuY3Vlc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGluZm9ybWFjaW9uSGRyOntcclxuICAgICAgICAgICAgICAgICAgICBbZW5jXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxufVxyXG5cclxudmFyIGdldEhkclF1ZXJ5ID0gIGZ1bmN0aW9uIGdldEhkclF1ZXJ5KHF1b3RlZENvbmRWaXY6c3RyaW5nLCBjb250ZXh0OkNvbnRleHQpe1xyXG4gICAgcmV0dXJuIGBcclxuICAgIHdpdGggJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9IGFzIFxyXG4gICAgICAgIChzZWxlY3QgdC5lbmMsIHQuanNvbl9lbmN1ZXN0YSBhcyByZXNwdWVzdGFzLCB0LnJlc3VtZW5fZXN0YWRvIGFzIFwicmVzdW1lbkVzdGFkb1wiLCBcclxuICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ2RvbWluaW8nICAgICAgICwgZG9taW5pbyAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnbm9tY2FsbGUnICAgICAgLCBub21jYWxsZSAgICAgICxcclxuICAgICAgICAgICAgICAgICdzZWN0b3InICAgICAgICAsIHNlY3RvciAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2VkaWZpY2lvJyAgICAgICwgZWRpZmljaW8gICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZW50cmFkYScgICAgICAgLCBlbnRyYWRhICAgICAgICxcclxuICAgICAgICAgICAgICAgICducm9jYXRhc3RyYWwnICAsIG5yb2NhdGFzdHJhbCAgLFxyXG4gICAgICAgICAgICAgICAgJ3Bpc28nICAgICAgICAgICwgcGlzbyAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZGVwYXJ0YW1lbnRvJyAgLCBkZXBhcnRhbWVudG8gICxcclxuICAgICAgICAgICAgICAgICdoYWJpdGFjaW9uJyAgICAsIGhhYml0YWNpb24gICAgLFxyXG4gICAgICAgICAgICAgICAgJ2Nhc2EnICAgICAgICAgICwgY2FzYSAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAncHJpb3JpZGFkJyAgICAgLCByZXNlcnZhKzEgICAgICxcclxuICAgICAgICAgICAgICAgICdvYnNlcnZhY2lvbmVzJyAsIHR0LmNhcmdhX29ic2VydmFjaW9uZXMgLFxyXG4gICAgICAgICAgICAgICAgJ2NpdGEnICAgICAgICAgICwgY2l0YSAsXHJcbiAgICAgICAgICAgICAgICAnY2FyZ2EnICAgICAgICAgLCB0LmFyZWEgICAgICAgICBcclxuICAgICAgICAgICAgKSBhcyB0ZW0sIHQuYXJlYSxcclxuICAgICAgICAgICAgLS1UT0RPOiBHRU5FUkFMSVpBUlxyXG4gICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAndGFyZWEnLCB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICdmZWNoYV9hc2lnbmFjaW9uJywgZmVjaGFfYXNpZ25hY2lvbixcclxuICAgICAgICAgICAgICAgICdhc2lnbmFkbycsIGFzaWduYWRvLFxyXG4gICAgICAgICAgICAgICAgJ21haW5fZm9ybScsIG1haW5fZm9ybVxyXG4gICAgICAgICAgICApIGFzIHRhcmVhLFxyXG4gICAgICAgICAgICBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGFfYXNpZ25hY2lvblxyXG4gICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiB0YXJlYXNfdGVtIHR0IG9uICh0Lm9wZXJhdGl2byA9IHR0Lm9wZXJhdGl2byBhbmQgdC5lbmMgPSB0dC5lbmMgYW5kIHQudGFyZWFfYWN0dWFsID0gdHQudGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIHRhcmVhcyB0YSBvbiB0LnRhcmVhX2FjdHVhbCA9IHRhLnRhcmVhXHJcbiAgICAgICAgICAgIHdoZXJlIHQuaGFiaWxpdGFkYSBhbmQgJHtxdW90ZWRDb25kVml2fVxyXG4gICAgICAgICAgICBncm91cCBieSB0LmVuYywgdC5qc29uX2VuY3Vlc3RhLCB0LnJlc3VtZW5fZXN0YWRvLCBkb21pbmlvLCBub21jYWxsZSxzZWN0b3IsZWRpZmljaW8sIGVudHJhZGEsIG5yb2NhdGFzdHJhbCwgcGlzbyxkZXBhcnRhbWVudG8saGFiaXRhY2lvbixjYXNhLHJlc2VydmEsdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcywgY2l0YSwgdC5hcmVhLCB0dC50YXJlYSwgZmVjaGFfYXNpZ25hY2lvbiwgYXNpZ25hZG8sIG1haW5fZm9ybVxyXG4gICAgICAgIClcclxuICAgICAgICBzZWxlY3QganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ3ZpdmllbmRhcycsICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBlbmMsIHJlc3B1ZXN0YXMsIGpzb25iX2J1aWxkX29iamVjdCgncmVzdW1lbkVzdGFkbycsXCJyZXN1bWVuRXN0YWRvXCIpIGFzIG90cmFzIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9YCxcclxuICAgICAgICAgICAgICAgICAgICAnZW5jJyxcclxuICAgICAgICAgICAgICAgICAgICBgb3RyYXMgfHwgY29hbGVzY2UocmVzcHVlc3Rhcywne30nOjpqc29uYilgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICApIGFzIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgYXJlYSBhcyBjYXJnYSwgb2JzZXJ2YWNpb25lc19oZHIgYXMgb2JzZXJ2YWNpb25lcywgbWluKGZlY2hhX2FzaWduYWNpb24pIGFzIGZlY2hhXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gaW5uZXIgam9pbiBhcmVhcyB1c2luZyAoYXJlYSkgXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgYXJlYSwgb2JzZXJ2YWNpb25lc19oZHJgLCBcclxuICAgICAgICAgICAgICAgICdmZWNoYScpfSBhcyBjYXJnYXMsXHJcbiAgICAgICAgICAgICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGVuYywganNvbmJfYnVpbGRfb2JqZWN0KCd0ZW0nLCB0ZW0sICd0YXJlYScsIHRhcmVhKSBhcyBvdHJhcyBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVEQpfWAsXHJcbiAgICAgICAgICAgICAgICAgJ2VuYycsXHJcbiAgICAgICAgICAgICAgICAgYG90cmFzIHx8J3t9Jzo6anNvbmJgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICBhcyBcImluZm9ybWFjaW9uSGRyXCJcclxuYFxyXG59XHJcblxyXG5leHBvcnQgdmFyIHNldEhkclF1ZXJ5ID0gKG15RnVuOihxdW90ZWRDb25kVml2OnN0cmluZywgY29udGV4dD86Q29udGV4dCk9PnN0cmluZyk9PiBnZXRIZHJRdWVyeT1teUZ1blxyXG5cclxuY29uc3QgZ2V0VUFQcmluY2lwYWwgPSBhc3luYyAoY2xpZW50OkNsaWVudCwgb3BlcmF0aXZvOnN0cmluZyk9PlxyXG4gICAgKGF3YWl0IGNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0IHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICBmcm9tIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBwcmluY2lwYWxcclxuICAgICAgICBgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIFtvcGVyYXRpdm9dXHJcbiAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWVcclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6e1trIGluIHN0cmluZ106Ym9vbGVhbn0gPSB7fVxyXG5cclxudmFyIGNvbXBpbGVyID0gbmV3IEV4cHJlc2lvblBhcnNlci5Db21waWxlcih7XHJcbiAgICBsYW5ndWFnZTonanMnLFxyXG4gICAgdmFyV3JhcHBlcjoodmFyX25hbWU6c3RyaW5nKT0+YGhlbHBlcnMubnVsbDJ6ZXJvKHZhbG9yZXMuJHt2YXJfbmFtZX0pYCxcclxuICAgIGZ1bldyYXBwZXI6KGZ1bmN0aW9uTmFtZTpzdHJpbmcpPT57XHJcbiAgICAgICAgaWYoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZnVuY3Rpb25OYW1lKVxyXG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgaGVscGVycy5mdW5zLiR7ZnVuY3Rpb25OYW1lfWBcclxuICAgIH1cclxufSlcclxuXHJcbnR5cGUgQ2FzaWxsZXJvRGVBY2E9e1xyXG4gICAgY2hpbGRzOiBDYXNpbGxlcm9EZUFjYVtdLFxyXG4gICAgZGF0YTp7XHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcjogc3RyaW5nXHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcl9qczogc3RyaW5nXHJcbiAgICAgICAgZXNwZWNpYWw6IGFueVxyXG4gICAgICAgIGV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanM6IHN0cmluZ1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbihleHByZXNpb246c3RyaW5nKXtcclxuICAgIHJldHVybiBjb21waWxlci50b0NvZGUoRXhwcmVzaW9uUGFyc2VyLnBhcnNlKFxyXG4gICAgICAgIGV4cHJlc2lvblxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwnIDw+ICcpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwnICcpXHJcbiAgICApKS5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmJsYW5jb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXHJcbiAgICAucmVwbGFjZSgvaGVscGVyc1xcLmZ1bnNcXC5pbmZvcm1hZG9cXChoZWxwZXJzLm51bGwyemVyb1xcKC9nLCdoZWxwZXJzLmZ1bnMuaW5mb3JtYWRvKCgnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm86Q2FzaWxsZXJvRGVBY2Epe1xyXG4gICAgaWYoIWNhc2lsbGVybyl7IHJldHVybiB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKXtcclxuICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyX2pzID0gY29tcGlsYXJFeHByZXNpb24oY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2hhYmlsaXRhcik7XHJcbiAgICB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5lc3BlY2lhbD8uYXV0b2luZyl7XHJcbiAgICAgICAgdmFyIHBhcnRlcyA9IGNhc2lsbGVyby5kYXRhLmVzcGVjaWFsPy5hdXRvaW5nLnNwbGl0KCc9PicpO1xyXG4gICAgICAgIGlmKHBhcnRlcy5sZW5ndGg+MSl7XHJcbiAgICAgICAgICAgIHZhciBwcmVjb25kaWNpb24gPSBwYXJ0ZXNbMF07XHJcbiAgICAgICAgICAgIHZhciB2YWxvciA9IHBhcnRlcy5zbGljZSgxKS5qb2luKCc9PicpO1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gYCgke2NvbXBpbGFyRXhwcmVzaW9uKHByZWNvbmRpY2lvbil9KT8oJHtjb21waWxhckV4cHJlc2lvbih2YWxvcil9KTpudWxsYDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2F1dG9pbmdyZXNhcl9qcyA9IGNvbXBpbGFyRXhwcmVzaW9uKHBhcnRlc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yKHZhciBjYXNpbGxlcm9JbnRlcm5vIG9mIGNhc2lsbGVyby5jaGlsZHMpIGNvbXBpbGFyRXhwcmVzaW9uZXMoY2FzaWxsZXJvSW50ZXJubyk7XHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMgPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykgPT4gXHJcbiAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgaW5zZXJ0IGludG8gdGFyZWFzX3RlbSAob3BlcmF0aXZvLCBlbmMsIHRhcmVhKVxyXG4gICAgICAgICAgICBzZWxlY3QgdGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhXHJcbiAgICAgICAgICAgIGZyb20gKHNlbGVjdCB0YS4qLCB0LmVuYyx0LmFyZWEgZnJvbSB0YXJlYXMgdGEsIHRlbSB0IHdoZXJlIHRhLm9wZXJhdGl2bz10Lm9wZXJhdGl2bykgdGEgXHJcbiAgICAgICAgICAgIHdoZXJlIHRhLm9wZXJhdGl2byA9ICQxIFxyXG4gICAgICAgICAgICAgICAgYW5kIG5vdCAodGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhKSBpbiAoc2VsZWN0IG9wZXJhdGl2bywgZW5jLCB0YXJlYSBmcm9tIHRhcmVhc190ZW0pXHJcbiAgICAgICAgICAgIG9yZGVyIGJ5IDEsMywyO1xyXG4gICAgYCxbb3BlcmF0aXZvXSkuZXhlY3V0ZSgpO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0lPTl9QQVNBUl9QUk9JRSA9ICdlbmN1ZXN0YXNfcHJvY2VzYW1pZW50b19wYXNhcic7XHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzRG1FbmN1IDogUHJvY2VkdXJlRGVmW10gPSBbXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidvcGVyYXRpdm9fZXN0cnVjdHVyYV9jb21wbGV0YScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgICAgLHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6J2Rlc3BsZWdhckZvcm11bGFyaW8nLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgY2FzaWxsZXJvc19qZXJhcnF1aXphZG9zKCQxKSBhcyBmb3JtdWxhcmlvcywgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgc2VsZWN0IHVuaWRhZF9hbmFsaXNpcywgcGFkcmUsIHBrX2FncmVnYWRhLCAne30nOjpqc29uYiBhcyBoaWphcyBmcm9tIHVuaWRhZF9hbmFsaXNpcyB3aGVyZSBvcGVyYXRpdm8gPSAkMmAsICd1bmlkYWRfYW5hbGlzaXMnKX0gYXMgdW5pZGFkZXNfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm8sIHBhcmFtZXRlcnMub3BlcmF0aXZvXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LmZvcm11bGFyaW9zKS5mb3JFYWNoKGY9PmNvbXBpbGFyRXhwcmVzaW9uZXMoZikpO1xyXG4gICAgICAgICAgICAvLyBIZXJtYW5vcyBzb24gbG9zIGZvcm11bGFyaW9zIHF1ZSBlc3TDoW4gaW1wbGFudGFkb3MgZW4gb3RybyBmb3JtdWxhcmlvIGRlIGxhIG1pc21hIFVBLiBQb3IgZWplbXBsbyBlbCBBMSBlbiBlbCBTMVxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0SGVybWFub3MgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbnNlbGVjdCBvLmlkX2Nhc2lsbGVybyBhcyBpZF9mb3JtdWxhcmlvLCBvLnVuaWRhZF9hbmFsaXNpcywgJ0JGXyd8fG8uY2FzaWxsZXJvIGJvdG9uLCBiZi5jYXNpbGxlcm8sIGJmLnBhZHJlLCBmcC5jYXNpbGxlcm8sIGZwLnVuaWRhZF9hbmFsaXNpc1xyXG4gIGZyb20gY2FzaWxsZXJvcyBvIGxlZnQgam9pbiBjYXNpbGxlcm9zIGJmXHJcbiAgICBvbiBiZi50aXBvYz0nQkYnXHJcblx0YW5kIGJmLmNhc2lsbGVybyA9ICdCRl8nfHxvLmNhc2lsbGVyb1xyXG5cdGFuZCBiZi5vcGVyYXRpdm8gPSBvLm9wZXJhdGl2b1xyXG5cdGxlZnQgam9pbiBjYXNpbGxlcm9zIGZwXHJcblx0ICBvbiBmcC5pZF9jYXNpbGxlcm8gPSBiZi5wYWRyZVxyXG5cdCAgYW5kIGZwLm9wZXJhdGl2byA9IGJmLm9wZXJhdGl2b1xyXG4gIHdoZXJlIG8udGlwb2MgPSAnRidcclxuICAgIGFuZCBvLnVuaWRhZF9hbmFsaXNpcyA9IGZwLnVuaWRhZF9hbmFsaXNpc1xyXG5cdGFuZCBvLm9wZXJhdGl2byA9ICQxYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXN1bHRIZXJtYW5vcy5yb3dzLmZvckVhY2gocm93PT57XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucm93LmZvcm11bGFyaW9zW3Jvdy5pZF9mb3JtdWxhcmlvXS5kYXRhLmhlcm1hbm8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJVQSh1YTpVbmlkYWRBbmFsaXNpcywgaWRVYTpJZFVuaWRhZEFuYWxpc2lzLCB1QXM6e1trIGluIElkVW5pZGFkQW5hbGlzaXNdOiBVbmlkYWRBbmFsaXNpc30pe1xyXG4gICAgICAgICAgICAgICAgaWYodWEucGFkcmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHVBc1t1YS5wYWRyZV0uaGlqYXNbaWRVYV0gPSB1YTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHVhLnByaW5jaXBhbD10cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LnVuaWRhZGVzX2FuYWxpc2lzKS5mb3JFYWNoKCh1YSwgaWRVYSk9PlxyXG4gICAgICAgICAgICAgICAgY29tcGxldGFyVUEodWEsIGlkVWEgYXMgSWRVbmlkYWRBbmFsaXNpcywgcmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB2YXIge1xyXG4gICAgICAgICAgICAgICAgY29uX3JlYV9ob2dhcjogY29uUmVhSG9nYXIsIFxyXG4gICAgICAgICAgICAgICAgY29uZmlnX3NvcnRlbzogY29uZmlnU29ydGVvLCBcclxuICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbl9ib3Rvbl9mb3JtdWxhcmlvOmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhOiBwZXJtaXRlR2VuZXJhck11ZXN0cmFcclxuICAgICAgICAgICAgfSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbywgY29uX3JlYV9ob2dhciwgaGFiaWxpdGFjaW9uX2JvdG9uX2Zvcm11bGFyaW8sIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbWV0ZXJzLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgbGV0IGNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyA9IChleHByZXNpb25lc0RvbWluaW86YW55KT0+IFxyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGV4cHJlc2lvbmVzRG9taW5pbylcclxuICAgICAgICAgICAgICAgICAgICAubWFwKChleHByLGRvbWluaW8pPT4oe2RvbWluaW8sIGV4cHI6Y29tcGlsYXJFeHByZXNpb24oZXhwci5leHByKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5wbGFpbigpO1xyXG4gICAgICAgICAgICBpZihjb25maWdTb3J0ZW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGNvbmZpZ1NvcnRlbykuZm9yRWFjaCgoY29uZmlnU29ydGVvRm9ybXVsYXJpbyk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmV4cHJfaW5jb21wbGV0aXR1ZF9qcz1jb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5leHByX2luY29tcGxldGl0dWQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm9fanM9Y29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZmlsdHJvKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbykuZm9yRWFjaCgoZm9ybSk9PntcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmV4cHJfaGFiaWxpdGFyX2JvdG9uX2pzPWNvbXBpbGFyRXhwcmVzaW9uKGZvcm0uZXhwcl9oYWJpbGl0YXJfYm90b24pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7dGltZXN0YW1wOiBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSwgLi4ucmVzdWx0LnJvdywgb3BlcmF0aXZvOnBhcmFtZXRlcnMub3BlcmF0aXZvLCBjb25SZWFIb2dhciwgY29uZmlnU29ydGVvLCBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSwgbm9SZWFzOmJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXNTdXA6YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZ2VuZXJhcl9mb3JtdWxhcmlvcycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidhbm5pbycsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczonYW5uaW8nfSxcclxuICAgICAgICAgICAge25hbWU6J21lcycgICwgdHlwZU5hbWU6J2ludGVnZXInLCByZWZlcmVuY2VzOidtZXMnICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG90ZScgLCB0eXBlTmFtZTonaW50ZWdlcicsIHJlZmVyZW5jZXM6J2xvdGVzJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0VUEgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgZnJvbSB1bmlkYWRfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgICAgIHdoZXJlIHByaW5jaXBhbCA9IHRydWUgYW5kIG9wZXJhdGl2byA9ICQxXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWT11cclxuICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRVQS5yb3dDb3VudCA9PT0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGNvbmZpZ3Vyw7MgdW5hIHVuaWRhZCBkZSBhbmFsaXNpcyBjb21vIHByaW5jaXBhbCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByb3cgPSByZXN1bHRVQS5yb3c7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRQcmVndW50YXMgPSBhd2FpdCBiZS5wcm9jZWR1cmUucHJlZ3VudGFzX3VhX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3cpXHJcbiAgICAgICAgICAgIHZhciBjb250ZW5lZG9yVmFjaW86e1trZXk6c3RyaW5nXTphbnl9ID0ge307XHJcbiAgICAgICAgICAgIHJlc3VsdFByZWd1bnRhcy5mb3JFYWNoKGZ1bmN0aW9uKGRlZlByZWd1bnRhKXtcclxuICAgICAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpb1tkZWZQcmVndW50YS52YXJfbmFtZV0gPSBkZWZQcmVndW50YS51bmlkYWRfYW5hbGlzaXM/W106bnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5hbm5pbz0gcGFyYW1ldGVycy5hbm5pbztcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLm1lcyAgPSBwYXJhbWV0ZXJzLm1lcyAgO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubG90ZSA9IHBhcmFtZXRlcnMubG90ZSA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGRlYmVfaGFiZXIuaWRfY2FzbywgcyBhcyBpZFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBsb3RlLCBhcm1hcl9pZChhbm5pbywgbWVzLCBsb3RlLCBzKSBhcyBpZF9jYXNvLCBzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBhbm5pbyxtZXMsbG90ZSwgY2FudF9jdWVzIGZyb20gbG90ZXMgd2hlcmUgKGFubmlvLG1lcyxsb3RlKT0oJDIsJDMsJDQpKSByLCBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLGNhbnRfY3Vlcykgc1xyXG4gICAgICAgICAgICAgICAgICAgICkgZGViZV9oYWJlciBsZWZ0IGpvaW4gZGVmZ2VuIGhheSBvbiBoYXkuaWRfY2FzbyA9IGRlYmVfaGFiZXIuaWRfY2FzbyBhbmQgaGF5Lm9wZXJhdGl2bz0kMVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIGhheS5pZF9jYXNvIGlzIG51bGxgLFxyXG4gICAgICAgICAgICAgICAgWyBPUEVSQVRJVk8sIHBhcmFtZXRlcnMuYW5uaW8sIHBhcmFtZXRlcnMubWVzLCBwYXJhbWV0ZXJzLmxvdGVdXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtvcGVyYXRpdm86IE9QRVJBVElWT307XHJcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgcmVzdWx0LnJvd0NvdW50OyBpKyspe1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcocGFyYW1zLHtpZF9jYXNvOnJlc3VsdC5yb3dzW2ldLmlkX2Nhc28sIGRhdG9zX2Nhc286Y2hhbmdpbmcoY29udGVuZWRvclZhY2lvLHtpZDpyZXN1bHQucm93c1tpXS5pZH0pfSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge2FncmVnYWRhczpyZXN1bHQucm93Q291bnR9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3VwbG9hZF9maWxlJyxcclxuICAgICAgICBwcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6ICdpZF9hZGp1bnRvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOiAnbm9tYnJlJywgdHlwZU5hbWU6ICd0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBmaWxlczp7Y291bnQ6MX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBmaWxlcyl7XHJcbiAgICAgICAgICAgIGxldCBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBsZXQgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICBjb250ZXh0LmluZm9ybVByb2dyZXNzKHttZXNzYWdlOmJlLm1lc3NhZ2VzLmZpbGVVcGxvYWRlZH0pO1xyXG4gICAgICAgICAgICBsZXQgZmlsZSA9IGZpbGVzWzBdXHJcbiAgICAgICAgICAgIGxldCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZS5wYXRoKS5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbEZpbGVuYW1lID0gZmlsZS5vcmlnaW5hbEZpbGVuYW1lLnNsaWNlKDAsLShleHQubGVuZ3RoKzEpKTtcclxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lPSBwYXJhbWV0ZXJzLm5vbWJyZSB8fCBvcmlnaW5hbEZpbGVuYW1lO1xyXG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9ICdsb2NhbC1hdHRhY2htZW50cy9maWxlLSc7XHJcbiAgICAgICAgICAgIHZhciBjcmVhdGVSZXNwb25zZSA9IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKGFkanVudG9Sb3cpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTGEgc3ViaWRhIHNlIHJlYWxpesOzIGNvcnJlY3RhbWVudGUgKHVwZGF0ZSknLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZTogYWRqdW50b1Jvdy5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlX29yaWdpbmFsOiBhZGp1bnRvUm93Lm5vbWJyZV9vcmlnaW5hbCxcclxuICAgICAgICAgICAgICAgICAgICBleHQ6IGFkanVudG9Sb3cuZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGZlY2hhOiBhZGp1bnRvUm93LmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvcmE6IGFkanVudG9Sb3cuaG9yYSxcclxuICAgICAgICAgICAgICAgICAgICBpZF9hZGp1bnRvOiBhZGp1bnRvUm93LmlkX2FkanVudG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbW92ZUZpbGUgPSBmdW5jdGlvbiBtb3ZlRmlsZShmaWxlLCBpZF9hZGp1bnRvLCBleHRlbnNpb24pe1xyXG4gICAgICAgICAgICAgICAgZnMubW92ZShmaWxlLnBhdGgsIG5ld1BhdGggKyBpZF9hZGp1bnRvICsgJy4nICsgZXh0ZW5zaW9uLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVycy5pZF9hZGp1bnRvKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgbm9tYnJlPSAkMSxub21icmVfb3JpZ2luYWwgPSAkMiwgZXh0ID0gJDMsIHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJywkNDo6dGV4dCwnLicsJDM6OnRleHQpLCBmZWNoYSA9IG5vdygpLCBob3JhID0gZGF0ZV90cnVuYygnc2Vjb25kcycsY3VycmVudF90aW1lc3RhbXAtY3VycmVudF9kYXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDQgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsZW5hbWUsIG9yaWdpbmFsRmlsZW5hbWUsIGV4dCwgcGFyYW1ldGVycy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0YWRvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZpbGUoZmlsZSxyZXN1bHRhZG8uaWRfYWRqdW50byxyZXN1bHRhZG8uZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBhZGp1bnRvcyAobm9tYnJlLCBub21icmVfb3JpZ2luYWwsIGV4dCwgZmVjaGEsIGhvcmEpIHZhbHVlcyAoJDEsJDIsJDMsbm93KCksIGRhdGVfdHJ1bmMoJ3NlY29uZHMnLGN1cnJlbnRfdGltZXN0YW1wLWN1cnJlbnRfZGF0ZSkpIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVuYW1lLCBvcmlnaW5hbEZpbGVuYW1lLCBleHRdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGB1cGRhdGUgYWRqdW50b3Mgc2V0IHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJyxpZF9hZGp1bnRvOjp0ZXh0LCcuJyxleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDEgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdC5yb3cuaWRfYWRqdW50b11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdGFkbyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLHJlc3VsdGFkby5pZF9hZGp1bnRvLHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2Nhc29fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAsIHR5cGVOYW1lOid0ZXh0JyAgICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidkYXRvc19jYXNvJyAgLCB0eXBlTmFtZTonanNvbmInICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZGVmaW5lZEluOiAnZG1lbmN1JyxcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXNwZWNpZmljbyBlbCB0aXBvIGRlIGxvcyBwYXLDoW1ldHJvc1xyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6e1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86c3RyaW5nLCBcclxuICAgICAgICAgICAgaWRfY2FzbzpzdHJpbmcsXHJcbiAgICAgICAgICAgIGRhdG9zX2Nhc286QW55T2JqZWN0XHJcbiAgICAgICAgfSxuZXdDbGllbnQ6Q2xpZW50KXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1uZXdDbGllbnQgfHwgY29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBkYXRvc19qc29uPXBhcmFtZXRlcnMuZGF0b3NfY2FzbztcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHRhYmxlU3RydWN0dXJlc19hcHA6VGFibGVEZWZpbml0aW9ucyA9IGJlLnRhYmxlU3RydWN0dXJlcztcclxuICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHN0cnVjdF9kbWVuY3UgPSBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bJ29wZXJhdGl2byddID0gcGFyYW1ldGVycy5vcGVyYXRpdm87XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19qc29uW09wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQS10gPSBwYXJhbWV0ZXJzLmlkX2Nhc287XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKCB1bHRfcGssIHVhX2Fycil7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29uX3BrX2NvbXBsZXRhPXVhX2FycjsgXHJcbiAgICAgICAgICAgICAgICBpZiAodWFfYXJyICYmIHVhX2Fyci5sZW5ndGg+PTEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbl9wa19jb21wbGV0YT0gY29uX3BrX2NvbXBsZXRhLm1hcCgodW5hX3VhLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYV91YVt1bHRfcGtdPWkrMSAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5hX3VhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbl9wa19jb21wbGV0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZGF0b3NqKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXlOYW1lIGluIGRhdG9zaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRvSyA9IGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0b0sgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvSy5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGsgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleU5hbWVdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bHRfcGsgPSBwa1tway5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0sgPSBjb21wbGV0YXJfdWx0X3BrX2VuX2Fycih1bHRfcGssIGRhdG9LKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0suZm9yRWFjaCgoZWxlbUkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1JPXJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZWxlbUkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlOYW1lLnN0YXJ0c1dpdGgoJyQnKXx8a2V5TmFtZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b3NqO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGRhdG9zX2pzb24gPSByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGRhdG9zX2pzb24pO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhU3VwO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvU3VwO1xyXG5cclxuICAgICAgICAgICAgaWYoIE9iamVjdC5rZXlzKGRhdG9zX2pzb24pLmxlbmd0aCA+Mil7XHJcbiAgICAgICAgICAgICAgICB2YXIgcXVlcmllcyA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFdyaXRlKGRhdG9zX2pzb24sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJpZXMucmVkdWNlKGZ1bmN0aW9uKHByb21pc2UsIHF1ZXJ5KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5leGVjdXRlKCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxQcm9taXNlLnJlc29sdmUoKSkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9rXCI7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnI6RXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Fzb19ndWFyZGFyIEVOVFJBIEVOIEVMIENBVENIOiBcIixlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAndmFjaW8nO1xyXG4gICAgICAgICAgICB9ICAgIFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICAvL3tuYW1lOidmb3JtdWxhcmlvJyAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAgICx0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdnb1RvRW5jJyxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoe29wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtZXRlcnMuaWRfY2Fzb30sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgdml2aWVuZGE6IHBhcmFtZXRlcnMuaWRfY2FzbyxcclxuICAgICAgICAgICAgICAgIGRhdG9zX2Nhc286IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC8vZm9ybXVsYXJpbzogZm9ybVByaW5jaXBhbCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcl9vX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19wcmVwYXJhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19ndWFyZGFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIGNoYW5naW5nKHBhcmFtZXRlcnMsIHtkYXRvc19jYXNvOmpzb259KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qIEdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIEZST00gJHtPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREfSBMSU1JVCAxYCkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYocmVzdWx0TWFpbi5yb3dDb3VudD4wKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIQVkgREFUT1MnLHJlc3VsdE1haW4ucm93cylcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSEFZIERBVE9TLiBOTyBTRSBQVUVERSBJTklDSUFSIEVMIFBBU0FKRScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRKc29uID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgU0VMRUNUIG9wZXJhdGl2bywgZW5jIGlkX2Nhc28sIGpzb25fZW5jdWVzdGEgZGF0b3NfY2FzbyBmcm9tIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBvcGVyYXRpdm89JDEgYW5kIHJlc3VtZW5fZXN0YWRvIGlzIGRpc3RpbmN0IGZyb20gJ3ZhY2lvJyBhbmQganNvbl9lbmN1ZXN0YSBpcyBub3QgbnVsbCBcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBlbmMgYCxcclxuICAgICAgICAgICAgICAgIFtPUEVSQVRJVk9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICBpZihwcm9jZWR1cmVHdWFyZGFyLmRlZmluZWRJbiE9J2RtZW5jdScpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYXkgcXVlIHNvYnJlZXNjcmliaXIgY2Fzb19ndWFyZGFyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdEpzb24ucm93cy5tYXAoYXN5bmMgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgY2FzbyAke3Jvdy5pZF9jYXNvfTogYDtcclxuICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIGZ1bmN0aW9uKGNsaWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbys9IGF3YWl0IHByb2NlZHVyZUd1YXJkYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHJvdywgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJqc29uMnVhIGVycm9yLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0YWRvLmluY2x1ZGVzKCdvaycpKXsgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfSA9IGF3YWl0IGJlLnByb2NlZHVyZS5jYXNvX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7b3BlcmF0aXZvOnJvdy5vcGVyYXRpdm8sIGlkX2Nhc286cm93LmlkX2Nhc299KVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJRdWVHcmFibyA9IHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3JlcGFuY2VzLnNob3dBbmRUaHJvdyh2ZXJRdWVHcmFibyxyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZlclF1ZUdyYWJvLHJvdylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgICAgICAgICB9KSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondml2aWVuZGEnICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcInRhcmVhc1wifSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLHZpdmllbmRhLCB0YXJlYX0gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbWFpbl9mb3JtID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBtYWluX2Zvcm1cclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHRhcmVhPSQyYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgdGFyZWFdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbmR2aXY9IGAgdC5vcGVyYXRpdm89ICQxIGFuZCB0LmVuYyA9JDJgO1xyXG4gICAgICAgICAgICB2YXIgc29sb0xlY3R1cmEgPSAhIShhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gam9pbiBlc3RhZG9zIHVzaW5nIChvcGVyYXRpdm8sIGVzdGFkbykgLS1wayBlc3RhZG8gdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdhZG9fZG0gaXMgbm90IG51bGwgb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwZXJtaXRlX2VkaXRhcl9lbmN1ZXN0YSBhbmQgYXNpZ25hZG8gPD4gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChjb250ZXh0LnVzZXIuaWRwZXIpfVxyXG4gICAgICAgICAgICAgICAgICAgIClgLCBbb3BlcmF0aXZvLCB2aXZpZW5kYV0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93Q291bnQ7XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtvcGVyYXRpdm8sdml2aWVuZGFdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByb3cuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhPXtcclxuICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgIH0gO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmEsXHJcbiAgICAgICAgICAgICAgICBpZFBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsfSkpLCAnY2FyZ2EnKSxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcEVzdHJ1Y3R1cmE6YmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmFcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgcGVyc2lzdGVudGVzfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIGNvbnN0IFVBX1BSSU5DSVBBTCA9IGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBvcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsaWRFbmMpPT57XHJcbiAgICAgICAgICAgICAgICBpZihyZXNwdWVzdGFzVUFQcmluY2lwYWwuczFhMV9vYnMgPT0gJyFwcnVlYmEgZGUgZXJyb3IgYWwgZ3JhYmFyIScpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRElPIFBSVUVCQSBERSBFUlJPUiBBTCBHUkFCQVInKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50YXJlYS50YXJlYSk7XHJcbiAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgZW5jICR7aWRFbmN9OiBgO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogb3BlcmF0aXZvLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvKz0gYXdhaXQgcHJvY2VkdXJlR3VhcmRhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1fZ3VhcmRhciwgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVyck1lc3NhZ2UgPSByZXN1bHRhZG8gKyBcImRtX2ZvcnBrcmFpel9kZXNjYXJnYXIuIFwiKyBlcnIgO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwYXNlX3RhYmxhPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgW29wZXJhdGl2bywgaWRFbmMsIHJlc3VsdGFkb11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTsgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICB9KS5hcnJheSgpKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvaydcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fc2luY3Jvbml6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge3BlcnNpc3RlbnRlc30gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbnVtX3NpbmNybzpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIHRva2VuOnN0cmluZ3xudWxsPXBlcnNpc3RlbnRlcz8udG9rZW47XHJcbiAgICAgICAgICAgIGlmKCF0b2tlbil7XHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IChhd2FpdCBiZS5wcm9jZWR1cmUudG9rZW5fZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcmFnZW50OiBjb250ZXh0LnNlc3Npb24ucmVxLnVzZXJhZ2VudCwgXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IGNvbnRleHQudXNlcm5hbWVcclxuICAgICAgICAgICAgICAgIH0pKS50b2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIge3ZhbHVlfSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNpbmNyb25pemFjaW9uZXMgKHRva2VuLCB1c3VhcmlvLCBkYXRvcylcclxuICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKCQxLCQyLCQzKSBcclxuICAgICAgICAgICAgICAgICAgICBSRVRVUk5JTkcgc2luY3JvXHJcbiAgICAgICAgICAgICAgICBgLCBbdG9rZW4sIGNvbnRleHQudXNlcm5hbWUsIHBlcnNpc3RlbnRlc11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIG51bV9zaW5jcm89dmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2PSBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0Lm9wZXJhdGl2bz0gJDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhc2lnbmFkbyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0dC5vcGVyYWNpb249J2NhcmdhcicgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAodHQuY2FyZ2Fkb19kbSBpcyBudWxsIG9yIHR0LmNhcmdhZG9fZG0gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKHRva2VuKX0pXHJcbiAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkNJUEFMID0gYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgICAgIGlmKHBlcnNpc3RlbnRlcyl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsIGlkRW5jKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJlYSA9IHBlcnNpc3RlbnRlcy5pbmZvcm1hY2lvbkhkcltpZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB1ZWRvR3VhcmRhckVuVEVNPXRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtwYXJhbXMsc2V0dGVyc30gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlc3RhZG8gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EpfWAsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhcmdhZG9fZG09bnVsbGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbT1BFUkFUSVZPLCBpZEVuYywgdGFyZWEsIHRva2VuXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5VGFyZWFzVGVtID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7c2V0dGVycy5qb2luKCcsJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkMyBhbmQgY2FyZ2Fkb19kbSA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNcclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBwdWVkb0d1YXJkYXJFblRFTT1xdWVyeVRhcmVhc1RlbS5yb3dDb3VudD09MTtcclxuICAgICAgICAgICAgICAgICAgICBpZihwdWVkb0d1YXJkYXJFblRFTSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogT1BFUkFUSVZPLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyLCBjbGllbnQpOyAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHBhc2VfdGFibGE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVjaWJpZG8tc2luLXRva2VuLnR4dCcsIEpTT04uc3RyaW5naWZ5KHtub3c6bmV3IERhdGUoKSx1c2VyOmNvbnRleHQudXNlcm5hbWUsaWRDYXNvOiBpZEVuYyx2aXZpZW5kYTogcmVzcHVlc3Rhc1VBUHJpbmNpcGFsfSkrJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtPUEVSQVRJVk8sY29udGV4dC51c2VyLmlkcGVyXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICBzZXQgIGVzdGFkbyA9ICQ0LCBjYXJnYWRvX2RtPSQzOjp0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtjb25kdml2fSBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgZW5jYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgcGFyYW1ldGVycy5lbmM/cGFyYW1ldGVycy5lbmM6Y29udGV4dC51c2VyLmlkcGVyLCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmE6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIG51bV9zaW5jcm8sXHJcbiAgICAgICAgICAgICAgICBpZHBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsLCBlc3RhZG9fY2FyZ2E6J3JlbGV2YW1pZW50byd9KSksICdjYXJnYScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2JhY2t1cCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0ZW0nICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2JlLCBjbGllbnR9ID1jb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBudW1fc2luY3JvOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW46c3RyaW5nfG51bGw9cGFyYW1ldGVycy50b2tlbjtcclxuICAgICAgICAgICAgaWYodG9rZW4gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB2YXIge3Jvd0NvdW50fSA9IGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0IDEgZnJvbSB0b2tlbnMgd2hlcmUgdG9rZW4gPSAkMWAsW3Rva2VuXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYoIXJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRlbSl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGFyYW1ldGVycy50ZW0pLm1hcChhc3luYyAoYmFja3VwOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2JhY2t1cCA9ICQzLCBmZWNoYV9iYWNrdXAgPSBjdXJyZW50X3RpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIGpzb25fYmFja3VwIGlzIGRpc3RpbmN0IGZyb20gJDRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGJhY2t1cC5mb3JQa1JhaXoudml2aWVuZGEsIGJhY2t1cC5yZXNwdWVzdGFzUmFpeiwgYmFja3VwLnJlc3B1ZXN0YXNSYWl6XVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgfSkuYXJyYXkoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2NvbnNpc3Rpcl92aXZpZW5kYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3ZpdmllbmRhJyAgICAgICAsdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIHtiZSwgY2xpZW50fSA9Y29udGV4dDtcclxuICAgICAgICAgICAgbGV0IHBhcmFtX3Byb2M9e1xyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBwYXJhbWV0ZXJzLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgIGlkX2Nhc286IHBhcmFtZXRlcnMudml2aWVuZGFcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0YWRvOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0YWRvPSBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX2VuY3Vlc3RhLmNvcmVGdW5jdGlvbihjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcHJvYywgY2xpZW50XHJcbiAgICAgICAgICAgICAgICApOyAgICBcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gXCIgY29uc2lzdGlyX3ZpdmllbmRhLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcqKioqKiogY29uc2lzdGlyX3ZpdmllbmRhIHJlc3VsdGFkbzonLHJlc3VsdGFkbykgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9yZXNjYXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidsb2NhbFN0b3JhZ2VJdGVtJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG9jYWxTdG9yYWdlSXRlbUtleScgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciB7bG9jYWxTdG9yYWdlSXRlbUtleSwgbG9jYWxTdG9yYWdlSXRlbX0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsU3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVzY2F0ZS50eHQnLCBKU09OLnN0cmluZ2lmeSh7bm93Om5ldyBEYXRlKCksdXNlcjpjb250ZXh0LnVzZXJuYW1lLCBpdGVtS2V5OiBsb2NhbFN0b3JhZ2VJdGVtS2V5LCBpdGVtRGF0YTogbG9jYWxTdG9yYWdlSXRlbX0pKydcXG5cXG4nLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdvcGVyYXRpdm9fZ2V0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2dldF9yYW5kb21fZnJlZV9jYXNlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOlt7bmFtZTonb3BlcmF0aXZvJyAgICAsIHR5cGVOYW1lOid0ZXh0J31dLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgbWluc1RvRXhwaXJlID0gMzA7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbnNTaW5jZUJsb3F1ZWQgPSBgZGF0ZV9wYXJ0KCdtaW4nLCBhZ2UoY3VycmVudF90aW1lc3RhbXAsIGZlY2hhX2Jsb3F1ZW8pKWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYyA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBzZWxlY3QgZW5jIGZyb20gdGVtIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgKGxpYnJlIG9yICR7bWluc1NpbmNlQmxvcXVlZH0gPiAke21pbnNUb0V4cGlyZX0pIGxpbWl0IDE7YCxbcGFyYW1zLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFVQREFURSB0ZW0gc2V0IGxpYnJlID0gZmFsc2UsIGZlY2hhX2Jsb3F1ZW89Y3VycmVudF90aW1lc3RhbXAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJgLFtwYXJhbXMub3BlcmF0aXZvLCBlbmMudmFsdWVdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtdWVzdHJhX2dlbmVyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgICAgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCJ9LFxyXG4gICAgICAgICAgICB7bmFtZTonYXJlYScgICAgICAgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczogXCJhcmVhc1wifSxcclxuICAgICAgICAgICAge25hbWU6J2RvbWluaW8nICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicsIGRlZmF1bHRWYWx1ZTogM30sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50X2VuY3Vlc3RhcycgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgYmUgPSAgY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYX0gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICBpZihwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSl7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGVtVGFibGVEZWY6VGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzWyd0ZW0nXShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihwYXJhbXMuY2FudF9lbmN1ZXN0YXMsbWF4QUdlbmVyYXIpOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmMgPSBnZW5lcmFySWRFbmNGdW4ocGFyYW1zLmFyZWEsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIGludG8gdGVtIChvcGVyYXRpdm8sIGVuYywgYXJlYSwgZG9taW5pbywgaGFiaWxpdGFkYSkgdmFsdWVzICgkMSwgJDIsICQzLCAkNCwgJDUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uIGNvbmZsaWN0ICgke3NxbFRvb2xzLnF1b3RlSWRlbnRBcnJheSh0ZW1UYWJsZURlZi5wcmltYXJ5S2V5KS5qb2luKCcsJyl9KSBkbyBub3RoaW5nYCxcclxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgZW5jLCBwYXJhbXMuYXJlYSwgcGFyYW1zLmRvbWluaW8sIHRydWVdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJlbCBvcGVyYXRpdm8gbm8gcGVybWl0ZSBnZW5lcmFyIG11ZXN0cmFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyAgICAgXHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYmxhbnF1ZWFyX3ByZXZpc3VhbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6J21vc3RyYXJfZW5jdWVzdGFfYV9ibGFucXVlYXJfY29udGVuaWRvJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IgKGBObyBzZSBlbmNvbnRyw7MgbGEgZW5jdWVzdGEgJHtwYXJhbXMuZW5jfSBwYXJhIGVsIG9wZXJhdGl2byAke3BhcmFtcy5vcGVyYXRpdm99LiAke2Vyci5tZXNzYWdlfWAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7Y2Fzb1RlbTogcmVzdWx0LnJvd307XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOlsnY29vcl9wcm9jJywnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tICR7YmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgLy9wYXNvIGEgZW5jdSBwYXJhIGd1YXJkYXIgZW4gaGlzdG9yaWFsXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhX2FjdHVhbCA9ICdlbmN1J1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvKTsgICAgICAgICBcclxuICAgICAgICAgICAgLy9yZXNldGVvIHRlbSAobm8gc2UgZ3VhcmRhIGhpc3RvcmlhbCBwb3JxdWUgdGFyZWFfYWN0dWFsIGVzIG51bGwpXHJcbiAgICAgICAgICAgIC8vZ3VhcmRvIGJhY2t1cCBwb3IgbGFzIGR1ZGFzXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fYmFja3VwID0ganNvbl9lbmN1ZXN0YSwganNvbl9lbmN1ZXN0YSA9IG51bGwsIHRhcmVhX2FjdHVhbCA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gbnVsbCwgZmVjaGFfYmFja3VwID0gY3VycmVudF90aW1lc3RhbXAsIG1vZGlmaWNhZG8gPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVuX2VzdGFkbyA9IG51bGwsIHJlc3VtZW5fZXN0YWRvX3N1cCA9IG51bGwsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzZV90YWJsYSA9IG51bGwsIHJlYSA9IG51bGwsIG5vcmVhID0gbnVsbCwgcmVhX3N1cCA9IG51bGwsIG5vcmVhX3N1cCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbl9jb25fdmFyXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIHBrX2ludGVncmFkYS0+PiR7YmUuZGIucXVvdGVMaXRlcmFsKE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSyl9ID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzX3VsdGltYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYGxhIGVuY3Vlc3RhICR7cGFyYW1zLmVuY30gc2UgYmxhbnF1ZcOzIGNvcnJlY3RhbWVudGVgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWNjaW9uX3RhcmVhc190ZW1fZWplY3V0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonY29uZGljaW9uJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidhY2Npb24nICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9ICBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgYWNjaW9uID0gcGFyYW1zLmFjY2lvbiBhcyBFc3RhZG9BY2Npb247XHJcbiAgICAgICAgICAgIHZhciBjdW1wbGU6Ym9vbGVhbiA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgYWNjaW9uX2N1bXBsZV9jb25kaWNpb24oJDUsICQ2LCAkNywgJDgsIChcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY29uZGljaW9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSBlc3RhZG9zX2FjY2lvbmVzIFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVzdGFkbyA9ICQyIGFuZCBlYWNjaW9uID0gJDMgYW5kIGVzdGFkb19kZXN0aW5vID0gJDRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKWAsIFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbiwgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG8sIFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmVuYywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbixcclxuICAgICAgICAgICAgXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgaWYoIWN1bXBsZSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgcHVkbyBlamVjdXRhciBsYSBhY2Npw7NuLCBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzbiBcIiR7cGFyYW1zLmNvbmRpY2lvbn1cIiBvIGJpZW4gZWwgZXN0YWRvIGVzdMOhIGRlc2FjdHVhbGl6YWRvLCByZWZyZXNxdWUgbGEgZ3JpbGxhLmApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmM9JDIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5lbmMsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgaWYoYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgaWYoYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGV4aXN0ZSBlbCBwcm9jZWR1cmUgXCIke2FjY2lvbi5ub21icmVfcHJvY2VkdXJlfVwiIGRlZmluaWRvIGVuIGxhIHRhYmxhIFwiZXN0YWRvc19hY2Npb25lc1wiIHBhcmEgZWxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm86ICR7YWNjaW9uLm9wZXJhdGl2b30sIGVzdGFkbzogJHthY2Npb24uZXN0YWRvfSwgZWFjY2lvbjogJHthY2Npb24uZWFjY2lvbn0uYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBCVVNDTyBQQVNFIERFIFRBUkVBXHJcbiAgICAgICAgICAgIHZhciB0YXJlYVNpZ3VpZW50ZSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3Byb3hpbWFzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byA9ICQxIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSAkMiBhbmQgZXN0YWRvID0gJDMgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYV9jdW1wbGVfY29uZGljaW9uKCQ0LCAkNSwgJDYsICQ3LCBjb25kaWNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgb3JkZW5cclxuICAgICAgICAgICAgICAgICAgICBsaW1pdCAxYFxyXG4gICAgICAgICAgICAsW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSxcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlubyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5lbmNcclxuICAgICAgICAgICAgXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3c7XHJcbiAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlKXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vXVxyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGF1dG9Bc2lnbmFkbyA9IHRhcmVhU2lndWllbnRlLnJlZ2lzdHJhX3JlY2VwY2lvbmlzdGE/Y29udGV4dC51c2VyLmlkcGVyOm51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGNvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0c19lbnRyYWRhID0gY3VycmVudF90aW1lc3RhbXAsIGFkZWxhbnRhciA9IG51bGwsIGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2F1dG9Bc2lnbmFkbz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiwgcmVjZXBjaW9uaXN0YT1cIitxKGF1dG9Bc2lnbmFkbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcIlwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vLCB0YXJlYVNpZ3VpZW50ZS5lc3RhZG9fZGVzdGlub11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVt0YXJlYVNpZ3VpZW50ZS5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBGSU4gUEFTRSBERSBUQVJFQVxyXG4gICAgICAgICAgICByZXR1cm4gXCJva1wiO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGlzcG9uaWJpbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBhc2lnbmFkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rlc2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICdjYXJnYXInXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9hbmFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtvcGVyYXRpdm86cGFyYW1zLm9wZXJhdGl2bywgaWRfY2FzbzpwYXJhbXMuZW5jfSlcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV92ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gJzEnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub192ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2VycmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9ICcxJywgYXNpZ25hZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jLCBjb250ZXh0LnVzZXIuaWRwZXJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jZXJyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfc3VwZXJ2aXNhcl9wcmVzZW5jaWFsJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdzdXBlJywgMV0pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3N1cGVydmlzYXJfdGVsZWZvbmljYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnc3VwZScsIDJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19zdXBlcnZpc2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2ZpbmMnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfcGFzYXJfYV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3Bhc2FyX2FfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX25vX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3JlY3VwZXJhcl9kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtvcGVyYXRpdm8sIGVuYywgdGFyZWF9ID0gcGFyYW1zO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdSddKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19yZWN1cGVyYXJfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLCBlbmMsIHRhcmVhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdScsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfbm9fdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZm9yemFyX3RhcmVhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYV9hY3R1YWwnICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhX251ZXZhJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnVicgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWxdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfaGFiaWxpdGFyX2Rlc2hhYmlsaXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGhhYmlsaXRhZGEgPSBub3QgaGFiaWxpdGFkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246IEFDQ0lPTl9QQVNBUl9QUk9JRSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbWV0cm9zID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb2AsXHJcbiAgICAgICAgICAgIFtdKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3QgPSBgc2VsZWN0IHQub3BlcmF0aXZvLCB0LmVuYywgdC50YXJlYV9hY3R1YWwsIHR0LnRzX2VudHJhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSB0dCBqb2luIHRlbSB0IHVzaW5nIChvcGVyYXRpdm8sZW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdHQub3BlcmF0aXZvPSQxIGFuZCB0dC50YXJlYT0gJDIgYW5kICgke2dldERpYXNBUGFzYXJRdWVyeSgndHQnKX0gPD0gMCBvciBjb2FsZXNjZSh0dC5hZGVsYW50YXIsZmFsc2UpKSBhbmQgdHQudGFyZWEgPSB0LnRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdWJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAnZmluYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgLy9UT0RPIGFzaWduYXIgZW4gcHJvY2VzYW1pZW50b1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAncHJvYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSB0XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICdwcm9jJ1xyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0LmVuYyA9IGF1eC5lbmNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAgLFxyXG4gICAgICAgICAgICBbcGFyYW1ldHJvcy5vcGVyYXRpdm8sICdmaW5jJ10pLmZldGNoQWxsKCk7XHJcbiAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2ludGVyY2FtYmlhcl9lbmN1ZXN0YXMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonZW5jMScgICAgICAgICAgICAgICAgLHJlZmVyZW5jZXM6J3RlbScgLCB0eXBlTmFtZTondGV4dCcgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTEnICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMScgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jMicgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCcgICAgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTInICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMicgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZToncGFzbycgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J2NvbmZpcm1hJyAgICAgICAgICAgICwgdHlwZU5hbWU6J2Jvb2xlYW4nLCBkZWZhdWx0VmFsdWU6ZmFsc2UsIGxhYmVsOidDb25maXJtYSBpbnRlcmNhbWJpbyBkZSBsb3MgZGF0b3MgZW50cmUgbGFzIGVuY3Vlc3Rhcz8gJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdjb29yX2NhbXBvJywnYWRtaW4nXSxcclxuICAgICAgICBwcm9ncmVzczp0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBQYXJhIGNvbnRyb2xhcjpcclxuICAgICAgICAgICAgICogLSBxdWUgbGFzIGhvZ2FyZXMsIHBlcnNvbmFzLCBldGMgZXN0w6luIGludGVyY2FtYmlhZGFzIFxyXG4gICAgICAgICAgICAgKiAgKiB0YW50byBlbiBlbCBqc29uXHJcbiAgICAgICAgICAgICAqICAqIGNvbW8gZW4gbGFzIFREc1xyXG4gICAgICAgICAgICAgKiAtIGNvc2FzIHF1ZSBzZSBjYWxjdWxhbiBwb3IgbGEgYXBwPyBjdWFsZXM/IChyZXN1bWVuX2VzdGFkbywgcmVhIHkgbm9yZWEpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1fY2FudHBlcj1bcGFyYW1zLmNhbnRQZXJFbmMxLHBhcmFtcy5jYW50UGVyRW5jMl07XHJcbiAgICAgICAgICAgIHZhciBwYXJhbV9yZWE9W3BhcmFtcy5yZWExLHBhcmFtcy5yZWEyXTsgICAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5jb25maXJtYSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpcm3DsyBpbnRlcmNhbWJpbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCAhcGFyYW1zLmVuYzEgfHwgIXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgRmFsdGEgaW5ncmVzYXIgdW4gbnVtZXJvIGRlIGVuY3Vlc3RhIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICggcGFyYW1zLmVuYzE9PXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgZW5jMSB5IGVuYzIgZGViZW4gc2VyIGRpc3RpbnRvcyEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoWzEsMl0uaW5jbHVkZXMocGFyYW1zLnBhc28pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBwYXNvIGRlYmUgc2VyIDEoZWxpbWluYXIgZGF0b3MgKSApbyAyIChpbnRlcmNhbWJpbyB5IHJlZ2VuZXJhY2lvbiBkYXRvcyknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLnBhc289PTEpe1xyXG4gICAgICAgICAgICAgICAgcGFyYW1fY2FudHBlci5mb3JFYWNoKChucGVyLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFucGVyKSAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCBDYW50aWRhZCBkZSBQZXJzb25hcyBUb3RhbCBkZSBlbmMke2krMX0sIG5vIGVzdGEgaW5ncmVzYWRvIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgcGFyYW1fcmVhLmZvckVhY2goKHIsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghcikgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCByZWEgIGRlIGVuYyR7aSsxfSwgbm8gZXN0YSBpbmdyZXNhZG8hYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pICAgXHJcbiAgICAgICAgICAgIC8vIENPTlRST0xBUiBRVUUgTklOR1VOQSBERSBMQVMgMiBlbmN1ZXN0YXMgRVNURSBDQVJHQURBLCBBQklFUlRBIEZBTFRBXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gICA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkMgICAgPSBjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBrX1VBX1BSSU5DID0gY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSykgICAgXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdG9zX2NvbnRyb2w9KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAke3BrX1VBX1BSSU5DfSwgcmVhLCBjb3VudCgqKW5wIFxyXG4gICAgICAgICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiBwZXJzb25hcyBwIG9uIHQub3BlcmF0aXZvPXAub3BlcmF0aXZvIGFuZCB0LmVuYz1wLiR7cGtfVUFfUFJJTkN9XHJcbiAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwIGJ5ICR7cGtfVUFfUFJJTkN9LCByZWFcclxuICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgJHtwa19VQV9QUklOQ31cclxuICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19jb250cm9sLmZvckVhY2goKGRjLGkpPT57XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1fY2FudHBlcltpXSAhPT0gZGMubnApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeG1lbnM9YEVycm9yLCBubyBjb2luY2lkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBkZSBlbmMke2krMX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih4bWVucyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtX3JlYVtpXSAhPT0gZGMucmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgbm8gY29pbmNpZGUgbGEgcmVhIGRlIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pOyAgICBcclxuXHJcbiAgICAgICAgICAgIHZhciBkYXRvc190ZW09KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCB0LmVuYywgdGFyZWFfYWN0dWFsLCBqc29uX2VuY3Vlc3RhLCBlc3RhZG8gXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW0gdCBsZWZ0IGpvaW4gdGFyZWFzX3RlbSB0dCBvbiB0Lm9wZXJhdGl2bz10dC5vcGVyYXRpdm8gYW5kIHQuZW5jPXR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWw9dHQudGFyZWEgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm89JDEgYW5kIHQuZW5jIGluICgkMiwkMykgXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgdC5lbmMgXHJcbiAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgIC8vRkFMVEEgY29udHJvbGFyIGVzdGFkbyB5IHRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICBkYXRvc190ZW0uZm9yRWFjaCgoZHQsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghKFsnUCddLmluY2x1ZGVzKGR0W2ldLmVzdGFkbyl8fCBbJ3Byb2MnLCdmaW5jJywnYW5hYyddLmluY2x1ZGVzKGR0W2ldLnRhcmVhX2FjdHVhbCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgc29sbyBzZSBwdWVkZSBpbnRlcmNhbWJpYXIgZW5jdWVzdGFzIGVuIHRhcmVhIHByb2MsIGZpbmMsIGFuYWMgb3IgZW4gZXN0YWRvIFAsIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTsgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkYXRvc190ZW0ubGVuZ3RoIT0yKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIE5vIHNlIGVuY29udHJhcm9uIDIgZW5jdWVzdGFzJykgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmICggcGFyYW1zLnBhc28gPT0gMSApe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbXBpYSBsYXMgVERzIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZHRlbSBvZiBkYXRvc190ZW0peyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZGVsZXRlIGZyb20gJHtVQV9QUklOQ30gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfT0kMmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZHRlbS5lbmNdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmIChwYXJhbXMucGFzbyA9PSAyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW50X3Zpdj0oYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgIGNvdW50KCopIG52aXYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAke3BrX1VBX1BSSU5DfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FudF92aXY9PTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zaW11bGEgZ3VhcmRhZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuYzEgPSBkYXRvc190ZW1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmMyID0gZGF0b3NfdGVtWzFdOyAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMxLmVuYywgZW5jMi50YXJlYV9hY3R1YWwgLCBlbmMyLmpzb25fZW5jdWVzdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMyLmVuYywgZW5jMS50YXJlYV9hY3R1YWwgLCBlbmMxLmpzb25fZW5jdWVzdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2hhY2VyIGludGVyY2FtYmlvIGRlbCBlc3RhZG8sIGFzaWduYWRvIGRlIGxhIGVuY3Vlc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbz0kNCxhc2lnbmFkbz0kNSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9JDMgYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBbT1BFUkFUSVZPLCBlbmMxLmVuYywgZW5jMi50YXJlYV9hY3R1YWwsIGVuYzIuZXN0YWRvLCBlbmMyLmFzaWduYWRvXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvPSQ0LGFzaWduYWRvPSQ1IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0kMyBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFtPUEVSQVRJVk8sIGVuYzIuZW5jLCBlbmMxLnRhcmVhX2FjdHVhbCwgZW5jMS5lc3RhZG8sIGVuYzEuYXNpZ25hZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZXhlY3V0ZSgpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVnaXN0cmFyIHZhbG9yIGFudGVyaW9yIGVuIGJhY2t1cCBcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgRmFsdGEgcmVhbGl6YXIgcGFzbyAxIScpIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIHBhc28gbm8gY29uc2lkZXJhZG8hJykgICAgXHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIChgTGlzdG8gcGFzbyAke3BhcmFtcy5wYXNvfS4gSW50ZXJjYW1iaW8gcmVhbGl6YWRvIGVudHJlIGxhcyBlbmN1ZXN0YXMgICR7cGFyYW1zLmVuYzF9IHkgJHtwYXJhbXMuZW5jMn0uIFBvciBmYXZvciBjb25zaXN0YSBsYSBlbmN1ZXN0YWApXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHsgICAgIFxyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhZG9yX2Rtc19tb3N0cmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6XCJvcGVyYXRpdm9zXCJ9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jdWVzdGFkb3InICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6J21vc3RyYXJfZW5jdWVzdGFzX2FfYmxhbnF1ZWFyJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgYXNpZ25hZG8gPSAkMiBhbmQgY2FyZ2Fkb19kbSBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyIGJ5IGNhcmdhZG9fZG1cclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY3Vlc3RhZG9yXSlcclxuICAgICAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdC5yb3dDb3VudCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yIChgTm8gc2UgZW5jb250cmFyb24gZW5jdWVzdGFzIGNhcmdhZGFzIGVuIHVuIERNIHBhcmEgZWwgb3BlcmF0aXZvICR7cGFyYW1zLm9wZXJhdGl2b30sIGVuY3Vlc3RhZG9yICR7cGFyYW1zLmVuY3Vlc3RhZG9yfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtyb3dzOiByZXN1bHQucm93cywgb3BlcmF0aXZvOiBwYXJhbXMub3BlcmF0aXZvfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2RtX2JsYW5xdWVhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnLCByZWZlcmVuY2VzOlwib3BlcmF0aXZvc1wifSxcclxuICAgICAgICAgICAge25hbWU6J3Rva2VuJyAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOlsnY29vcl9wcm9jJywnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGNvbnN0IFVBX1BSSU5DSVBBTCA9IGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbXMub3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgbGV0IHRhcmVhc1RlbVJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGNhcmdhZG9fZG0gPSBudWxsLCBvcGVyYWNpb24gPSAnZGVzY2FyZ2FyJywgZXN0YWRvID0gJDNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGNhcmdhZG9fZG0gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudG9rZW4sIEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0FdKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYodGFyZWFzVGVtUmVzdWx0LnJvd0NvdW50ID09IDApe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3IoJ05vIHNlIGJsYW5xdWXDsyBuaW5ndW5hIGVuY3Vlc3RhJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IobGV0IHR0IG9mIHRhcmVhc1RlbVJlc3VsdC5yb3dzKXtcclxuICAgICAgICAgICAgICAgIHR0LnJlc3VsdF9ibGFucXVlbyA9IGBlbmMgJHt0dC5lbmN9IHNlIGJsYW5xdWXDsyBjb3JyZWN0YW1lbnRlLmA7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0QmFja3VwID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGpzb25fZW5jdWVzdGEgPSBqc29uX2JhY2t1cCwgZmVjaGFfbW9kaWZfZW5jdWVzdGEgPSBmZWNoYV9iYWNrdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDIgYW5kIGZlY2hhX2JhY2t1cCA+IGNvYWxlc2NlKGZlY2hhX21vZGlmX2VuY3Vlc3RhLCAnMTkwMC0wMS0wMScpIGFuZCBqc29uX2JhY2t1cCBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgW3R0Lm9wZXJhdGl2bywgdHQuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHRCYWNrdXAucm93Q291bnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHR0LnJlc3VsdF9ibGFucXVlbys9YCBTZSByZXN0YWJsZWNpw7MgZWwgYmFja3VwIGNvbiBmZWNoYSAke3Jlc3VsdEJhY2t1cC5yb3cuZmVjaGFfYmFja3VwLnRvWW1kSG1zKCl9LmBcclxuICAgICAgICAgICAgICAgICAgICB2YXIge3BhcmFtczpxdWVyeVBhcmFtcyxzZXR0ZXJzfSA9IGdldFNldHRlcnNBbmRQYXJhbWV0ZXJzRm9yUmVhTm9SZWFSZXN1bWVuRXN0YWRvKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6IHR0LnRhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWw6IHJlc3VsdEJhY2t1cC5yb3cuanNvbl9lbmN1ZXN0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogW3R0Lm9wZXJhdGl2bywgdHQuZW5jLCB0dC50YXJlYV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3NldHRlcnMuam9pbignLCcpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgcmVzdWx0QmFja3VwLnJvdy5vcGVyYXRpdm8sIHJlc3VsdEJhY2t1cC5yb3cuZW5jLCB0dC50YXJlYSxyZXN1bHRCYWNrdXAucm93Lmpzb25fZW5jdWVzdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRhcmVhc1RlbVJlc3VsdC5yb3dzO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbl07Il19