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 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
+ //hacer 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29waWFyICgyKSBwcm9jZWR1cmVzLWRtZW5jdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvQ29waWFyICgyKSBwcm9jZWR1cmVzLWRtZW5jdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBSWIsa0NBQWtDO0lBQ2xDLGlEQUErQjtJQUcvQixpREFBa0Q7SUFFbEQseURBQThDO0lBRTlDLCtDQUE2QztJQUM3QywyQkFBbUM7SUFFbkMsZ0RBQWdEO0lBR2hELHlEQUF3RDtJQUN4RCxxQ0FBZ0M7SUFHaEMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVwQyxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFM0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBRTdCLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0lBQ25DLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0lBSXRDLElBQUksZUFBZ0MsQ0FBQztJQUVyQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7SUFFYixNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBbUIsRUFBQyxFQUFFLENBQ3JELGVBQWUsR0FBRyxHQUFHLENBQUM7SUFEYixRQUFBLGtCQUFrQixzQkFDTDtJQUVuQixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVUsRUFBQyxFQUFFLENBQ3hDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFEVCxRQUFBLGNBQWMsa0JBQ0w7SUFFdEIsSUFBQSwwQkFBa0IsRUFBQyxDQUFDLElBQVcsRUFBQyxLQUFZLEVBQUMsRUFBRSxDQUFBLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFR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LDJDQUEyQyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7b0JBQ3pKLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEMsQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCwgVGFibGVEZWZpbml0aW9ucyB9IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmVDb250ZXh0LCBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBGb3JlaWduS2V5IH0gZnJvbSBcIm1ldGEtZW5jXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgSWRVbmlkYWRBbmFsaXNpcywgVW5pZGFkQW5hbGlzaXMsIEVzdGFkb0FjY2lvbiwgSWRFbmMsIElkVGFyZWEsIFJlc3B1ZXN0YXNSYWl6LCBJZE9wZXJhdGl2byB9IGZyb20gXCIuLi91bmxvZ2dlZC90aXBvc1wiO1xyXG5cclxuaW1wb3J0IHtPcGVyYXRpdm9HZW5lcmF0b3IgfSBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5cclxuaW1wb3J0IHtqc29uLCBqc29ub30gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQge2NoYW5naW5nLCBkYXRlIH0gZnJvbSAnYmVzdC1nbG9iYWxzJztcclxuaW1wb3J0IHtwcm9taXNlcyBhcyAgZnN9IGZyb20gXCJmc1wiO1xyXG5cclxuaW1wb3J0ICogYXMgRXhwcmVzaW9uUGFyc2VyIGZyb20gJ2V4cHJlLXBhcnNlcic7XHJcbmltcG9ydCB7IHRhcmVhcyB9IGZyb20gXCIuL3RhYmxlLXRhcmVhc1wiO1xyXG5pbXBvcnQgeyBwcmVwZW5kTGlzdGVuZXIgfSBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBnZXREaWFzQVBhc2FyUXVlcnkgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNfdGVtXCI7XHJcbmltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJ2bVwiO1xyXG5cclxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBzcWxUb29scyA9IHJlcXVpcmUoJ3NxbC10b29scycpO1xyXG5cclxudmFyIGRpc2NyZXBhbmNlcyA9IHJlcXVpcmUoJ2Rpc2NyZXBhbmNlcycpO1xyXG5cclxuY29uc3QgZm9ybVByaW5jaXBhbCA9ICdGOkYxJztcclxuXHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfQ0FSR0EgPSAnQyc7XHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EgPSAnRCc7XHJcblxyXG5leHBvcnQgdHlwZSBnZW5lcmFySWRFbmNGdW4gPSAoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+c3RyaW5nXHJcblxyXG52YXIgZ2VuZXJhcklkRW5jRnVuOiBnZW5lcmFySWRFbmNGdW47ICBcclxuXHJcbnZhciBtYXhBR2VuZXJhciA9IDUwXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0R2VuZXJhcklkRW5jRnVuID0gKGZ1bjpnZW5lcmFySWRFbmNGdW4pPT5cclxuICAgIGdlbmVyYXJJZEVuY0Z1biA9IGZ1bjtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNYXhBZ2VuZXJhciA9IChtYXg6bnVtYmVyKT0+XHJcbiAgICBtYXhBR2VuZXJhciA9IG1heDtcclxuXHJcbnNldEdlbmVyYXJJZEVuY0Z1bigoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+YXJlYS50b1N0cmluZygpICsgKGluZGV4KzEwKS50b1N0cmluZygpKTtcclxuXHJcbnNldE1heEFnZW5lcmFyKDEwMCk7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3BlcmF0aXZvQWN0dWFsID0gYXN5bmMgKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUucHJvY2VkdXJlLnRhYmxlX2RhdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQse3RhYmxlOiBgcGFyYW1ldHJvc2AsIGZpeGVkRmllbGRzOltdfSk7XHJcbiAgICBpZihyZXN1bHRbMF0/Lm9wZXJhdGl2byl7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFswXS5vcGVyYXRpdm9cclxuICAgIH1lbHNle1xyXG4gICAgICAgIHRocm93IEVycm9yICgnbm8gc2UgY29uZmlndXLDsyB1biBvcGVyYXRpdm8gZW4gbGEgdGFibGEgcGFyw6FtZXRyb3MnKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qZGVmaW5pY2nDs24gZGUgZXN0cnVjdHVyYSBjb21wbGV0YSwgY3VhbmRvIGV4aXN0YSBpbmctZW5jIGhheSBxdWUgcG9uZXJsbyBhaMOtKi8gXHJcbnR5cGUgRXN0cnVjdHVyYVRhYmxhPXt0YWJsZU5hbWU6c3RyaW5nLCBwa0ZpZWxkczp7ZmllbGROYW1lOnN0cmluZ31bXSwgY2hpbGRUYWJsZXM6RXN0cnVjdHVyYVRhYmxhW119O1xyXG5mdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCB0YWJsZU5hbWU6c3RyaW5nKXtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiA9IGJlLnRhYmxlU3RydWN0dXJlc1t0YWJsZU5hbWVdKGNvbnRleHQpO1xyXG4gICAgdmFyIGdldFBrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0UGtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24ocGspe1xyXG4gICAgICAgICAgICByZXR1cm4ge2ZpZWxkTmFtZTpwa307XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24sIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nKXtcclxuICAgICAgICAvLyByZXR1cm4gdGFibGVEZWYuZm9yZWlnbktleXM/IHRhYmxlRGVmLmZvcmVpZ25LZXlzLm1hcChmaz0+ZmsuZmllbGRzKTogW107XHJcbiAgICAgICAgbGV0IHBhcmVudEZrID0gKDxGb3JlaWduS2V5W10+IHRhYmxlRGVmLmZvcmVpZ25LZXlzKS5maW5kKGZrPT5may5yZWZlcmVuY2VzID09IHBhcmVudFRhYmxlTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudEZrPyBwYXJlbnRGay5maWVsZHM6IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdDpFc3RydWN0dXJhVGFibGE9e1xyXG4gICAgICAgIHRhYmxlTmFtZTptYWluVGFibGVEZWYubmFtZSxcclxuICAgICAgICBwa0ZpZWxkczpnZXRQa0Zyb21UYWJsZURlZihtYWluVGFibGVEZWYpLFxyXG4gICAgICAgIGNoaWxkVGFibGVzOltdXHJcbiAgICB9O1xyXG4gICAgaWYobWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcyAmJiBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmxlbmd0aCl7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRldGFpbFRhYmxlKXtcclxuICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2luZyhcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHtma0ZpZWxkczogZ2V0RmtGcm9tVGFibGVEZWYoYmUudGFibGVTdHJ1Y3R1cmVzW2RldGFpbFRhYmxlLnRhYmxlXShjb250ZXh0KSwgdGFibGVOYW1lKX1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG4vKiBmaW4gZGVmaW5pY2lvbiBlc3RydWN0dXJhIGNvbXBsZXRhICovXHJcblxyXG50eXBlIEFueU9iamVjdCA9IHtbazpzdHJpbmddOmFueX1cclxuXHJcbnZhciBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyA9IChmdW5QYXJhbXM6e3RhcmVhOklkVGFyZWEsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgc2V0dGVyczpzdHJpbmdbXSwgcGFyYW1zOmFueVtdfSk9PntcclxuICAgIGxldCB7dGFyZWEscmVzcHVlc3Rhc1VBUHJpbmNpcGFsLHNldHRlcnMscGFyYW1zfSA9IGZ1blBhcmFtcztcclxuICAgIGxldCB7cmVzdW1lbkVzdGFkb1N1cCwgY29kTm9SZWFTdXAsIGNvZFJlYVN1cCwgcmVzdW1lbkVzdGFkbywgY29kTm9SZWEsIGNvZFJlYX0gPSByZXNwdWVzdGFzVUFQcmluY2lwYWw7XHJcbiAgICBzZXR0ZXJzID0gc2V0dGVycy5jb25jYXQoW1xyXG4gICAgICAgIGByZXN1bWVuX2VzdGFkbyR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMX1gLFxyXG4gICAgICAgIGBub3JlYSR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMn1gLFxyXG4gICAgICAgIGByZWEke3RhcmVhPT0nc3VwZSc/J19zdXAnOicnfT0kJHtwYXJhbXMubGVuZ3RoKzN9YFxyXG4gICAgXSlcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5jb25jYXQoW1xyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/cmVzdW1lbkVzdGFkb1N1cDpyZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/Y29kTm9SZWFTdXA6Y29kTm9SZWEsXHJcbiAgICAgICAgdGFyZWE9PSdzdXBlJz9jb2RSZWFTdXA6Y29kUmVhXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB7c2V0dGVycyxwYXJhbXN9XHJcbn1cclxuXHJcbnZhciBndWFyZGFyRW5jdWVzdGFFblRlbSA9IGFzeW5jIChjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzpJZE9wZXJhdGl2bywgaWRFbmM6SWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgdGFyZWE6SWRUYXJlYSk9PntcclxuICAgIHZhciB7cGFyYW1zLHNldHRlcnN9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgIHRhcmVhLFxyXG4gICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxcclxuICAgICAgICBzZXR0ZXJzOiBbYGpzb25fZW5jdWVzdGEgPSAkM2AsIGBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IGN1cnJlbnRfdGltZXN0YW1wYF0sXHJcbiAgICAgICAgcGFyYW1zOiBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG59XHJcblxyXG52YXIgc2ltdWxhckd1YXJkYWRvRGVFbmN1ZXN0YURlc2RlQXBwRXNjcml0b3JpbyA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0ICxvcGVyYXRpdm86IHN0cmluZywgZW5jOiBJZEVuYywgdGFyZWE6IElkVGFyZWEsIGpzb25fZW5jdWVzdGE6YW55ICk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgb3BlcmF0aXZvKTtcclxuICAgIHJldHVybiBhd2FpdCBiZS5wcm9jZWR1cmUuZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86b3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgcGVyc2lzdGVudGVzOntcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIFtVQV9QUklOQ0lQQUxdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmNdOiBqc29uX2VuY3Vlc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGluZm9ybWFjaW9uSGRyOntcclxuICAgICAgICAgICAgICAgICAgICBbZW5jXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxufVxyXG5cclxudmFyIGdldEhkclF1ZXJ5ID0gIGZ1bmN0aW9uIGdldEhkclF1ZXJ5KHF1b3RlZENvbmRWaXY6c3RyaW5nLCBjb250ZXh0OkNvbnRleHQpe1xyXG4gICAgcmV0dXJuIGBcclxuICAgIHdpdGggJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9IGFzIFxyXG4gICAgICAgIChzZWxlY3QgdC5lbmMsIHQuanNvbl9lbmN1ZXN0YSBhcyByZXNwdWVzdGFzLCB0LnJlc3VtZW5fZXN0YWRvIGFzIFwicmVzdW1lbkVzdGFkb1wiLCBcclxuICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ2RvbWluaW8nICAgICAgICwgZG9taW5pbyAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnbm9tY2FsbGUnICAgICAgLCBub21jYWxsZSAgICAgICxcclxuICAgICAgICAgICAgICAgICdzZWN0b3InICAgICAgICAsIHNlY3RvciAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2VkaWZpY2lvJyAgICAgICwgZWRpZmljaW8gICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZW50cmFkYScgICAgICAgLCBlbnRyYWRhICAgICAgICxcclxuICAgICAgICAgICAgICAgICducm9jYXRhc3RyYWwnICAsIG5yb2NhdGFzdHJhbCAgLFxyXG4gICAgICAgICAgICAgICAgJ3Bpc28nICAgICAgICAgICwgcGlzbyAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZGVwYXJ0YW1lbnRvJyAgLCBkZXBhcnRhbWVudG8gICxcclxuICAgICAgICAgICAgICAgICdoYWJpdGFjaW9uJyAgICAsIGhhYml0YWNpb24gICAgLFxyXG4gICAgICAgICAgICAgICAgJ2Nhc2EnICAgICAgICAgICwgY2FzYSAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAncHJpb3JpZGFkJyAgICAgLCByZXNlcnZhKzEgICAgICxcclxuICAgICAgICAgICAgICAgICdvYnNlcnZhY2lvbmVzJyAsIHR0LmNhcmdhX29ic2VydmFjaW9uZXMgLFxyXG4gICAgICAgICAgICAgICAgJ2NpdGEnICAgICAgICAgICwgY2l0YSAsXHJcbiAgICAgICAgICAgICAgICAnY2FyZ2EnICAgICAgICAgLCB0LmFyZWEgICAgICAgICBcclxuICAgICAgICAgICAgKSBhcyB0ZW0sIHQuYXJlYSxcclxuICAgICAgICAgICAgLS1UT0RPOiBHRU5FUkFMSVpBUlxyXG4gICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAndGFyZWEnLCB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICdmZWNoYV9hc2lnbmFjaW9uJywgZmVjaGFfYXNpZ25hY2lvbixcclxuICAgICAgICAgICAgICAgICdhc2lnbmFkbycsIGFzaWduYWRvLFxyXG4gICAgICAgICAgICAgICAgJ21haW5fZm9ybScsIG1haW5fZm9ybVxyXG4gICAgICAgICAgICApIGFzIHRhcmVhLFxyXG4gICAgICAgICAgICBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGFfYXNpZ25hY2lvblxyXG4gICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiB0YXJlYXNfdGVtIHR0IG9uICh0Lm9wZXJhdGl2byA9IHR0Lm9wZXJhdGl2byBhbmQgdC5lbmMgPSB0dC5lbmMgYW5kIHQudGFyZWFfYWN0dWFsID0gdHQudGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIHRhcmVhcyB0YSBvbiB0LnRhcmVhX2FjdHVhbCA9IHRhLnRhcmVhXHJcbiAgICAgICAgICAgIHdoZXJlIHQuaGFiaWxpdGFkYSBhbmQgJHtxdW90ZWRDb25kVml2fVxyXG4gICAgICAgICAgICBncm91cCBieSB0LmVuYywgdC5qc29uX2VuY3Vlc3RhLCB0LnJlc3VtZW5fZXN0YWRvLCBkb21pbmlvLCBub21jYWxsZSxzZWN0b3IsZWRpZmljaW8sIGVudHJhZGEsIG5yb2NhdGFzdHJhbCwgcGlzbyxkZXBhcnRhbWVudG8saGFiaXRhY2lvbixjYXNhLHJlc2VydmEsdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcywgY2l0YSwgdC5hcmVhLCB0dC50YXJlYSwgZmVjaGFfYXNpZ25hY2lvbiwgYXNpZ25hZG8sIG1haW5fZm9ybVxyXG4gICAgICAgIClcclxuICAgICAgICBzZWxlY3QganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ3ZpdmllbmRhcycsICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBlbmMsIHJlc3B1ZXN0YXMsIGpzb25iX2J1aWxkX29iamVjdCgncmVzdW1lbkVzdGFkbycsXCJyZXN1bWVuRXN0YWRvXCIpIGFzIG90cmFzIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9YCxcclxuICAgICAgICAgICAgICAgICAgICAnZW5jJyxcclxuICAgICAgICAgICAgICAgICAgICBgb3RyYXMgfHwgY29hbGVzY2UocmVzcHVlc3Rhcywne30nOjpqc29uYilgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICApIGFzIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgYXJlYSBhcyBjYXJnYSwgb2JzZXJ2YWNpb25lc19oZHIgYXMgb2JzZXJ2YWNpb25lcywgbWluKGZlY2hhX2FzaWduYWNpb24pIGFzIGZlY2hhXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gaW5uZXIgam9pbiBhcmVhcyB1c2luZyAoYXJlYSkgXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgYXJlYSwgb2JzZXJ2YWNpb25lc19oZHJgLCBcclxuICAgICAgICAgICAgICAgICdmZWNoYScpfSBhcyBjYXJnYXMsXHJcbiAgICAgICAgICAgICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGVuYywganNvbmJfYnVpbGRfb2JqZWN0KCd0ZW0nLCB0ZW0sICd0YXJlYScsIHRhcmVhKSBhcyBvdHJhcyBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVEQpfWAsXHJcbiAgICAgICAgICAgICAgICAgJ2VuYycsXHJcbiAgICAgICAgICAgICAgICAgYG90cmFzIHx8J3t9Jzo6anNvbmJgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICBhcyBcImluZm9ybWFjaW9uSGRyXCJcclxuYFxyXG59XHJcblxyXG5leHBvcnQgdmFyIHNldEhkclF1ZXJ5ID0gKG15RnVuOihxdW90ZWRDb25kVml2OnN0cmluZywgY29udGV4dD86Q29udGV4dCk9PnN0cmluZyk9PiBnZXRIZHJRdWVyeT1teUZ1blxyXG5cclxuY29uc3QgZ2V0VUFQcmluY2lwYWwgPSBhc3luYyAoY2xpZW50OkNsaWVudCwgb3BlcmF0aXZvOnN0cmluZyk9PlxyXG4gICAgKGF3YWl0IGNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0IHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICBmcm9tIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBwcmluY2lwYWxcclxuICAgICAgICBgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIFtvcGVyYXRpdm9dXHJcbiAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWVcclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6e1trIGluIHN0cmluZ106Ym9vbGVhbn0gPSB7fVxyXG5cclxudmFyIGNvbXBpbGVyID0gbmV3IEV4cHJlc2lvblBhcnNlci5Db21waWxlcih7XHJcbiAgICBsYW5ndWFnZTonanMnLFxyXG4gICAgdmFyV3JhcHBlcjoodmFyX25hbWU6c3RyaW5nKT0+YGhlbHBlcnMubnVsbDJ6ZXJvKHZhbG9yZXMuJHt2YXJfbmFtZX0pYCxcclxuICAgIGZ1bldyYXBwZXI6KGZ1bmN0aW9uTmFtZTpzdHJpbmcpPT57XHJcbiAgICAgICAgaWYoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZnVuY3Rpb25OYW1lKVxyXG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgaGVscGVycy5mdW5zLiR7ZnVuY3Rpb25OYW1lfWBcclxuICAgIH1cclxufSlcclxuXHJcbnR5cGUgQ2FzaWxsZXJvRGVBY2E9e1xyXG4gICAgY2hpbGRzOiBDYXNpbGxlcm9EZUFjYVtdLFxyXG4gICAgZGF0YTp7XHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcjogc3RyaW5nXHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcl9qczogc3RyaW5nXHJcbiAgICAgICAgZXNwZWNpYWw6IGFueVxyXG4gICAgICAgIGV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanM6IHN0cmluZ1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbihleHByZXNpb246c3RyaW5nKXtcclxuICAgIHJldHVybiBjb21waWxlci50b0NvZGUoRXhwcmVzaW9uUGFyc2VyLnBhcnNlKFxyXG4gICAgICAgIGV4cHJlc2lvblxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwnIDw+ICcpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwnICcpXHJcbiAgICApKS5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmJsYW5jb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXHJcbiAgICAucmVwbGFjZSgvaGVscGVyc1xcLmZ1bnNcXC5pbmZvcm1hZG9cXChoZWxwZXJzLm51bGwyemVyb1xcKC9nLCdoZWxwZXJzLmZ1bnMuaW5mb3JtYWRvKCgnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm86Q2FzaWxsZXJvRGVBY2Epe1xyXG4gICAgaWYoIWNhc2lsbGVybyl7IHJldHVybiB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKXtcclxuICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyX2pzID0gY29tcGlsYXJFeHByZXNpb24oY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2hhYmlsaXRhcik7XHJcbiAgICB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5lc3BlY2lhbD8uYXV0b2luZyl7XHJcbiAgICAgICAgdmFyIHBhcnRlcyA9IGNhc2lsbGVyby5kYXRhLmVzcGVjaWFsPy5hdXRvaW5nLnNwbGl0KCc9PicpO1xyXG4gICAgICAgIGlmKHBhcnRlcy5sZW5ndGg+MSl7XHJcbiAgICAgICAgICAgIHZhciBwcmVjb25kaWNpb24gPSBwYXJ0ZXNbMF07XHJcbiAgICAgICAgICAgIHZhciB2YWxvciA9IHBhcnRlcy5zbGljZSgxKS5qb2luKCc9PicpO1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gYCgke2NvbXBpbGFyRXhwcmVzaW9uKHByZWNvbmRpY2lvbil9KT8oJHtjb21waWxhckV4cHJlc2lvbih2YWxvcil9KTpudWxsYDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2F1dG9pbmdyZXNhcl9qcyA9IGNvbXBpbGFyRXhwcmVzaW9uKHBhcnRlc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yKHZhciBjYXNpbGxlcm9JbnRlcm5vIG9mIGNhc2lsbGVyby5jaGlsZHMpIGNvbXBpbGFyRXhwcmVzaW9uZXMoY2FzaWxsZXJvSW50ZXJubyk7XHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMgPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykgPT4gXHJcbiAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgaW5zZXJ0IGludG8gdGFyZWFzX3RlbSAob3BlcmF0aXZvLCBlbmMsIHRhcmVhKVxyXG4gICAgICAgICAgICBzZWxlY3QgdGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhXHJcbiAgICAgICAgICAgIGZyb20gKHNlbGVjdCB0YS4qLCB0LmVuYyx0LmFyZWEgZnJvbSB0YXJlYXMgdGEsIHRlbSB0IHdoZXJlIHRhLm9wZXJhdGl2bz10Lm9wZXJhdGl2bykgdGEgXHJcbiAgICAgICAgICAgIHdoZXJlIHRhLm9wZXJhdGl2byA9ICQxIFxyXG4gICAgICAgICAgICAgICAgYW5kIG5vdCAodGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhKSBpbiAoc2VsZWN0IG9wZXJhdGl2bywgZW5jLCB0YXJlYSBmcm9tIHRhcmVhc190ZW0pXHJcbiAgICAgICAgICAgIG9yZGVyIGJ5IDEsMywyO1xyXG4gICAgYCxbb3BlcmF0aXZvXSkuZXhlY3V0ZSgpO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0lPTl9QQVNBUl9QUk9JRSA9ICdlbmN1ZXN0YXNfcHJvY2VzYW1pZW50b19wYXNhcic7XHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzRG1FbmN1IDogUHJvY2VkdXJlRGVmW10gPSBbXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidvcGVyYXRpdm9fZXN0cnVjdHVyYV9jb21wbGV0YScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgICAgLHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6J2Rlc3BsZWdhckZvcm11bGFyaW8nLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgY2FzaWxsZXJvc19qZXJhcnF1aXphZG9zKCQxKSBhcyBmb3JtdWxhcmlvcywgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgc2VsZWN0IHVuaWRhZF9hbmFsaXNpcywgcGFkcmUsIHBrX2FncmVnYWRhLCAne30nOjpqc29uYiBhcyBoaWphcyBmcm9tIHVuaWRhZF9hbmFsaXNpcyB3aGVyZSBvcGVyYXRpdm8gPSAkMmAsICd1bmlkYWRfYW5hbGlzaXMnKX0gYXMgdW5pZGFkZXNfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm8sIHBhcmFtZXRlcnMub3BlcmF0aXZvXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LmZvcm11bGFyaW9zKS5mb3JFYWNoKGY9PmNvbXBpbGFyRXhwcmVzaW9uZXMoZikpO1xyXG4gICAgICAgICAgICAvLyBIZXJtYW5vcyBzb24gbG9zIGZvcm11bGFyaW9zIHF1ZSBlc3TDoW4gaW1wbGFudGFkb3MgZW4gb3RybyBmb3JtdWxhcmlvIGRlIGxhIG1pc21hIFVBLiBQb3IgZWplbXBsbyBlbCBBMSBlbiBlbCBTMVxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0SGVybWFub3MgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbnNlbGVjdCBvLmlkX2Nhc2lsbGVybyBhcyBpZF9mb3JtdWxhcmlvLCBvLnVuaWRhZF9hbmFsaXNpcywgJ0JGXyd8fG8uY2FzaWxsZXJvIGJvdG9uLCBiZi5jYXNpbGxlcm8sIGJmLnBhZHJlLCBmcC5jYXNpbGxlcm8sIGZwLnVuaWRhZF9hbmFsaXNpc1xyXG4gIGZyb20gY2FzaWxsZXJvcyBvIGxlZnQgam9pbiBjYXNpbGxlcm9zIGJmXHJcbiAgICBvbiBiZi50aXBvYz0nQkYnXHJcblx0YW5kIGJmLmNhc2lsbGVybyA9ICdCRl8nfHxvLmNhc2lsbGVyb1xyXG5cdGFuZCBiZi5vcGVyYXRpdm8gPSBvLm9wZXJhdGl2b1xyXG5cdGxlZnQgam9pbiBjYXNpbGxlcm9zIGZwXHJcblx0ICBvbiBmcC5pZF9jYXNpbGxlcm8gPSBiZi5wYWRyZVxyXG5cdCAgYW5kIGZwLm9wZXJhdGl2byA9IGJmLm9wZXJhdGl2b1xyXG4gIHdoZXJlIG8udGlwb2MgPSAnRidcclxuICAgIGFuZCBvLnVuaWRhZF9hbmFsaXNpcyA9IGZwLnVuaWRhZF9hbmFsaXNpc1xyXG5cdGFuZCBvLm9wZXJhdGl2byA9ICQxYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXN1bHRIZXJtYW5vcy5yb3dzLmZvckVhY2gocm93PT57XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucm93LmZvcm11bGFyaW9zW3Jvdy5pZF9mb3JtdWxhcmlvXS5kYXRhLmhlcm1hbm8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJVQSh1YTpVbmlkYWRBbmFsaXNpcywgaWRVYTpJZFVuaWRhZEFuYWxpc2lzLCB1QXM6e1trIGluIElkVW5pZGFkQW5hbGlzaXNdOiBVbmlkYWRBbmFsaXNpc30pe1xyXG4gICAgICAgICAgICAgICAgaWYodWEucGFkcmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHVBc1t1YS5wYWRyZV0uaGlqYXNbaWRVYV0gPSB1YTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHVhLnByaW5jaXBhbD10cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LnVuaWRhZGVzX2FuYWxpc2lzKS5mb3JFYWNoKCh1YSwgaWRVYSk9PlxyXG4gICAgICAgICAgICAgICAgY29tcGxldGFyVUEodWEsIGlkVWEgYXMgSWRVbmlkYWRBbmFsaXNpcywgcmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB2YXIge1xyXG4gICAgICAgICAgICAgICAgY29uX3JlYV9ob2dhcjogY29uUmVhSG9nYXIsIFxyXG4gICAgICAgICAgICAgICAgY29uZmlnX3NvcnRlbzogY29uZmlnU29ydGVvLCBcclxuICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbl9ib3Rvbl9mb3JtdWxhcmlvOmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhOiBwZXJtaXRlR2VuZXJhck11ZXN0cmFcclxuICAgICAgICAgICAgfSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbywgY29uX3JlYV9ob2dhciwgaGFiaWxpdGFjaW9uX2JvdG9uX2Zvcm11bGFyaW8sIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbWV0ZXJzLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgbGV0IGNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyA9IChleHByZXNpb25lc0RvbWluaW86YW55KT0+IFxyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGV4cHJlc2lvbmVzRG9taW5pbylcclxuICAgICAgICAgICAgICAgICAgICAubWFwKChleHByLGRvbWluaW8pPT4oe2RvbWluaW8sIGV4cHI6Y29tcGlsYXJFeHByZXNpb24oZXhwci5leHByKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5wbGFpbigpO1xyXG4gICAgICAgICAgICBpZihjb25maWdTb3J0ZW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGNvbmZpZ1NvcnRlbykuZm9yRWFjaCgoY29uZmlnU29ydGVvRm9ybXVsYXJpbyk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmV4cHJfaW5jb21wbGV0aXR1ZF9qcz1jb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5leHByX2luY29tcGxldGl0dWQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm9fanM9Y29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZmlsdHJvKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbykuZm9yRWFjaCgoZm9ybSk9PntcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmV4cHJfaGFiaWxpdGFyX2JvdG9uX2pzPWNvbXBpbGFyRXhwcmVzaW9uKGZvcm0uZXhwcl9oYWJpbGl0YXJfYm90b24pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7dGltZXN0YW1wOiBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSwgLi4ucmVzdWx0LnJvdywgb3BlcmF0aXZvOnBhcmFtZXRlcnMub3BlcmF0aXZvLCBjb25SZWFIb2dhciwgY29uZmlnU29ydGVvLCBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSwgbm9SZWFzOmJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXNTdXA6YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZ2VuZXJhcl9mb3JtdWxhcmlvcycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidhbm5pbycsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczonYW5uaW8nfSxcclxuICAgICAgICAgICAge25hbWU6J21lcycgICwgdHlwZU5hbWU6J2ludGVnZXInLCByZWZlcmVuY2VzOidtZXMnICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG90ZScgLCB0eXBlTmFtZTonaW50ZWdlcicsIHJlZmVyZW5jZXM6J2xvdGVzJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0VUEgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgZnJvbSB1bmlkYWRfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgICAgIHdoZXJlIHByaW5jaXBhbCA9IHRydWUgYW5kIG9wZXJhdGl2byA9ICQxXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWT11cclxuICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRVQS5yb3dDb3VudCA9PT0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGNvbmZpZ3Vyw7MgdW5hIHVuaWRhZCBkZSBhbmFsaXNpcyBjb21vIHByaW5jaXBhbCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByb3cgPSByZXN1bHRVQS5yb3c7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRQcmVndW50YXMgPSBhd2FpdCBiZS5wcm9jZWR1cmUucHJlZ3VudGFzX3VhX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3cpXHJcbiAgICAgICAgICAgIHZhciBjb250ZW5lZG9yVmFjaW86e1trZXk6c3RyaW5nXTphbnl9ID0ge307XHJcbiAgICAgICAgICAgIHJlc3VsdFByZWd1bnRhcy5mb3JFYWNoKGZ1bmN0aW9uKGRlZlByZWd1bnRhKXtcclxuICAgICAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpb1tkZWZQcmVndW50YS52YXJfbmFtZV0gPSBkZWZQcmVndW50YS51bmlkYWRfYW5hbGlzaXM/W106bnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5hbm5pbz0gcGFyYW1ldGVycy5hbm5pbztcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLm1lcyAgPSBwYXJhbWV0ZXJzLm1lcyAgO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubG90ZSA9IHBhcmFtZXRlcnMubG90ZSA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGRlYmVfaGFiZXIuaWRfY2FzbywgcyBhcyBpZFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBsb3RlLCBhcm1hcl9pZChhbm5pbywgbWVzLCBsb3RlLCBzKSBhcyBpZF9jYXNvLCBzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBhbm5pbyxtZXMsbG90ZSwgY2FudF9jdWVzIGZyb20gbG90ZXMgd2hlcmUgKGFubmlvLG1lcyxsb3RlKT0oJDIsJDMsJDQpKSByLCBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLGNhbnRfY3Vlcykgc1xyXG4gICAgICAgICAgICAgICAgICAgICkgZGViZV9oYWJlciBsZWZ0IGpvaW4gZGVmZ2VuIGhheSBvbiBoYXkuaWRfY2FzbyA9IGRlYmVfaGFiZXIuaWRfY2FzbyBhbmQgaGF5Lm9wZXJhdGl2bz0kMVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIGhheS5pZF9jYXNvIGlzIG51bGxgLFxyXG4gICAgICAgICAgICAgICAgWyBPUEVSQVRJVk8sIHBhcmFtZXRlcnMuYW5uaW8sIHBhcmFtZXRlcnMubWVzLCBwYXJhbWV0ZXJzLmxvdGVdXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtvcGVyYXRpdm86IE9QRVJBVElWT307XHJcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgcmVzdWx0LnJvd0NvdW50OyBpKyspe1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcocGFyYW1zLHtpZF9jYXNvOnJlc3VsdC5yb3dzW2ldLmlkX2Nhc28sIGRhdG9zX2Nhc286Y2hhbmdpbmcoY29udGVuZWRvclZhY2lvLHtpZDpyZXN1bHQucm93c1tpXS5pZH0pfSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge2FncmVnYWRhczpyZXN1bHQucm93Q291bnR9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3VwbG9hZF9maWxlJyxcclxuICAgICAgICBwcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6ICdpZF9hZGp1bnRvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOiAnbm9tYnJlJywgdHlwZU5hbWU6ICd0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBmaWxlczp7Y291bnQ6MX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBmaWxlcyl7XHJcbiAgICAgICAgICAgIGxldCBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBsZXQgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICBjb250ZXh0LmluZm9ybVByb2dyZXNzKHttZXNzYWdlOmJlLm1lc3NhZ2VzLmZpbGVVcGxvYWRlZH0pO1xyXG4gICAgICAgICAgICBsZXQgZmlsZSA9IGZpbGVzWzBdXHJcbiAgICAgICAgICAgIGxldCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZS5wYXRoKS5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbEZpbGVuYW1lID0gZmlsZS5vcmlnaW5hbEZpbGVuYW1lLnNsaWNlKDAsLShleHQubGVuZ3RoKzEpKTtcclxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lPSBwYXJhbWV0ZXJzLm5vbWJyZSB8fCBvcmlnaW5hbEZpbGVuYW1lO1xyXG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9ICdsb2NhbC1hdHRhY2htZW50cy9maWxlLSc7XHJcbiAgICAgICAgICAgIHZhciBjcmVhdGVSZXNwb25zZSA9IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKGFkanVudG9Sb3cpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTGEgc3ViaWRhIHNlIHJlYWxpesOzIGNvcnJlY3RhbWVudGUgKHVwZGF0ZSknLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZTogYWRqdW50b1Jvdy5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlX29yaWdpbmFsOiBhZGp1bnRvUm93Lm5vbWJyZV9vcmlnaW5hbCxcclxuICAgICAgICAgICAgICAgICAgICBleHQ6IGFkanVudG9Sb3cuZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGZlY2hhOiBhZGp1bnRvUm93LmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvcmE6IGFkanVudG9Sb3cuaG9yYSxcclxuICAgICAgICAgICAgICAgICAgICBpZF9hZGp1bnRvOiBhZGp1bnRvUm93LmlkX2FkanVudG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbW92ZUZpbGUgPSBmdW5jdGlvbiBtb3ZlRmlsZShmaWxlLCBpZF9hZGp1bnRvLCBleHRlbnNpb24pe1xyXG4gICAgICAgICAgICAgICAgZnMubW92ZShmaWxlLnBhdGgsIG5ld1BhdGggKyBpZF9hZGp1bnRvICsgJy4nICsgZXh0ZW5zaW9uLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVycy5pZF9hZGp1bnRvKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgbm9tYnJlPSAkMSxub21icmVfb3JpZ2luYWwgPSAkMiwgZXh0ID0gJDMsIHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJywkNDo6dGV4dCwnLicsJDM6OnRleHQpLCBmZWNoYSA9IG5vdygpLCBob3JhID0gZGF0ZV90cnVuYygnc2Vjb25kcycsY3VycmVudF90aW1lc3RhbXAtY3VycmVudF9kYXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDQgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsZW5hbWUsIG9yaWdpbmFsRmlsZW5hbWUsIGV4dCwgcGFyYW1ldGVycy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0YWRvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZpbGUoZmlsZSxyZXN1bHRhZG8uaWRfYWRqdW50byxyZXN1bHRhZG8uZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBhZGp1bnRvcyAobm9tYnJlLCBub21icmVfb3JpZ2luYWwsIGV4dCwgZmVjaGEsIGhvcmEpIHZhbHVlcyAoJDEsJDIsJDMsbm93KCksIGRhdGVfdHJ1bmMoJ3NlY29uZHMnLGN1cnJlbnRfdGltZXN0YW1wLWN1cnJlbnRfZGF0ZSkpIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVuYW1lLCBvcmlnaW5hbEZpbGVuYW1lLCBleHRdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGB1cGRhdGUgYWRqdW50b3Mgc2V0IHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJyxpZF9hZGp1bnRvOjp0ZXh0LCcuJyxleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDEgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdC5yb3cuaWRfYWRqdW50b11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdGFkbyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLHJlc3VsdGFkby5pZF9hZGp1bnRvLHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2Nhc29fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAsIHR5cGVOYW1lOid0ZXh0JyAgICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidkYXRvc19jYXNvJyAgLCB0eXBlTmFtZTonanNvbmInICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZGVmaW5lZEluOiAnZG1lbmN1JyxcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXNwZWNpZmljbyBlbCB0aXBvIGRlIGxvcyBwYXLDoW1ldHJvc1xyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6e1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86c3RyaW5nLCBcclxuICAgICAgICAgICAgaWRfY2FzbzpzdHJpbmcsXHJcbiAgICAgICAgICAgIGRhdG9zX2Nhc286QW55T2JqZWN0XHJcbiAgICAgICAgfSxuZXdDbGllbnQ6Q2xpZW50KXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1uZXdDbGllbnQgfHwgY29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBkYXRvc19qc29uPXBhcmFtZXRlcnMuZGF0b3NfY2FzbztcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHRhYmxlU3RydWN0dXJlc19hcHA6VGFibGVEZWZpbml0aW9ucyA9IGJlLnRhYmxlU3RydWN0dXJlcztcclxuICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHN0cnVjdF9kbWVuY3UgPSBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bJ29wZXJhdGl2byddID0gcGFyYW1ldGVycy5vcGVyYXRpdm87XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19qc29uW09wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQS10gPSBwYXJhbWV0ZXJzLmlkX2Nhc287XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKCB1bHRfcGssIHVhX2Fycil7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29uX3BrX2NvbXBsZXRhPXVhX2FycjsgXHJcbiAgICAgICAgICAgICAgICBpZiAodWFfYXJyICYmIHVhX2Fyci5sZW5ndGg+PTEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbl9wa19jb21wbGV0YT0gY29uX3BrX2NvbXBsZXRhLm1hcCgodW5hX3VhLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYV91YVt1bHRfcGtdPWkrMSAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5hX3VhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbl9wa19jb21wbGV0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZGF0b3NqKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXlOYW1lIGluIGRhdG9zaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRvSyA9IGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0b0sgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvSy5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGsgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleU5hbWVdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bHRfcGsgPSBwa1tway5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0sgPSBjb21wbGV0YXJfdWx0X3BrX2VuX2Fycih1bHRfcGssIGRhdG9LKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0suZm9yRWFjaCgoZWxlbUkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1JPXJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZWxlbUkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlOYW1lLnN0YXJ0c1dpdGgoJyQnKXx8a2V5TmFtZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b3NqO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGRhdG9zX2pzb24gPSByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGRhdG9zX2pzb24pO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhU3VwO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvU3VwO1xyXG5cclxuICAgICAgICAgICAgaWYoIE9iamVjdC5rZXlzKGRhdG9zX2pzb24pLmxlbmd0aCA+Mil7XHJcbiAgICAgICAgICAgICAgICB2YXIgcXVlcmllcyA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFdyaXRlKGRhdG9zX2pzb24sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJpZXMucmVkdWNlKGZ1bmN0aW9uKHByb21pc2UsIHF1ZXJ5KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5leGVjdXRlKCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxQcm9taXNlLnJlc29sdmUoKSkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9rXCI7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnI6RXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Fzb19ndWFyZGFyIEVOVFJBIEVOIEVMIENBVENIOiBcIixlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAndmFjaW8nO1xyXG4gICAgICAgICAgICB9ICAgIFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICAvL3tuYW1lOidmb3JtdWxhcmlvJyAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAgICx0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdnb1RvRW5jJyxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoe29wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtZXRlcnMuaWRfY2Fzb30sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgdml2aWVuZGE6IHBhcmFtZXRlcnMuaWRfY2FzbyxcclxuICAgICAgICAgICAgICAgIGRhdG9zX2Nhc286IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC8vZm9ybXVsYXJpbzogZm9ybVByaW5jaXBhbCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcl9vX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19wcmVwYXJhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19ndWFyZGFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIGNoYW5naW5nKHBhcmFtZXRlcnMsIHtkYXRvc19jYXNvOmpzb259KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qIEdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIEZST00gJHtPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREfSBMSU1JVCAxYCkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYocmVzdWx0TWFpbi5yb3dDb3VudD4wKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIQVkgREFUT1MnLHJlc3VsdE1haW4ucm93cylcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSEFZIERBVE9TLiBOTyBTRSBQVUVERSBJTklDSUFSIEVMIFBBU0FKRScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRKc29uID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgU0VMRUNUIG9wZXJhdGl2bywgZW5jIGlkX2Nhc28sIGpzb25fZW5jdWVzdGEgZGF0b3NfY2FzbyBmcm9tIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBvcGVyYXRpdm89JDEgYW5kIHJlc3VtZW5fZXN0YWRvIGlzIGRpc3RpbmN0IGZyb20gJ3ZhY2lvJyBhbmQganNvbl9lbmN1ZXN0YSBpcyBub3QgbnVsbCBcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBlbmMgYCxcclxuICAgICAgICAgICAgICAgIFtPUEVSQVRJVk9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICBpZihwcm9jZWR1cmVHdWFyZGFyLmRlZmluZWRJbiE9J2RtZW5jdScpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYXkgcXVlIHNvYnJlZXNjcmliaXIgY2Fzb19ndWFyZGFyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdEpzb24ucm93cy5tYXAoYXN5bmMgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgY2FzbyAke3Jvdy5pZF9jYXNvfTogYDtcclxuICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIGZ1bmN0aW9uKGNsaWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbys9IGF3YWl0IHByb2NlZHVyZUd1YXJkYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHJvdywgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJqc29uMnVhIGVycm9yLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0YWRvLmluY2x1ZGVzKCdvaycpKXsgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfSA9IGF3YWl0IGJlLnByb2NlZHVyZS5jYXNvX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7b3BlcmF0aXZvOnJvdy5vcGVyYXRpdm8sIGlkX2Nhc286cm93LmlkX2Nhc299KVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJRdWVHcmFibyA9IHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3JlcGFuY2VzLnNob3dBbmRUaHJvdyh2ZXJRdWVHcmFibyxyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZlclF1ZUdyYWJvLHJvdylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgICAgICAgICB9KSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondml2aWVuZGEnICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcInRhcmVhc1wifSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLHZpdmllbmRhLCB0YXJlYX0gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbWFpbl9mb3JtID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBtYWluX2Zvcm1cclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHRhcmVhPSQyYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgdGFyZWFdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbmR2aXY9IGAgdC5vcGVyYXRpdm89ICQxIGFuZCB0LmVuYyA9JDJgO1xyXG4gICAgICAgICAgICB2YXIgc29sb0xlY3R1cmEgPSAhIShhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gam9pbiBlc3RhZG9zIHVzaW5nIChvcGVyYXRpdm8sIGVzdGFkbykgLS1wayBlc3RhZG8gdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdhZG9fZG0gaXMgbm90IG51bGwgb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwZXJtaXRlX2VkaXRhcl9lbmN1ZXN0YSBhbmQgYXNpZ25hZG8gPD4gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChjb250ZXh0LnVzZXIuaWRwZXIpfVxyXG4gICAgICAgICAgICAgICAgICAgIClgLCBbb3BlcmF0aXZvLCB2aXZpZW5kYV0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93Q291bnQ7XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtvcGVyYXRpdm8sdml2aWVuZGFdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByb3cuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhPXtcclxuICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgIH0gO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmEsXHJcbiAgICAgICAgICAgICAgICBpZFBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsfSkpLCAnY2FyZ2EnKSxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcEVzdHJ1Y3R1cmE6YmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmFcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgcGVyc2lzdGVudGVzfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIGNvbnN0IFVBX1BSSU5DSVBBTCA9IGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBvcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsaWRFbmMpPT57XHJcbiAgICAgICAgICAgICAgICBpZihyZXNwdWVzdGFzVUFQcmluY2lwYWwuczFhMV9vYnMgPT0gJyFwcnVlYmEgZGUgZXJyb3IgYWwgZ3JhYmFyIScpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRElPIFBSVUVCQSBERSBFUlJPUiBBTCBHUkFCQVInKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50YXJlYS50YXJlYSk7XHJcbiAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgZW5jICR7aWRFbmN9OiBgO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogb3BlcmF0aXZvLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvKz0gYXdhaXQgcHJvY2VkdXJlR3VhcmRhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1fZ3VhcmRhciwgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVyck1lc3NhZ2UgPSByZXN1bHRhZG8gKyBcImRtX2ZvcnBrcmFpel9kZXNjYXJnYXIuIFwiKyBlcnIgO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwYXNlX3RhYmxhPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgW29wZXJhdGl2bywgaWRFbmMsIHJlc3VsdGFkb11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTsgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICB9KS5hcnJheSgpKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvaydcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fc2luY3Jvbml6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge3BlcnNpc3RlbnRlc30gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbnVtX3NpbmNybzpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIHRva2VuOnN0cmluZ3xudWxsPXBlcnNpc3RlbnRlcz8udG9rZW47XHJcbiAgICAgICAgICAgIGlmKCF0b2tlbil7XHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IChhd2FpdCBiZS5wcm9jZWR1cmUudG9rZW5fZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcmFnZW50OiBjb250ZXh0LnNlc3Npb24ucmVxLnVzZXJhZ2VudCwgXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IGNvbnRleHQudXNlcm5hbWVcclxuICAgICAgICAgICAgICAgIH0pKS50b2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIge3ZhbHVlfSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNpbmNyb25pemFjaW9uZXMgKHRva2VuLCB1c3VhcmlvLCBkYXRvcylcclxuICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKCQxLCQyLCQzKSBcclxuICAgICAgICAgICAgICAgICAgICBSRVRVUk5JTkcgc2luY3JvXHJcbiAgICAgICAgICAgICAgICBgLCBbdG9rZW4sIGNvbnRleHQudXNlcm5hbWUsIHBlcnNpc3RlbnRlc11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIG51bV9zaW5jcm89dmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2PSBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0Lm9wZXJhdGl2bz0gJDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhc2lnbmFkbyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0dC5vcGVyYWNpb249J2NhcmdhcicgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAodHQuY2FyZ2Fkb19kbSBpcyBudWxsIG9yIHR0LmNhcmdhZG9fZG0gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKHRva2VuKX0pXHJcbiAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkNJUEFMID0gYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgICAgIGlmKHBlcnNpc3RlbnRlcyl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsIGlkRW5jKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJlYSA9IHBlcnNpc3RlbnRlcy5pbmZvcm1hY2lvbkhkcltpZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB1ZWRvR3VhcmRhckVuVEVNPXRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtwYXJhbXMsc2V0dGVyc30gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlc3RhZG8gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EpfWAsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhcmdhZG9fZG09bnVsbGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbT1BFUkFUSVZPLCBpZEVuYywgdGFyZWEsIHRva2VuXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5VGFyZWFzVGVtID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7c2V0dGVycy5qb2luKCcsJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkMyBhbmQgY2FyZ2Fkb19kbSA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNcclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBwdWVkb0d1YXJkYXJFblRFTT1xdWVyeVRhcmVhc1RlbS5yb3dDb3VudD09MTtcclxuICAgICAgICAgICAgICAgICAgICBpZihwdWVkb0d1YXJkYXJFblRFTSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogT1BFUkFUSVZPLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyLCBjbGllbnQpOyAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHBhc2VfdGFibGE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVjaWJpZG8tc2luLXRva2VuLnR4dCcsIEpTT04uc3RyaW5naWZ5KHtub3c6bmV3IERhdGUoKSx1c2VyOmNvbnRleHQudXNlcm5hbWUsaWRDYXNvOiBpZEVuYyx2aXZpZW5kYTogcmVzcHVlc3Rhc1VBUHJpbmNpcGFsfSkrJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtPUEVSQVRJVk8sY29udGV4dC51c2VyLmlkcGVyXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICBzZXQgIGVzdGFkbyA9ICQ0LCBjYXJnYWRvX2RtPSQzOjp0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtjb25kdml2fSBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgZW5jYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgcGFyYW1ldGVycy5lbmM/cGFyYW1ldGVycy5lbmM6Y29udGV4dC51c2VyLmlkcGVyLCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmE6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIG51bV9zaW5jcm8sXHJcbiAgICAgICAgICAgICAgICBpZHBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsLCBlc3RhZG9fY2FyZ2E6J3JlbGV2YW1pZW50byd9KSksICdjYXJnYScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2JhY2t1cCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0ZW0nICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2JlLCBjbGllbnR9ID1jb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBudW1fc2luY3JvOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW46c3RyaW5nfG51bGw9cGFyYW1ldGVycy50b2tlbjtcclxuICAgICAgICAgICAgaWYodG9rZW4gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB2YXIge3Jvd0NvdW50fSA9IGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0IDEgZnJvbSB0b2tlbnMgd2hlcmUgdG9rZW4gPSAkMWAsW3Rva2VuXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYoIXJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRlbSl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGFyYW1ldGVycy50ZW0pLm1hcChhc3luYyAoYmFja3VwOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2JhY2t1cCA9ICQzLCBmZWNoYV9iYWNrdXAgPSBjdXJyZW50X3RpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIGpzb25fYmFja3VwIGlzIGRpc3RpbmN0IGZyb20gJDRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGJhY2t1cC5mb3JQa1JhaXoudml2aWVuZGEsIGJhY2t1cC5yZXNwdWVzdGFzUmFpeiwgYmFja3VwLnJlc3B1ZXN0YXNSYWl6XVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgfSkuYXJyYXkoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2NvbnNpc3Rpcl92aXZpZW5kYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3ZpdmllbmRhJyAgICAgICAsdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIHtiZSwgY2xpZW50fSA9Y29udGV4dDtcclxuICAgICAgICAgICAgbGV0IHBhcmFtX3Byb2M9e1xyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBwYXJhbWV0ZXJzLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgIGlkX2Nhc286IHBhcmFtZXRlcnMudml2aWVuZGFcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0YWRvOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0YWRvPSBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX2VuY3Vlc3RhLmNvcmVGdW5jdGlvbihjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcHJvYywgY2xpZW50XHJcbiAgICAgICAgICAgICAgICApOyAgICBcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gXCIgY29uc2lzdGlyX3ZpdmllbmRhLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcqKioqKiogY29uc2lzdGlyX3ZpdmllbmRhIHJlc3VsdGFkbzonLHJlc3VsdGFkbykgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9yZXNjYXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidsb2NhbFN0b3JhZ2VJdGVtJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG9jYWxTdG9yYWdlSXRlbUtleScgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciB7bG9jYWxTdG9yYWdlSXRlbUtleSwgbG9jYWxTdG9yYWdlSXRlbX0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsU3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVzY2F0ZS50eHQnLCBKU09OLnN0cmluZ2lmeSh7bm93Om5ldyBEYXRlKCksdXNlcjpjb250ZXh0LnVzZXJuYW1lLCBpdGVtS2V5OiBsb2NhbFN0b3JhZ2VJdGVtS2V5LCBpdGVtRGF0YTogbG9jYWxTdG9yYWdlSXRlbX0pKydcXG5cXG4nLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdvcGVyYXRpdm9fZ2V0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2dldF9yYW5kb21fZnJlZV9jYXNlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOlt7bmFtZTonb3BlcmF0aXZvJyAgICAsIHR5cGVOYW1lOid0ZXh0J31dLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgbWluc1RvRXhwaXJlID0gMzA7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbnNTaW5jZUJsb3F1ZWQgPSBgZGF0ZV9wYXJ0KCdtaW4nLCBhZ2UoY3VycmVudF90aW1lc3RhbXAsIGZlY2hhX2Jsb3F1ZW8pKWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYyA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBzZWxlY3QgZW5jIGZyb20gdGVtIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgKGxpYnJlIG9yICR7bWluc1NpbmNlQmxvcXVlZH0gPiAke21pbnNUb0V4cGlyZX0pIGxpbWl0IDE7YCxbcGFyYW1zLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFVQREFURSB0ZW0gc2V0IGxpYnJlID0gZmFsc2UsIGZlY2hhX2Jsb3F1ZW89Y3VycmVudF90aW1lc3RhbXAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJgLFtwYXJhbXMub3BlcmF0aXZvLCBlbmMudmFsdWVdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtdWVzdHJhX2dlbmVyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgICAgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCJ9LFxyXG4gICAgICAgICAgICB7bmFtZTonYXJlYScgICAgICAgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczogXCJhcmVhc1wifSxcclxuICAgICAgICAgICAge25hbWU6J2RvbWluaW8nICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicsIGRlZmF1bHRWYWx1ZTogM30sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50X2VuY3Vlc3RhcycgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgYmUgPSAgY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYX0gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICBpZihwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSl7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGVtVGFibGVEZWY6VGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzWyd0ZW0nXShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihwYXJhbXMuY2FudF9lbmN1ZXN0YXMsbWF4QUdlbmVyYXIpOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmMgPSBnZW5lcmFySWRFbmNGdW4ocGFyYW1zLmFyZWEsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIGludG8gdGVtIChvcGVyYXRpdm8sIGVuYywgYXJlYSwgZG9taW5pbywgaGFiaWxpdGFkYSkgdmFsdWVzICgkMSwgJDIsICQzLCAkNCwgJDUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uIGNvbmZsaWN0ICgke3NxbFRvb2xzLnF1b3RlSWRlbnRBcnJheSh0ZW1UYWJsZURlZi5wcmltYXJ5S2V5KS5qb2luKCcsJyl9KSBkbyBub3RoaW5nYCxcclxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgZW5jLCBwYXJhbXMuYXJlYSwgcGFyYW1zLmRvbWluaW8sIHRydWVdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJlbCBvcGVyYXRpdm8gbm8gcGVybWl0ZSBnZW5lcmFyIG11ZXN0cmFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyAgICAgXHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYmxhbnF1ZWFyX3ByZXZpc3VhbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6J21vc3RyYXJfZW5jdWVzdGFfYV9ibGFucXVlYXJfY29udGVuaWRvJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IgKGBObyBzZSBlbmNvbnRyw7MgbGEgZW5jdWVzdGEgJHtwYXJhbXMuZW5jfSBwYXJhIGVsIG9wZXJhdGl2byAke3BhcmFtcy5vcGVyYXRpdm99LiAke2Vyci5tZXNzYWdlfWAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7Y2Fzb1RlbTogcmVzdWx0LnJvd307XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOlsnY29vcl9wcm9jJywnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tICR7YmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgLy9wYXNvIGEgZW5jdSBwYXJhIGd1YXJkYXIgZW4gaGlzdG9yaWFsXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhX2FjdHVhbCA9ICdlbmN1J1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvKTsgICAgICAgICBcclxuICAgICAgICAgICAgLy9yZXNldGVvIHRlbSAobm8gc2UgZ3VhcmRhIGhpc3RvcmlhbCBwb3JxdWUgdGFyZWFfYWN0dWFsIGVzIG51bGwpXHJcbiAgICAgICAgICAgIC8vZ3VhcmRvIGJhY2t1cCBwb3IgbGFzIGR1ZGFzXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fYmFja3VwID0ganNvbl9lbmN1ZXN0YSwganNvbl9lbmN1ZXN0YSA9IG51bGwsIHRhcmVhX2FjdHVhbCA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gbnVsbCwgZmVjaGFfYmFja3VwID0gY3VycmVudF90aW1lc3RhbXAsIG1vZGlmaWNhZG8gPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVuX2VzdGFkbyA9IG51bGwsIHJlc3VtZW5fZXN0YWRvX3N1cCA9IG51bGwsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzZV90YWJsYSA9IG51bGwsIHJlYSA9IG51bGwsIG5vcmVhID0gbnVsbCwgcmVhX3N1cCA9IG51bGwsIG5vcmVhX3N1cCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbl9jb25fdmFyXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIHBrX2ludGVncmFkYS0+PiR7YmUuZGIucXVvdGVMaXRlcmFsKE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSyl9ID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzX3VsdGltYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYGxhIGVuY3Vlc3RhICR7cGFyYW1zLmVuY30gc2UgYmxhbnF1ZcOzIGNvcnJlY3RhbWVudGVgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWNjaW9uX3RhcmVhc190ZW1fZWplY3V0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonY29uZGljaW9uJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidhY2Npb24nICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9ICBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgYWNjaW9uID0gcGFyYW1zLmFjY2lvbiBhcyBFc3RhZG9BY2Npb247XHJcbiAgICAgICAgICAgIHZhciBjdW1wbGU6Ym9vbGVhbiA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgYWNjaW9uX2N1bXBsZV9jb25kaWNpb24oJDUsICQ2LCAkNywgJDgsIChcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY29uZGljaW9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSBlc3RhZG9zX2FjY2lvbmVzIFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVzdGFkbyA9ICQyIGFuZCBlYWNjaW9uID0gJDMgYW5kIGVzdGFkb19kZXN0aW5vID0gJDRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKWAsIFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbiwgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG8sIFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmVuYywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbixcclxuICAgICAgICAgICAgXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgaWYoIWN1bXBsZSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgcHVkbyBlamVjdXRhciBsYSBhY2Npw7NuLCBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzbiBcIiR7cGFyYW1zLmNvbmRpY2lvbn1cIiBvIGJpZW4gZWwgZXN0YWRvIGVzdMOhIGRlc2FjdHVhbGl6YWRvLCByZWZyZXNxdWUgbGEgZ3JpbGxhLmApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmM9JDIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5lbmMsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgaWYoYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgaWYoYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGV4aXN0ZSBlbCBwcm9jZWR1cmUgXCIke2FjY2lvbi5ub21icmVfcHJvY2VkdXJlfVwiIGRlZmluaWRvIGVuIGxhIHRhYmxhIFwiZXN0YWRvc19hY2Npb25lc1wiIHBhcmEgZWxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm86ICR7YWNjaW9uLm9wZXJhdGl2b30sIGVzdGFkbzogJHthY2Npb24uZXN0YWRvfSwgZWFjY2lvbjogJHthY2Npb24uZWFjY2lvbn0uYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBCVVNDTyBQQVNFIERFIFRBUkVBXHJcbiAgICAgICAgICAgIHZhciB0YXJlYVNpZ3VpZW50ZSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3Byb3hpbWFzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byA9ICQxIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSAkMiBhbmQgZXN0YWRvID0gJDMgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYV9jdW1wbGVfY29uZGljaW9uKCQ0LCAkNSwgJDYsICQ3LCBjb25kaWNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgb3JkZW5cclxuICAgICAgICAgICAgICAgICAgICBsaW1pdCAxYFxyXG4gICAgICAgICAgICAsW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSxcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlubyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5lbmNcclxuICAgICAgICAgICAgXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3c7XHJcbiAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlKXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vXVxyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGF1dG9Bc2lnbmFkbyA9IHRhcmVhU2lndWllbnRlLnJlZ2lzdHJhX3JlY2VwY2lvbmlzdGE/Y29udGV4dC51c2VyLmlkcGVyOm51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGNvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0c19lbnRyYWRhID0gY3VycmVudF90aW1lc3RhbXAsIGFkZWxhbnRhciA9IG51bGwsIGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2F1dG9Bc2lnbmFkbz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiwgcmVjZXBjaW9uaXN0YT1cIitxKGF1dG9Bc2lnbmFkbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcIlwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vLCB0YXJlYVNpZ3VpZW50ZS5lc3RhZG9fZGVzdGlub11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVt0YXJlYVNpZ3VpZW50ZS5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBGSU4gUEFTRSBERSBUQVJFQVxyXG4gICAgICAgICAgICByZXR1cm4gXCJva1wiO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGlzcG9uaWJpbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBhc2lnbmFkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rlc2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICdjYXJnYXInXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9hbmFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtvcGVyYXRpdm86cGFyYW1zLm9wZXJhdGl2bywgaWRfY2FzbzpwYXJhbXMuZW5jfSlcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV92ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gJzEnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub192ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2VycmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9ICcxJywgYXNpZ25hZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jLCBjb250ZXh0LnVzZXIuaWRwZXJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jZXJyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfc3VwZXJ2aXNhcl9wcmVzZW5jaWFsJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdzdXBlJywgMV0pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3N1cGVydmlzYXJfdGVsZWZvbmljYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnc3VwZScsIDJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19zdXBlcnZpc2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2ZpbmMnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfcGFzYXJfYV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3Bhc2FyX2FfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX25vX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3JlY3VwZXJhcl9kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtvcGVyYXRpdm8sIGVuYywgdGFyZWF9ID0gcGFyYW1zO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdSddKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19yZWN1cGVyYXJfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLCBlbmMsIHRhcmVhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdScsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfbm9fdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZm9yemFyX3RhcmVhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYV9hY3R1YWwnICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhX251ZXZhJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnVicgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWxdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfaGFiaWxpdGFyX2Rlc2hhYmlsaXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGhhYmlsaXRhZGEgPSBub3QgaGFiaWxpdGFkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246IEFDQ0lPTl9QQVNBUl9QUk9JRSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbWV0cm9zID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb2AsXHJcbiAgICAgICAgICAgIFtdKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3QgPSBgc2VsZWN0IHQub3BlcmF0aXZvLCB0LmVuYywgdC50YXJlYV9hY3R1YWwsIHR0LnRzX2VudHJhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSB0dCBqb2luIHRlbSB0IHVzaW5nIChvcGVyYXRpdm8sZW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdHQub3BlcmF0aXZvPSQxIGFuZCB0dC50YXJlYT0gJDIgYW5kICgke2dldERpYXNBUGFzYXJRdWVyeSgndHQnKX0gPD0gMCBvciBjb2FsZXNjZSh0dC5hZGVsYW50YXIsZmFsc2UpKSBhbmQgdHQudGFyZWEgPSB0LnRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdWJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAnZmluYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgLy9UT0RPIGFzaWduYXIgZW4gcHJvY2VzYW1pZW50b1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAncHJvYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSB0XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICdwcm9jJ1xyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0LmVuYyA9IGF1eC5lbmNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAgLFxyXG4gICAgICAgICAgICBbcGFyYW1ldHJvcy5vcGVyYXRpdm8sICdmaW5jJ10pLmZldGNoQWxsKCk7XHJcbiAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2ludGVyY2FtYmlhcl9lbmN1ZXN0YXMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonZW5jMScgICAgICAgICAgICAgICAgLHJlZmVyZW5jZXM6J3RlbScgLCB0eXBlTmFtZTondGV4dCcgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTEnICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMScgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jMicgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCcgICAgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTInICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMicgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZToncGFzbycgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J2NvbmZpcm1hJyAgICAgICAgICAgICwgdHlwZU5hbWU6J2Jvb2xlYW4nLCBkZWZhdWx0VmFsdWU6ZmFsc2UsIGxhYmVsOidDb25maXJtYSBpbnRlcmNhbWJpbyBkZSBsb3MgZGF0b3MgZW50cmUgbGFzIGVuY3Vlc3Rhcz8gJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdjb29yX2NhbXBvJywnYWRtaW4nXSxcclxuICAgICAgICBwcm9ncmVzczp0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBQYXJhIGNvbnRyb2xhcjpcclxuICAgICAgICAgICAgICogLSBxdWUgbGFzIGhvZ2FyZXMsIHBlcnNvbmFzLCBldGMgZXN0w6luIGludGVyY2FtYmlhZGFzIFxyXG4gICAgICAgICAgICAgKiAgKiB0YW50byBlbiBlbCBqc29uXHJcbiAgICAgICAgICAgICAqICAqIGNvbW8gZW4gbGFzIFREc1xyXG4gICAgICAgICAgICAgKiAtIGNvc2FzIHF1ZSBzZSBjYWxjdWxhbiBwb3IgbGEgYXBwPyBjdWFsZXM/IChyZXN1bWVuX2VzdGFkbywgcmVhIHkgbm9yZWEpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1fY2FudHBlcj1bcGFyYW1zLmNhbnRQZXJFbmMxLHBhcmFtcy5jYW50UGVyRW5jMl07XHJcbiAgICAgICAgICAgIHZhciBwYXJhbV9yZWE9W3BhcmFtcy5yZWExLHBhcmFtcy5yZWEyXTsgICAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5jb25maXJtYSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpcm3DsyBpbnRlcmNhbWJpbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCAhcGFyYW1zLmVuYzEgfHwgIXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgRmFsdGEgaW5ncmVzYXIgdW4gbnVtZXJvIGRlIGVuY3Vlc3RhIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICggcGFyYW1zLmVuYzE9PXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgZW5jMSB5IGVuYzIgZGViZW4gc2VyIGRpc3RpbnRvcyEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoWzEsMl0uaW5jbHVkZXMocGFyYW1zLnBhc28pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBwYXNvIGRlYmUgc2VyIDEoZWxpbWluYXIgZGF0b3MgKSApbyAyIChpbnRlcmNhbWJpbyB5IHJlZ2VuZXJhY2lvbiBkYXRvcyknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLnBhc289PTEpe1xyXG4gICAgICAgICAgICAgICAgcGFyYW1fY2FudHBlci5mb3JFYWNoKChucGVyLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFucGVyKSAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCBDYW50aWRhZCBkZSBQZXJzb25hcyBUb3RhbCBkZSBlbmMke2krMX0sIG5vIGVzdGEgaW5ncmVzYWRvIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgcGFyYW1fcmVhLmZvckVhY2goKHIsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghcikgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCByZWEgIGRlIGVuYyR7aSsxfSwgbm8gZXN0YSBpbmdyZXNhZG8hYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pICAgXHJcbiAgICAgICAgICAgIC8vIENPTlRST0xBUiBRVUUgTklOR1VOQSBERSBMQVMgMiBlbmN1ZXN0YXMgRVNURSBDQVJHQURBLCBBQklFUlRBIEZBTFRBXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gICA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkMgICAgPSBjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBrX1VBX1BSSU5DID0gY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSykgICAgXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdG9zX2NvbnRyb2w9KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAke3BrX1VBX1BSSU5DfSwgcmVhLCBjb3VudCgqKW5wIFxyXG4gICAgICAgICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiBwZXJzb25hcyBwIG9uIHQub3BlcmF0aXZvPXAub3BlcmF0aXZvIGFuZCB0LmVuYz1wLiR7cGtfVUFfUFJJTkN9XHJcbiAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwIGJ5ICR7cGtfVUFfUFJJTkN9LCByZWFcclxuICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgJHtwa19VQV9QUklOQ31cclxuICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19jb250cm9sLmZvckVhY2goKGRjLGkpPT57XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1fY2FudHBlcltpXSAhPT0gZGMubnApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeG1lbnM9YEVycm9yLCBubyBjb2luY2lkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBkZSBlbmMke2krMX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih4bWVucyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtX3JlYVtpXSAhPT0gZGMucmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgbm8gY29pbmNpZGUgbGEgcmVhIGRlIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pOyAgICBcclxuXHJcbiAgICAgICAgICAgIHZhciBkYXRvc190ZW09KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCB0LmVuYywgdGFyZWFfYWN0dWFsLCBqc29uX2VuY3Vlc3RhLCBlc3RhZG8gXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW0gdCBsZWZ0IGpvaW4gdGFyZWFzX3RlbSB0dCBvbiB0Lm9wZXJhdGl2bz10dC5vcGVyYXRpdm8gYW5kIHQuZW5jPXR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWw9dHQudGFyZWEgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm89JDEgYW5kIHQuZW5jIGluICgkMiwkMykgXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgdC5lbmMgXHJcbiAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgIC8vRkFMVEEgY29udHJvbGFyIGVzdGFkbyB5IHRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICBkYXRvc190ZW0uZm9yRWFjaCgoZHQsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghKFsnUCddLmluY2x1ZGVzKGR0W2ldLmVzdGFkbyl8fCBbJ3Byb2MnLCdmaW5jJywnYW5hYyddLmluY2x1ZGVzKGR0W2ldLnRhcmVhX2FjdHVhbCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgc29sbyBzZSBwdWVkZSBpbnRlcmNhbWJpYXIgZW5jdWVzdGFzIGVuIHRhcmVhIHByb2MsIGZpbmMsIGFuYWMgb3IgZW4gZXN0YWRvIFAsIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTsgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkYXRvc190ZW0ubGVuZ3RoIT0yKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIE5vIHNlIGVuY29udHJhcm9uIDIgZW5jdWVzdGFzJykgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmICggcGFyYW1zLnBhc28gPT0gMSApe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbXBpYSBsYXMgVERzIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZHRlbSBvZiBkYXRvc190ZW0peyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZGVsZXRlIGZyb20gJHtVQV9QUklOQ30gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfT0kMmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZHRlbS5lbmNdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmIChwYXJhbXMucGFzbyA9PSAyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW50X3Zpdj0oYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgIGNvdW50KCopIG52aXYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAke3BrX1VBX1BSSU5DfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FudF92aXY9PTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zaW11bGEgZ3VhcmRhZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuYzEgPSBkYXRvc190ZW1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmMyID0gZGF0b3NfdGVtWzFdOyAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMxLmVuYywgZW5jMi50YXJlYV9hY3R1YWwgLCBlbmMyLmpzb25fZW5jdWVzdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMyLmVuYywgZW5jMS50YXJlYV9hY3R1YWwgLCBlbmMxLmpzb25fZW5jdWVzdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2hhY2VyIGludGVyY2FtYmlvIGRlbCBlc3RhZG8gZGUgbGEgZW5jdWVzdGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvPSQ0LGFzaWduYWRvPSQ1IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0kMyBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFtPUEVSQVRJVk8sIGVuYzEuZW5jLCBlbmMyLnRhcmVhX2FjdHVhbCwgZW5jMi5lc3RhZG8sIGVuYzIuYXNpZ25hZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG89JDQsYXNpZ25hZG89JDUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDIgYW5kIHRhcmVhPSQzIGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZW5jMi5lbmMsIGVuYzEudGFyZWFfYWN0dWFsLCBlbmMxLmVzdGFkbywgZW5jMS5hc2lnbmFkb11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5leGVjdXRlKCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9oYWNlciBiYWNrdXAgXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIEZhbHRhIHJlYWxpemFyIHBhc28gMSEnKSBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBwYXNvIG5vIGNvbnNpZGVyYWRvIScpICAgIFxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoYExpc3RvIHBhc28gJHtwYXJhbXMucGFzb30uIEludGVyY2FtYmlvIHJlYWxpemFkbyBlbnRyZSBsYXMgZW5jdWVzdGFzICAke3BhcmFtcy5lbmMxfSB5ICR7cGFyYW1zLmVuYzJ9LiBQb3IgZmF2b3IgY29uc2lzdGEgbGEgZW5jdWVzdGFgKVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7ICAgICBcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YWRvcl9kbXNfbW9zdHJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnLCByZWZlcmVuY2VzOlwib3BlcmF0aXZvc1wifSxcclxuICAgICAgICAgICAge25hbWU6J2VuY3Vlc3RhZG9yJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdhZG1pbiddLFxyXG4gICAgICAgIHJlc3VsdE9rOidtb3N0cmFyX2VuY3Vlc3Rhc19hX2JsYW5xdWVhcicsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGFzaWduYWRvID0gJDIgYW5kIGNhcmdhZG9fZG0gaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBjYXJnYWRvX2RtXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmN1ZXN0YWRvcl0pXHJcbiAgICAgICAgICAgIC5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICBpZihyZXN1bHQucm93Q291bnQgPT0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvciAoYE5vIHNlIGVuY29udHJhcm9uIGVuY3Vlc3RhcyBjYXJnYWRhcyBlbiB1biBETSBwYXJhIGVsIG9wZXJhdGl2byAke3BhcmFtcy5vcGVyYXRpdm99LCBlbmN1ZXN0YWRvciAke3BhcmFtcy5lbmN1ZXN0YWRvcn1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7cm93czogcmVzdWx0LnJvd3MsIG9wZXJhdGl2bzogcGFyYW1zLm9wZXJhdGl2b307XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGxldCB0YXJlYXNUZW1SZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBjYXJnYWRvX2RtID0gbnVsbCwgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcicsIGVzdGFkbyA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBjYXJnYWRvX2RtID0gJDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRva2VuLCBFU1RBRE9fUE9TVEVSSU9SX0RFU0NBUkdBXSlcclxuICAgICAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHRhcmVhc1RlbVJlc3VsdC5yb3dDb3VudCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yKCdObyBzZSBibGFucXVlw7MgbmluZ3VuYSBlbmN1ZXN0YScpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKGxldCB0dCBvZiB0YXJlYXNUZW1SZXN1bHQucm93cyl7XHJcbiAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8gPSBgZW5jICR7dHQuZW5jfSBzZSBibGFucXVlw7MgY29ycmVjdGFtZW50ZS5gO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdEJhY2t1cCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2VuY3Vlc3RhID0ganNvbl9iYWNrdXAsIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gZmVjaGFfYmFja3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCBmZWNoYV9iYWNrdXAgPiBjb2FsZXNjZShmZWNoYV9tb2RpZl9lbmN1ZXN0YSwgJzE5MDAtMDEtMDEnKSBhbmQganNvbl9iYWNrdXAgaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgIFt0dC5vcGVyYXRpdm8sIHR0LmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0QmFja3VwLnJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8rPWAgU2UgcmVzdGFibGVjacOzIGVsIGJhY2t1cCBjb24gZmVjaGEgJHtyZXN1bHRCYWNrdXAucm93LmZlY2hhX2JhY2t1cC50b1ltZEhtcygpfS5gXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtwYXJhbXM6cXVlcnlQYXJhbXMsc2V0dGVyc30gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiByZXN1bHRCYWNrdXAucm93Lmpzb25fZW5jdWVzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFt0dC5vcGVyYXRpdm8sIHR0LmVuYywgdHQudGFyZWFdXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc1xyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzaW11bGFyR3VhcmRhZG9EZUVuY3Vlc3RhRGVzZGVBcHBFc2NyaXRvcmlvKGNvbnRleHQsIHJlc3VsdEJhY2t1cC5yb3cub3BlcmF0aXZvLCByZXN1bHRCYWNrdXAucm93LmVuYywgdHQudGFyZWEscmVzdWx0QmFja3VwLnJvdy5qc29uX2VuY3Vlc3RhKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJlYXNUZW1SZXN1bHQucm93cztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5dOyJdfQ==