dmencu 0.3.34 → 0.3.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/client/client.d.ts +1 -1
- package/dist/client/client/client.js +540 -539
- package/dist/client/client/menu.js +2 -2
- package/dist/client/unlogged/abrir-formulario.d.ts +12 -12
- package/dist/client/unlogged/abrir-formulario.js +102 -102
- package/dist/client/unlogged/bypass-formulario.d.ts +200 -200
- package/dist/client/unlogged/bypass-formulario.js +1041 -1041
- package/dist/client/unlogged/redux-formulario.d.ts +349 -349
- package/dist/client/unlogged/redux-formulario.js +317 -317
- package/dist/client/unlogged/tipos.d.ts +469 -469
- package/dist/client/unlogged/tipos.js +21 -21
- package/dist/server/server/app-dmencu.d.ts +1511 -1511
- package/dist/server/server/app-dmencu.js +649 -649
- package/dist/server/server/def-config.d.ts +1 -1
- package/dist/server/server/def-config.js +14 -14
- package/dist/server/server/procedures-dmencu.d.ts +6 -6
- package/dist/server/server/procedures-dmencu.js +854 -854
- package/dist/server/server/server-dmencu.d.ts +1 -1
- package/dist/server/server/server-dmencu.js +20 -20
- package/dist/server/server/table-acciones.d.ts +3 -3
- package/dist/server/server/table-acciones.js +53 -53
- package/dist/server/server/table-areas.d.ts +3 -3
- package/dist/server/server/table-areas.js +88 -88
- package/dist/server/server/table-comunas.d.ts +3 -3
- package/dist/server/server/table-comunas.js +28 -28
- package/dist/server/server/table-control_campo.d.ts +11 -11
- package/dist/server/server/table-control_campo.js +71 -71
- package/dist/server/server/table-control_resumen.d.ts +3 -3
- package/dist/server/server/table-control_resumen.js +18 -18
- package/dist/server/server/table-encuestadores.d.ts +3 -3
- package/dist/server/server/table-encuestadores.js +18 -18
- package/dist/server/server/table-estados.d.ts +3 -3
- package/dist/server/server/table-estados.js +60 -60
- package/dist/server/server/table-estados_acciones.d.ts +3 -3
- package/dist/server/server/table-estados_acciones.js +38 -38
- package/dist/server/server/table-hogares.d.ts +3 -3
- package/dist/server/server/table-hogares.js +156 -156
- package/dist/server/server/table-hogares_sup.d.ts +3 -3
- package/dist/server/server/table-hogares_sup.js +191 -191
- package/dist/server/server/table-lotes.d.ts +3 -3
- package/dist/server/server/table-lotes.js +35 -35
- package/dist/server/server/table-mis_encuestadores.d.ts +3 -3
- package/dist/server/server/table-mis_encuestadores.js +56 -56
- package/dist/server/server/table-mis_tareas.d.ts +3 -3
- package/dist/server/server/table-mis_tareas.js +18 -18
- package/dist/server/server/table-mis_tareas_areas.d.ts +3 -3
- package/dist/server/server/table-mis_tareas_areas.js +20 -20
- package/dist/server/server/table-no_rea.d.ts +3 -3
- package/dist/server/server/table-no_rea.js +32 -32
- package/dist/server/server/table-no_rea_sup.d.ts +3 -3
- package/dist/server/server/table-no_rea_sup.js +32 -32
- package/dist/server/server/table-operaciones.d.ts +3 -3
- package/dist/server/server/table-operaciones.js +30 -30
- package/dist/server/server/table-parametros.d.ts +3 -3
- package/dist/server/server/table-parametros.js +39 -39
- package/dist/server/server/table-permisos.d.ts +3 -3
- package/dist/server/server/table-permisos.js +31 -31
- package/dist/server/server/table-personal.d.ts +6 -6
- package/dist/server/server/table-personal.js +56 -56
- package/dist/server/server/table-personal_rol.d.ts +3 -3
- package/dist/server/server/table-personal_rol.js +36 -36
- package/dist/server/server/table-personas.d.ts +3 -3
- package/dist/server/server/table-personas.js +448 -448
- package/dist/server/server/table-personas_sup.d.ts +3 -3
- package/dist/server/server/table-personas_sup.js +93 -93
- package/dist/server/server/table-recepcionistas.d.ts +3 -3
- package/dist/server/server/table-recepcionistas.js +18 -18
- package/dist/server/server/table-recuperadores.d.ts +3 -3
- package/dist/server/server/table-recuperadores.js +18 -18
- package/dist/server/server/table-resultados_tarea.d.ts +3 -3
- package/dist/server/server/table-resultados_tarea.js +28 -28
- package/dist/server/server/table-roles.d.ts +3 -3
- package/dist/server/server/table-roles.js +32 -32
- package/dist/server/server/table-roles_permisos.d.ts +3 -3
- package/dist/server/server/table-roles_permisos.js +35 -35
- package/dist/server/server/table-roles_subordinados.d.ts +3 -3
- package/dist/server/server/table-roles_subordinados.js +32 -32
- package/dist/server/server/table-semanas.d.ts +3 -3
- package/dist/server/server/table-semanas.js +34 -34
- package/dist/server/server/table-sincronizaciones.d.ts +3 -3
- package/dist/server/server/table-sincronizaciones.js +30 -30
- package/dist/server/server/table-supervisores.d.ts +3 -3
- package/dist/server/server/table-supervisores.js +18 -18
- package/dist/server/server/table-tareas.d.ts +3 -3
- package/dist/server/server/table-tareas.js +46 -46
- package/dist/server/server/table-tareas_areas.d.ts +3 -3
- package/dist/server/server/table-tareas_areas.js +55 -55
- package/dist/server/server/table-tareas_tem.d.ts +3 -3
- package/dist/server/server/table-tareas_tem.js +104 -105
- package/dist/server/server/table-tareas_tem_asignables.d.ts +1 -1
- package/dist/server/server/table-tareas_tem_asignables.js +5 -5
- package/dist/server/server/table-tareas_tem_recepcion.d.ts +3 -5
- package/dist/server/server/table-tareas_tem_recepcion.js +33 -43
- package/dist/server/server/table-tem.d.ts +3 -3
- package/dist/server/server/table-tem.js +192 -192
- package/dist/server/server/table-tem_asignacion.d.ts +3 -0
- package/dist/server/server/table-tem_asignacion.js +51 -0
- package/dist/server/server/table-tem_recepcion.d.ts +3 -3
- package/dist/server/server/table-tem_recepcion.js +18 -18
- package/dist/server/server/table-usuarios.d.ts +3 -3
- package/dist/server/server/table-usuarios.js +58 -58
- package/dist/server/server/table-visitas.d.ts +3 -3
- package/dist/server/server/table-visitas.js +91 -91
- package/dist/server/server/table-visitas_sup.d.ts +3 -3
- package/dist/server/server/table-visitas_sup.js +91 -91
- package/dist/server/server/table-viviendas.d.ts +3 -3
- package/dist/server/server/table-viviendas.js +299 -299
- package/dist/server/server/types-dmencu.d.ts +24 -24
- package/dist/server/server/types-dmencu.js +32 -32
- package/dist/server/unlogged/tipos.d.ts +469 -469
- package/dist/server/unlogged/tipos.js +21 -21
- package/dist/unlogged/unlogged/abrir-formulario.d.ts +12 -12
- package/dist/unlogged/unlogged/abrir-formulario.js +102 -102
- package/dist/unlogged/unlogged/adapt.js +7 -7
- package/dist/unlogged/unlogged/bypass-formulario.d.ts +200 -200
- package/dist/unlogged/unlogged/bypass-formulario.js +1041 -1041
- package/dist/unlogged/unlogged/redux-formulario.d.ts +349 -349
- package/dist/unlogged/unlogged/redux-formulario.js +317 -317
- package/dist/unlogged/unlogged/render-formulario.d.ts +54 -54
- package/dist/unlogged/unlogged/render-formulario.js +1485 -1485
- package/dist/unlogged/unlogged/render-general.d.ts +126 -126
- package/dist/unlogged/unlogged/render-general.js +184 -184
- package/dist/unlogged/unlogged/tipos.d.ts +469 -469
- package/dist/unlogged/unlogged/tipos.js +21 -21
- package/dist/unlogged/unlogged/unlogged.d.ts +1 -1
- package/dist/unlogged/unlogged/unlogged.js +162 -162
- package/package.json +1 -1
|
@@ -1,95 +1,95 @@
|
|
|
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", "pg-promise-strict", "best-globals", "fs", "expre-parser"], factory);
|
|
22
|
-
}
|
|
23
|
-
})(function (require, exports) {
|
|
24
|
-
"use strict";
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.ProceduresDmEncu = exports.setHdrQuery = exports.getOperativoActual = void 0;
|
|
27
|
-
const likeAr = require("like-ar");
|
|
28
|
-
__exportStar(require("./types-dmencu"), exports);
|
|
29
|
-
const pg_promise_strict_1 = require("pg-promise-strict");
|
|
30
|
-
const best_globals_1 = require("best-globals");
|
|
31
|
-
const fs_1 = require("fs");
|
|
32
|
-
const ExpresionParser = require("expre-parser");
|
|
33
|
-
var path = require('path');
|
|
34
|
-
var sqlTools = require('sql-tools');
|
|
35
|
-
var discrepances = require('discrepances');
|
|
36
|
-
const formPrincipal = 'F:F1';
|
|
37
|
-
const MAIN_TABLENAME = 'viviendas';
|
|
38
|
-
const getOperativoActual = async (context) => {
|
|
39
|
-
var _a;
|
|
40
|
-
var be = context.be;
|
|
41
|
-
var result = await be.procedure.table_data.coreFunction(context, { table: `parametros`, fixedFields: [] });
|
|
42
|
-
if ((_a = result[0]) === null || _a === void 0 ? void 0 : _a.operativo) {
|
|
43
|
-
return result[0].operativo;
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
throw Error('no se configuró un operativo en la tabla parámetros');
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
exports.getOperativoActual = getOperativoActual;
|
|
50
|
-
function createStructure(context, tableName) {
|
|
51
|
-
var be = context.be;
|
|
52
|
-
var mainTableDef = be.tableStructures[tableName](context);
|
|
53
|
-
var getPkFromTableDef = function getPkFromTableDef(tableDef) {
|
|
54
|
-
return tableDef.primaryKey.map(function (pk) {
|
|
55
|
-
return { fieldName: pk };
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
|
|
59
|
-
// return tableDef.foreignKeys? tableDef.foreignKeys.map(fk=>fk.fields): [];
|
|
60
|
-
let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
|
|
61
|
-
return parentFk ? parentFk.fields : [];
|
|
62
|
-
};
|
|
63
|
-
var struct = {
|
|
64
|
-
tableName: mainTableDef.name,
|
|
65
|
-
pkFields: getPkFromTableDef(mainTableDef),
|
|
66
|
-
childTables: []
|
|
67
|
-
};
|
|
68
|
-
if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
|
|
69
|
-
mainTableDef.detailTables.forEach(function (detailTable) {
|
|
70
|
-
struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
return struct;
|
|
74
|
-
}
|
|
75
|
-
var getParametersAndSettersForUpdateTem = async (context, operativo, idEnc, respuestasUAPrincipal, tarea) => {
|
|
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", "pg-promise-strict", "best-globals", "fs", "expre-parser"], factory);
|
|
22
|
+
}
|
|
23
|
+
})(function (require, exports) {
|
|
24
|
+
"use strict";
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ProceduresDmEncu = exports.setHdrQuery = exports.getOperativoActual = void 0;
|
|
27
|
+
const likeAr = require("like-ar");
|
|
28
|
+
__exportStar(require("./types-dmencu"), exports);
|
|
29
|
+
const pg_promise_strict_1 = require("pg-promise-strict");
|
|
30
|
+
const best_globals_1 = require("best-globals");
|
|
31
|
+
const fs_1 = require("fs");
|
|
32
|
+
const ExpresionParser = require("expre-parser");
|
|
33
|
+
var path = require('path');
|
|
34
|
+
var sqlTools = require('sql-tools');
|
|
35
|
+
var discrepances = require('discrepances');
|
|
36
|
+
const formPrincipal = 'F:F1';
|
|
37
|
+
const MAIN_TABLENAME = 'viviendas';
|
|
38
|
+
const getOperativoActual = async (context) => {
|
|
39
|
+
var _a;
|
|
40
|
+
var be = context.be;
|
|
41
|
+
var result = await be.procedure.table_data.coreFunction(context, { table: `parametros`, fixedFields: [] });
|
|
42
|
+
if ((_a = result[0]) === null || _a === void 0 ? void 0 : _a.operativo) {
|
|
43
|
+
return result[0].operativo;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw Error('no se configuró un operativo en la tabla parámetros');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.getOperativoActual = getOperativoActual;
|
|
50
|
+
function createStructure(context, tableName) {
|
|
51
|
+
var be = context.be;
|
|
52
|
+
var mainTableDef = be.tableStructures[tableName](context);
|
|
53
|
+
var getPkFromTableDef = function getPkFromTableDef(tableDef) {
|
|
54
|
+
return tableDef.primaryKey.map(function (pk) {
|
|
55
|
+
return { fieldName: pk };
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
|
|
59
|
+
// return tableDef.foreignKeys? tableDef.foreignKeys.map(fk=>fk.fields): [];
|
|
60
|
+
let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
|
|
61
|
+
return parentFk ? parentFk.fields : [];
|
|
62
|
+
};
|
|
63
|
+
var struct = {
|
|
64
|
+
tableName: mainTableDef.name,
|
|
65
|
+
pkFields: getPkFromTableDef(mainTableDef),
|
|
66
|
+
childTables: []
|
|
67
|
+
};
|
|
68
|
+
if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
|
|
69
|
+
mainTableDef.detailTables.forEach(function (detailTable) {
|
|
70
|
+
struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return struct;
|
|
74
|
+
}
|
|
75
|
+
var getParametersAndSettersForUpdateTem = async (context, operativo, idEnc, respuestasUAPrincipal, tarea) => {
|
|
76
76
|
var registraEstadoEnTem = (await context.client.query(`select registra_estado_en_tem
|
|
77
77
|
from tareas
|
|
78
|
-
where operativo=$1 and tarea = $2`, [operativo, tarea]).fetchUniqueValue()).value;
|
|
79
|
-
var params = [operativo, idEnc, respuestasUAPrincipal];
|
|
80
|
-
var setters = `json_encuesta = $3`;
|
|
81
|
-
//TODO ARREGLAR ESTE HORROR, GENERALIZAR
|
|
82
|
-
if (tarea == 'supe') {
|
|
83
|
-
setters += `, resumen_estado_sup=$4, norea_sup=$5, rea_sup=$6`;
|
|
84
|
-
params = params.concat([respuestasUAPrincipal.resumenEstadoSup, respuestasUAPrincipal.codNoReaSup, respuestasUAPrincipal.codReaSup]);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
setters += `, resumen_estado=$4, norea=$5, rea=$6`;
|
|
88
|
-
params = params.concat([respuestasUAPrincipal.resumenEstado, respuestasUAPrincipal.codNoRea, respuestasUAPrincipal.codRea]);
|
|
89
|
-
}
|
|
90
|
-
return { setters, params };
|
|
91
|
-
};
|
|
92
|
-
var getHdrQuery = function getHdrQuery(quotedCondViv) {
|
|
78
|
+
where operativo=$1 and tarea = $2`, [operativo, tarea]).fetchUniqueValue()).value;
|
|
79
|
+
var params = [operativo, idEnc, respuestasUAPrincipal];
|
|
80
|
+
var setters = `json_encuesta = $3`;
|
|
81
|
+
//TODO ARREGLAR ESTE HORROR, GENERALIZAR
|
|
82
|
+
if (tarea == 'supe') {
|
|
83
|
+
setters += `, resumen_estado_sup=$4, norea_sup=$5, rea_sup=$6`;
|
|
84
|
+
params = params.concat([respuestasUAPrincipal.resumenEstadoSup, respuestasUAPrincipal.codNoReaSup, respuestasUAPrincipal.codReaSup]);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
setters += `, resumen_estado=$4, norea=$5, rea=$6`;
|
|
88
|
+
params = params.concat([respuestasUAPrincipal.resumenEstado, respuestasUAPrincipal.codNoRea, respuestasUAPrincipal.codRea]);
|
|
89
|
+
}
|
|
90
|
+
return { setters, params };
|
|
91
|
+
};
|
|
92
|
+
var getHdrQuery = function getHdrQuery(quotedCondViv) {
|
|
93
93
|
return `
|
|
94
94
|
with viviendas as
|
|
95
95
|
(select t.enc, t.json_encuesta as respuestas, t.resumen_estado as "resumenEstado",
|
|
@@ -131,68 +131,68 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
131
131
|
group by area, observaciones_hdr`, 'fecha')} as cargas,
|
|
132
132
|
${(0, pg_promise_strict_1.jsono)(`select enc, jsonb_build_object('tem', tem, 'tarea', tarea) as otras from viviendas`, 'enc', `otras ||'{}'::jsonb`)}
|
|
133
133
|
as "informacionHdr"
|
|
134
|
-
`;
|
|
135
|
-
};
|
|
136
|
-
var setHdrQuery = (myFun) => getHdrQuery = myFun;
|
|
137
|
-
exports.setHdrQuery = setHdrQuery;
|
|
134
|
+
`;
|
|
135
|
+
};
|
|
136
|
+
var setHdrQuery = (myFun) => getHdrQuery = myFun;
|
|
137
|
+
exports.setHdrQuery = setHdrQuery;
|
|
138
138
|
const getUAPrincipal = async (client, operativo) => (await client.query(`select unidad_analisis
|
|
139
139
|
from unidad_analisis
|
|
140
140
|
where operativo= $1 and principal
|
|
141
|
-
`, [operativo]).fetchUniqueValue()).value;
|
|
142
|
-
var funcionesConocidas = {};
|
|
143
|
-
var compiler = new ExpresionParser.Compiler({
|
|
144
|
-
language: 'js',
|
|
145
|
-
varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
|
|
146
|
-
funWrapper: (functionName) => {
|
|
147
|
-
if (!funcionesConocidas[functionName]) {
|
|
148
|
-
console.log(functionName);
|
|
149
|
-
funcionesConocidas[functionName] = true;
|
|
150
|
-
}
|
|
151
|
-
return `helpers.funs.${functionName}`;
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
function compilarExpresion(expresion) {
|
|
155
|
-
return compiler.toCode(ExpresionParser.parse(expresion
|
|
156
|
-
.replace(/\bis distinct from\b/gi, ' <> ')
|
|
157
|
-
.replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
|
|
158
|
-
.replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
|
|
159
|
-
}
|
|
160
|
-
function compilarExpresiones(casillero) {
|
|
161
|
-
var _a, _b;
|
|
162
|
-
if (!casillero) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
if (casillero.data.expresion_habilitar) {
|
|
166
|
-
casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
|
|
167
|
-
}
|
|
168
|
-
if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
|
|
169
|
-
var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
|
|
170
|
-
if (partes.length > 1) {
|
|
171
|
-
var precondicion = partes[0];
|
|
172
|
-
var valor = partes.slice(1).join('=>');
|
|
173
|
-
casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
for (var casilleroInterno of casillero.childs)
|
|
180
|
-
compilarExpresiones(casilleroInterno);
|
|
181
|
-
}
|
|
182
|
-
exports.ProceduresDmEncu = [
|
|
183
|
-
{
|
|
184
|
-
action: 'operativo_estructura_completa',
|
|
185
|
-
parameters: [
|
|
186
|
-
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
187
|
-
],
|
|
188
|
-
resultOk: 'desplegarFormulario',
|
|
189
|
-
coreFunction: async function (context, parameters) {
|
|
190
|
-
var be = context.be;
|
|
141
|
+
`, [operativo]).fetchUniqueValue()).value;
|
|
142
|
+
var funcionesConocidas = {};
|
|
143
|
+
var compiler = new ExpresionParser.Compiler({
|
|
144
|
+
language: 'js',
|
|
145
|
+
varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
|
|
146
|
+
funWrapper: (functionName) => {
|
|
147
|
+
if (!funcionesConocidas[functionName]) {
|
|
148
|
+
console.log(functionName);
|
|
149
|
+
funcionesConocidas[functionName] = true;
|
|
150
|
+
}
|
|
151
|
+
return `helpers.funs.${functionName}`;
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
function compilarExpresion(expresion) {
|
|
155
|
+
return compiler.toCode(ExpresionParser.parse(expresion
|
|
156
|
+
.replace(/\bis distinct from\b/gi, ' <> ')
|
|
157
|
+
.replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
|
|
158
|
+
.replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
|
|
159
|
+
}
|
|
160
|
+
function compilarExpresiones(casillero) {
|
|
161
|
+
var _a, _b;
|
|
162
|
+
if (!casillero) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (casillero.data.expresion_habilitar) {
|
|
166
|
+
casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
|
|
167
|
+
}
|
|
168
|
+
if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
|
|
169
|
+
var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
|
|
170
|
+
if (partes.length > 1) {
|
|
171
|
+
var precondicion = partes[0];
|
|
172
|
+
var valor = partes.slice(1).join('=>');
|
|
173
|
+
casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
for (var casilleroInterno of casillero.childs)
|
|
180
|
+
compilarExpresiones(casilleroInterno);
|
|
181
|
+
}
|
|
182
|
+
exports.ProceduresDmEncu = [
|
|
183
|
+
{
|
|
184
|
+
action: 'operativo_estructura_completa',
|
|
185
|
+
parameters: [
|
|
186
|
+
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
187
|
+
],
|
|
188
|
+
resultOk: 'desplegarFormulario',
|
|
189
|
+
coreFunction: async function (context, parameters) {
|
|
190
|
+
var be = context.be;
|
|
191
191
|
var result = await context.client.query(`select casilleros_jerarquizados($1) as formularios,
|
|
192
192
|
${(0, pg_promise_strict_1.jsono)(`select unidad_analisis, padre, pk_agregada, '{}'::jsonb as hijas from unidad_analisis`, 'unidad_analisis')} as unidades_analisis
|
|
193
|
-
`, [parameters.operativo]).fetchUniqueRow();
|
|
194
|
-
likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
|
|
195
|
-
// Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
|
|
193
|
+
`, [parameters.operativo]).fetchUniqueRow();
|
|
194
|
+
likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
|
|
195
|
+
// Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
|
|
196
196
|
var resultHermanos = await context.client.query(`
|
|
197
197
|
select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero boton, bf.casillero, bf.padre, fp.casillero, fp.unidad_analisis
|
|
198
198
|
from casilleros o left join casilleros bf
|
|
@@ -204,802 +204,802 @@ select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero bo
|
|
|
204
204
|
and fp.operativo = bf.operativo
|
|
205
205
|
where o.tipoc = 'F'
|
|
206
206
|
and o.unidad_analisis = fp.unidad_analisis
|
|
207
|
-
and o.operativo = $1`, [parameters.operativo]).fetchAll();
|
|
208
|
-
resultHermanos.rows.forEach(row => {
|
|
209
|
-
result.row.formularios[row.id_formulario].data.hermano = true;
|
|
210
|
-
});
|
|
211
|
-
function completarUA(ua, idUa, uAs) {
|
|
212
|
-
if (ua.padre) {
|
|
213
|
-
uAs[ua.padre].hijas[idUa] = ua;
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
ua.principal = true;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
|
|
207
|
+
and o.operativo = $1`, [parameters.operativo]).fetchAll();
|
|
208
|
+
resultHermanos.rows.forEach(row => {
|
|
209
|
+
result.row.formularios[row.id_formulario].data.hermano = true;
|
|
210
|
+
});
|
|
211
|
+
function completarUA(ua, idUa, uAs) {
|
|
212
|
+
if (ua.padre) {
|
|
213
|
+
uAs[ua.padre].hijas[idUa] = ua;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
ua.principal = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
|
|
220
220
|
var configSorteo = (await context.client.query(`
|
|
221
221
|
select config_sorteo
|
|
222
222
|
from operativos
|
|
223
223
|
where operativo = $1
|
|
224
|
-
`, [parameters.operativo]).fetchUniqueValue()).value;
|
|
225
|
-
let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
|
|
226
|
-
.map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
|
|
227
|
-
.plain();
|
|
228
|
-
if (configSorteo) {
|
|
229
|
-
likeAr(configSorteo).forEach((configSorteoFormulario) => {
|
|
230
|
-
configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
|
|
231
|
-
configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
return { timestamp: be.timestampEstructura, ...result.row, operativo: parameters.operativo, configSorteo, noReas: be.caches.tableContent.no_rea, noReasSup: be.caches.tableContent.no_rea_sup };
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
action: 'generar_formularios',
|
|
239
|
-
parameters: [
|
|
240
|
-
{ name: 'annio', typeName: 'integer', references: 'annio' },
|
|
241
|
-
{ name: 'mes', typeName: 'integer', references: 'mes' },
|
|
242
|
-
{ name: 'lote', typeName: 'integer', references: 'lotes' },
|
|
243
|
-
],
|
|
244
|
-
coreFunction: async function (context, parameters) {
|
|
245
|
-
var be = context.be;
|
|
246
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
224
|
+
`, [parameters.operativo]).fetchUniqueValue()).value;
|
|
225
|
+
let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
|
|
226
|
+
.map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
|
|
227
|
+
.plain();
|
|
228
|
+
if (configSorteo) {
|
|
229
|
+
likeAr(configSorteo).forEach((configSorteoFormulario) => {
|
|
230
|
+
configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
|
|
231
|
+
configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return { timestamp: be.timestampEstructura, ...result.row, operativo: parameters.operativo, configSorteo, noReas: be.caches.tableContent.no_rea, noReasSup: be.caches.tableContent.no_rea_sup };
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
action: 'generar_formularios',
|
|
239
|
+
parameters: [
|
|
240
|
+
{ name: 'annio', typeName: 'integer', references: 'annio' },
|
|
241
|
+
{ name: 'mes', typeName: 'integer', references: 'mes' },
|
|
242
|
+
{ name: 'lote', typeName: 'integer', references: 'lotes' },
|
|
243
|
+
],
|
|
244
|
+
coreFunction: async function (context, parameters) {
|
|
245
|
+
var be = context.be;
|
|
246
|
+
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
247
247
|
let resultUA = await context.client.query(`select *
|
|
248
248
|
from unidad_analisis
|
|
249
249
|
where principal = true and operativo = $1
|
|
250
|
-
`, [OPERATIVO]).fetchOneRowIfExists();
|
|
251
|
-
if (resultUA.rowCount === 0) {
|
|
252
|
-
throw new Error('No se configuró una unidad de analisis como principal');
|
|
253
|
-
}
|
|
254
|
-
let row = resultUA.row;
|
|
255
|
-
let resultPreguntas = await be.procedure.preguntas_ua_traer.coreFunction(context, row);
|
|
256
|
-
var contenedorVacio = {};
|
|
257
|
-
resultPreguntas.forEach(function (defPregunta) {
|
|
258
|
-
contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
|
|
259
|
-
});
|
|
260
|
-
contenedorVacio.annio = parameters.annio;
|
|
261
|
-
contenedorVacio.mes = parameters.mes;
|
|
262
|
-
contenedorVacio.lote = parameters.lote;
|
|
250
|
+
`, [OPERATIVO]).fetchOneRowIfExists();
|
|
251
|
+
if (resultUA.rowCount === 0) {
|
|
252
|
+
throw new Error('No se configuró una unidad de analisis como principal');
|
|
253
|
+
}
|
|
254
|
+
let row = resultUA.row;
|
|
255
|
+
let resultPreguntas = await be.procedure.preguntas_ua_traer.coreFunction(context, row);
|
|
256
|
+
var contenedorVacio = {};
|
|
257
|
+
resultPreguntas.forEach(function (defPregunta) {
|
|
258
|
+
contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
|
|
259
|
+
});
|
|
260
|
+
contenedorVacio.annio = parameters.annio;
|
|
261
|
+
contenedorVacio.mes = parameters.mes;
|
|
262
|
+
contenedorVacio.lote = parameters.lote;
|
|
263
263
|
var result = await context.client.query(`select debe_haber.id_caso, s as id
|
|
264
264
|
from (select lote, armar_id(annio, mes, lote, s) as id_caso, s
|
|
265
265
|
from (select annio,mes,lote, cant_cues from lotes where (annio,mes,lote)=($2,$3,$4)) r, lateral generate_series(1,cant_cues) s
|
|
266
266
|
) debe_haber left join defgen hay on hay.id_caso = debe_haber.id_caso and hay.operativo=$1
|
|
267
|
-
where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
|
|
268
|
-
var params = { operativo: OPERATIVO };
|
|
269
|
-
for (var i = 0; i < result.rowCount; i++) {
|
|
270
|
-
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 }) }));
|
|
271
|
-
}
|
|
272
|
-
return { agregadas: result.rowCount };
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
action: 'upload_file',
|
|
277
|
-
progress: true,
|
|
278
|
-
parameters: [
|
|
279
|
-
{ name: 'id_adjunto', typeName: 'integer' },
|
|
280
|
-
{ name: 'nombre', typeName: 'text' },
|
|
281
|
-
],
|
|
282
|
-
files: { count: 1 },
|
|
283
|
-
coreFunction: function (context, parameters, files) {
|
|
284
|
-
let be = context.be;
|
|
285
|
-
let client = context.client;
|
|
286
|
-
context.informProgress({ message: be.messages.fileUploaded });
|
|
287
|
-
let file = files[0];
|
|
288
|
-
let ext = path.extname(file.path).substr(1);
|
|
289
|
-
let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
|
|
290
|
-
let filename = parameters.nombre || originalFilename;
|
|
291
|
-
let newPath = 'local-attachments/file-';
|
|
292
|
-
var createResponse = function createResponse(adjuntoRow) {
|
|
293
|
-
let resultado = {
|
|
294
|
-
message: 'La subida se realizó correctamente (update)',
|
|
295
|
-
nombre: adjuntoRow.nombre,
|
|
296
|
-
nombre_original: adjuntoRow.nombre_original,
|
|
297
|
-
ext: adjuntoRow.ext,
|
|
298
|
-
fecha: adjuntoRow.fecha,
|
|
299
|
-
hora: adjuntoRow.hora,
|
|
300
|
-
id_adjunto: adjuntoRow.id_adjunto
|
|
301
|
-
};
|
|
302
|
-
return resultado;
|
|
303
|
-
};
|
|
304
|
-
var moveFile = function moveFile(file, id_adjunto, extension) {
|
|
305
|
-
fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
|
|
306
|
-
};
|
|
307
|
-
return Promise.resolve().then(function () {
|
|
308
|
-
if (parameters.id_adjunto) {
|
|
267
|
+
where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
|
|
268
|
+
var params = { operativo: OPERATIVO };
|
|
269
|
+
for (var i = 0; i < result.rowCount; i++) {
|
|
270
|
+
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 }) }));
|
|
271
|
+
}
|
|
272
|
+
return { agregadas: result.rowCount };
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
action: 'upload_file',
|
|
277
|
+
progress: true,
|
|
278
|
+
parameters: [
|
|
279
|
+
{ name: 'id_adjunto', typeName: 'integer' },
|
|
280
|
+
{ name: 'nombre', typeName: 'text' },
|
|
281
|
+
],
|
|
282
|
+
files: { count: 1 },
|
|
283
|
+
coreFunction: function (context, parameters, files) {
|
|
284
|
+
let be = context.be;
|
|
285
|
+
let client = context.client;
|
|
286
|
+
context.informProgress({ message: be.messages.fileUploaded });
|
|
287
|
+
let file = files[0];
|
|
288
|
+
let ext = path.extname(file.path).substr(1);
|
|
289
|
+
let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
|
|
290
|
+
let filename = parameters.nombre || originalFilename;
|
|
291
|
+
let newPath = 'local-attachments/file-';
|
|
292
|
+
var createResponse = function createResponse(adjuntoRow) {
|
|
293
|
+
let resultado = {
|
|
294
|
+
message: 'La subida se realizó correctamente (update)',
|
|
295
|
+
nombre: adjuntoRow.nombre,
|
|
296
|
+
nombre_original: adjuntoRow.nombre_original,
|
|
297
|
+
ext: adjuntoRow.ext,
|
|
298
|
+
fecha: adjuntoRow.fecha,
|
|
299
|
+
hora: adjuntoRow.hora,
|
|
300
|
+
id_adjunto: adjuntoRow.id_adjunto
|
|
301
|
+
};
|
|
302
|
+
return resultado;
|
|
303
|
+
};
|
|
304
|
+
var moveFile = function moveFile(file, id_adjunto, extension) {
|
|
305
|
+
fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
|
|
306
|
+
};
|
|
307
|
+
return Promise.resolve().then(function () {
|
|
308
|
+
if (parameters.id_adjunto) {
|
|
309
309
|
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)
|
|
310
|
-
where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
311
|
-
return createResponse(result.row);
|
|
312
|
-
}).then(function (resultado) {
|
|
313
|
-
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
314
|
-
return resultado;
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
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) {
|
|
310
|
+
where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
311
|
+
return createResponse(result.row);
|
|
312
|
+
}).then(function (resultado) {
|
|
313
|
+
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
314
|
+
return resultado;
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
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) {
|
|
319
319
|
return context.client.query(`update adjuntos set ruta = concat('local-attachments/file-',id_adjunto::text,'.',ext)
|
|
320
|
-
where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
321
|
-
return createResponse(result.row);
|
|
322
|
-
}).then(function (resultado) {
|
|
323
|
-
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
324
|
-
return resultado;
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
}).catch(function (err) {
|
|
329
|
-
throw err;
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
action: 'caso_guardar',
|
|
335
|
-
parameters: [
|
|
336
|
-
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
337
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
338
|
-
{ name: 'datos_caso', typeName: 'jsonb' },
|
|
339
|
-
],
|
|
340
|
-
definedIn: 'dmencu',
|
|
341
|
-
//@ts-ignore especifico el tipo de los parámetros
|
|
342
|
-
coreFunction: async function (context, parameters, newClient) {
|
|
343
|
-
var client = newClient || context.client;
|
|
344
|
-
var datos_json = parameters.datos_caso;
|
|
345
|
-
var be = context.be;
|
|
346
|
-
var tableStructures_app = be.tableStructures;
|
|
347
|
-
var struct_dmencu = createStructure(context, MAIN_TABLENAME);
|
|
348
|
-
datos_json['operativo'] = parameters.operativo;
|
|
349
|
-
//TODO : vivienda ó enc???
|
|
350
|
-
datos_json['vivienda'] = parameters.id_caso;
|
|
351
|
-
function completar_ult_pk_en_arr(ult_pk, ua_arr) {
|
|
352
|
-
var con_pk_completa = ua_arr;
|
|
353
|
-
if (ua_arr && ua_arr.length >= 1) {
|
|
354
|
-
con_pk_completa = con_pk_completa.map((una_ua, i) => {
|
|
355
|
-
una_ua[ult_pk] = i + 1;
|
|
356
|
-
return una_ua;
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
;
|
|
360
|
-
return con_pk_completa;
|
|
361
|
-
}
|
|
362
|
-
for (var key1 in datos_json) {
|
|
363
|
-
var dato_key1 = datos_json[key1];
|
|
364
|
-
if (dato_key1 instanceof Array && dato_key1.length >= 1) {
|
|
365
|
-
var pk1 = tableStructures_app[key1](context).primaryKey;
|
|
366
|
-
var ult_pk1 = pk1[pk1.length - 1];
|
|
367
|
-
datos_json[key1] = completar_ult_pk_en_arr(ult_pk1, datos_json[key1]);
|
|
368
|
-
datos_json[key1].forEach((un_key1, i1) => {
|
|
369
|
-
for (var key2 in un_key1) {
|
|
370
|
-
if (un_key1[key2] instanceof Array && un_key1[key2].length >= 1) {
|
|
371
|
-
var pk2 = tableStructures_app[key2](context).primaryKey;
|
|
372
|
-
var ult_pk2 = pk2[pk2.length - 1];
|
|
373
|
-
datos_json[key1][i1][key2] = completar_ult_pk_en_arr(ult_pk2, datos_json[key1][i1][key2]);
|
|
374
|
-
datos_json[key1][i1][key2].forEach(un_key2 => {
|
|
375
|
-
Object.keys(un_key2).filter(p2 => p2.startsWith('$')).forEach(pp2 => delete un_key2[pp2]);
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
if (key2.startsWith('$') || key2.startsWith('_')) {
|
|
379
|
-
delete datos_json[key1][i1][key2];
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
if (key1.startsWith('$')) {
|
|
385
|
-
delete datos_json[key1];
|
|
386
|
-
}
|
|
387
|
-
;
|
|
388
|
-
}
|
|
389
|
-
delete datos_json.codRea;
|
|
390
|
-
delete datos_json.codNoRea;
|
|
391
|
-
delete datos_json.resumenEstado;
|
|
392
|
-
delete datos_json.codReaSup;
|
|
393
|
-
delete datos_json.codNoReaSup;
|
|
394
|
-
delete datos_json.resumenEstadoSup;
|
|
395
|
-
if (Object.keys(datos_json).length > 2) {
|
|
396
|
-
var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
|
|
397
|
-
return await queries.reduce(function (promise, query) {
|
|
398
|
-
return promise.then(function () {
|
|
399
|
-
return client.query(query).execute().then(function (result) {
|
|
400
|
-
return 'ok';
|
|
401
|
-
});
|
|
402
|
-
});
|
|
403
|
-
}, Promise.resolve()).then(function () {
|
|
404
|
-
return "ok";
|
|
405
|
-
}).catch(function (err) {
|
|
406
|
-
console.log("caso_guardar ENTRA EN EL CATCH: ", err);
|
|
407
|
-
throw err;
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
return 'vacio';
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
action: 'caso_traer',
|
|
417
|
-
parameters: [
|
|
418
|
-
//{name:'formulario' , typeName:'text'},
|
|
419
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
420
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
421
|
-
],
|
|
422
|
-
resultOk: 'goToEnc',
|
|
423
|
-
definedIn: 'dmencu',
|
|
424
|
-
coreFunction: async function (context, parameters) {
|
|
425
|
-
var client = context.client;
|
|
426
|
-
var struct_dmencu = createStructure(context, MAIN_TABLENAME);
|
|
427
|
-
var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, vivienda: parameters.id_caso }, struct_dmencu);
|
|
428
|
-
var result = await client.query(sql).fetchUniqueValue();
|
|
429
|
-
var response = {
|
|
430
|
-
operativo: parameters.operativo,
|
|
431
|
-
vivienda: parameters.id_caso,
|
|
432
|
-
datos_caso: result.value,
|
|
433
|
-
//formulario: formPrincipal,
|
|
434
|
-
};
|
|
435
|
-
return response;
|
|
436
|
-
}
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
action: 'caso_traer_o_crear',
|
|
440
|
-
parameters: [
|
|
441
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
442
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
443
|
-
],
|
|
444
|
-
resultOk: 'goToEnc',
|
|
445
|
-
// bitacora:{always:true},
|
|
446
|
-
coreFunction: async function (context, parameters) {
|
|
447
|
-
var be = context.be;
|
|
448
|
-
try {
|
|
449
|
-
var result = await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
450
|
-
return result;
|
|
451
|
-
}
|
|
452
|
-
catch (err) {
|
|
453
|
-
var json = await be.procedure['caso_preparar'].coreFunction(context, parameters);
|
|
454
|
-
await be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
|
|
455
|
-
return await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
{
|
|
460
|
-
action: 'pasar_json2ua',
|
|
461
|
-
parameters: [],
|
|
462
|
-
coreFunction: async function (context, _parameters) {
|
|
463
|
-
/* GENERALIZAR: */
|
|
464
|
-
var be = context.be;
|
|
465
|
-
/* FIN-GENERALIZAR: */
|
|
466
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
467
|
-
let resultMain = await context.client.query(`SELECT * FROM ${MAIN_TABLENAME} LIMIT 1`).fetchAll();
|
|
468
|
-
if (resultMain.rowCount > 0) {
|
|
469
|
-
console.log('HAY DATOS', resultMain.rows);
|
|
470
|
-
throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
|
|
471
|
-
}
|
|
320
|
+
where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
321
|
+
return createResponse(result.row);
|
|
322
|
+
}).then(function (resultado) {
|
|
323
|
+
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
324
|
+
return resultado;
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}).catch(function (err) {
|
|
329
|
+
throw err;
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
action: 'caso_guardar',
|
|
335
|
+
parameters: [
|
|
336
|
+
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
337
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
338
|
+
{ name: 'datos_caso', typeName: 'jsonb' },
|
|
339
|
+
],
|
|
340
|
+
definedIn: 'dmencu',
|
|
341
|
+
//@ts-ignore especifico el tipo de los parámetros
|
|
342
|
+
coreFunction: async function (context, parameters, newClient) {
|
|
343
|
+
var client = newClient || context.client;
|
|
344
|
+
var datos_json = parameters.datos_caso;
|
|
345
|
+
var be = context.be;
|
|
346
|
+
var tableStructures_app = be.tableStructures;
|
|
347
|
+
var struct_dmencu = createStructure(context, MAIN_TABLENAME);
|
|
348
|
+
datos_json['operativo'] = parameters.operativo;
|
|
349
|
+
//TODO : vivienda ó enc???
|
|
350
|
+
datos_json['vivienda'] = parameters.id_caso;
|
|
351
|
+
function completar_ult_pk_en_arr(ult_pk, ua_arr) {
|
|
352
|
+
var con_pk_completa = ua_arr;
|
|
353
|
+
if (ua_arr && ua_arr.length >= 1) {
|
|
354
|
+
con_pk_completa = con_pk_completa.map((una_ua, i) => {
|
|
355
|
+
una_ua[ult_pk] = i + 1;
|
|
356
|
+
return una_ua;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
;
|
|
360
|
+
return con_pk_completa;
|
|
361
|
+
}
|
|
362
|
+
for (var key1 in datos_json) {
|
|
363
|
+
var dato_key1 = datos_json[key1];
|
|
364
|
+
if (dato_key1 instanceof Array && dato_key1.length >= 1) {
|
|
365
|
+
var pk1 = tableStructures_app[key1](context).primaryKey;
|
|
366
|
+
var ult_pk1 = pk1[pk1.length - 1];
|
|
367
|
+
datos_json[key1] = completar_ult_pk_en_arr(ult_pk1, datos_json[key1]);
|
|
368
|
+
datos_json[key1].forEach((un_key1, i1) => {
|
|
369
|
+
for (var key2 in un_key1) {
|
|
370
|
+
if (un_key1[key2] instanceof Array && un_key1[key2].length >= 1) {
|
|
371
|
+
var pk2 = tableStructures_app[key2](context).primaryKey;
|
|
372
|
+
var ult_pk2 = pk2[pk2.length - 1];
|
|
373
|
+
datos_json[key1][i1][key2] = completar_ult_pk_en_arr(ult_pk2, datos_json[key1][i1][key2]);
|
|
374
|
+
datos_json[key1][i1][key2].forEach(un_key2 => {
|
|
375
|
+
Object.keys(un_key2).filter(p2 => p2.startsWith('$')).forEach(pp2 => delete un_key2[pp2]);
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
if (key2.startsWith('$') || key2.startsWith('_')) {
|
|
379
|
+
delete datos_json[key1][i1][key2];
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
if (key1.startsWith('$')) {
|
|
385
|
+
delete datos_json[key1];
|
|
386
|
+
}
|
|
387
|
+
;
|
|
388
|
+
}
|
|
389
|
+
delete datos_json.codRea;
|
|
390
|
+
delete datos_json.codNoRea;
|
|
391
|
+
delete datos_json.resumenEstado;
|
|
392
|
+
delete datos_json.codReaSup;
|
|
393
|
+
delete datos_json.codNoReaSup;
|
|
394
|
+
delete datos_json.resumenEstadoSup;
|
|
395
|
+
if (Object.keys(datos_json).length > 2) {
|
|
396
|
+
var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
|
|
397
|
+
return await queries.reduce(function (promise, query) {
|
|
398
|
+
return promise.then(function () {
|
|
399
|
+
return client.query(query).execute().then(function (result) {
|
|
400
|
+
return 'ok';
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
}, Promise.resolve()).then(function () {
|
|
404
|
+
return "ok";
|
|
405
|
+
}).catch(function (err) {
|
|
406
|
+
console.log("caso_guardar ENTRA EN EL CATCH: ", err);
|
|
407
|
+
throw err;
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
return 'vacio';
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
action: 'caso_traer',
|
|
417
|
+
parameters: [
|
|
418
|
+
//{name:'formulario' , typeName:'text'},
|
|
419
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
420
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
421
|
+
],
|
|
422
|
+
resultOk: 'goToEnc',
|
|
423
|
+
definedIn: 'dmencu',
|
|
424
|
+
coreFunction: async function (context, parameters) {
|
|
425
|
+
var client = context.client;
|
|
426
|
+
var struct_dmencu = createStructure(context, MAIN_TABLENAME);
|
|
427
|
+
var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, vivienda: parameters.id_caso }, struct_dmencu);
|
|
428
|
+
var result = await client.query(sql).fetchUniqueValue();
|
|
429
|
+
var response = {
|
|
430
|
+
operativo: parameters.operativo,
|
|
431
|
+
vivienda: parameters.id_caso,
|
|
432
|
+
datos_caso: result.value,
|
|
433
|
+
//formulario: formPrincipal,
|
|
434
|
+
};
|
|
435
|
+
return response;
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
action: 'caso_traer_o_crear',
|
|
440
|
+
parameters: [
|
|
441
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
442
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
443
|
+
],
|
|
444
|
+
resultOk: 'goToEnc',
|
|
445
|
+
// bitacora:{always:true},
|
|
446
|
+
coreFunction: async function (context, parameters) {
|
|
447
|
+
var be = context.be;
|
|
448
|
+
try {
|
|
449
|
+
var result = await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
450
|
+
return result;
|
|
451
|
+
}
|
|
452
|
+
catch (err) {
|
|
453
|
+
var json = await be.procedure['caso_preparar'].coreFunction(context, parameters);
|
|
454
|
+
await be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
|
|
455
|
+
return await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
action: 'pasar_json2ua',
|
|
461
|
+
parameters: [],
|
|
462
|
+
coreFunction: async function (context, _parameters) {
|
|
463
|
+
/* GENERALIZAR: */
|
|
464
|
+
var be = context.be;
|
|
465
|
+
/* FIN-GENERALIZAR: */
|
|
466
|
+
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
467
|
+
let resultMain = await context.client.query(`SELECT * FROM ${MAIN_TABLENAME} LIMIT 1`).fetchAll();
|
|
468
|
+
if (resultMain.rowCount > 0) {
|
|
469
|
+
console.log('HAY DATOS', resultMain.rows);
|
|
470
|
+
throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
|
|
471
|
+
}
|
|
472
472
|
let resultJson = await context.client.query(`SELECT operativo, enc id_caso, json_encuesta datos_caso from tem
|
|
473
473
|
WHERE operativo=$1 and resumen_estado is distinct from 'vacio' and json_encuesta is not null
|
|
474
|
-
order by enc `, [OPERATIVO]).fetchAll();
|
|
475
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
476
|
-
if (procedureGuardar.definedIn != 'dmencu') {
|
|
477
|
-
throw new Error('hay que sobreescribir caso_guardar');
|
|
478
|
-
}
|
|
479
|
-
return Promise.all(resultJson.rows.map(async function (row) {
|
|
480
|
-
let resultado = `id caso ${row.id_caso}: `;
|
|
481
|
-
try {
|
|
482
|
-
await be.inTransaction(null, async function (client) {
|
|
483
|
-
resultado += await procedureGuardar.coreFunction(context, row, client);
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
catch (err) {
|
|
487
|
-
let errMessage = resultado + "json2ua error. " + err;
|
|
488
|
-
resultado = errMessage;
|
|
489
|
-
console.log(errMessage);
|
|
490
|
-
}
|
|
491
|
-
if (resultado.includes('ok')) {
|
|
492
|
-
var { datos_caso, vivienda, operativo } = await be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
|
|
493
|
-
var verQueGrabo = { datos_caso, vivienda, operativo };
|
|
494
|
-
try {
|
|
495
|
-
discrepances.showAndThrow(verQueGrabo, row);
|
|
496
|
-
}
|
|
497
|
-
catch (err) {
|
|
498
|
-
console.log(verQueGrabo, row);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
return resultado;
|
|
502
|
-
})).catch(function (err) {
|
|
503
|
-
throw err;
|
|
504
|
-
}).then(function (result) {
|
|
505
|
-
return result;
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
},
|
|
509
|
-
{
|
|
510
|
-
action: 'dm_forpkraiz_cargar',
|
|
511
|
-
parameters: [
|
|
512
|
-
{ name: 'operativo', typeName: 'text' },
|
|
513
|
-
{ name: 'vivienda', typeName: 'text' },
|
|
514
|
-
{ name: 'tarea', typeName: 'text', references: "tareas" },
|
|
515
|
-
],
|
|
516
|
-
coreFunction: async function (context, parameters) {
|
|
517
|
-
var be = context.be;
|
|
518
|
-
var { operativo, vivienda, tarea } = parameters;
|
|
474
|
+
order by enc `, [OPERATIVO]).fetchAll();
|
|
475
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
476
|
+
if (procedureGuardar.definedIn != 'dmencu') {
|
|
477
|
+
throw new Error('hay que sobreescribir caso_guardar');
|
|
478
|
+
}
|
|
479
|
+
return Promise.all(resultJson.rows.map(async function (row) {
|
|
480
|
+
let resultado = `id caso ${row.id_caso}: `;
|
|
481
|
+
try {
|
|
482
|
+
await be.inTransaction(null, async function (client) {
|
|
483
|
+
resultado += await procedureGuardar.coreFunction(context, row, client);
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
catch (err) {
|
|
487
|
+
let errMessage = resultado + "json2ua error. " + err;
|
|
488
|
+
resultado = errMessage;
|
|
489
|
+
console.log(errMessage);
|
|
490
|
+
}
|
|
491
|
+
if (resultado.includes('ok')) {
|
|
492
|
+
var { datos_caso, vivienda, operativo } = await be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
|
|
493
|
+
var verQueGrabo = { datos_caso, vivienda, operativo };
|
|
494
|
+
try {
|
|
495
|
+
discrepances.showAndThrow(verQueGrabo, row);
|
|
496
|
+
}
|
|
497
|
+
catch (err) {
|
|
498
|
+
console.log(verQueGrabo, row);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return resultado;
|
|
502
|
+
})).catch(function (err) {
|
|
503
|
+
throw err;
|
|
504
|
+
}).then(function (result) {
|
|
505
|
+
return result;
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
action: 'dm_forpkraiz_cargar',
|
|
511
|
+
parameters: [
|
|
512
|
+
{ name: 'operativo', typeName: 'text' },
|
|
513
|
+
{ name: 'vivienda', typeName: 'text' },
|
|
514
|
+
{ name: 'tarea', typeName: 'text', references: "tareas" },
|
|
515
|
+
],
|
|
516
|
+
coreFunction: async function (context, parameters) {
|
|
517
|
+
var be = context.be;
|
|
518
|
+
var { operativo, vivienda, tarea } = parameters;
|
|
519
519
|
var main_form = (await context.client.query(`select main_form
|
|
520
520
|
from tareas
|
|
521
|
-
where operativo= $1 and tarea=$2`, [operativo, tarea]).fetchUniqueValue()).value;
|
|
522
|
-
var condviv = ` t.operativo= $1 and t.enc =$2`;
|
|
521
|
+
where operativo= $1 and tarea=$2`, [operativo, tarea]).fetchUniqueValue()).value;
|
|
522
|
+
var condviv = ` t.operativo= $1 and t.enc =$2`;
|
|
523
523
|
var soloLectura = !!(await context.client.query(`select *
|
|
524
|
-
from tareas_tem
|
|
525
|
-
where operativo= $1 and enc = $2 and cargado_dm is not null`, [operativo, vivienda]).fetchOneRowIfExists()).rowCount;
|
|
526
|
-
var { row } = await context.client.query(getHdrQuery(condviv), [operativo, vivienda]).fetchUniqueRow();
|
|
527
|
-
row.informacionHdr[vivienda].tarea = {
|
|
528
|
-
tarea,
|
|
529
|
-
main_form
|
|
530
|
-
};
|
|
531
|
-
return {
|
|
532
|
-
...row,
|
|
533
|
-
operativo,
|
|
534
|
-
soloLectura,
|
|
535
|
-
idPer: context.user.idper,
|
|
536
|
-
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })), 'carga'),
|
|
537
|
-
timestampEstructura: be.timestampEstructura
|
|
538
|
-
};
|
|
539
|
-
}
|
|
540
|
-
},
|
|
541
|
-
{
|
|
542
|
-
action: 'dm_forpkraiz_descargar',
|
|
543
|
-
parameters: [
|
|
544
|
-
{ name: 'operativo', typeName: 'text' },
|
|
545
|
-
{ name: 'persistentes', typeName: 'jsonb' },
|
|
546
|
-
],
|
|
547
|
-
coreFunction: async function (context, parameters) {
|
|
548
|
-
var be = context.be;
|
|
549
|
-
var { operativo, persistentes } = parameters;
|
|
550
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
|
|
551
|
-
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
552
|
-
if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
|
|
553
|
-
throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
|
|
554
|
-
}
|
|
555
|
-
var { params, setters } = await getParametersAndSettersForUpdateTem(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
|
|
524
|
+
from tareas_tem join estados using (operativo, estado) --pk estado verificada
|
|
525
|
+
where operativo= $1 and enc = $2 and (cargado_dm is not null or not permite_editar_encuesta)`, [operativo, vivienda]).fetchOneRowIfExists()).rowCount;
|
|
526
|
+
var { row } = await context.client.query(getHdrQuery(condviv), [operativo, vivienda]).fetchUniqueRow();
|
|
527
|
+
row.informacionHdr[vivienda].tarea = {
|
|
528
|
+
tarea,
|
|
529
|
+
main_form
|
|
530
|
+
};
|
|
531
|
+
return {
|
|
532
|
+
...row,
|
|
533
|
+
operativo,
|
|
534
|
+
soloLectura,
|
|
535
|
+
idPer: context.user.idper,
|
|
536
|
+
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })), 'carga'),
|
|
537
|
+
timestampEstructura: be.timestampEstructura
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
action: 'dm_forpkraiz_descargar',
|
|
543
|
+
parameters: [
|
|
544
|
+
{ name: 'operativo', typeName: 'text' },
|
|
545
|
+
{ name: 'persistentes', typeName: 'jsonb' },
|
|
546
|
+
],
|
|
547
|
+
coreFunction: async function (context, parameters) {
|
|
548
|
+
var be = context.be;
|
|
549
|
+
var { operativo, persistentes } = parameters;
|
|
550
|
+
const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
|
|
551
|
+
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
552
|
+
if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
|
|
553
|
+
throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
|
|
554
|
+
}
|
|
555
|
+
var { params, setters } = await getParametersAndSettersForUpdateTem(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
|
|
556
556
|
await context.client.query(`update tem
|
|
557
557
|
set ${setters}
|
|
558
558
|
where operativo= $1 and enc = $2
|
|
559
|
-
returning 'ok'`, params).fetchUniqueRow();
|
|
560
|
-
//guardar paralelamente en tablas ua
|
|
561
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
562
|
-
let resultado = `id enc ${idEnc}: `;
|
|
563
|
-
let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
564
|
-
let errMessage;
|
|
565
|
-
try {
|
|
566
|
-
await be.inTransaction(null, async function (client) {
|
|
567
|
-
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
catch (err) {
|
|
571
|
-
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
572
|
-
resultado = errMessage;
|
|
573
|
-
console.log(errMessage);
|
|
574
|
-
}
|
|
559
|
+
returning 'ok'`, params).fetchUniqueRow();
|
|
560
|
+
//guardar paralelamente en tablas ua
|
|
561
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
562
|
+
let resultado = `id enc ${idEnc}: `;
|
|
563
|
+
let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
564
|
+
let errMessage;
|
|
565
|
+
try {
|
|
566
|
+
await be.inTransaction(null, async function (client) {
|
|
567
|
+
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
catch (err) {
|
|
571
|
+
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
572
|
+
resultado = errMessage;
|
|
573
|
+
console.log(errMessage);
|
|
574
|
+
}
|
|
575
575
|
await context.client.query(`update tem
|
|
576
576
|
set pase_tabla= $3
|
|
577
577
|
where operativo= $1 and enc = $2
|
|
578
|
-
returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
|
|
579
|
-
}).array());
|
|
580
|
-
return 'ok';
|
|
581
|
-
}
|
|
582
|
-
},
|
|
583
|
-
{
|
|
584
|
-
action: 'dm_sincronizar',
|
|
585
|
-
parameters: [
|
|
586
|
-
{ name: 'persistentes', typeName: 'jsonb' },
|
|
587
|
-
],
|
|
588
|
-
coreFunction: async function (context, parameters) {
|
|
589
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
590
|
-
const ESTADO_POSTERIOR_CARGA = 'C';
|
|
591
|
-
const ESTADO_POSTERIOR_DESCARGA = 'D';
|
|
592
|
-
var be = context.be;
|
|
593
|
-
var { persistentes } = parameters;
|
|
594
|
-
var num_sincro = 0;
|
|
595
|
-
var token = persistentes === null || persistentes === void 0 ? void 0 : persistentes.token;
|
|
596
|
-
if (!token) {
|
|
597
|
-
token = (await be.procedure.token_get.coreFunction(context, {
|
|
598
|
-
useragent: context.session.req.useragent,
|
|
599
|
-
username: context.username
|
|
600
|
-
})).token;
|
|
601
|
-
}
|
|
578
|
+
returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
|
|
579
|
+
}).array());
|
|
580
|
+
return 'ok';
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
action: 'dm_sincronizar',
|
|
585
|
+
parameters: [
|
|
586
|
+
{ name: 'persistentes', typeName: 'jsonb' },
|
|
587
|
+
],
|
|
588
|
+
coreFunction: async function (context, parameters) {
|
|
589
|
+
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
590
|
+
const ESTADO_POSTERIOR_CARGA = 'C';
|
|
591
|
+
const ESTADO_POSTERIOR_DESCARGA = 'D';
|
|
592
|
+
var be = context.be;
|
|
593
|
+
var { persistentes } = parameters;
|
|
594
|
+
var num_sincro = 0;
|
|
595
|
+
var token = persistentes === null || persistentes === void 0 ? void 0 : persistentes.token;
|
|
596
|
+
if (!token) {
|
|
597
|
+
token = (await be.procedure.token_get.coreFunction(context, {
|
|
598
|
+
useragent: context.session.req.useragent,
|
|
599
|
+
username: context.username
|
|
600
|
+
})).token;
|
|
601
|
+
}
|
|
602
602
|
var { value } = await context.client.query(`
|
|
603
603
|
INSERT INTO sincronizaciones (token, usuario, datos)
|
|
604
604
|
VALUES ($1,$2,$3)
|
|
605
605
|
RETURNING sincro
|
|
606
|
-
`, [token, context.username, persistentes]).fetchUniqueValue();
|
|
607
|
-
num_sincro = value;
|
|
606
|
+
`, [token, context.username, persistentes]).fetchUniqueValue();
|
|
607
|
+
num_sincro = value;
|
|
608
608
|
var condviv = `
|
|
609
609
|
tt.operativo= $1
|
|
610
610
|
and asignado = $2
|
|
611
611
|
and tt.operacion='cargar'
|
|
612
612
|
and (tt.cargado_dm is null or tt.cargado_dm = ${context.be.db.quoteLiteral(token)})
|
|
613
|
-
`;
|
|
614
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, OPERATIVO);
|
|
615
|
-
if (persistentes) {
|
|
616
|
-
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
617
|
-
var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
|
|
618
|
-
var puedoGuardarEnTEM = true;
|
|
619
|
-
//TODO GENERALIZAR EL HORROR ESTE
|
|
620
|
-
var setters = ``;
|
|
621
|
-
var params = [OPERATIVO, idEnc, tarea, token];
|
|
622
|
-
if (tarea == 'supe') {
|
|
623
|
-
setters += `, resumen_estado_sup=$5, norea_sup=$6, rea_sup=$7`;
|
|
624
|
-
params = params.concat([respuestasUAPrincipal.resumenEstadoSup, respuestasUAPrincipal.codNoReaSup, respuestasUAPrincipal.codReaSup]);
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
setters += `, resumen_estado=$5, norea=$6, rea=$7`;
|
|
628
|
-
params = params.concat([respuestasUAPrincipal.resumenEstado, respuestasUAPrincipal.codNoRea, respuestasUAPrincipal.codRea]);
|
|
629
|
-
}
|
|
613
|
+
`;
|
|
614
|
+
const UA_PRINCIPAL = await getUAPrincipal(context.client, OPERATIVO);
|
|
615
|
+
if (persistentes) {
|
|
616
|
+
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
617
|
+
var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
|
|
618
|
+
var puedoGuardarEnTEM = true;
|
|
619
|
+
//TODO GENERALIZAR EL HORROR ESTE
|
|
620
|
+
var setters = ``;
|
|
621
|
+
var params = [OPERATIVO, idEnc, tarea, token];
|
|
622
|
+
if (tarea == 'supe') {
|
|
623
|
+
setters += `, resumen_estado_sup=$5, norea_sup=$6, rea_sup=$7`;
|
|
624
|
+
params = params.concat([respuestasUAPrincipal.resumenEstadoSup, respuestasUAPrincipal.codNoReaSup, respuestasUAPrincipal.codReaSup]);
|
|
625
|
+
}
|
|
626
|
+
else {
|
|
627
|
+
setters += `, resumen_estado=$5, norea=$6, rea=$7`;
|
|
628
|
+
params = params.concat([respuestasUAPrincipal.resumenEstado, respuestasUAPrincipal.codNoRea, respuestasUAPrincipal.codRea]);
|
|
629
|
+
}
|
|
630
630
|
var queryTareasTem = await context.client.query(`update tareas_tem
|
|
631
631
|
set estado = ${context.be.db.quoteLiteral(ESTADO_POSTERIOR_DESCARGA)}, cargado_dm=null ${setters}
|
|
632
632
|
where operativo= $1 and enc = $2 and tarea = $3 and cargado_dm = $4
|
|
633
|
-
returning 'ok'`, params).fetchOneRowIfExists();
|
|
634
|
-
puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
|
|
635
|
-
if (puedoGuardarEnTEM) {
|
|
636
|
-
var { params, setters } = await getParametersAndSettersForUpdateTem(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
|
|
633
|
+
returning 'ok'`, params).fetchOneRowIfExists();
|
|
634
|
+
puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
|
|
635
|
+
if (puedoGuardarEnTEM) {
|
|
636
|
+
var { params, setters } = await getParametersAndSettersForUpdateTem(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
|
|
637
637
|
await context.client.query(`update tem
|
|
638
638
|
set ${setters}
|
|
639
639
|
where operativo= $1 and enc = $2
|
|
640
|
-
returning 'ok'`, params).fetchUniqueRow();
|
|
641
|
-
//guardar paralelamente en tablas ua
|
|
642
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
643
|
-
let resultado = `id enc ${idEnc}: `;
|
|
644
|
-
let param_guardar = { operativo: OPERATIVO, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
645
|
-
let errMessage;
|
|
646
|
-
try {
|
|
647
|
-
await be.inTransaction(null, async function (client) {
|
|
648
|
-
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
649
|
-
});
|
|
650
|
-
}
|
|
651
|
-
catch (err) {
|
|
652
|
-
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
653
|
-
resultado = errMessage;
|
|
654
|
-
console.log(errMessage);
|
|
655
|
-
}
|
|
640
|
+
returning 'ok'`, params).fetchUniqueRow();
|
|
641
|
+
//guardar paralelamente en tablas ua
|
|
642
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
643
|
+
let resultado = `id enc ${idEnc}: `;
|
|
644
|
+
let param_guardar = { operativo: OPERATIVO, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
645
|
+
let errMessage;
|
|
646
|
+
try {
|
|
647
|
+
await be.inTransaction(null, async function (client) {
|
|
648
|
+
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
catch (err) {
|
|
652
|
+
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
653
|
+
resultado = errMessage;
|
|
654
|
+
console.log(errMessage);
|
|
655
|
+
}
|
|
656
656
|
await context.client.query(`update tem
|
|
657
657
|
set pase_tabla= $3
|
|
658
658
|
where operativo= $1 and enc = $2
|
|
659
|
-
returning 'ok'`, [OPERATIVO, idEnc, resultado]).fetchUniqueRow();
|
|
660
|
-
}
|
|
661
|
-
else {
|
|
662
|
-
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');
|
|
663
|
-
}
|
|
664
|
-
}).array());
|
|
665
|
-
}
|
|
666
|
-
console.log("condviv: ", condviv);
|
|
667
|
-
console.log("query: ", getHdrQuery(condviv));
|
|
668
|
-
var { row } = await context.client.query(getHdrQuery(condviv), [OPERATIVO, context.user.idper]).fetchUniqueRow();
|
|
669
|
-
// console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxx',getHdrQuery(condviv));
|
|
659
|
+
returning 'ok'`, [OPERATIVO, idEnc, resultado]).fetchUniqueRow();
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
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');
|
|
663
|
+
}
|
|
664
|
+
}).array());
|
|
665
|
+
}
|
|
666
|
+
console.log("condviv: ", condviv);
|
|
667
|
+
console.log("query: ", getHdrQuery(condviv));
|
|
668
|
+
var { row } = await context.client.query(getHdrQuery(condviv), [OPERATIVO, context.user.idper]).fetchUniqueRow();
|
|
669
|
+
// console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxx',getHdrQuery(condviv));
|
|
670
670
|
await context.client.query(`update tareas_tem tt
|
|
671
671
|
set estado = $4, cargado_dm=$3::text
|
|
672
672
|
where ${condviv}
|
|
673
|
-
returning enc`, [OPERATIVO, parameters.enc ? parameters.enc : context.user.idper, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
|
|
674
|
-
return {
|
|
675
|
-
...row,
|
|
676
|
-
operativo: OPERATIVO,
|
|
677
|
-
soloLectura: false,
|
|
678
|
-
token,
|
|
679
|
-
num_sincro,
|
|
680
|
-
idper: context.user.idper,
|
|
681
|
-
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null, estado_carga: 'relevamiento' })), 'carga')
|
|
682
|
-
};
|
|
683
|
-
}
|
|
684
|
-
},
|
|
685
|
-
{
|
|
686
|
-
action: 'dm_backup',
|
|
687
|
-
parameters: [
|
|
688
|
-
{ name: 'token', typeName: 'text' },
|
|
689
|
-
{ name: 'tem', typeName: 'jsonb' },
|
|
690
|
-
],
|
|
691
|
-
unlogged: true,
|
|
692
|
-
coreFunction: async function (context, parameters) {
|
|
693
|
-
var { be, client } = context;
|
|
694
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
695
|
-
var num_sincro = 0;
|
|
696
|
-
var token = parameters.token;
|
|
697
|
-
if (token == null) {
|
|
698
|
-
return { ok: 'ok:N/T' };
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
701
|
-
var { rowCount } = await client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
|
|
702
|
-
if (!rowCount) {
|
|
703
|
-
return { ok: 'ok:N/T' };
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
if (parameters.tem) {
|
|
707
|
-
await Promise.all(likeAr(parameters.tem).map(async (backup) => {
|
|
673
|
+
returning enc`, [OPERATIVO, parameters.enc ? parameters.enc : context.user.idper, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
|
|
674
|
+
return {
|
|
675
|
+
...row,
|
|
676
|
+
operativo: OPERATIVO,
|
|
677
|
+
soloLectura: false,
|
|
678
|
+
token,
|
|
679
|
+
num_sincro,
|
|
680
|
+
idper: context.user.idper,
|
|
681
|
+
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null, estado_carga: 'relevamiento' })), 'carga')
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
action: 'dm_backup',
|
|
687
|
+
parameters: [
|
|
688
|
+
{ name: 'token', typeName: 'text' },
|
|
689
|
+
{ name: 'tem', typeName: 'jsonb' },
|
|
690
|
+
],
|
|
691
|
+
unlogged: true,
|
|
692
|
+
coreFunction: async function (context, parameters) {
|
|
693
|
+
var { be, client } = context;
|
|
694
|
+
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
695
|
+
var num_sincro = 0;
|
|
696
|
+
var token = parameters.token;
|
|
697
|
+
if (token == null) {
|
|
698
|
+
return { ok: 'ok:N/T' };
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
var { rowCount } = await client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
|
|
702
|
+
if (!rowCount) {
|
|
703
|
+
return { ok: 'ok:N/T' };
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
if (parameters.tem) {
|
|
707
|
+
await Promise.all(likeAr(parameters.tem).map(async (backup) => {
|
|
708
708
|
context.client.query(`update tem
|
|
709
709
|
set json_backup = $3
|
|
710
710
|
where operativo= $1 and enc = $2 and json_backup is distinct from $4
|
|
711
|
-
returning 'ok'`, [OPERATIVO, backup.forPkRaiz.vivienda, backup.respuestasRaiz, backup.respuestasRaiz]).fetchOneRowIfExists();
|
|
712
|
-
}).array());
|
|
713
|
-
}
|
|
714
|
-
return {
|
|
715
|
-
ok: 'ok'
|
|
716
|
-
};
|
|
717
|
-
}
|
|
718
|
-
},
|
|
719
|
-
{
|
|
720
|
-
action: 'consistir_vivienda',
|
|
721
|
-
parameters: [
|
|
722
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
723
|
-
{ name: 'vivienda', typeName: 'text' },
|
|
724
|
-
],
|
|
725
|
-
coreFunction: async function (context, parameters) {
|
|
726
|
-
var { be, client } = context;
|
|
727
|
-
let param_proc = {
|
|
728
|
-
operativo: parameters.operativo,
|
|
729
|
-
id_caso: parameters.vivienda
|
|
730
|
-
};
|
|
731
|
-
let errMessage;
|
|
732
|
-
let resultado;
|
|
733
|
-
try {
|
|
734
|
-
resultado = await be.procedure.consistir_encuesta.coreFunction(context, param_proc, client);
|
|
735
|
-
}
|
|
736
|
-
catch (err) {
|
|
737
|
-
errMessage = " consistir_vivienda. " + err;
|
|
738
|
-
console.log(errMessage);
|
|
739
|
-
}
|
|
740
|
-
console.log('****** consistir_vivienda resultado:', resultado);
|
|
741
|
-
return {
|
|
742
|
-
ok: 'ok'
|
|
743
|
-
};
|
|
744
|
-
}
|
|
745
|
-
},
|
|
746
|
-
{
|
|
747
|
-
action: 'dm_rescatar',
|
|
748
|
-
parameters: [
|
|
749
|
-
{ name: 'localStorageItem', typeName: 'jsonb' },
|
|
750
|
-
{ name: 'localStorageItemKey', typeName: 'text' },
|
|
751
|
-
],
|
|
752
|
-
unlogged: true,
|
|
753
|
-
coreFunction: async function (context, params) {
|
|
754
|
-
var { localStorageItemKey, localStorageItem } = params;
|
|
755
|
-
try {
|
|
756
|
-
console.log(localStorageItem);
|
|
757
|
-
await fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
|
|
758
|
-
return 'ok';
|
|
759
|
-
}
|
|
760
|
-
catch (err) {
|
|
761
|
-
console.log('ERROR', err);
|
|
762
|
-
throw err;
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
},
|
|
766
|
-
{
|
|
767
|
-
action: 'operativo_get',
|
|
768
|
-
parameters: [],
|
|
769
|
-
unlogged: true,
|
|
770
|
-
coreFunction: async function (context, _parameters) {
|
|
771
|
-
return (0, exports.getOperativoActual)(context);
|
|
772
|
-
}
|
|
773
|
-
},
|
|
774
|
-
{
|
|
775
|
-
action: 'get_random_free_case',
|
|
776
|
-
parameters: [{ name: 'operativo', typeName: 'text' }],
|
|
777
|
-
coreFunction: async function (context, params) {
|
|
778
|
-
const minsToExpire = 30;
|
|
779
|
-
const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
|
|
780
|
-
const enc = await context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
|
|
781
|
-
await context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
|
|
782
|
-
return enc.value;
|
|
783
|
-
}
|
|
784
|
-
},
|
|
785
|
-
{
|
|
786
|
-
action: 'accion_tareas_tem_ejecutar',
|
|
787
|
-
parameters: [
|
|
788
|
-
{ name: 'operativo', typeName: 'text' },
|
|
789
|
-
{ name: 'tarea', typeName: 'text' },
|
|
790
|
-
{ name: 'enc', typeName: 'text' },
|
|
791
|
-
{ name: 'condicion', typeName: 'text' },
|
|
792
|
-
{ name: 'accion', typeName: 'jsonb' },
|
|
793
|
-
],
|
|
794
|
-
coreFunction: async function (context, params) {
|
|
795
|
-
var be = context.be;
|
|
796
|
-
var accion = params.accion;
|
|
797
|
-
const ANALIZAR_CONDICION = true;
|
|
798
|
-
if (ANALIZAR_CONDICION) {
|
|
711
|
+
returning 'ok'`, [OPERATIVO, backup.forPkRaiz.vivienda, backup.respuestasRaiz, backup.respuestasRaiz]).fetchOneRowIfExists();
|
|
712
|
+
}).array());
|
|
713
|
+
}
|
|
714
|
+
return {
|
|
715
|
+
ok: 'ok'
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
action: 'consistir_vivienda',
|
|
721
|
+
parameters: [
|
|
722
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
723
|
+
{ name: 'vivienda', typeName: 'text' },
|
|
724
|
+
],
|
|
725
|
+
coreFunction: async function (context, parameters) {
|
|
726
|
+
var { be, client } = context;
|
|
727
|
+
let param_proc = {
|
|
728
|
+
operativo: parameters.operativo,
|
|
729
|
+
id_caso: parameters.vivienda
|
|
730
|
+
};
|
|
731
|
+
let errMessage;
|
|
732
|
+
let resultado;
|
|
733
|
+
try {
|
|
734
|
+
resultado = await be.procedure.consistir_encuesta.coreFunction(context, param_proc, client);
|
|
735
|
+
}
|
|
736
|
+
catch (err) {
|
|
737
|
+
errMessage = " consistir_vivienda. " + err;
|
|
738
|
+
console.log(errMessage);
|
|
739
|
+
}
|
|
740
|
+
console.log('****** consistir_vivienda resultado:', resultado);
|
|
741
|
+
return {
|
|
742
|
+
ok: 'ok'
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
action: 'dm_rescatar',
|
|
748
|
+
parameters: [
|
|
749
|
+
{ name: 'localStorageItem', typeName: 'jsonb' },
|
|
750
|
+
{ name: 'localStorageItemKey', typeName: 'text' },
|
|
751
|
+
],
|
|
752
|
+
unlogged: true,
|
|
753
|
+
coreFunction: async function (context, params) {
|
|
754
|
+
var { localStorageItemKey, localStorageItem } = params;
|
|
755
|
+
try {
|
|
756
|
+
console.log(localStorageItem);
|
|
757
|
+
await fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
|
|
758
|
+
return 'ok';
|
|
759
|
+
}
|
|
760
|
+
catch (err) {
|
|
761
|
+
console.log('ERROR', err);
|
|
762
|
+
throw err;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
action: 'operativo_get',
|
|
768
|
+
parameters: [],
|
|
769
|
+
unlogged: true,
|
|
770
|
+
coreFunction: async function (context, _parameters) {
|
|
771
|
+
return (0, exports.getOperativoActual)(context);
|
|
772
|
+
}
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
action: 'get_random_free_case',
|
|
776
|
+
parameters: [{ name: 'operativo', typeName: 'text' }],
|
|
777
|
+
coreFunction: async function (context, params) {
|
|
778
|
+
const minsToExpire = 30;
|
|
779
|
+
const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
|
|
780
|
+
const enc = await context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
|
|
781
|
+
await context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
|
|
782
|
+
return enc.value;
|
|
783
|
+
}
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
action: 'accion_tareas_tem_ejecutar',
|
|
787
|
+
parameters: [
|
|
788
|
+
{ name: 'operativo', typeName: 'text' },
|
|
789
|
+
{ name: 'tarea', typeName: 'text' },
|
|
790
|
+
{ name: 'enc', typeName: 'text' },
|
|
791
|
+
{ name: 'condicion', typeName: 'text' },
|
|
792
|
+
{ name: 'accion', typeName: 'jsonb' },
|
|
793
|
+
],
|
|
794
|
+
coreFunction: async function (context, params) {
|
|
795
|
+
var be = context.be;
|
|
796
|
+
var accion = params.accion;
|
|
797
|
+
const ANALIZAR_CONDICION = true;
|
|
798
|
+
if (ANALIZAR_CONDICION) {
|
|
799
799
|
var cumple = (await context.client.query(`select accion_cumple_condicion($5, $6, $7, $8, (
|
|
800
800
|
select condicion
|
|
801
801
|
from estados_acciones
|
|
802
802
|
where operativo = $1 and estado = $2 and eaccion = $3 and estado_destino = $4
|
|
803
803
|
)
|
|
804
|
-
)`, [
|
|
805
|
-
params.operativo,
|
|
806
|
-
accion.estado,
|
|
807
|
-
accion.eaccion,
|
|
808
|
-
accion.estado_destino,
|
|
809
|
-
params.operativo,
|
|
810
|
-
accion.estado,
|
|
811
|
-
params.enc,
|
|
812
|
-
accion.eaccion,
|
|
813
|
-
])
|
|
814
|
-
.fetchUniqueValue()).value;
|
|
815
|
-
if (!cumple) {
|
|
816
|
-
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.`);
|
|
817
|
-
}
|
|
818
|
-
}
|
|
804
|
+
)`, [
|
|
805
|
+
params.operativo,
|
|
806
|
+
accion.estado,
|
|
807
|
+
accion.eaccion,
|
|
808
|
+
accion.estado_destino,
|
|
809
|
+
params.operativo,
|
|
810
|
+
accion.estado,
|
|
811
|
+
params.enc,
|
|
812
|
+
accion.eaccion,
|
|
813
|
+
])
|
|
814
|
+
.fetchUniqueValue()).value;
|
|
815
|
+
if (!cumple) {
|
|
816
|
+
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.`);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
819
|
var result = await context.client.query(`
|
|
820
820
|
UPDATE tareas_tem
|
|
821
821
|
set estado = $4
|
|
822
822
|
where operativo=$1
|
|
823
823
|
and enc=$2
|
|
824
824
|
and tarea = $3
|
|
825
|
-
returning *`, [
|
|
826
|
-
params.operativo,
|
|
827
|
-
params.enc,
|
|
828
|
-
params.tarea,
|
|
829
|
-
accion.estado_destino
|
|
830
|
-
]).fetchUniqueRow();
|
|
831
|
-
if (accion.nombre_procedure) {
|
|
832
|
-
if (be.procedure[accion.nombre_procedure]) {
|
|
833
|
-
await be.procedure[accion.nombre_procedure].coreFunction(context, params);
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
825
|
+
returning *`, [
|
|
826
|
+
params.operativo,
|
|
827
|
+
params.enc,
|
|
828
|
+
params.tarea,
|
|
829
|
+
accion.estado_destino
|
|
830
|
+
]).fetchUniqueRow();
|
|
831
|
+
if (accion.nombre_procedure) {
|
|
832
|
+
if (be.procedure[accion.nombre_procedure]) {
|
|
833
|
+
await be.procedure[accion.nombre_procedure].coreFunction(context, params);
|
|
834
|
+
}
|
|
835
|
+
else {
|
|
836
836
|
throw Error(`No existe el procedure "${accion.nombre_procedure}" definido en la tabla "estados_acciones" para el
|
|
837
|
-
operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return result.row;
|
|
841
|
-
}
|
|
842
|
-
},
|
|
843
|
-
{
|
|
844
|
-
action: 'encuesta_carga_preparar',
|
|
845
|
-
parameters: [
|
|
846
|
-
{ name: 'operativo', typeName: 'text' },
|
|
847
|
-
{ name: 'tarea', typeName: 'text' },
|
|
848
|
-
{ name: 'enc', typeName: 'text' },
|
|
849
|
-
],
|
|
850
|
-
coreFunction: async function (context, params) {
|
|
837
|
+
operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
return result.row;
|
|
841
|
+
}
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
action: 'encuesta_carga_preparar',
|
|
845
|
+
parameters: [
|
|
846
|
+
{ name: 'operativo', typeName: 'text' },
|
|
847
|
+
{ name: 'tarea', typeName: 'text' },
|
|
848
|
+
{ name: 'enc', typeName: 'text' },
|
|
849
|
+
],
|
|
850
|
+
coreFunction: async function (context, params) {
|
|
851
851
|
await context.client.query(`
|
|
852
852
|
UPDATE tareas_tem
|
|
853
853
|
set operacion = 'cargar'
|
|
854
854
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
855
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
856
|
-
.fetchUniqueRow();
|
|
857
|
-
return 'ok';
|
|
858
|
-
}
|
|
859
|
-
},
|
|
860
|
-
{
|
|
861
|
-
action: 'encuesta_disponibilizar',
|
|
862
|
-
parameters: [
|
|
863
|
-
{ name: 'operativo', typeName: 'text' },
|
|
864
|
-
{ name: 'tarea', typeName: 'text' },
|
|
865
|
-
{ name: 'enc', typeName: 'text' },
|
|
866
|
-
],
|
|
867
|
-
coreFunction: async function (context, params) {
|
|
855
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
856
|
+
.fetchUniqueRow();
|
|
857
|
+
return 'ok';
|
|
858
|
+
}
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
action: 'encuesta_disponibilizar',
|
|
862
|
+
parameters: [
|
|
863
|
+
{ name: 'operativo', typeName: 'text' },
|
|
864
|
+
{ name: 'tarea', typeName: 'text' },
|
|
865
|
+
{ name: 'enc', typeName: 'text' },
|
|
866
|
+
],
|
|
867
|
+
coreFunction: async function (context, params) {
|
|
868
868
|
await context.client.query(`
|
|
869
869
|
UPDATE tareas_tem
|
|
870
870
|
set asignado = null
|
|
871
871
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
872
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
873
|
-
.fetchUniqueRow();
|
|
874
|
-
return 'ok';
|
|
875
|
-
}
|
|
876
|
-
},
|
|
877
|
-
{
|
|
878
|
-
action: 'encuesta_no_cargar',
|
|
879
|
-
parameters: [
|
|
880
|
-
{ name: 'operativo', typeName: 'text' },
|
|
881
|
-
{ name: 'tarea', typeName: 'text' },
|
|
882
|
-
{ name: 'enc', typeName: 'text' },
|
|
883
|
-
],
|
|
884
|
-
coreFunction: async function (context, params) {
|
|
872
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
873
|
+
.fetchUniqueRow();
|
|
874
|
+
return 'ok';
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
action: 'encuesta_no_cargar',
|
|
879
|
+
parameters: [
|
|
880
|
+
{ name: 'operativo', typeName: 'text' },
|
|
881
|
+
{ name: 'tarea', typeName: 'text' },
|
|
882
|
+
{ name: 'enc', typeName: 'text' },
|
|
883
|
+
],
|
|
884
|
+
coreFunction: async function (context, params) {
|
|
885
885
|
await context.client.query(`
|
|
886
886
|
UPDATE tareas_tem
|
|
887
887
|
set operacion = null
|
|
888
888
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
889
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
890
|
-
.fetchUniqueRow();
|
|
891
|
-
return 'ok';
|
|
892
|
-
}
|
|
893
|
-
},
|
|
894
|
-
{
|
|
895
|
-
action: 'encuesta_descarga_preparar',
|
|
896
|
-
parameters: [
|
|
897
|
-
{ name: 'operativo', typeName: 'text' },
|
|
898
|
-
{ name: 'tarea', typeName: 'text' },
|
|
899
|
-
{ name: 'enc', typeName: 'text' },
|
|
900
|
-
],
|
|
901
|
-
coreFunction: async function (context, params) {
|
|
889
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
890
|
+
.fetchUniqueRow();
|
|
891
|
+
return 'ok';
|
|
892
|
+
}
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
action: 'encuesta_descarga_preparar',
|
|
896
|
+
parameters: [
|
|
897
|
+
{ name: 'operativo', typeName: 'text' },
|
|
898
|
+
{ name: 'tarea', typeName: 'text' },
|
|
899
|
+
{ name: 'enc', typeName: 'text' },
|
|
900
|
+
],
|
|
901
|
+
coreFunction: async function (context, params) {
|
|
902
902
|
await context.client.query(`
|
|
903
903
|
UPDATE tareas_tem
|
|
904
904
|
set operacion = 'descargar'
|
|
905
905
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
906
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
907
|
-
.fetchUniqueRow();
|
|
908
|
-
return 'ok';
|
|
909
|
-
}
|
|
910
|
-
},
|
|
911
|
-
{
|
|
912
|
-
action: 'encuesta_no_descargar',
|
|
913
|
-
parameters: [
|
|
914
|
-
{ name: 'operativo', typeName: 'text' },
|
|
915
|
-
{ name: 'tarea', typeName: 'text' },
|
|
916
|
-
{ name: 'enc', typeName: 'text' },
|
|
917
|
-
],
|
|
918
|
-
coreFunction: async function (context, params) {
|
|
906
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
907
|
+
.fetchUniqueRow();
|
|
908
|
+
return 'ok';
|
|
909
|
+
}
|
|
910
|
+
},
|
|
911
|
+
{
|
|
912
|
+
action: 'encuesta_no_descargar',
|
|
913
|
+
parameters: [
|
|
914
|
+
{ name: 'operativo', typeName: 'text' },
|
|
915
|
+
{ name: 'tarea', typeName: 'text' },
|
|
916
|
+
{ name: 'enc', typeName: 'text' },
|
|
917
|
+
],
|
|
918
|
+
coreFunction: async function (context, params) {
|
|
919
919
|
await context.client.query(`
|
|
920
920
|
UPDATE tareas_tem
|
|
921
921
|
set operacion = 'cargar'
|
|
922
922
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
923
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
924
|
-
.fetchUniqueRow();
|
|
925
|
-
return 'ok';
|
|
926
|
-
}
|
|
927
|
-
},
|
|
928
|
-
{
|
|
929
|
-
action: 'encuesta_analizar',
|
|
930
|
-
parameters: [
|
|
931
|
-
{ name: 'operativo', typeName: 'text' },
|
|
932
|
-
{ name: 'tarea', typeName: 'text' },
|
|
933
|
-
{ name: 'enc', typeName: 'text' },
|
|
934
|
-
],
|
|
935
|
-
coreFunction: async function (context, params) {
|
|
936
|
-
var be = context.be;
|
|
937
|
-
await be.procedure.
|
|
938
|
-
return 'ok';
|
|
939
|
-
}
|
|
940
|
-
},
|
|
941
|
-
{
|
|
942
|
-
action: 'encuesta_verificar',
|
|
943
|
-
parameters: [
|
|
944
|
-
{ name: 'operativo', typeName: 'text' },
|
|
945
|
-
{ name: 'tarea', typeName: 'text' },
|
|
946
|
-
{ name: 'enc', typeName: 'text' },
|
|
947
|
-
],
|
|
948
|
-
coreFunction: async function (context, params) {
|
|
923
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
924
|
+
.fetchUniqueRow();
|
|
925
|
+
return 'ok';
|
|
926
|
+
}
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
action: 'encuesta_analizar',
|
|
930
|
+
parameters: [
|
|
931
|
+
{ name: 'operativo', typeName: 'text' },
|
|
932
|
+
{ name: 'tarea', typeName: 'text' },
|
|
933
|
+
{ name: 'enc', typeName: 'text' },
|
|
934
|
+
],
|
|
935
|
+
coreFunction: async function (context, params) {
|
|
936
|
+
var be = context.be;
|
|
937
|
+
await be.procedure.consistir_encuesta.coreFunction(context, { operativo: params.operativo, id_caso: params.enc });
|
|
938
|
+
return 'ok';
|
|
939
|
+
}
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
action: 'encuesta_verificar',
|
|
943
|
+
parameters: [
|
|
944
|
+
{ name: 'operativo', typeName: 'text' },
|
|
945
|
+
{ name: 'tarea', typeName: 'text' },
|
|
946
|
+
{ name: 'enc', typeName: 'text' },
|
|
947
|
+
],
|
|
948
|
+
coreFunction: async function (context, params) {
|
|
949
949
|
await context.client.query(`
|
|
950
950
|
UPDATE tareas_tem
|
|
951
951
|
set verificado = '1'
|
|
952
952
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
953
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
954
|
-
.fetchUniqueRow();
|
|
955
|
-
return 'ok';
|
|
956
|
-
}
|
|
957
|
-
},
|
|
958
|
-
{
|
|
959
|
-
action: 'encuesta_no_verificar',
|
|
960
|
-
parameters: [
|
|
961
|
-
{ name: 'operativo', typeName: 'text' },
|
|
962
|
-
{ name: 'tarea', typeName: 'text' },
|
|
963
|
-
{ name: 'enc', typeName: 'text' },
|
|
964
|
-
],
|
|
965
|
-
coreFunction: async function (context, params) {
|
|
953
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
954
|
+
.fetchUniqueRow();
|
|
955
|
+
return 'ok';
|
|
956
|
+
}
|
|
957
|
+
},
|
|
958
|
+
{
|
|
959
|
+
action: 'encuesta_no_verificar',
|
|
960
|
+
parameters: [
|
|
961
|
+
{ name: 'operativo', typeName: 'text' },
|
|
962
|
+
{ name: 'tarea', typeName: 'text' },
|
|
963
|
+
{ name: 'enc', typeName: 'text' },
|
|
964
|
+
],
|
|
965
|
+
coreFunction: async function (context, params) {
|
|
966
966
|
await context.client.query(`
|
|
967
967
|
UPDATE tareas_tem
|
|
968
968
|
set verificado = null
|
|
969
969
|
where operativo=$1 and tarea= $2 and enc=$3
|
|
970
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
971
|
-
.fetchUniqueRow();
|
|
972
|
-
return 'ok';
|
|
973
|
-
}
|
|
974
|
-
},
|
|
975
|
-
{
|
|
976
|
-
action: 'encuesta_dpt',
|
|
977
|
-
parameters: [
|
|
978
|
-
{ name: 'operativo', typeName: 'text' },
|
|
979
|
-
{ name: 'tarea', typeName: 'text' },
|
|
980
|
-
{ name: 'enc', typeName: 'text' },
|
|
981
|
-
],
|
|
982
|
-
coreFunction: async function (context, params) {
|
|
983
|
-
//TODO acá hay que preparar la siguiente tarea
|
|
984
|
-
return 'ok';
|
|
985
|
-
}
|
|
986
|
-
},
|
|
987
|
-
{
|
|
988
|
-
action: 'encuesta_habilitar_deshabilitar',
|
|
989
|
-
parameters: [
|
|
990
|
-
{ name: 'operativo', typeName: 'text' },
|
|
991
|
-
{ name: 'enc', typeName: 'text' },
|
|
992
|
-
],
|
|
993
|
-
coreFunction: async function (context, params) {
|
|
970
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
971
|
+
.fetchUniqueRow();
|
|
972
|
+
return 'ok';
|
|
973
|
+
}
|
|
974
|
+
},
|
|
975
|
+
{
|
|
976
|
+
action: 'encuesta_dpt',
|
|
977
|
+
parameters: [
|
|
978
|
+
{ name: 'operativo', typeName: 'text' },
|
|
979
|
+
{ name: 'tarea', typeName: 'text' },
|
|
980
|
+
{ name: 'enc', typeName: 'text' },
|
|
981
|
+
],
|
|
982
|
+
coreFunction: async function (context, params) {
|
|
983
|
+
//TODO acá hay que preparar la siguiente tarea
|
|
984
|
+
return 'ok';
|
|
985
|
+
}
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
action: 'encuesta_habilitar_deshabilitar',
|
|
989
|
+
parameters: [
|
|
990
|
+
{ name: 'operativo', typeName: 'text' },
|
|
991
|
+
{ name: 'enc', typeName: 'text' },
|
|
992
|
+
],
|
|
993
|
+
coreFunction: async function (context, params) {
|
|
994
994
|
await context.client.query(`
|
|
995
995
|
UPDATE tem
|
|
996
996
|
set habilitada = not habilitada
|
|
997
997
|
where operativo=$1 and enc=$2
|
|
998
|
-
returning *`, [params.operativo, params.enc])
|
|
999
|
-
.fetchUniqueRow();
|
|
1000
|
-
return 'ok';
|
|
1001
|
-
}
|
|
1002
|
-
},
|
|
1003
|
-
];
|
|
1004
|
-
});
|
|
1005
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1kbWVuY3UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Byb2NlZHVyZXMtZG1lbmN1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOzs7SUFJYixrQ0FBa0M7SUFDbEMsaURBQStCO0lBRy9CLHlEQUE4QztJQUU5QywrQ0FBNkM7SUFDN0MsMkJBQW1DO0lBRW5DLGdEQUFnRDtJQUloRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXBDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDN0IsTUFBTSxjQUFjLEdBQUUsV0FBVyxDQUFDO0lBRTNCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLE9BQXdCLEVBQUMsRUFBRTs7UUFDaEUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUMsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUcsTUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFNBQVMsRUFBQztZQUNwQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7U0FDN0I7YUFBSTtZQUNELE1BQU0sS0FBSyxDQUFFLHFEQUFxRCxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDLENBQUE7SUFSWSxRQUFBLGtCQUFrQixzQkFROUI7SUFLRCxTQUFTLGVBQWUsQ0FBQyxPQUF3QixFQUFFLFNB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Q0FBQztxQkFDbEMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7U0FDSjtLQUVKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCB7IFByb2NlZHVyZURlZiwgVGFibGVEZWZpbml0aW9uLCBDbGllbnQgfSBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJlQ29udGV4dCwgQ29yZUZ1bmN0aW9uUGFyYW1ldGVycywgRm9yZWlnbktleSB9IGZyb20gXCJtZXRhLWVuY1wiO1xyXG5pbXBvcnQgKiBhcyBsaWtlQXIgZnJvbSBcImxpa2UtYXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmltcG9ydCB7IElkVW5pZGFkQW5hbGlzaXMsIFVuaWRhZEFuYWxpc2lzLCBFc3RhZG9BY2Npb24gfSBmcm9tIFwiLi4vdW5sb2dnZWQvdGlwb3NcIjtcclxuXHJcbmltcG9ydCB7anNvbiwganNvbm99IGZyb20gXCJwZy1wcm9taXNlLXN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHtjaGFuZ2luZywgZGF0ZSB9IGZyb20gJ2Jlc3QtZ2xvYmFscyc7XHJcbmltcG9ydCB7cHJvbWlzZXMgYXMgIGZzfSBmcm9tIFwiZnNcIjtcclxuXHJcbmltcG9ydCAqIGFzIEV4cHJlc2lvblBhcnNlciBmcm9tICdleHByZS1wYXJzZXInO1xyXG5pbXBvcnQgeyB0YXJlYXMgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNcIjtcclxuaW1wb3J0IHsgcHJlcGVuZExpc3RlbmVyIH0gZnJvbSBcInByb2Nlc3NcIjtcclxuXHJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG52YXIgc3FsVG9vbHMgPSByZXF1aXJlKCdzcWwtdG9vbHMnKTtcclxuXHJcbnZhciBkaXNjcmVwYW5jZXMgPSByZXF1aXJlKCdkaXNjcmVwYW5jZXMnKTtcclxuXHJcbmNvbnN0IGZvcm1QcmluY2lwYWwgPSAnRjpGMSc7XHJcbmNvbnN0IE1BSU5fVEFCTEVOQU1FID0ndml2aWVuZGFzJztcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcGVyYXRpdm9BY3R1YWwgPSBhc3luYyAoY29udGV4dDpQcm9jZWR1cmVDb250ZXh0KT0+e1xyXG4gICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgIHZhciByZXN1bHQgPSBhd2FpdCBiZS5wcm9jZWR1cmUudGFibGVfZGF0YS5jb3JlRnVuY3Rpb24oY29udGV4dCx7dGFibGU6IGBwYXJhbWV0cm9zYCwgZml4ZWRGaWVsZHM6W119KTtcclxuICAgIGlmKHJlc3VsdFswXT8ub3BlcmF0aXZvKXtcclxuICAgICAgICByZXR1cm4gcmVzdWx0WzBdLm9wZXJhdGl2b1xyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IgKCdubyBzZSBjb25maWd1csOzIHVuIG9wZXJhdGl2byBlbiBsYSB0YWJsYSBwYXLDoW1ldHJvcycpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLypkZWZpbmljacOzbiBkZSBlc3RydWN0dXJhIGNvbXBsZXRhLCBjdWFuZG8gZXhpc3RhIGluZy1lbmMgaGF5IHF1ZSBwb25lcmxvIGFow60qLyBcclxudHlwZSBFc3RydWN0dXJhVGFibGE9e3RhYmxlTmFtZTpzdHJpbmcsIHBrRmllbGRzOntmaWVsZE5hbWU6c3RyaW5nfVtdLCBjaGlsZFRhYmxlczpFc3RydWN0dXJhVGFibGFbXX07XHJcbmZ1bmN0aW9uIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHRhYmxlTmFtZTpzdHJpbmcpe1xyXG4gICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgIHZhciBtYWluVGFibGVEZWY6VGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzW3RhYmxlTmFtZV0oY29udGV4dCk7XHJcbiAgICB2YXIgZ2V0UGtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRQa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24pe1xyXG4gICAgICAgIHJldHVybiB0YWJsZURlZi5wcmltYXJ5S2V5Lm1hcChmdW5jdGlvbihwayl7XHJcbiAgICAgICAgICAgIHJldHVybiB7ZmllbGROYW1lOnBrfTtcclxuICAgICAgICB9KVxyXG4gICAgfTtcclxuICAgIHZhciBnZXRGa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldEZrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiwgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcpe1xyXG4gICAgICAgIC8vIHJldHVybiB0YWJsZURlZi5mb3JlaWduS2V5cz8gdGFibGVEZWYuZm9yZWlnbktleXMubWFwKGZrPT5may5maWVsZHMpOiBbXTtcclxuICAgICAgICBsZXQgcGFyZW50RmsgPSAoPEZvcmVpZ25LZXlbXT4gdGFibGVEZWYuZm9yZWlnbktleXMpLmZpbmQoZms9PmZrLnJlZmVyZW5jZXMgPT0gcGFyZW50VGFibGVOYW1lKTtcclxuICAgICAgICByZXR1cm4gcGFyZW50Rms/IHBhcmVudEZrLmZpZWxkczogW107XHJcbiAgICB9XHJcbiAgICB2YXIgc3RydWN0OkVzdHJ1Y3R1cmFUYWJsYT17XHJcbiAgICAgICAgdGFibGVOYW1lOm1haW5UYWJsZURlZi5uYW1lLFxyXG4gICAgICAgIHBrRmllbGRzOmdldFBrRnJvbVRhYmxlRGVmKG1haW5UYWJsZURlZiksXHJcbiAgICAgICAgY2hpbGRUYWJsZXM6W11cclxuICAgIH07XHJcbiAgICBpZihtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzICYmIG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMubGVuZ3RoKXtcclxuICAgICAgICBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmZvckVhY2goZnVuY3Rpb24oZGV0YWlsVGFibGUpe1xyXG4gICAgICAgICAgICBzdHJ1Y3QuY2hpbGRUYWJsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIGNoYW5naW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBkZXRhaWxUYWJsZS50YWJsZSksXHJcbiAgICAgICAgICAgICAgICAgICAge2ZrRmllbGRzOiBnZXRGa0Zyb21UYWJsZURlZihiZS50YWJsZVN0cnVjdHVyZXNbZGV0YWlsVGFibGUudGFibGVdKGNvbnRleHQpLCB0YWJsZU5hbWUpfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RydWN0O1xyXG59XHJcbi8qIGZpbiBkZWZpbmljaW9uIGVzdHJ1Y3R1cmEgY29tcGxldGEgKi9cclxuXHJcbnR5cGUgQW55T2JqZWN0ID0ge1trOnN0cmluZ106YW55fVxyXG5cclxudmFyIGdldFBhcmFtZXRlcnNBbmRTZXR0ZXJzRm9yVXBkYXRlVGVtID0gYXN5bmMgKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpPT57XHJcbiAgICB2YXIgcmVnaXN0cmFFc3RhZG9FblRlbSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0IHJlZ2lzdHJhX2VzdGFkb19lbl90ZW1cclxuICAgICAgICAgICAgZnJvbSB0YXJlYXNcclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYSA9ICQyYFxyXG4gICAgICAgICxcclxuICAgICAgICBbb3BlcmF0aXZvLCB0YXJlYV1cclxuICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgIHZhciBwYXJhbXMgPSBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXVxyXG4gICAgdmFyIHNldHRlcnMgPSBganNvbl9lbmN1ZXN0YSA9ICQzYDtcclxuICAgIC8vVE9ETyBBUlJFR0xBUiBFU1RFIEhPUlJPUiwgR0VORVJBTElaQVJcclxuICAgIGlmKHRhcmVhPT0nc3VwZScpe1xyXG4gICAgICAgIHNldHRlcnMrPSBgLCByZXN1bWVuX2VzdGFkb19zdXA9JDQsIG5vcmVhX3N1cD0kNSwgcmVhX3N1cD0kNmBcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuY29uY2F0KFtyZXNwdWVzdGFzVUFQcmluY2lwYWwucmVzdW1lbkVzdGFkb1N1cCwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZE5vUmVhU3VwLCByZXNwdWVzdGFzVUFQcmluY2lwYWwuY29kUmVhU3VwXSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBzZXR0ZXJzKz0gYCwgcmVzdW1lbl9lc3RhZG89JDQsIG5vcmVhPSQ1LCByZWE9JDZgXHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnJlc3VtZW5Fc3RhZG8sIHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5jb2ROb1JlYSwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZFJlYV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtzZXR0ZXJzLCBwYXJhbXN9XHJcbn1cclxuXHJcbnZhciBnZXRIZHJRdWVyeSA9ICBmdW5jdGlvbiBnZXRIZHJRdWVyeShxdW90ZWRDb25kVml2OnN0cmluZyl7XHJcbiAgICByZXR1cm4gYFxyXG4gICAgd2l0aCB2aXZpZW5kYXMgYXMgXHJcbiAgICAgICAgKHNlbGVjdCB0LmVuYywgdC5qc29uX2VuY3Vlc3RhIGFzIHJlc3B1ZXN0YXMsIHQucmVzdW1lbl9lc3RhZG8gYXMgXCJyZXN1bWVuRXN0YWRvXCIsIFxyXG4gICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAnZG9taW5pbycgICAgICAgLCBkb21pbmlvICAgICAgICxcclxuICAgICAgICAgICAgICAgICdub21jYWxsZScgICAgICAsIG5vbWNhbGxlICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ3NlY3RvcicgICAgICAgICwgc2VjdG9yICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZWRpZmljaW8nICAgICAgLCBlZGlmaWNpbyAgICAgICxcclxuICAgICAgICAgICAgICAgICdlbnRyYWRhJyAgICAgICAsIGVudHJhZGEgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ25yb2NhdGFzdHJhbCcgICwgbnJvY2F0YXN0cmFsICAsXHJcbiAgICAgICAgICAgICAgICAncGlzbycgICAgICAgICAgLCBwaXNvICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdkZXBhcnRhbWVudG8nICAsIGRlcGFydGFtZW50byAgLFxyXG4gICAgICAgICAgICAgICAgJ2hhYml0YWNpb24nICAgICwgaGFiaXRhY2lvbiAgICAsXHJcbiAgICAgICAgICAgICAgICAnY2FzYScgICAgICAgICAgLCBjYXNhICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdwcmlvcmlkYWQnICAgICAsIHJlc2VydmErMSAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ29ic2VydmFjaW9uZXMnICwgdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcyAsXHJcbiAgICAgICAgICAgICAgICAnY2l0YScgICAgICAgICAgLCBjaXRhICxcclxuICAgICAgICAgICAgICAgICdjYXJnYScgICAgICAgICAsIHQuYXJlYSAgICAgICAgIFxyXG4gICAgICAgICAgICApIGFzIHRlbSwgdC5hcmVhLFxyXG4gICAgICAgICAgICAtLVRPRE86IEdFTkVSQUxJWkFSXHJcbiAgICAgICAgICAgIGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICd0YXJlYScsIHR0LnRhcmVhLFxyXG4gICAgICAgICAgICAgICAgJ2ZlY2hhX2FzaWduYWNpb24nLCBmZWNoYV9hc2lnbmFjaW9uLFxyXG4gICAgICAgICAgICAgICAgJ2FzaWduYWRvJywgYXNpZ25hZG8sXHJcbiAgICAgICAgICAgICAgICAnbWFpbl9mb3JtJywgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgICkgYXMgdGFyZWEsXHJcbiAgICAgICAgICAgIG1pbihmZWNoYV9hc2lnbmFjaW9uKSBhcyBmZWNoYV9hc2lnbmFjaW9uXHJcbiAgICAgICAgICAgIGZyb20gdGVtIHQgbGVmdCBqb2luIHRhcmVhc190ZW0gdHQgb24gKHQub3BlcmF0aXZvID0gdHQub3BlcmF0aXZvIGFuZCB0LmVuYyA9IHR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWwgPSB0dC50YXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gdGFyZWFzIHRhIG9uIHQudGFyZWFfYWN0dWFsID0gdGEudGFyZWFcclxuICAgICAgICAgICAgd2hlcmUgdC5oYWJpbGl0YWRhIGFuZCAke3F1b3RlZENvbmRWaXZ9XHJcbiAgICAgICAgICAgIGdyb3VwIGJ5IHQuZW5jLCB0Lmpzb25fZW5jdWVzdGEsIHQucmVzdW1lbl9lc3RhZG8sIGRvbWluaW8sIG5vbWNhbGxlLHNlY3RvcixlZGlmaWNpbywgZW50cmFkYSwgbnJvY2F0YXN0cmFsLCBwaXNvLGRlcGFydGFtZW50byxoYWJpdGFjaW9uLGNhc2EscmVzZXJ2YSx0dC5jYXJnYV9vYnNlcnZhY2lvbmVzLCBjaXRhLCB0LmFyZWEsIHR0LnRhcmVhLCBmZWNoYV9hc2lnbmFjaW9uLCBhc2lnbmFkbywgbWFpbl9mb3JtXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHNlbGVjdCBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAndml2aWVuZGFzJywgJHtqc29ubyhcclxuICAgICAgICAgICAgICAgICAgICBgc2VsZWN0IGVuYywgcmVzcHVlc3RhcywganNvbmJfYnVpbGRfb2JqZWN0KCdyZXN1bWVuRXN0YWRvJyxcInJlc3VtZW5Fc3RhZG9cIikgYXMgb3RyYXMgZnJvbSB2aXZpZW5kYXNgLFxyXG4gICAgICAgICAgICAgICAgICAgICdlbmMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGBvdHJhcyB8fCBjb2FsZXNjZShyZXNwdWVzdGFzLCd7fSc6Ompzb25iKWBcclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICkgYXMgcmVzcHVlc3RhcyxcclxuICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBhcmVhIGFzIGNhcmdhLCBvYnNlcnZhY2lvbmVzX2hkciBhcyBvYnNlcnZhY2lvbmVzLCBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGFcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHZpdmllbmRhcyBpbm5lciBqb2luIGFyZWFzIHVzaW5nIChhcmVhKSBcclxuICAgICAgICAgICAgICAgICAgICBncm91cCBieSBhcmVhLCBvYnNlcnZhY2lvbmVzX2hkcmAsIFxyXG4gICAgICAgICAgICAgICAgJ2ZlY2hhJyl9IGFzIGNhcmdhcyxcclxuICAgICAgICAgICAgJHtqc29ubyhcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgZW5jLCBqc29uYl9idWlsZF9vYmplY3QoJ3RlbScsIHRlbSwgJ3RhcmVhJywgdGFyZWEpIGFzIG90cmFzIGZyb20gdml2aWVuZGFzYCxcclxuICAgICAgICAgICAgICAgICAnZW5jJyxcclxuICAgICAgICAgICAgICAgICBgb3RyYXMgfHwne30nOjpqc29uYmBcclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIGFzIFwiaW5mb3JtYWNpb25IZHJcIlxyXG5gXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgc2V0SGRyUXVlcnkgPSAobXlGdW46KHF1b3RlZENvbmRWaXY6c3RyaW5nKT0+c3RyaW5nKT0+IGdldEhkclF1ZXJ5PW15RnVuXHJcblxyXG5jb25zdCBnZXRVQVByaW5jaXBhbCA9IGFzeW5jIChjbGllbnQ6Q2xpZW50LCBvcGVyYXRpdm86c3RyaW5nKT0+XHJcbiAgICAoYXdhaXQgY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgIGBzZWxlY3QgdW5pZGFkX2FuYWxpc2lzXHJcbiAgICAgICAgICAgIGZyb20gdW5pZGFkX2FuYWxpc2lzXHJcbiAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHByaW5jaXBhbFxyXG4gICAgICAgIGBcclxuICAgICAgICAsXHJcbiAgICAgICAgW29wZXJhdGl2b11cclxuICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZVxyXG5cclxudmFyIGZ1bmNpb25lc0Nvbm9jaWRhczp7W2sgaW4gc3RyaW5nXTpib29sZWFufSA9IHt9XHJcblxyXG52YXIgY29tcGlsZXIgPSBuZXcgRXhwcmVzaW9uUGFyc2VyLkNvbXBpbGVyKHtcclxuICAgIGxhbmd1YWdlOidqcycsXHJcbiAgICB2YXJXcmFwcGVyOih2YXJfbmFtZTpzdHJpbmcpPT5gaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4ke3Zhcl9uYW1lfSlgLFxyXG4gICAgZnVuV3JhcHBlcjooZnVuY3Rpb25OYW1lOnN0cmluZyk9PntcclxuICAgICAgICBpZighZnVuY2lvbmVzQ29ub2NpZGFzW2Z1bmN0aW9uTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhmdW5jdGlvbk5hbWUpXHJcbiAgICAgICAgICAgIGZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGBoZWxwZXJzLmZ1bnMuJHtmdW5jdGlvbk5hbWV9YFxyXG4gICAgfVxyXG59KVxyXG5cclxudHlwZSBDYXNpbGxlcm9EZUFjYT17XHJcbiAgICBjaGlsZHM6IENhc2lsbGVyb0RlQWNhW10sXHJcbiAgICBkYXRhOntcclxuICAgICAgICBleHByZXNpb25faGFiaWxpdGFyOiBzdHJpbmdcclxuICAgICAgICBleHByZXNpb25faGFiaWxpdGFyX2pzOiBzdHJpbmdcclxuICAgICAgICBlc3BlY2lhbDogYW55XHJcbiAgICAgICAgZXhwcmVzaW9uX2F1dG9pbmdyZXNhcl9qczogc3RyaW5nXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBpbGFyRXhwcmVzaW9uKGV4cHJlc2lvbjpzdHJpbmcpe1xyXG4gICAgcmV0dXJuIGNvbXBpbGVyLnRvQ29kZShFeHByZXNpb25QYXJzZXIucGFyc2UoXHJcbiAgICAgICAgZXhwcmVzaW9uXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJpcyBkaXN0aW5jdCBmcm9tXFxiL2dpLCcgPD4gJylcclxuICAgICAgICAgICAgLnJlcGxhY2UoLyEhL2dpLCcgJylcclxuICAgICkpLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuYmxhbmNvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywnaGVscGVycy5mdW5zLmJsYW5jbygoJylcclxuICAgIC5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmluZm9ybWFkb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csJ2hlbHBlcnMuZnVucy5pbmZvcm1hZG8oKCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbmVzKGNhc2lsbGVybzpDYXNpbGxlcm9EZUFjYSl7XHJcbiAgICBpZighY2FzaWxsZXJvKXsgcmV0dXJuIH1cclxuICAgIGlmKGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXIpe1xyXG4gICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXJfanMgPSBjb21waWxhckV4cHJlc2lvbihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKTtcclxuICAgIH1cclxuICAgIGlmKGNhc2lsbGVyby5kYXRhLmVzcGVjaWFsPy5hdXRvaW5nKXtcclxuICAgICAgICB2YXIgcGFydGVzID0gY2FzaWxsZXJvLmRhdGEuZXNwZWNpYWw/LmF1dG9pbmcuc3BsaXQoJz0+Jyk7XHJcbiAgICAgICAgaWYocGFydGVzLmxlbmd0aD4xKXtcclxuICAgICAgICAgICAgdmFyIHByZWNvbmRpY2lvbiA9IHBhcnRlc1swXTtcclxuICAgICAgICAgICAgdmFyIHZhbG9yID0gcGFydGVzLnNsaWNlKDEpLmpvaW4oJz0+Jyk7XHJcbiAgICAgICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanMgPSBgKCR7Y29tcGlsYXJFeHByZXNpb24ocHJlY29uZGljaW9uKX0pPygke2NvbXBpbGFyRXhwcmVzaW9uKHZhbG9yKX0pOm51bGxgO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gY29tcGlsYXJFeHByZXNpb24ocGFydGVzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IodmFyIGNhc2lsbGVyb0ludGVybm8gb2YgY2FzaWxsZXJvLmNoaWxkcykgY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm9JbnRlcm5vKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFByb2NlZHVyZXNEbUVuY3UgOiBQcm9jZWR1cmVEZWZbXSA9IFtcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J29wZXJhdGl2b19lc3RydWN0dXJhX2NvbXBsZXRhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgICAgICAsdHlwZU5hbWU6J3RleHQnLCByZWZlcmVuY2VzOidvcGVyYXRpdm9zJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazonZGVzcGxlZ2FyRm9ybXVsYXJpbycsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBjYXNpbGxlcm9zX2plcmFycXVpemFkb3MoJDEpIGFzIGZvcm11bGFyaW9zLCBcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBzZWxlY3QgdW5pZGFkX2FuYWxpc2lzLCBwYWRyZSwgcGtfYWdyZWdhZGEsICd7fSc6Ompzb25iIGFzIGhpamFzIGZyb20gdW5pZGFkX2FuYWxpc2lzYCwgJ3VuaWRhZF9hbmFsaXNpcycpfSBhcyB1bmlkYWRlc19hbmFsaXNpc1xyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBsaWtlQXIocmVzdWx0LnJvdy5mb3JtdWxhcmlvcykuZm9yRWFjaChmPT5jb21waWxhckV4cHJlc2lvbmVzKGYpKTtcclxuICAgICAgICAgICAgLy8gSGVybWFub3Mgc29uIGxvcyBmb3JtdWxhcmlvcyBxdWUgZXN0w6FuIGltcGxhbnRhZG9zIGVuIG90cm8gZm9ybXVsYXJpbyBkZSBsYSBtaXNtYSBVQS4gUG9yIGVqZW1wbG8gZWwgQTEgZW4gZWwgUzFcclxuICAgICAgICAgICAgdmFyIHJlc3VsdEhlcm1hbm9zID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG5zZWxlY3Qgby5pZF9jYXNpbGxlcm8gYXMgaWRfZm9ybXVsYXJpbywgby51bmlkYWRfYW5hbGlzaXMsICdCRl8nfHxvLmNhc2lsbGVybyBib3RvbiwgYmYuY2FzaWxsZXJvLCBiZi5wYWRyZSwgZnAuY2FzaWxsZXJvLCBmcC51bmlkYWRfYW5hbGlzaXNcclxuICBmcm9tIGNhc2lsbGVyb3MgbyBsZWZ0IGpvaW4gY2FzaWxsZXJvcyBiZlxyXG4gICAgb24gYmYudGlwb2M9J0JGJ1xyXG5cdGFuZCBiZi5jYXNpbGxlcm8gPSAnQkZfJ3x8by5jYXNpbGxlcm9cclxuXHRhbmQgYmYub3BlcmF0aXZvID0gby5vcGVyYXRpdm9cclxuXHRsZWZ0IGpvaW4gY2FzaWxsZXJvcyBmcFxyXG5cdCAgb24gZnAuaWRfY2FzaWxsZXJvID0gYmYucGFkcmVcclxuXHQgIGFuZCBmcC5vcGVyYXRpdm8gPSBiZi5vcGVyYXRpdm9cclxuICB3aGVyZSBvLnRpcG9jID0gJ0YnXHJcbiAgICBhbmQgby51bmlkYWRfYW5hbGlzaXMgPSBmcC51bmlkYWRfYW5hbGlzaXNcclxuXHRhbmQgby5vcGVyYXRpdm8gPSAkMWAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgcmVzdWx0SGVybWFub3Mucm93cy5mb3JFYWNoKHJvdz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJvdy5mb3JtdWxhcmlvc1tyb3cuaWRfZm9ybXVsYXJpb10uZGF0YS5oZXJtYW5vID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgZnVuY3Rpb24gY29tcGxldGFyVUEodWE6VW5pZGFkQW5hbGlzaXMsIGlkVWE6SWRVbmlkYWRBbmFsaXNpcywgdUFzOntbayBpbiBJZFVuaWRhZEFuYWxpc2lzXTogVW5pZGFkQW5hbGlzaXN9KXtcclxuICAgICAgICAgICAgICAgIGlmKHVhLnBhZHJlKXtcclxuICAgICAgICAgICAgICAgICAgICB1QXNbdWEucGFkcmVdLmhpamFzW2lkVWFdID0gdWE7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB1YS5wcmluY2lwYWw9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaWtlQXIocmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcykuZm9yRWFjaCgodWEsIGlkVWEpPT5cclxuICAgICAgICAgICAgICAgIGNvbXBsZXRhclVBKHVhLCBpZFVhIGFzIElkVW5pZGFkQW5hbGlzaXMsIHJlc3VsdC5yb3cudW5pZGFkZXNfYW5hbGlzaXMpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgdmFyIGNvbmZpZ1NvcnRlbyA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbyBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIG9wZXJhdGl2b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDFcclxuICAgICAgICAgICAgYCxbcGFyYW1ldGVycy5vcGVyYXRpdm9dKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlO1xyXG4gICAgICAgICAgICBsZXQgY29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zID0gKGV4cHJlc2lvbmVzRG9taW5pbzphbnkpPT4gXHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoZXhwcmVzaW9uZXNEb21pbmlvKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGV4cHIsZG9taW5pbyk9Pih7ZG9taW5pbywgZXhwcjpjb21waWxhckV4cHJlc2lvbihleHByLmV4cHIpfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBsYWluKCk7XHJcbiAgICAgICAgICAgIGlmKGNvbmZpZ1NvcnRlbyl7XHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoY29uZmlnU29ydGVvKS5mb3JFYWNoKChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZXhwcl9pbmNvbXBsZXRpdHVkX2pzPWNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmV4cHJfaW5jb21wbGV0aXR1ZClcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmZpbHRyb19qcz1jb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm8pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7dGltZXN0YW1wOiBiZS50aW1lc3RhbXBFc3RydWN0dXJhLCAuLi5yZXN1bHQucm93LCBvcGVyYXRpdm86cGFyYW1ldGVycy5vcGVyYXRpdm8sIGNvbmZpZ1NvcnRlbyxub1JlYXM6YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWEsIG5vUmVhc1N1cDpiZS5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9zdXB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidnZW5lcmFyX2Zvcm11bGFyaW9zJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J2FubmlvJywgdHlwZU5hbWU6J2ludGVnZXInLCByZWZlcmVuY2VzOidhbm5pbyd9LFxyXG4gICAgICAgICAgICB7bmFtZTonbWVzJyAgLCB0eXBlTmFtZTonaW50ZWdlcicsIHJlZmVyZW5jZXM6J21lcycgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidsb3RlJyAsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczonbG90ZXMnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRVQSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCAqXHJcbiAgICAgICAgICAgICAgICAgICBmcm9tIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICAgICAgICAgd2hlcmUgcHJpbmNpcGFsID0gdHJ1ZSBhbmQgb3BlcmF0aXZvID0gJDFcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPXVxyXG4gICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdFVBLnJvd0NvdW50ID09PSAwKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgY29uZmlndXLDsyB1bmEgdW5pZGFkIGRlIGFuYWxpc2lzIGNvbW8gcHJpbmNpcGFsJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJvdyA9IHJlc3VsdFVBLnJvdztcclxuICAgICAgICAgICAgbGV0IHJlc3VsdFByZWd1bnRhcyA9IGF3YWl0IGJlLnByb2NlZHVyZS5wcmVndW50YXNfdWFfdHJhZXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHJvdylcclxuICAgICAgICAgICAgdmFyIGNvbnRlbmVkb3JWYWNpbzp7W2tleTpzdHJpbmddOmFueX0gPSB7fTtcclxuICAgICAgICAgICAgcmVzdWx0UHJlZ3VudGFzLmZvckVhY2goZnVuY3Rpb24oZGVmUHJlZ3VudGEpe1xyXG4gICAgICAgICAgICAgICAgY29udGVuZWRvclZhY2lvW2RlZlByZWd1bnRhLnZhcl9uYW1lXSA9IGRlZlByZWd1bnRhLnVuaWRhZF9hbmFsaXNpcz9bXTpudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLmFubmlvPSBwYXJhbWV0ZXJzLmFubmlvO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubWVzICA9IHBhcmFtZXRlcnMubWVzICA7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5sb3RlID0gcGFyYW1ldGVycy5sb3RlIDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgZGViZV9oYWJlci5pZF9jYXNvLCBzIGFzIGlkXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGxvdGUsIGFybWFyX2lkKGFubmlvLCBtZXMsIGxvdGUsIHMpIGFzIGlkX2Nhc28sIHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGFubmlvLG1lcyxsb3RlLCBjYW50X2N1ZXMgZnJvbSBsb3RlcyB3aGVyZSAoYW5uaW8sbWVzLGxvdGUpPSgkMiwkMywkNCkpIHIsIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsY2FudF9jdWVzKSBzXHJcbiAgICAgICAgICAgICAgICAgICAgKSBkZWJlX2hhYmVyIGxlZnQgam9pbiBkZWZnZW4gaGF5IG9uIGhheS5pZF9jYXNvID0gZGViZV9oYWJlci5pZF9jYXNvIGFuZCBoYXkub3BlcmF0aXZvPSQxXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgaGF5LmlkX2Nhc28gaXMgbnVsbGAsXHJcbiAgICAgICAgICAgICAgICBbIE9QRVJBVElWTywgcGFyYW1ldGVycy5hbm5pbywgcGFyYW1ldGVycy5tZXMsIHBhcmFtZXRlcnMubG90ZV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge29wZXJhdGl2bzogT1BFUkFUSVZPfTtcclxuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGkgPCByZXN1bHQucm93Q291bnQ7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyLmNvcmVGdW5jdGlvbihcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2luZyhwYXJhbXMse2lkX2Nhc286cmVzdWx0LnJvd3NbaV0uaWRfY2FzbywgZGF0b3NfY2FzbzpjaGFuZ2luZyhjb250ZW5lZG9yVmFjaW8se2lkOnJlc3VsdC5yb3dzW2ldLmlkfSl9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7YWdyZWdhZGFzOnJlc3VsdC5yb3dDb3VudH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjondXBsb2FkX2ZpbGUnLFxyXG4gICAgICAgIHByb2dyZXNzOiB0cnVlLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTogJ2lkX2FkanVudG8nLCB0eXBlTmFtZTogJ2ludGVnZXInfSxcclxuICAgICAgICAgICAge25hbWU6ICdub21icmUnLCB0eXBlTmFtZTogJ3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZpbGVzOntjb3VudDoxfSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246ZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMsIGZpbGVzKXtcclxuICAgICAgICAgICAgbGV0IGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGxldCBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIGNvbnRleHQuaW5mb3JtUHJvZ3Jlc3Moe21lc3NhZ2U6YmUubWVzc2FnZXMuZmlsZVVwbG9hZGVkfSk7XHJcbiAgICAgICAgICAgIGxldCBmaWxlID0gZmlsZXNbMF1cclxuICAgICAgICAgICAgbGV0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlLnBhdGgpLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgbGV0IG9yaWdpbmFsRmlsZW5hbWUgPSBmaWxlLm9yaWdpbmFsRmlsZW5hbWUuc2xpY2UoMCwtKGV4dC5sZW5ndGgrMSkpO1xyXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWU9IHBhcmFtZXRlcnMubm9tYnJlIHx8IG9yaWdpbmFsRmlsZW5hbWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdQYXRoID0gJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJztcclxuICAgICAgICAgICAgdmFyIGNyZWF0ZVJlc3BvbnNlID0gZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2UoYWRqdW50b1Jvdyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMYSBzdWJpZGEgc2UgcmVhbGl6w7MgY29ycmVjdGFtZW50ZSAodXBkYXRlKScsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlOiBhZGp1bnRvUm93Lm5vbWJyZSxcclxuICAgICAgICAgICAgICAgICAgICBub21icmVfb3JpZ2luYWw6IGFkanVudG9Sb3cubm9tYnJlX29yaWdpbmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dDogYWRqdW50b1Jvdy5leHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmVjaGE6IGFkanVudG9Sb3cuZmVjaGEsXHJcbiAgICAgICAgICAgICAgICAgICAgaG9yYTogYWRqdW50b1Jvdy5ob3JhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX2FkanVudG86IGFkanVudG9Sb3cuaWRfYWRqdW50b1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBtb3ZlRmlsZSA9IGZ1bmN0aW9uIG1vdmVGaWxlKGZpbGUsIGlkX2FkanVudG8sIGV4dGVuc2lvbil7XHJcbiAgICAgICAgICAgICAgICBmcy5tb3ZlKGZpbGUucGF0aCwgbmV3UGF0aCArIGlkX2FkanVudG8gKyAnLicgKyBleHRlbnNpb24sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJzLmlkX2FkanVudG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNsaWVudC5xdWVyeShgdXBkYXRlIGFkanVudG9zIHNldCBub21icmU9ICQxLG5vbWJyZV9vcmlnaW5hbCA9ICQyLCBleHQgPSAkMywgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLCQ0Ojp0ZXh0LCcuJywkMzo6dGV4dCksIGZlY2hhID0gbm93KCksIGhvcmEgPSBkYXRlX3RydW5jKCdzZWNvbmRzJyxjdXJyZW50X3RpbWVzdGFtcC1jdXJyZW50X2RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkNCByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlbmFtZSwgb3JpZ2luYWxGaWxlbmFtZSwgZXh0LCBwYXJhbWV0ZXJzLmlkX2FkanVudG9dXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlc3VsdC5yb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXN1bHRhZG8pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLHJlc3VsdGFkby5pZF9hZGp1bnRvLHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYGluc2VydCBpbnRvIGFkanVudG9zIChub21icmUsIG5vbWJyZV9vcmlnaW5hbCwgZXh0LCBmZWNoYSwgaG9yYSkgdmFsdWVzICgkMSwkMiwkMyxub3coKSwgZGF0ZV90cnVuYygnc2Vjb25kcycsY3VycmVudF90aW1lc3RhbXAtY3VycmVudF9kYXRlKSkgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsZW5hbWUsIG9yaWdpbmFsRmlsZW5hbWUsIGV4dF1cclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLGlkX2FkanVudG86OnRleHQsJy4nLGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkMSByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzdWx0LnJvdy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlc3VsdC5yb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0YWRvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVGaWxlKGZpbGUscmVzdWx0YWRvLmlkX2FkanVudG8scmVzdWx0YWRvLmV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonY2Fzb19ndWFyZGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICwgdHlwZU5hbWU6J3RleHQnICAgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J2RhdG9zX2Nhc28nICAsIHR5cGVOYW1lOidqc29uYicgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBlc3BlY2lmaWNvIGVsIHRpcG8gZGUgbG9zIHBhcsOhbWV0cm9zXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczp7XHJcbiAgICAgICAgICAgIG9wZXJhdGl2bzpzdHJpbmcsIFxyXG4gICAgICAgICAgICBpZF9jYXNvOnN0cmluZyxcclxuICAgICAgICAgICAgZGF0b3NfY2FzbzpBbnlPYmplY3RcclxuICAgICAgICB9LG5ld0NsaWVudDpDbGllbnQpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PW5ld0NsaWVudCB8fCBjb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRhdG9zX2pzb249cGFyYW1ldGVycy5kYXRvc19jYXNvO1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgdGFibGVTdHJ1Y3R1cmVzX2FwcDpUYWJsZURlZmluaXRpb25zID0gYmUudGFibGVTdHJ1Y3R1cmVzO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBNQUlOX1RBQkxFTkFNRSk7XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bJ29wZXJhdGl2byddID0gcGFyYW1ldGVycy5vcGVyYXRpdm87XHJcbiAgICAgICAgICAgIC8vVE9ETyA6IHZpdmllbmRhIMOzIGVuYz8/P1xyXG4gICAgICAgICAgICBkYXRvc19qc29uWyd2aXZpZW5kYSddID0gcGFyYW1ldGVycy5pZF9jYXNvO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJfdWx0X3BrX2VuX2FyciggdWx0X3BrLCB1YV9hcnIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbl9wa19jb21wbGV0YT11YV9hcnI7IFxyXG4gICAgICAgICAgICAgICAgaWYgKHVhX2FyciAmJiB1YV9hcnIubGVuZ3RoPj0xKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25fcGtfY29tcGxldGE9IGNvbl9wa19jb21wbGV0YS5tYXAoKHVuYV91YSxpKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmFfdWFbdWx0X3BrXT1pKzEgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuYV91YTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25fcGtfY29tcGxldGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIHZhciBrZXkxIGluIGRhdG9zX2pzb24gKXtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRvX2tleTEgPSBkYXRvc19qc29uW2tleTFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCBkYXRvX2tleTEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvX2tleTEubGVuZ3RoID49IDEgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBrMSA9IHRhYmxlU3RydWN0dXJlc19hcHBba2V5MV0oY29udGV4dCkucHJpbWFyeUtleTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdWx0X3BrMSA9IHBrMVtwazEubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdG9zX2pzb25ba2V5MV0gPSBjb21wbGV0YXJfdWx0X3BrX2VuX2FyciggdWx0X3BrMSwgZGF0b3NfanNvbltrZXkxXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0b3NfanNvbltrZXkxXS5mb3JFYWNoKCh1bl9rZXkxLCBpMSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGtleTIgaW4gdW5fa2V5MSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB1bl9rZXkxW2tleTJdIGluc3RhbmNlb2YgQXJyYXkgJiYgdW5fa2V5MVtrZXkyXS5sZW5ndGggPj0gMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwazIgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleTJdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVsdF9wazIgPSBwazJbcGsyLmxlbmd0aC0xXTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXSA9IGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKCB1bHRfcGsyLCBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXS5mb3JFYWNoKHVuX2tleTI9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModW5fa2V5MikuZmlsdGVyKCBwMj0+cDIuc3RhcnRzV2l0aCgnJCcpKS5mb3JFYWNoKHBwMj0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5fa2V5MltwcDJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkyLnN0YXJ0c1dpdGgoJyQnKXx8a2V5Mi5zdGFydHNXaXRoKCdfJykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGtleTEuc3RhcnRzV2l0aCgnJCcpKXtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbltrZXkxXTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYTtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG87XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYVN1cDtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG9TdXA7XHJcblxyXG4gICAgICAgICAgICBpZiggT2JqZWN0LmtleXMoZGF0b3NfanNvbikubGVuZ3RoID4yKXtcclxuICAgICAgICAgICAgICAgIHZhciBxdWVyaWVzID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsV3JpdGUoZGF0b3NfanNvbiwgc3RydWN0X2RtZW5jdSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24ocHJvbWlzZSwgcXVlcnkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQucXVlcnkocXVlcnkpLmV4ZWN1dGUoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFByb21pc2UucmVzb2x2ZSgpKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwib2tcIjtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycjpFcnJvcil7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjYXNvX2d1YXJkYXIgRU5UUkEgRU4gRUwgQ0FUQ0g6IFwiLGVycilcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd2YWNpbyc7XHJcbiAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjYXNvX3RyYWVyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIC8ve25hbWU6J2Zvcm11bGFyaW8nICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIGRlZmluZWRJbjogJ2RtZW5jdScsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgIHZhciBzdHJ1Y3RfZG1lbmN1ID0gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIE1BSU5fVEFCTEVOQU1FKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoe29wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtZXRlcnMuaWRfY2Fzb30sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgdml2aWVuZGE6IHBhcmFtZXRlcnMuaWRfY2FzbyxcclxuICAgICAgICAgICAgICAgIGRhdG9zX2Nhc286IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC8vZm9ybXVsYXJpbzogZm9ybVByaW5jaXBhbCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcl9vX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19wcmVwYXJhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19ndWFyZGFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIGNoYW5naW5nKHBhcmFtZXRlcnMsIHtkYXRvc19jYXNvOmpzb259KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qIEdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIEZST00gJHtNQUlOX1RBQkxFTkFNRX0gTElNSVQgMWApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdE1haW4ucm93Q291bnQ+MCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSEFZIERBVE9TJyxyZXN1bHRNYWluLnJvd3MpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hBWSBEQVRPUy4gTk8gU0UgUFVFREUgSU5JQ0lBUiBFTCBQQVNBSkUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0SnNvbiA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYFNFTEVDVCBvcGVyYXRpdm8sIGVuYyBpZF9jYXNvLCBqc29uX2VuY3Vlc3RhIGRhdG9zX2Nhc28gZnJvbSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgV0hFUkUgb3BlcmF0aXZvPSQxIGFuZCByZXN1bWVuX2VzdGFkbyBpcyBkaXN0aW5jdCBmcm9tICd2YWNpbycgYW5kIGpzb25fZW5jdWVzdGEgaXMgbm90IG51bGwgXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgZW5jIGAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPXVxyXG4gICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuICAgICAgICAgICAgaWYocHJvY2VkdXJlR3VhcmRhci5kZWZpbmVkSW4hPSdkbWVuY3UnKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGF5IHF1ZSBzb2JyZWVzY3JpYmlyIGNhc29fZ3VhcmRhcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRKc29uLnJvd3MubWFwKGFzeW5jIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGNhc28gJHtyb3cuaWRfY2Fzb306IGA7XHJcbiAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbihjbGllbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3csIGNsaWVudCk7ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwianNvbjJ1YSBlcnJvci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvID0gZXJyTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9ICAgICBcclxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdGFkby5pbmNsdWRlcygnb2snKSl7IFxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB7ZGF0b3NfY2Fzbywgdml2aWVuZGEsIG9wZXJhdGl2b30gPSBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb190cmFlci5jb3JlRnVuY3Rpb24oY29udGV4dCwge29wZXJhdGl2bzpyb3cub3BlcmF0aXZvLCBpZF9jYXNvOnJvdy5pZF9jYXNvfSlcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmVyUXVlR3JhYm8gPSB7ZGF0b3NfY2Fzbywgdml2aWVuZGEsIG9wZXJhdGl2b31cclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyZXBhbmNlcy5zaG93QW5kVGhyb3codmVyUXVlR3JhYm8scm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2ZXJRdWVHcmFibyxyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkbztcclxuICAgICAgICAgICAgfSkpLmNhdGNoKGZ1bmN0aW9uKGVycil7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2ZvcnBrcmFpel9jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3ZpdmllbmRhJyAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6XCJ0YXJlYXNcIn0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2byx2aXZpZW5kYSwgdGFyZWF9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgdmFyIG1haW5fZm9ybSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCB0YXJlYT0kMmBcclxuICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIHRhcmVhXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2PSBgIHQub3BlcmF0aXZvPSAkMSBhbmQgdC5lbmMgPSQyYDtcclxuICAgICAgICAgICAgdmFyIHNvbG9MZWN0dXJhID0gISEoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgY2FyZ2Fkb19kbSBpcyBub3QgbnVsbGBcclxuICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIHZpdmllbmRhXVxyXG4gICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93Q291bnQ7XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYpLFtvcGVyYXRpdm8sdml2aWVuZGFdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByb3cuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhPXtcclxuICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgIH0gO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmEsXHJcbiAgICAgICAgICAgICAgICBpZFBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsfSkpLCAnY2FyZ2EnKSxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcEVzdHJ1Y3R1cmE6YmUudGltZXN0YW1wRXN0cnVjdHVyYVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidkbV9mb3Jwa3JhaXpfZGVzY2FyZ2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidwZXJzaXN0ZW50ZXMnICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLCBwZXJzaXN0ZW50ZXN9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkNJUEFMID0gYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIG9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGxpa2VBcihwZXJzaXN0ZW50ZXMucmVzcHVlc3Rhc1tVQV9QUklOQ0lQQUxdKS5tYXAoYXN5bmMgKHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxpZEVuYyk9PntcclxuICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5zMWExX29icyA9PSAnIXBydWViYSBkZSBlcnJvciBhbCBncmFiYXIhJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdESU8gUFJVRUJBIERFIEVSUk9SIEFMIEdSQUJBUicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHtwYXJhbXMsIHNldHRlcnN9ID0gYXdhaXQgZ2V0UGFyYW1ldGVyc0FuZFNldHRlcnNGb3JVcGRhdGVUZW0oY29udGV4dCwgb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLCBwZXJzaXN0ZW50ZXMuaW5mb3JtYWNpb25IZHJbaWRFbmNdLnRhcmVhLnRhcmVhKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3NldHRlcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNcclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIC8vZ3VhcmRhciBwYXJhbGVsYW1lbnRlIGVuIHRhYmxhcyB1YVxyXG4gICAgICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IGBpZCBlbmMgJHtpZEVuY306IGA7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1fZ3VhcmRhcj17b3BlcmF0aXZvOiBvcGVyYXRpdm8saWRfY2FzbzppZEVuYywgZGF0b3NfY2FzbzpyZXNwdWVzdGFzVUFQcmluY2lwYWx9XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbihjbGllbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyLCBjbGllbnQpOyAgICBcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvID0gZXJyTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHBhc2VfdGFibGE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBpZEVuYywgcmVzdWx0YWRvXVxyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpOyAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJ1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidkbV9zaW5jcm9uaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwZXJzaXN0ZW50ZXMnICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGNvbnN0IE9QRVJBVElWTyA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc3QgRVNUQURPX1BPU1RFUklPUl9DQVJHQSA9ICdDJztcclxuICAgICAgICAgICAgY29uc3QgRVNUQURPX1BPU1RFUklPUl9ERVNDQVJHQSA9ICdEJztcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7cGVyc2lzdGVudGVzfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIHZhciBudW1fc2luY3JvOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW46c3RyaW5nfG51bGw9cGVyc2lzdGVudGVzPy50b2tlbjtcclxuICAgICAgICAgICAgaWYoIXRva2VuKXtcclxuICAgICAgICAgICAgICAgIHRva2VuID0gKGF3YWl0IGJlLnByb2NlZHVyZS50b2tlbl9nZXQuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyYWdlbnQ6IGNvbnRleHQuc2Vzc2lvbi5yZXEudXNlcmFnZW50LCBcclxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogY29udGV4dC51c2VybmFtZVxyXG4gICAgICAgICAgICAgICAgfSkpLnRva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB7dmFsdWV9ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2luY3Jvbml6YWNpb25lcyAodG9rZW4sIHVzdWFyaW8sIGRhdG9zKVxyXG4gICAgICAgICAgICAgICAgICAgIFZBTFVFUyAoJDEsJDIsJDMpIFxyXG4gICAgICAgICAgICAgICAgICAgIFJFVFVSTklORyBzaW5jcm9cclxuICAgICAgICAgICAgICAgIGAsIFt0b2tlbiwgY29udGV4dC51c2VybmFtZSwgcGVyc2lzdGVudGVzXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgbnVtX3NpbmNybz12YWx1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbmR2aXY9IGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHQub3BlcmF0aXZvPSAkMSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFzaWduYWRvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHR0Lm9wZXJhY2lvbj0nY2FyZ2FyJyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kICh0dC5jYXJnYWRvX2RtIGlzIG51bGwgb3IgdHQuY2FyZ2Fkb19kbSA9ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwodG9rZW4pfSlcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKTtcclxuICAgICAgICAgICAgaWYocGVyc2lzdGVudGVzKXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGxpa2VBcihwZXJzaXN0ZW50ZXMucmVzcHVlc3Rhc1tVQV9QUklOQ0lQQUxdKS5tYXAoYXN5bmMgKHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgaWRFbmMpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmVhID0gcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50YXJlYS50YXJlYTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHVlZG9HdWFyZGFyRW5URU09dHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gR0VORVJBTElaQVIgRUwgSE9SUk9SIEVTVEVcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2V0dGVycz1gYDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gW09QRVJBVElWTywgaWRFbmMsIHRhcmVhLCB0b2tlbl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGFyZWE9PSdzdXBlJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnMrPSBgLCByZXN1bWVuX2VzdGFkb19zdXA9JDUsIG5vcmVhX3N1cD0kNiwgcmVhX3N1cD0kN2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnJlc3VtZW5Fc3RhZG9TdXAsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5jb2ROb1JlYVN1cCwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZFJlYVN1cF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzKz0gYCwgcmVzdW1lbl9lc3RhZG89JDUsIG5vcmVhPSQ2LCByZWE9JDdgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5jb25jYXQoW3Jlc3B1ZXN0YXNVQVByaW5jaXBhbC5yZXN1bWVuRXN0YWRvLCByZXNwdWVzdGFzVUFQcmluY2lwYWwuY29kTm9SZWEsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5jb2RSZWFdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5VGFyZWFzVGVtID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwoRVNUQURPX1BPU1RFUklPUl9ERVNDQVJHQSl9LCBjYXJnYWRvX2RtPW51bGwgJHtzZXR0ZXJzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDMgYW5kIGNhcmdhZG9fZG0gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHVlZG9HdWFyZGFyRW5URU09cXVlcnlUYXJlYXNUZW0ucm93Q291bnQ9PTE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocHVlZG9HdWFyZGFyRW5URU0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIge3BhcmFtcywgc2V0dGVyc30gPSBhd2FpdCBnZXRQYXJhbWV0ZXJzQW5kU2V0dGVyc0ZvclVwZGF0ZVRlbShjb250ZXh0LCBPUEVSQVRJVk8sIGlkRW5jLCByZXNwdWVzdGFzVUFQcmluY2lwYWwsIHRhcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3NldHRlcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogT1BFUkFUSVZPLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyLCBjbGllbnQpOyAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHBhc2VfdGFibGE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVjaWJpZG8tc2luLXRva2VuLnR4dCcsIEpTT04uc3RyaW5naWZ5KHtub3c6bmV3IERhdGUoKSx1c2VyOmNvbnRleHQudXNlcm5hbWUsaWRDYXNvOiBpZEVuYyx2aXZpZW5kYTogcmVzcHVlc3Rhc1VBUHJpbmNpcGFsfSkrJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29uZHZpdjogXCIsIGNvbmR2aXYpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInF1ZXJ5OiBcIiwgZ2V0SGRyUXVlcnkoY29uZHZpdikpO1xyXG4gICAgICAgICAgICB2YXIge3Jvd30gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShnZXRIZHJRdWVyeShjb25kdml2KSxbT1BFUkFUSVZPLGNvbnRleHQudXNlci5pZHBlcl0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgnLGdldEhkclF1ZXJ5KGNvbmR2aXYpKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICBzZXQgIGVzdGFkbyA9ICQ0LCBjYXJnYWRvX2RtPSQzOjp0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtjb25kdml2fSBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgZW5jYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgcGFyYW1ldGVycy5lbmM/cGFyYW1ldGVycy5lbmM6Y29udGV4dC51c2VyLmlkcGVyLCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmE6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIG51bV9zaW5jcm8sXHJcbiAgICAgICAgICAgICAgICBpZHBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsLCBlc3RhZG9fY2FyZ2E6J3JlbGV2YW1pZW50byd9KSksICdjYXJnYScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2JhY2t1cCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0ZW0nICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2JlLCBjbGllbnR9ID1jb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBudW1fc2luY3JvOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW46c3RyaW5nfG51bGw9cGFyYW1ldGVycy50b2tlbjtcclxuICAgICAgICAgICAgaWYodG9rZW4gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB2YXIge3Jvd0NvdW50fSA9IGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0IDEgZnJvbSB0b2tlbnMgd2hlcmUgdG9rZW4gPSAkMWAsW3Rva2VuXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYoIXJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRlbSl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGFyYW1ldGVycy50ZW0pLm1hcChhc3luYyAoYmFja3VwOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2JhY2t1cCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQganNvbl9iYWNrdXAgaXMgZGlzdGluY3QgZnJvbSAkNFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW09QRVJBVElWTywgYmFja3VwLmZvclBrUmFpei52aXZpZW5kYSwgYmFja3VwLnJlc3B1ZXN0YXNSYWl6LCBiYWNrdXAucmVzcHVlc3Rhc1JhaXpdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5hcnJheSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgb2s6J29rJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY29uc2lzdGlyX3ZpdmllbmRhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondml2aWVuZGEnICAgICAgICx0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2JlLCBjbGllbnR9ID1jb250ZXh0O1xyXG4gICAgICAgICAgICBsZXQgcGFyYW1fcHJvYz17XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgaWRfY2FzbzogcGFyYW1ldGVycy52aXZpZW5kYVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRhZG86IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRhZG89IGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9wcm9jLCBjbGllbnRcclxuICAgICAgICAgICAgICAgICk7ICAgIFxyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGVyck1lc3NhZ2UgPSBcIiBjb25zaXN0aXJfdml2aWVuZGEuIFwiKyBlcnIgO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyTWVzc2FnZSlcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJyoqKioqKiBjb25zaXN0aXJfdml2aWVuZGEgcmVzdWx0YWRvOicscmVzdWx0YWRvKSAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgb2s6J29rJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2RtX3Jlc2NhdGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J2xvY2FsU3RvcmFnZUl0ZW0nICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOidsb2NhbFN0b3JhZ2VJdGVtS2V5JyAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICB1bmxvZ2dlZDp0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIHtsb2NhbFN0b3JhZ2VJdGVtS2V5LCBsb2NhbFN0b3JhZ2VJdGVtfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobG9jYWxTdG9yYWdlSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5hcHBlbmRGaWxlKCdsb2NhbC1yZXNjYXRlLnR4dCcsIEpTT04uc3RyaW5naWZ5KHtub3c6bmV3IERhdGUoKSx1c2VyOmNvbnRleHQudXNlcm5hbWUsIGl0ZW1LZXk6IGxvY2FsU3RvcmFnZUl0ZW1LZXksIGl0ZW1EYXRhOiBsb2NhbFN0b3JhZ2VJdGVtfSkrJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVycik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29wZXJhdGl2b19nZXQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W10sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBfcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgcmV0dXJuIGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZ2V0X3JhbmRvbV9mcmVlX2Nhc2UnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W3tuYW1lOidvcGVyYXRpdm8nICAgICwgdHlwZU5hbWU6J3RleHQnfV0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBjb25zdCBtaW5zVG9FeHBpcmUgPSAzMDtcclxuICAgICAgICAgICAgY29uc3QgbWluc1NpbmNlQmxvcXVlZCA9IGBkYXRlX3BhcnQoJ21pbicsIGFnZShjdXJyZW50X3RpbWVzdGFtcCwgZmVjaGFfYmxvcXVlbykpYDtcclxuICAgICAgICAgICAgY29uc3QgZW5jID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYHNlbGVjdCBlbmMgZnJvbSB0ZW0gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAobGlicmUgb3IgJHttaW5zU2luY2VCbG9xdWVkfSA+ICR7bWluc1RvRXhwaXJlfSkgbGltaXQgMTtgLFtwYXJhbXMub3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgVVBEQVRFIHRlbSBzZXQgbGlicmUgPSBmYWxzZSwgZmVjaGFfYmxvcXVlbz1jdXJyZW50X3RpbWVzdGFtcCB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMmAsW3BhcmFtcy5vcGVyYXRpdm8sIGVuYy52YWx1ZV0pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVuYy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2FjY2lvbl90YXJlYXNfdGVtX2VqZWN1dGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2NvbmRpY2lvbicgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonYWNjaW9uJyAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmUgPSAgY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIGFjY2lvbiA9IHBhcmFtcy5hY2Npb24gYXMgRXN0YWRvQWNjaW9uO1xyXG4gICAgICAgICAgICBjb25zdCBBTkFMSVpBUl9DT05ESUNJT04gPSB0cnVlO1xyXG4gICAgICAgICAgICBpZihBTkFMSVpBUl9DT05ESUNJT04pe1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1bXBsZTpib29sZWFuID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGBzZWxlY3QgYWNjaW9uX2N1bXBsZV9jb25kaWNpb24oJDUsICQ2LCAkNywgJDgsIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGNvbmRpY2lvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGVzdGFkb3NfYWNjaW9uZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVzdGFkbyA9ICQyIGFuZCBlYWNjaW9uID0gJDMgYW5kIGVzdGFkb19kZXN0aW5vID0gJDRcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApYCwgW1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG8sIFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2lvbi5lYWNjaW9uLCBcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbywgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVuYywgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVhY2Npb24sXHJcbiAgICAgICAgICAgICAgICBdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZighY3VtcGxlKXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgcHVkbyBlamVjdXRhciBsYSBhY2Npw7NuLCBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzbiBcIiR7cGFyYW1zLmNvbmRpY2lvbn1cIiBvIGJpZW4gZWwgZXN0YWRvIGVzdMOhIGRlc2FjdHVhbGl6YWRvLCByZWZyZXNxdWUgbGEgZ3JpbGxhLmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVuYz0kMiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVuYywgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRhcmVhLCBcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm9cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBpZihhY2Npb24ubm9tYnJlX3Byb2NlZHVyZSl7XHJcbiAgICAgICAgICAgICAgICBpZihiZS5wcm9jZWR1cmVbYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmVdKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmVbYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmVdLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbXMpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gZXhpc3RlIGVsIHByb2NlZHVyZSBcIiR7YWNjaW9uLm5vbWJyZV9wcm9jZWR1cmV9XCIgZGVmaW5pZG8gZW4gbGEgdGFibGEgXCJlc3RhZG9zX2FjY2lvbmVzXCIgcGFyYSBlbFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogJHthY2Npb24ub3BlcmF0aXZvfSwgZXN0YWRvOiAke2FjY2lvbi5lc3RhZG99LCBlYWNjaW9uOiAke2FjY2lvbi5lYWNjaW9ufS5gKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93O1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rpc3BvbmliaWxpemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgYXNpZ25hZG8gPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9kZXNjYXJnYV9wcmVwYXJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICdkZXNjYXJnYXInXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19kZXNjYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYW5hbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX3ZpdmllbmRhLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7b3BlcmF0aXZvOnBhcmFtcy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtcy5lbmN9KVxyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3ZlcmlmaWNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHZlcmlmaWNhZG8gPSAnMSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3ZlcmlmaWNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHZlcmlmaWNhZG8gPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9kcHQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICAvL1RPRE8gYWPDoSBoYXkgcXVlIHByZXBhcmFyIGxhIHNpZ3VpZW50ZSB0YXJlYVxyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2hhYmlsaXRhcl9kZXNoYWJpbGl0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBoYWJpbGl0YWRhID0gbm90IGhhYmlsaXRhZGFcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICAgIFxyXG5dO1xyXG4iXX0=
|
|
998
|
+
returning *`, [params.operativo, params.enc])
|
|
999
|
+
.fetchUniqueRow();
|
|
1000
|
+
return 'ok';
|
|
1001
|
+
}
|
|
1002
|
+
},
|
|
1003
|
+
];
|
|
1004
|
+
});
|
|
1005
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1kbWVuY3UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Byb2NlZHVyZXMtZG1lbmN1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOzs7SUFJYixrQ0FBa0M7SUFDbEMsaURBQStCO0lBRy9CLHlEQUE4QztJQUU5QywrQ0FBNkM7SUFDN0MsMkJBQW1DO0lBRW5DLGdEQUFnRDtJQUloRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXBDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDN0IsTUFBTSxjQUFjLEdBQUUsV0FBVyxDQUFDO0lBRTNCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLE9BQXdCLEVBQUMsRUFBRTs7UUFDaEUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUMsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUcsTUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFNBQVMsRUFBQztZQUNwQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7U0FDN0I7YUFBSTtZQUNELE1BQU0sS0FBSyxDQUFFLHFEQUFxRCxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDLENBQUE7SUFSWSxRQUFBLGtCQUFrQixzQkFROUI7SUFLRCxTQUFTLGVBQWUsQ0FBQyxPQUF3QixFQUFFLFNB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Q0FBQztxQkFDbEMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7U0FDSjtLQUVKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCB7IFByb2NlZHVyZURlZiwgVGFibGVEZWZpbml0aW9uLCBDbGllbnQgfSBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJlQ29udGV4dCwgQ29yZUZ1bmN0aW9uUGFyYW1ldGVycywgRm9yZWlnbktleSB9IGZyb20gXCJtZXRhLWVuY1wiO1xyXG5pbXBvcnQgKiBhcyBsaWtlQXIgZnJvbSBcImxpa2UtYXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmltcG9ydCB7IElkVW5pZGFkQW5hbGlzaXMsIFVuaWRhZEFuYWxpc2lzLCBFc3RhZG9BY2Npb24gfSBmcm9tIFwiLi4vdW5sb2dnZWQvdGlwb3NcIjtcclxuXHJcbmltcG9ydCB7anNvbiwganNvbm99IGZyb20gXCJwZy1wcm9taXNlLXN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHtjaGFuZ2luZywgZGF0ZSB9IGZyb20gJ2Jlc3QtZ2xvYmFscyc7XHJcbmltcG9ydCB7cHJvbWlzZXMgYXMgIGZzfSBmcm9tIFwiZnNcIjtcclxuXHJcbmltcG9ydCAqIGFzIEV4cHJlc2lvblBhcnNlciBmcm9tICdleHByZS1wYXJzZXInO1xyXG5pbXBvcnQgeyB0YXJlYXMgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNcIjtcclxuaW1wb3J0IHsgcHJlcGVuZExpc3RlbmVyIH0gZnJvbSBcInByb2Nlc3NcIjtcclxuXHJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG52YXIgc3FsVG9vbHMgPSByZXF1aXJlKCdzcWwtdG9vbHMnKTtcclxuXHJcbnZhciBkaXNjcmVwYW5jZXMgPSByZXF1aXJlKCdkaXNjcmVwYW5jZXMnKTtcclxuXHJcbmNvbnN0IGZvcm1QcmluY2lwYWwgPSAnRjpGMSc7XHJcbmNvbnN0IE1BSU5fVEFCTEVOQU1FID0ndml2aWVuZGFzJztcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcGVyYXRpdm9BY3R1YWwgPSBhc3luYyAoY29udGV4dDpQcm9jZWR1cmVDb250ZXh0KT0+e1xyXG4gICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgIHZhciByZXN1bHQgPSBhd2FpdCBiZS5wcm9jZWR1cmUudGFibGVfZGF0YS5jb3JlRnVuY3Rpb24oY29udGV4dCx7dGFibGU6IGBwYXJhbWV0cm9zYCwgZml4ZWRGaWVsZHM6W119KTtcclxuICAgIGlmKHJlc3VsdFswXT8ub3BlcmF0aXZvKXtcclxuICAgICAgICByZXR1cm4gcmVzdWx0WzBdLm9wZXJhdGl2b1xyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IgKCdubyBzZSBjb25maWd1csOzIHVuIG9wZXJhdGl2byBlbiBsYSB0YWJsYSBwYXLDoW1ldHJvcycpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLypkZWZpbmljacOzbiBkZSBlc3RydWN0dXJhIGNvbXBsZXRhLCBjdWFuZG8gZXhpc3RhIGluZy1lbmMgaGF5IHF1ZSBwb25lcmxvIGFow60qLyBcclxudHlwZSBFc3RydWN0dXJhVGFibGE9e3RhYmxlTmFtZTpzdHJpbmcsIHBrRmllbGRzOntmaWVsZE5hbWU6c3RyaW5nfVtdLCBjaGlsZFRhYmxlczpFc3RydWN0dXJhVGFibGFbXX07XHJcbmZ1bmN0aW9uIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHRhYmxlTmFtZTpzdHJpbmcpe1xyXG4gICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgIHZhciBtYWluVGFibGVEZWY6VGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzW3RhYmxlTmFtZV0oY29udGV4dCk7XHJcbiAgICB2YXIgZ2V0UGtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRQa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24pe1xyXG4gICAgICAgIHJldHVybiB0YWJsZURlZi5wcmltYXJ5S2V5Lm1hcChmdW5jdGlvbihwayl7XHJcbiAgICAgICAgICAgIHJldHVybiB7ZmllbGROYW1lOnBrfTtcclxuICAgICAgICB9KVxyXG4gICAgfTtcclxuICAgIHZhciBnZXRGa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldEZrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiwgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcpe1xyXG4gICAgICAgIC8vIHJldHVybiB0YWJsZURlZi5mb3JlaWduS2V5cz8gdGFibGVEZWYuZm9yZWlnbktleXMubWFwKGZrPT5may5maWVsZHMpOiBbXTtcclxuICAgICAgICBsZXQgcGFyZW50RmsgPSAoPEZvcmVpZ25LZXlbXT4gdGFibGVEZWYuZm9yZWlnbktleXMpLmZpbmQoZms9PmZrLnJlZmVyZW5jZXMgPT0gcGFyZW50VGFibGVOYW1lKTtcclxuICAgICAgICByZXR1cm4gcGFyZW50Rms/IHBhcmVudEZrLmZpZWxkczogW107XHJcbiAgICB9XHJcbiAgICB2YXIgc3RydWN0OkVzdHJ1Y3R1cmFUYWJsYT17XHJcbiAgICAgICAgdGFibGVOYW1lOm1haW5UYWJsZURlZi5uYW1lLFxyXG4gICAgICAgIHBrRmllbGRzOmdldFBrRnJvbVRhYmxlRGVmKG1haW5UYWJsZURlZiksXHJcbiAgICAgICAgY2hpbGRUYWJsZXM6W11cclxuICAgIH07XHJcbiAgICBpZihtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzICYmIG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMubGVuZ3RoKXtcclxuICAgICAgICBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmZvckVhY2goZnVuY3Rpb24oZGV0YWlsVGFibGUpe1xyXG4gICAgICAgICAgICBzdHJ1Y3QuY2hpbGRUYWJsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIGNoYW5naW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBkZXRhaWxUYWJsZS50YWJsZSksXHJcbiAgICAgICAgICAgICAgICAgICAge2ZrRmllbGRzOiBnZXRGa0Zyb21UYWJsZURlZihiZS50YWJsZVN0cnVjdHVyZXNbZGV0YWlsVGFibGUudGFibGVdKGNvbnRleHQpLCB0YWJsZU5hbWUpfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RydWN0O1xyXG59XHJcbi8qIGZpbiBkZWZpbmljaW9uIGVzdHJ1Y3R1cmEgY29tcGxldGEgKi9cclxuXHJcbnR5cGUgQW55T2JqZWN0ID0ge1trOnN0cmluZ106YW55fVxyXG5cclxudmFyIGdldFBhcmFtZXRlcnNBbmRTZXR0ZXJzRm9yVXBkYXRlVGVtID0gYXN5bmMgKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpPT57XHJcbiAgICB2YXIgcmVnaXN0cmFFc3RhZG9FblRlbSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0IHJlZ2lzdHJhX2VzdGFkb19lbl90ZW1cclxuICAgICAgICAgICAgZnJvbSB0YXJlYXNcclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYSA9ICQyYFxyXG4gICAgICAgICxcclxuICAgICAgICBbb3BlcmF0aXZvLCB0YXJlYV1cclxuICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgIHZhciBwYXJhbXMgPSBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXVxyXG4gICAgdmFyIHNldHRlcnMgPSBganNvbl9lbmN1ZXN0YSA9ICQzYDtcclxuICAgIC8vVE9ETyBBUlJFR0xBUiBFU1RFIEhPUlJPUiwgR0VORVJBTElaQVJcclxuICAgIGlmKHRhcmVhPT0nc3VwZScpe1xyXG4gICAgICAgIHNldHRlcnMrPSBgLCByZXN1bWVuX2VzdGFkb19zdXA9JDQsIG5vcmVhX3N1cD0kNSwgcmVhX3N1cD0kNmBcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuY29uY2F0KFtyZXNwdWVzdGFzVUFQcmluY2lwYWwucmVzdW1lbkVzdGFkb1N1cCwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZE5vUmVhU3VwLCByZXNwdWVzdGFzVUFQcmluY2lwYWwuY29kUmVhU3VwXSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBzZXR0ZXJzKz0gYCwgcmVzdW1lbl9lc3RhZG89JDQsIG5vcmVhPSQ1LCByZWE9JDZgXHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnJlc3VtZW5Fc3RhZG8sIHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5jb2ROb1JlYSwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZFJlYV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtzZXR0ZXJzLCBwYXJhbXN9XHJcbn1cclxuXHJcbnZhciBnZXRIZHJRdWVyeSA9ICBmdW5jdGlvbiBnZXRIZHJRdWVyeShxdW90ZWRDb25kVml2OnN0cmluZyl7XHJcbiAgICByZXR1cm4gYFxyXG4gICAgd2l0aCB2aXZpZW5kYXMgYXMgXHJcbiAgICAgICAgKHNlbGVjdCB0LmVuYywgdC5qc29uX2VuY3Vlc3RhIGFzIHJlc3B1ZXN0YXMsIHQucmVzdW1lbl9lc3RhZG8gYXMgXCJyZXN1bWVuRXN0YWRvXCIsIFxyXG4gICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAnZG9taW5pbycgICAgICAgLCBkb21pbmlvICAgICAgICxcclxuICAgICAgICAgICAgICAgICdub21jYWxsZScgICAgICAsIG5vbWNhbGxlICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ3NlY3RvcicgICAgICAgICwgc2VjdG9yICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZWRpZmljaW8nICAgICAgLCBlZGlmaWNpbyAgICAgICxcclxuICAgICAgICAgICAgICAgICdlbnRyYWRhJyAgICAgICAsIGVudHJhZGEgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ25yb2NhdGFzdHJhbCcgICwgbnJvY2F0YXN0cmFsICAsXHJcbiAgICAgICAgICAgICAgICAncGlzbycgICAgICAgICAgLCBwaXNvICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdkZXBhcnRhbWVudG8nICAsIGRlcGFydGFtZW50byAgLFxyXG4gICAgICAgICAgICAgICAgJ2hhYml0YWNpb24nICAgICwgaGFiaXRhY2lvbiAgICAsXHJcbiAgICAgICAgICAgICAgICAnY2FzYScgICAgICAgICAgLCBjYXNhICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdwcmlvcmlkYWQnICAgICAsIHJlc2VydmErMSAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ29ic2VydmFjaW9uZXMnICwgdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcyAsXHJcbiAgICAgICAgICAgICAgICAnY2l0YScgICAgICAgICAgLCBjaXRhICxcclxuICAgICAgICAgICAgICAgICdjYXJnYScgICAgICAgICAsIHQuYXJlYSAgICAgICAgIFxyXG4gICAgICAgICAgICApIGFzIHRlbSwgdC5hcmVhLFxyXG4gICAgICAgICAgICAtLVRPRE86IEdFTkVSQUxJWkFSXHJcbiAgICAgICAgICAgIGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICd0YXJlYScsIHR0LnRhcmVhLFxyXG4gICAgICAgICAgICAgICAgJ2ZlY2hhX2FzaWduYWNpb24nLCBmZWNoYV9hc2lnbmFjaW9uLFxyXG4gICAgICAgICAgICAgICAgJ2FzaWduYWRvJywgYXNpZ25hZG8sXHJcbiAgICAgICAgICAgICAgICAnbWFpbl9mb3JtJywgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgICkgYXMgdGFyZWEsXHJcbiAgICAgICAgICAgIG1pbihmZWNoYV9hc2lnbmFjaW9uKSBhcyBmZWNoYV9hc2lnbmFjaW9uXHJcbiAgICAgICAgICAgIGZyb20gdGVtIHQgbGVmdCBqb2luIHRhcmVhc190ZW0gdHQgb24gKHQub3BlcmF0aXZvID0gdHQub3BlcmF0aXZvIGFuZCB0LmVuYyA9IHR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWwgPSB0dC50YXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gdGFyZWFzIHRhIG9uIHQudGFyZWFfYWN0dWFsID0gdGEudGFyZWFcclxuICAgICAgICAgICAgd2hlcmUgdC5oYWJpbGl0YWRhIGFuZCAke3F1b3RlZENvbmRWaXZ9XHJcbiAgICAgICAgICAgIGdyb3VwIGJ5IHQuZW5jLCB0Lmpzb25fZW5jdWVzdGEsIHQucmVzdW1lbl9lc3RhZG8sIGRvbWluaW8sIG5vbWNhbGxlLHNlY3RvcixlZGlmaWNpbywgZW50cmFkYSwgbnJvY2F0YXN0cmFsLCBwaXNvLGRlcGFydGFtZW50byxoYWJpdGFjaW9uLGNhc2EscmVzZXJ2YSx0dC5jYXJnYV9vYnNlcnZhY2lvbmVzLCBjaXRhLCB0LmFyZWEsIHR0LnRhcmVhLCBmZWNoYV9hc2lnbmFjaW9uLCBhc2lnbmFkbywgbWFpbl9mb3JtXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHNlbGVjdCBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAndml2aWVuZGFzJywgJHtqc29ubyhcclxuICAgICAgICAgICAgICAgICAgICBgc2VsZWN0IGVuYywgcmVzcHVlc3RhcywganNvbmJfYnVpbGRfb2JqZWN0KCdyZXN1bWVuRXN0YWRvJyxcInJlc3VtZW5Fc3RhZG9cIikgYXMgb3RyYXMgZnJvbSB2aXZpZW5kYXNgLFxyXG4gICAgICAgICAgICAgICAgICAgICdlbmMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGBvdHJhcyB8fCBjb2FsZXNjZShyZXNwdWVzdGFzLCd7fSc6Ompzb25iKWBcclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICkgYXMgcmVzcHVlc3RhcyxcclxuICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBhcmVhIGFzIGNhcmdhLCBvYnNlcnZhY2lvbmVzX2hkciBhcyBvYnNlcnZhY2lvbmVzLCBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGFcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHZpdmllbmRhcyBpbm5lciBqb2luIGFyZWFzIHVzaW5nIChhcmVhKSBcclxuICAgICAgICAgICAgICAgICAgICBncm91cCBieSBhcmVhLCBvYnNlcnZhY2lvbmVzX2hkcmAsIFxyXG4gICAgICAgICAgICAgICAgJ2ZlY2hhJyl9IGFzIGNhcmdhcyxcclxuICAgICAgICAgICAgJHtqc29ubyhcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgZW5jLCBqc29uYl9idWlsZF9vYmplY3QoJ3RlbScsIHRlbSwgJ3RhcmVhJywgdGFyZWEpIGFzIG90cmFzIGZyb20gdml2aWVuZGFzYCxcclxuICAgICAgICAgICAgICAgICAnZW5jJyxcclxuICAgICAgICAgICAgICAgICBgb3RyYXMgfHwne30nOjpqc29uYmBcclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIGFzIFwiaW5mb3JtYWNpb25IZHJcIlxyXG5gXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgc2V0SGRyUXVlcnkgPSAobXlGdW46KHF1b3RlZENvbmRWaXY6c3RyaW5nKT0+c3RyaW5nKT0+IGdldEhkclF1ZXJ5PW15RnVuXHJcblxyXG5jb25zdCBnZXRVQVByaW5jaXBhbCA9IGFzeW5jIChjbGllbnQ6Q2xpZW50LCBvcGVyYXRpdm86c3RyaW5nKT0+XHJcbiAgICAoYXdhaXQgY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgIGBzZWxlY3QgdW5pZGFkX2FuYWxpc2lzXHJcbiAgICAgICAgICAgIGZyb20gdW5pZGFkX2FuYWxpc2lzXHJcbiAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHByaW5jaXBhbFxyXG4gICAgICAgIGBcclxuICAgICAgICAsXHJcbiAgICAgICAgW29wZXJhdGl2b11cclxuICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZVxyXG5cclxudmFyIGZ1bmNpb25lc0Nvbm9jaWRhczp7W2sgaW4gc3RyaW5nXTpib29sZWFufSA9IHt9XHJcblxyXG52YXIgY29tcGlsZXIgPSBuZXcgRXhwcmVzaW9uUGFyc2VyLkNvbXBpbGVyKHtcclxuICAgIGxhbmd1YWdlOidqcycsXHJcbiAgICB2YXJXcmFwcGVyOih2YXJfbmFtZTpzdHJpbmcpPT5gaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4ke3Zhcl9uYW1lfSlgLFxyXG4gICAgZnVuV3JhcHBlcjooZnVuY3Rpb25OYW1lOnN0cmluZyk9PntcclxuICAgICAgICBpZighZnVuY2lvbmVzQ29ub2NpZGFzW2Z1bmN0aW9uTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhmdW5jdGlvbk5hbWUpXHJcbiAgICAgICAgICAgIGZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGBoZWxwZXJzLmZ1bnMuJHtmdW5jdGlvbk5hbWV9YFxyXG4gICAgfVxyXG59KVxyXG5cclxudHlwZSBDYXNpbGxlcm9EZUFjYT17XHJcbiAgICBjaGlsZHM6IENhc2lsbGVyb0RlQWNhW10sXHJcbiAgICBkYXRhOntcclxuICAgICAgICBleHByZXNpb25faGFiaWxpdGFyOiBzdHJpbmdcclxuICAgICAgICBleHByZXNpb25faGFiaWxpdGFyX2pzOiBzdHJpbmdcclxuICAgICAgICBlc3BlY2lhbDogYW55XHJcbiAgICAgICAgZXhwcmVzaW9uX2F1dG9pbmdyZXNhcl9qczogc3RyaW5nXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBpbGFyRXhwcmVzaW9uKGV4cHJlc2lvbjpzdHJpbmcpe1xyXG4gICAgcmV0dXJuIGNvbXBpbGVyLnRvQ29kZShFeHByZXNpb25QYXJzZXIucGFyc2UoXHJcbiAgICAgICAgZXhwcmVzaW9uXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJpcyBkaXN0aW5jdCBmcm9tXFxiL2dpLCcgPD4gJylcclxuICAgICAgICAgICAgLnJlcGxhY2UoLyEhL2dpLCcgJylcclxuICAgICkpLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuYmxhbmNvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywnaGVscGVycy5mdW5zLmJsYW5jbygoJylcclxuICAgIC5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmluZm9ybWFkb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csJ2hlbHBlcnMuZnVucy5pbmZvcm1hZG8oKCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbmVzKGNhc2lsbGVybzpDYXNpbGxlcm9EZUFjYSl7XHJcbiAgICBpZighY2FzaWxsZXJvKXsgcmV0dXJuIH1cclxuICAgIGlmKGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXIpe1xyXG4gICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXJfanMgPSBjb21waWxhckV4cHJlc2lvbihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKTtcclxuICAgIH1cclxuICAgIGlmKGNhc2lsbGVyby5kYXRhLmVzcGVjaWFsPy5hdXRvaW5nKXtcclxuICAgICAgICB2YXIgcGFydGVzID0gY2FzaWxsZXJvLmRhdGEuZXNwZWNpYWw/LmF1dG9pbmcuc3BsaXQoJz0+Jyk7XHJcbiAgICAgICAgaWYocGFydGVzLmxlbmd0aD4xKXtcclxuICAgICAgICAgICAgdmFyIHByZWNvbmRpY2lvbiA9IHBhcnRlc1swXTtcclxuICAgICAgICAgICAgdmFyIHZhbG9yID0gcGFydGVzLnNsaWNlKDEpLmpvaW4oJz0+Jyk7XHJcbiAgICAgICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanMgPSBgKCR7Y29tcGlsYXJFeHByZXNpb24ocHJlY29uZGljaW9uKX0pPygke2NvbXBpbGFyRXhwcmVzaW9uKHZhbG9yKX0pOm51bGxgO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gY29tcGlsYXJFeHByZXNpb24ocGFydGVzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IodmFyIGNhc2lsbGVyb0ludGVybm8gb2YgY2FzaWxsZXJvLmNoaWxkcykgY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm9JbnRlcm5vKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFByb2NlZHVyZXNEbUVuY3UgOiBQcm9jZWR1cmVEZWZbXSA9IFtcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J29wZXJhdGl2b19lc3RydWN0dXJhX2NvbXBsZXRhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgICAgICAsdHlwZU5hbWU6J3RleHQnLCByZWZlcmVuY2VzOidvcGVyYXRpdm9zJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazonZGVzcGxlZ2FyRm9ybXVsYXJpbycsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBjYXNpbGxlcm9zX2plcmFycXVpemFkb3MoJDEpIGFzIGZvcm11bGFyaW9zLCBcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBzZWxlY3QgdW5pZGFkX2FuYWxpc2lzLCBwYWRyZSwgcGtfYWdyZWdhZGEsICd7fSc6Ompzb25iIGFzIGhpamFzIGZyb20gdW5pZGFkX2FuYWxpc2lzYCwgJ3VuaWRhZF9hbmFsaXNpcycpfSBhcyB1bmlkYWRlc19hbmFsaXNpc1xyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBsaWtlQXIocmVzdWx0LnJvdy5mb3JtdWxhcmlvcykuZm9yRWFjaChmPT5jb21waWxhckV4cHJlc2lvbmVzKGYpKTtcclxuICAgICAgICAgICAgLy8gSGVybWFub3Mgc29uIGxvcyBmb3JtdWxhcmlvcyBxdWUgZXN0w6FuIGltcGxhbnRhZG9zIGVuIG90cm8gZm9ybXVsYXJpbyBkZSBsYSBtaXNtYSBVQS4gUG9yIGVqZW1wbG8gZWwgQTEgZW4gZWwgUzFcclxuICAgICAgICAgICAgdmFyIHJlc3VsdEhlcm1hbm9zID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG5zZWxlY3Qgby5pZF9jYXNpbGxlcm8gYXMgaWRfZm9ybXVsYXJpbywgby51bmlkYWRfYW5hbGlzaXMsICdCRl8nfHxvLmNhc2lsbGVybyBib3RvbiwgYmYuY2FzaWxsZXJvLCBiZi5wYWRyZSwgZnAuY2FzaWxsZXJvLCBmcC51bmlkYWRfYW5hbGlzaXNcclxuICBmcm9tIGNhc2lsbGVyb3MgbyBsZWZ0IGpvaW4gY2FzaWxsZXJvcyBiZlxyXG4gICAgb24gYmYudGlwb2M9J0JGJ1xyXG5cdGFuZCBiZi5jYXNpbGxlcm8gPSAnQkZfJ3x8by5jYXNpbGxlcm9cclxuXHRhbmQgYmYub3BlcmF0aXZvID0gby5vcGVyYXRpdm9cclxuXHRsZWZ0IGpvaW4gY2FzaWxsZXJvcyBmcFxyXG5cdCAgb24gZnAuaWRfY2FzaWxsZXJvID0gYmYucGFkcmVcclxuXHQgIGFuZCBmcC5vcGVyYXRpdm8gPSBiZi5vcGVyYXRpdm9cclxuICB3aGVyZSBvLnRpcG9jID0gJ0YnXHJcbiAgICBhbmQgby51bmlkYWRfYW5hbGlzaXMgPSBmcC51bmlkYWRfYW5hbGlzaXNcclxuXHRhbmQgby5vcGVyYXRpdm8gPSAkMWAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgcmVzdWx0SGVybWFub3Mucm93cy5mb3JFYWNoKHJvdz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJvdy5mb3JtdWxhcmlvc1tyb3cuaWRfZm9ybXVsYXJpb10uZGF0YS5oZXJtYW5vID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgZnVuY3Rpb24gY29tcGxldGFyVUEodWE6VW5pZGFkQW5hbGlzaXMsIGlkVWE6SWRVbmlkYWRBbmFsaXNpcywgdUFzOntbayBpbiBJZFVuaWRhZEFuYWxpc2lzXTogVW5pZGFkQW5hbGlzaXN9KXtcclxuICAgICAgICAgICAgICAgIGlmKHVhLnBhZHJlKXtcclxuICAgICAgICAgICAgICAgICAgICB1QXNbdWEucGFkcmVdLmhpamFzW2lkVWFdID0gdWE7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB1YS5wcmluY2lwYWw9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaWtlQXIocmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcykuZm9yRWFjaCgodWEsIGlkVWEpPT5cclxuICAgICAgICAgICAgICAgIGNvbXBsZXRhclVBKHVhLCBpZFVhIGFzIElkVW5pZGFkQW5hbGlzaXMsIHJlc3VsdC5yb3cudW5pZGFkZXNfYW5hbGlzaXMpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgdmFyIGNvbmZpZ1NvcnRlbyA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbyBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIG9wZXJhdGl2b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDFcclxuICAgICAgICAgICAgYCxbcGFyYW1ldGVycy5vcGVyYXRpdm9dKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlO1xyXG4gICAgICAgICAgICBsZXQgY29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zID0gKGV4cHJlc2lvbmVzRG9taW5pbzphbnkpPT4gXHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoZXhwcmVzaW9uZXNEb21pbmlvKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGV4cHIsZG9taW5pbyk9Pih7ZG9taW5pbywgZXhwcjpjb21waWxhckV4cHJlc2lvbihleHByLmV4cHIpfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBsYWluKCk7XHJcbiAgICAgICAgICAgIGlmKGNvbmZpZ1NvcnRlbyl7XHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoY29uZmlnU29ydGVvKS5mb3JFYWNoKChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZXhwcl9pbmNvbXBsZXRpdHVkX2pzPWNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmV4cHJfaW5jb21wbGV0aXR1ZClcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmZpbHRyb19qcz1jb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm8pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7dGltZXN0YW1wOiBiZS50aW1lc3RhbXBFc3RydWN0dXJhLCAuLi5yZXN1bHQucm93LCBvcGVyYXRpdm86cGFyYW1ldGVycy5vcGVyYXRpdm8sIGNvbmZpZ1NvcnRlbyxub1JlYXM6YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWEsIG5vUmVhc1N1cDpiZS5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9zdXB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidnZW5lcmFyX2Zvcm11bGFyaW9zJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J2FubmlvJywgdHlwZU5hbWU6J2ludGVnZXInLCByZWZlcmVuY2VzOidhbm5pbyd9LFxyXG4gICAgICAgICAgICB7bmFtZTonbWVzJyAgLCB0eXBlTmFtZTonaW50ZWdlcicsIHJlZmVyZW5jZXM6J21lcycgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidsb3RlJyAsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczonbG90ZXMnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRVQSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCAqXHJcbiAgICAgICAgICAgICAgICAgICBmcm9tIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICAgICAgICAgd2hlcmUgcHJpbmNpcGFsID0gdHJ1ZSBhbmQgb3BlcmF0aXZvID0gJDFcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPXVxyXG4gICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdFVBLnJvd0NvdW50ID09PSAwKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgY29uZmlndXLDsyB1bmEgdW5pZGFkIGRlIGFuYWxpc2lzIGNvbW8gcHJpbmNpcGFsJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJvdyA9IHJlc3VsdFVBLnJvdztcclxuICAgICAgICAgICAgbGV0IHJlc3VsdFByZWd1bnRhcyA9IGF3YWl0IGJlLnByb2NlZHVyZS5wcmVndW50YXNfdWFfdHJhZXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHJvdylcclxuICAgICAgICAgICAgdmFyIGNvbnRlbmVkb3JWYWNpbzp7W2tleTpzdHJpbmddOmFueX0gPSB7fTtcclxuICAgICAgICAgICAgcmVzdWx0UHJlZ3VudGFzLmZvckVhY2goZnVuY3Rpb24oZGVmUHJlZ3VudGEpe1xyXG4gICAgICAgICAgICAgICAgY29udGVuZWRvclZhY2lvW2RlZlByZWd1bnRhLnZhcl9uYW1lXSA9IGRlZlByZWd1bnRhLnVuaWRhZF9hbmFsaXNpcz9bXTpudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLmFubmlvPSBwYXJhbWV0ZXJzLmFubmlvO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubWVzICA9IHBhcmFtZXRlcnMubWVzICA7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5sb3RlID0gcGFyYW1ldGVycy5sb3RlIDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgZGViZV9oYWJlci5pZF9jYXNvLCBzIGFzIGlkXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGxvdGUsIGFybWFyX2lkKGFubmlvLCBtZXMsIGxvdGUsIHMpIGFzIGlkX2Nhc28sIHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGFubmlvLG1lcyxsb3RlLCBjYW50X2N1ZXMgZnJvbSBsb3RlcyB3aGVyZSAoYW5uaW8sbWVzLGxvdGUpPSgkMiwkMywkNCkpIHIsIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsY2FudF9jdWVzKSBzXHJcbiAgICAgICAgICAgICAgICAgICAgKSBkZWJlX2hhYmVyIGxlZnQgam9pbiBkZWZnZW4gaGF5IG9uIGhheS5pZF9jYXNvID0gZGViZV9oYWJlci5pZF9jYXNvIGFuZCBoYXkub3BlcmF0aXZvPSQxXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgaGF5LmlkX2Nhc28gaXMgbnVsbGAsXHJcbiAgICAgICAgICAgICAgICBbIE9QRVJBVElWTywgcGFyYW1ldGVycy5hbm5pbywgcGFyYW1ldGVycy5tZXMsIHBhcmFtZXRlcnMubG90ZV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge29wZXJhdGl2bzogT1BFUkFUSVZPfTtcclxuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGkgPCByZXN1bHQucm93Q291bnQ7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyLmNvcmVGdW5jdGlvbihcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2luZyhwYXJhbXMse2lkX2Nhc286cmVzdWx0LnJvd3NbaV0uaWRfY2FzbywgZGF0b3NfY2FzbzpjaGFuZ2luZyhjb250ZW5lZG9yVmFjaW8se2lkOnJlc3VsdC5yb3dzW2ldLmlkfSl9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7YWdyZWdhZGFzOnJlc3VsdC5yb3dDb3VudH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjondXBsb2FkX2ZpbGUnLFxyXG4gICAgICAgIHByb2dyZXNzOiB0cnVlLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTogJ2lkX2FkanVudG8nLCB0eXBlTmFtZTogJ2ludGVnZXInfSxcclxuICAgICAgICAgICAge25hbWU6ICdub21icmUnLCB0eXBlTmFtZTogJ3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZpbGVzOntjb3VudDoxfSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246ZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMsIGZpbGVzKXtcclxuICAgICAgICAgICAgbGV0IGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGxldCBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIGNvbnRleHQuaW5mb3JtUHJvZ3Jlc3Moe21lc3NhZ2U6YmUubWVzc2FnZXMuZmlsZVVwbG9hZGVkfSk7XHJcbiAgICAgICAgICAgIGxldCBmaWxlID0gZmlsZXNbMF1cclxuICAgICAgICAgICAgbGV0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlLnBhdGgpLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgbGV0IG9yaWdpbmFsRmlsZW5hbWUgPSBmaWxlLm9yaWdpbmFsRmlsZW5hbWUuc2xpY2UoMCwtKGV4dC5sZW5ndGgrMSkpO1xyXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWU9IHBhcmFtZXRlcnMubm9tYnJlIHx8IG9yaWdpbmFsRmlsZW5hbWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdQYXRoID0gJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJztcclxuICAgICAgICAgICAgdmFyIGNyZWF0ZVJlc3BvbnNlID0gZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2UoYWRqdW50b1Jvdyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMYSBzdWJpZGEgc2UgcmVhbGl6w7MgY29ycmVjdGFtZW50ZSAodXBkYXRlKScsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlOiBhZGp1bnRvUm93Lm5vbWJyZSxcclxuICAgICAgICAgICAgICAgICAgICBub21icmVfb3JpZ2luYWw6IGFkanVudG9Sb3cubm9tYnJlX29yaWdpbmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dDogYWRqdW50b1Jvdy5leHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmVjaGE6IGFkanVudG9Sb3cuZmVjaGEsXHJcbiAgICAgICAgICAgICAgICAgICAgaG9yYTogYWRqdW50b1Jvdy5ob3JhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX2FkanVudG86IGFkanVudG9Sb3cuaWRfYWRqdW50b1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBtb3ZlRmlsZSA9IGZ1bmN0aW9uIG1vdmVGaWxlKGZpbGUsIGlkX2FkanVudG8sIGV4dGVuc2lvbil7XHJcbiAgICAgICAgICAgICAgICBmcy5tb3ZlKGZpbGUucGF0aCwgbmV3UGF0aCArIGlkX2FkanVudG8gKyAnLicgKyBleHRlbnNpb24sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJzLmlkX2FkanVudG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNsaWVudC5xdWVyeShgdXBkYXRlIGFkanVudG9zIHNldCBub21icmU9ICQxLG5vbWJyZV9vcmlnaW5hbCA9ICQyLCBleHQgPSAkMywgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLCQ0Ojp0ZXh0LCcuJywkMzo6dGV4dCksIGZlY2hhID0gbm93KCksIGhvcmEgPSBkYXRlX3RydW5jKCdzZWNvbmRzJyxjdXJyZW50X3RpbWVzdGFtcC1jdXJyZW50X2RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkNCByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlbmFtZSwgb3JpZ2luYWxGaWxlbmFtZSwgZXh0LCBwYXJhbWV0ZXJzLmlkX2FkanVudG9dXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlc3VsdC5yb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXN1bHRhZG8pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLHJlc3VsdGFkby5pZF9hZGp1bnRvLHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYGluc2VydCBpbnRvIGFkanVudG9zIChub21icmUsIG5vbWJyZV9vcmlnaW5hbCwgZXh0LCBmZWNoYSwgaG9yYSkgdmFsdWVzICgkMSwkMiwkMyxub3coKSwgZGF0ZV90cnVuYygnc2Vjb25kcycsY3VycmVudF90aW1lc3RhbXAtY3VycmVudF9kYXRlKSkgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsZW5hbWUsIG9yaWdpbmFsRmlsZW5hbWUsIGV4dF1cclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLGlkX2FkanVudG86OnRleHQsJy4nLGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkMSByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzdWx0LnJvdy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlc3VsdC5yb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0YWRvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVGaWxlKGZpbGUscmVzdWx0YWRvLmlkX2FkanVudG8scmVzdWx0YWRvLmV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonY2Fzb19ndWFyZGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICwgdHlwZU5hbWU6J3RleHQnICAgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J2RhdG9zX2Nhc28nICAsIHR5cGVOYW1lOidqc29uYicgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBlc3BlY2lmaWNvIGVsIHRpcG8gZGUgbG9zIHBhcsOhbWV0cm9zXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczp7XHJcbiAgICAgICAgICAgIG9wZXJhdGl2bzpzdHJpbmcsIFxyXG4gICAgICAgICAgICBpZF9jYXNvOnN0cmluZyxcclxuICAgICAgICAgICAgZGF0b3NfY2FzbzpBbnlPYmplY3RcclxuICAgICAgICB9LG5ld0NsaWVudDpDbGllbnQpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PW5ld0NsaWVudCB8fCBjb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRhdG9zX2pzb249cGFyYW1ldGVycy5kYXRvc19jYXNvO1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgdGFibGVTdHJ1Y3R1cmVzX2FwcDpUYWJsZURlZmluaXRpb25zID0gYmUudGFibGVTdHJ1Y3R1cmVzO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBNQUlOX1RBQkxFTkFNRSk7XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bJ29wZXJhdGl2byddID0gcGFyYW1ldGVycy5vcGVyYXRpdm87XHJcbiAgICAgICAgICAgIC8vVE9ETyA6IHZpdmllbmRhIMOzIGVuYz8/P1xyXG4gICAgICAgICAgICBkYXRvc19qc29uWyd2aXZpZW5kYSddID0gcGFyYW1ldGVycy5pZF9jYXNvO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJfdWx0X3BrX2VuX2FyciggdWx0X3BrLCB1YV9hcnIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbl9wa19jb21wbGV0YT11YV9hcnI7IFxyXG4gICAgICAgICAgICAgICAgaWYgKHVhX2FyciAmJiB1YV9hcnIubGVuZ3RoPj0xKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25fcGtfY29tcGxldGE9IGNvbl9wa19jb21wbGV0YS5tYXAoKHVuYV91YSxpKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmFfdWFbdWx0X3BrXT1pKzEgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuYV91YTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25fcGtfY29tcGxldGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIHZhciBrZXkxIGluIGRhdG9zX2pzb24gKXtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRvX2tleTEgPSBkYXRvc19qc29uW2tleTFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCBkYXRvX2tleTEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvX2tleTEubGVuZ3RoID49IDEgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBrMSA9IHRhYmxlU3RydWN0dXJlc19hcHBba2V5MV0oY29udGV4dCkucHJpbWFyeUtleTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdWx0X3BrMSA9IHBrMVtwazEubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdG9zX2pzb25ba2V5MV0gPSBjb21wbGV0YXJfdWx0X3BrX2VuX2FyciggdWx0X3BrMSwgZGF0b3NfanNvbltrZXkxXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0b3NfanNvbltrZXkxXS5mb3JFYWNoKCh1bl9rZXkxLCBpMSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGtleTIgaW4gdW5fa2V5MSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB1bl9rZXkxW2tleTJdIGluc3RhbmNlb2YgQXJyYXkgJiYgdW5fa2V5MVtrZXkyXS5sZW5ndGggPj0gMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwazIgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleTJdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVsdF9wazIgPSBwazJbcGsyLmxlbmd0aC0xXTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXSA9IGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKCB1bHRfcGsyLCBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXS5mb3JFYWNoKHVuX2tleTI9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModW5fa2V5MikuZmlsdGVyKCBwMj0+cDIuc3RhcnRzV2l0aCgnJCcpKS5mb3JFYWNoKHBwMj0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5fa2V5MltwcDJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkyLnN0YXJ0c1dpdGgoJyQnKXx8a2V5Mi5zdGFydHNXaXRoKCdfJykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uW2tleTFdW2kxXVtrZXkyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGtleTEuc3RhcnRzV2l0aCgnJCcpKXtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbltrZXkxXTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYTtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG87XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYVN1cDtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG9TdXA7XHJcblxyXG4gICAgICAgICAgICBpZiggT2JqZWN0LmtleXMoZGF0b3NfanNvbikubGVuZ3RoID4yKXtcclxuICAgICAgICAgICAgICAgIHZhciBxdWVyaWVzID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsV3JpdGUoZGF0b3NfanNvbiwgc3RydWN0X2RtZW5jdSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24ocHJvbWlzZSwgcXVlcnkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQucXVlcnkocXVlcnkpLmV4ZWN1dGUoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFByb21pc2UucmVzb2x2ZSgpKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwib2tcIjtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycjpFcnJvcil7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjYXNvX2d1YXJkYXIgRU5UUkEgRU4gRUwgQ0FUQ0g6IFwiLGVycilcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd2YWNpbyc7XHJcbiAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjYXNvX3RyYWVyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIC8ve25hbWU6J2Zvcm11bGFyaW8nICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIGRlZmluZWRJbjogJ2RtZW5jdScsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgIHZhciBzdHJ1Y3RfZG1lbmN1ID0gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIE1BSU5fVEFCTEVOQU1FKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoe29wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtZXRlcnMuaWRfY2Fzb30sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgdml2aWVuZGE6IHBhcmFtZXRlcnMuaWRfY2FzbyxcclxuICAgICAgICAgICAgICAgIGRhdG9zX2Nhc286IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC8vZm9ybXVsYXJpbzogZm9ybVByaW5jaXBhbCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcl9vX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19wcmVwYXJhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19ndWFyZGFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIGNoYW5naW5nKHBhcmFtZXRlcnMsIHtkYXRvc19jYXNvOmpzb259KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qIEdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIEZST00gJHtNQUlOX1RBQkxFTkFNRX0gTElNSVQgMWApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdE1haW4ucm93Q291bnQ+MCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSEFZIERBVE9TJyxyZXN1bHRNYWluLnJvd3MpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hBWSBEQVRPUy4gTk8gU0UgUFVFREUgSU5JQ0lBUiBFTCBQQVNBSkUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0SnNvbiA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYFNFTEVDVCBvcGVyYXRpdm8sIGVuYyBpZF9jYXNvLCBqc29uX2VuY3Vlc3RhIGRhdG9zX2Nhc28gZnJvbSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgV0hFUkUgb3BlcmF0aXZvPSQxIGFuZCByZXN1bWVuX2VzdGFkbyBpcyBkaXN0aW5jdCBmcm9tICd2YWNpbycgYW5kIGpzb25fZW5jdWVzdGEgaXMgbm90IG51bGwgXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgZW5jIGAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPXVxyXG4gICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuICAgICAgICAgICAgaWYocHJvY2VkdXJlR3VhcmRhci5kZWZpbmVkSW4hPSdkbWVuY3UnKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGF5IHF1ZSBzb2JyZWVzY3JpYmlyIGNhc29fZ3VhcmRhcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRKc29uLnJvd3MubWFwKGFzeW5jIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGNhc28gJHtyb3cuaWRfY2Fzb306IGA7XHJcbiAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbihjbGllbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3csIGNsaWVudCk7ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwianNvbjJ1YSBlcnJvci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvID0gZXJyTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9ICAgICBcclxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdGFkby5pbmNsdWRlcygnb2snKSl7IFxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB7ZGF0b3NfY2Fzbywgdml2aWVuZGEsIG9wZXJhdGl2b30gPSBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb190cmFlci5jb3JlRnVuY3Rpb24oY29udGV4dCwge29wZXJhdGl2bzpyb3cub3BlcmF0aXZvLCBpZF9jYXNvOnJvdy5pZF9jYXNvfSlcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmVyUXVlR3JhYm8gPSB7ZGF0b3NfY2Fzbywgdml2aWVuZGEsIG9wZXJhdGl2b31cclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyZXBhbmNlcy5zaG93QW5kVGhyb3codmVyUXVlR3JhYm8scm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2ZXJRdWVHcmFibyxyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkbztcclxuICAgICAgICAgICAgfSkpLmNhdGNoKGZ1bmN0aW9uKGVycil7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2ZvcnBrcmFpel9jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3ZpdmllbmRhJyAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6XCJ0YXJlYXNcIn0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2byx2aXZpZW5kYSwgdGFyZWF9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgdmFyIG1haW5fZm9ybSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCB0YXJlYT0kMmBcclxuICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIHRhcmVhXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2PSBgIHQub3BlcmF0aXZvPSAkMSBhbmQgdC5lbmMgPSQyYDtcclxuICAgICAgICAgICAgdmFyIHNvbG9MZWN0dXJhID0gISEoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gam9pbiBlc3RhZG9zIHVzaW5nIChvcGVyYXRpdm8sIGVzdGFkbykgLS1wayBlc3RhZG8gdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCAoY2FyZ2Fkb19kbSBpcyBub3QgbnVsbCBvciBub3QgcGVybWl0ZV9lZGl0YXJfZW5jdWVzdGEpYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgdml2aWVuZGFdXHJcbiAgICAgICAgICAgICkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3dDb3VudDtcclxuICAgICAgICAgICAgdmFyIHtyb3d9ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoZ2V0SGRyUXVlcnkoY29uZHZpdiksW29wZXJhdGl2byx2aXZpZW5kYV0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJvdy5pbmZvcm1hY2lvbkhkclt2aXZpZW5kYV0udGFyZWE9e1xyXG4gICAgICAgICAgICAgICAgdGFyZWEsXHJcbiAgICAgICAgICAgICAgICBtYWluX2Zvcm1cclxuICAgICAgICAgICAgfSA7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5yb3csXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBzb2xvTGVjdHVyYSxcclxuICAgICAgICAgICAgICAgIGlkUGVyOmNvbnRleHQudXNlci5pZHBlcixcclxuICAgICAgICAgICAgICAgIGNhcmdhczpsaWtlQXIuY3JlYXRlSW5kZXgocm93LmNhcmdhcy5tYXAoY2FyZ2E9Pih7Li4uY2FyZ2EsIGZlY2hhOmNhcmdhLmZlY2hhP2RhdGUuaXNvKGNhcmdhLmZlY2hhKS50b0RteSgpOm51bGx9KSksICdjYXJnYScpLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wRXN0cnVjdHVyYTpiZS50aW1lc3RhbXBFc3RydWN0dXJhXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2ZvcnBrcmFpel9kZXNjYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3BlcnNpc3RlbnRlcycgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtvcGVyYXRpdm8sIHBlcnNpc3RlbnRlc30gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgb3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwobGlrZUFyKHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzW1VBX1BSSU5DSVBBTF0pLm1hcChhc3luYyAocmVzcHVlc3Rhc1VBUHJpbmNpcGFsLGlkRW5jKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYocmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnMxYTFfb2JzID09ICchcHJ1ZWJhIGRlIGVycm9yIGFsIGdyYWJhciEnKXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RJTyBQUlVFQkEgREUgRVJST1IgQUwgR1JBQkFSJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIge3BhcmFtcywgc2V0dGVyc30gPSBhd2FpdCBnZXRQYXJhbWV0ZXJzQW5kU2V0dGVyc0ZvclVwZGF0ZVRlbShjb250ZXh0LCBvcGVyYXRpdm8sIGlkRW5jLCByZXNwdWVzdGFzVUFQcmluY2lwYWwsIHBlcnNpc3RlbnRlcy5pbmZvcm1hY2lvbkhkcltpZEVuY10udGFyZWEudGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7c2V0dGVyc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1xyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgLy9ndWFyZGFyIHBhcmFsZWxhbWVudGUgZW4gdGFibGFzIHVhXHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvY2VkdXJlR3VhcmRhciA9IGJlLnByb2NlZHVyZS5jYXNvX2d1YXJkYXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJhbV9ndWFyZGFyPXtvcGVyYXRpdm86IG9wZXJhdGl2byxpZF9jYXNvOmlkRW5jLCBkYXRvc19jYXNvOnJlc3B1ZXN0YXNVQVByaW5jaXBhbH1cclxuICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIGZ1bmN0aW9uKGNsaWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbys9IGF3YWl0IHByb2NlZHVyZUd1YXJkYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtX2d1YXJkYXIsIGNsaWVudCk7ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJkbV9mb3Jwa3JhaXpfZGVzY2FyZ2FyLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgcGFzZV90YWJsYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7ICAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgfSkuYXJyYXkoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX3NpbmNyb25pemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3BlcnNpc3RlbnRlcycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBjb25zdCBFU1RBRE9fUE9TVEVSSU9SX0NBUkdBID0gJ0MnO1xyXG4gICAgICAgICAgICBjb25zdCBFU1RBRE9fUE9TVEVSSU9SX0RFU0NBUkdBID0gJ0QnO1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtwZXJzaXN0ZW50ZXN9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgdmFyIG51bV9zaW5jcm86bnVtYmVyPTA7XHJcbiAgICAgICAgICAgIHZhciB0b2tlbjpzdHJpbmd8bnVsbD1wZXJzaXN0ZW50ZXM/LnRva2VuO1xyXG4gICAgICAgICAgICBpZighdG9rZW4pe1xyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSAoYXdhaXQgYmUucHJvY2VkdXJlLnRva2VuX2dldC5jb3JlRnVuY3Rpb24oY29udGV4dCwge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJhZ2VudDogY29udGV4dC5zZXNzaW9uLnJlcS51c2VyYWdlbnQsIFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiBjb250ZXh0LnVzZXJuYW1lXHJcbiAgICAgICAgICAgICAgICB9KSkudG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHt2YWx1ZX0gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyBzaW5jcm9uaXphY2lvbmVzICh0b2tlbiwgdXN1YXJpbywgZGF0b3MpXHJcbiAgICAgICAgICAgICAgICAgICAgVkFMVUVTICgkMSwkMiwkMykgXHJcbiAgICAgICAgICAgICAgICAgICAgUkVUVVJOSU5HIHNpbmNyb1xyXG4gICAgICAgICAgICAgICAgYCwgW3Rva2VuLCBjb250ZXh0LnVzZXJuYW1lLCBwZXJzaXN0ZW50ZXNdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICBudW1fc2luY3JvPXZhbHVlO1xyXG4gICAgICAgICAgICB2YXIgY29uZHZpdj0gYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dC5vcGVyYXRpdm89ICQxIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgYXNpZ25hZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgdHQub3BlcmFjaW9uPSdjYXJnYXInIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgKHR0LmNhcmdhZG9fZG0gaXMgbnVsbCBvciB0dC5jYXJnYWRvX2RtID0gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbCh0b2tlbil9KVxyXG4gICAgICAgICAgICBgXHJcbiAgICAgICAgICAgIGNvbnN0IFVBX1BSSU5DSVBBTCA9IGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBPUEVSQVRJVk8pO1xyXG4gICAgICAgICAgICBpZihwZXJzaXN0ZW50ZXMpe1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwobGlrZUFyKHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzW1VBX1BSSU5DSVBBTF0pLm1hcChhc3luYyAocmVzcHVlc3Rhc1VBUHJpbmNpcGFsLCBpZEVuYyk9PntcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZWEgPSBwZXJzaXN0ZW50ZXMuaW5mb3JtYWNpb25IZHJbaWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwdWVkb0d1YXJkYXJFblRFTT10cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyBHRU5FUkFMSVpBUiBFTCBIT1JST1IgRVNURVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXJzPWBgO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBbT1BFUkFUSVZPLCBpZEVuYywgdGFyZWEsIHRva2VuXTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0YXJlYT09J3N1cGUnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVycys9IGAsIHJlc3VtZW5fZXN0YWRvX3N1cD0kNSwgbm9yZWFfc3VwPSQ2LCByZWFfc3VwPSQ3YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuY29uY2F0KFtyZXNwdWVzdGFzVUFQcmluY2lwYWwucmVzdW1lbkVzdGFkb1N1cCwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZE5vUmVhU3VwLCByZXNwdWVzdGFzVUFQcmluY2lwYWwuY29kUmVhU3VwXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnMrPSBgLCByZXN1bWVuX2VzdGFkbz0kNSwgbm9yZWE9JDYsIHJlYT0kN2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnJlc3VtZW5Fc3RhZG8sIHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5jb2ROb1JlYSwgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLmNvZFJlYV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlUYXJlYXNUZW0gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChFU1RBRE9fUE9TVEVSSU9SX0RFU0NBUkdBKX0sIGNhcmdhZG9fZG09bnVsbCAke3NldHRlcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkMyBhbmQgY2FyZ2Fkb19kbSA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNcclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBwdWVkb0d1YXJkYXJFblRFTT1xdWVyeVRhcmVhc1RlbS5yb3dDb3VudD09MTtcclxuICAgICAgICAgICAgICAgICAgICBpZihwdWVkb0d1YXJkYXJFblRFTSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB7cGFyYW1zLCBzZXR0ZXJzfSA9IGF3YWl0IGdldFBhcmFtZXRlcnNBbmRTZXR0ZXJzRm9yVXBkYXRlVGVtKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7c2V0dGVyc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ3VhcmRhciBwYXJhbGVsYW1lbnRlIGVuIHRhYmxhcyB1YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvY2VkdXJlR3VhcmRhciA9IGJlLnByb2NlZHVyZS5jYXNvX2d1YXJkYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgZW5jICR7aWRFbmN9OiBgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1fZ3VhcmRhcj17b3BlcmF0aXZvOiBPUEVSQVRJVk8saWRfY2FzbzppZEVuYywgZGF0b3NfY2FzbzpyZXNwdWVzdGFzVUFQcmluY2lwYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbihjbGllbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbys9IGF3YWl0IHByb2NlZHVyZUd1YXJkYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtX2d1YXJkYXIsIGNsaWVudCk7ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJkbV9mb3Jwa3JhaXpfZGVzY2FyZ2FyLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgcGFzZV90YWJsYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW09QRVJBVElWTywgaWRFbmMsIHJlc3VsdGFkb11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5hcHBlbmRGaWxlKCdsb2NhbC1yZWNpYmlkby1zaW4tdG9rZW4udHh0JywgSlNPTi5zdHJpbmdpZnkoe25vdzpuZXcgRGF0ZSgpLHVzZXI6Y29udGV4dC51c2VybmFtZSxpZENhc286IGlkRW5jLHZpdmllbmRhOiByZXNwdWVzdGFzVUFQcmluY2lwYWx9KSsnXFxuXFxuJywgJ3V0ZjgnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSkuYXJyYXkoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJjb25kdml2OiBcIiwgY29uZHZpdik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicXVlcnk6IFwiLCBnZXRIZHJRdWVyeShjb25kdml2KSk7XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYpLFtPUEVSQVRJVk8sY29udGV4dC51c2VyLmlkcGVyXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCcsZ2V0SGRyUXVlcnkoY29uZHZpdikpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbSB0dFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCAgZXN0YWRvID0gJDQsIGNhcmdhZG9fZG09JDM6OnRleHRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSAke2NvbmR2aXZ9IFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBlbmNgXHJcbiAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPLCBwYXJhbWV0ZXJzLmVuYz9wYXJhbWV0ZXJzLmVuYzpjb250ZXh0LnVzZXIuaWRwZXIsIHRva2VuLCBFU1RBRE9fUE9TVEVSSU9SX0NBUkdBXVxyXG4gICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5yb3csXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IE9QRVJBVElWTywgXHJcbiAgICAgICAgICAgICAgICBzb2xvTGVjdHVyYTpmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRva2VuLFxyXG4gICAgICAgICAgICAgICAgbnVtX3NpbmNybyxcclxuICAgICAgICAgICAgICAgIGlkcGVyOmNvbnRleHQudXNlci5pZHBlcixcclxuICAgICAgICAgICAgICAgIGNhcmdhczpsaWtlQXIuY3JlYXRlSW5kZXgocm93LmNhcmdhcy5tYXAoY2FyZ2E9Pih7Li4uY2FyZ2EsIGZlY2hhOmNhcmdhLmZlY2hhP2RhdGUuaXNvKGNhcmdhLmZlY2hhKS50b0RteSgpOm51bGwsIGVzdGFkb19jYXJnYToncmVsZXZhbWllbnRvJ30pKSwgJ2NhcmdhJylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fYmFja3VwJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3Rva2VuJyAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RlbScgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciB7YmUsIGNsaWVudH0gPWNvbnRleHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IE9QRVJBVElWTyA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgdmFyIG51bV9zaW5jcm86bnVtYmVyPTA7XHJcbiAgICAgICAgICAgIHZhciB0b2tlbjpzdHJpbmd8bnVsbD1wYXJhbWV0ZXJzLnRva2VuO1xyXG4gICAgICAgICAgICBpZih0b2tlbiA9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7b2s6J29rOk4vVCd9O1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHZhciB7cm93Q291bnR9ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KGBzZWxlY3QgMSBmcm9tIHRva2VucyB3aGVyZSB0b2tlbiA9ICQxYCxbdG9rZW5dKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICBpZighcm93Q291bnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7b2s6J29rOk4vVCd9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHBhcmFtZXRlcnMudGVtKXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGxpa2VBcihwYXJhbWV0ZXJzLnRlbSkubWFwKGFzeW5jIChiYWNrdXA6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGpzb25fYmFja3VwID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCBqc29uX2JhY2t1cCBpcyBkaXN0aW5jdCBmcm9tICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbT1BFUkFUSVZPLCBiYWNrdXAuZm9yUGtSYWl6LnZpdmllbmRhLCBiYWNrdXAucmVzcHVlc3Rhc1JhaXosIGJhY2t1cC5yZXNwdWVzdGFzUmFpel1cclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBvazonb2snXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjb25zaXN0aXJfdml2aWVuZGEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICxyZWZlcmVuY2VzOidvcGVyYXRpdm9zJywgIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid2aXZpZW5kYScgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciB7YmUsIGNsaWVudH0gPWNvbnRleHQ7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbV9wcm9jPXtcclxuICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBpZF9jYXNvOiBwYXJhbWV0ZXJzLnZpdmllbmRhXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdGFkbzogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdGFkbz0gYXdhaXQgYmUucHJvY2VkdXJlLmNvbnNpc3Rpcl9lbmN1ZXN0YS5jb3JlRnVuY3Rpb24oY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3Byb2MsIGNsaWVudFxyXG4gICAgICAgICAgICAgICAgKTsgICAgXHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IFwiIGNvbnNpc3Rpcl92aXZpZW5kYS4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnKioqKioqIGNvbnNpc3Rpcl92aXZpZW5kYSByZXN1bHRhZG86JyxyZXN1bHRhZG8pICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBvazonb2snXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZG1fcmVzY2F0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonbG9jYWxTdG9yYWdlSXRlbScgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2xvY2FsU3RvcmFnZUl0ZW1LZXknICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2xvY2FsU3RvcmFnZUl0ZW1LZXksIGxvY2FsU3RvcmFnZUl0ZW19ID0gcGFyYW1zO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb2NhbFN0b3JhZ2VJdGVtKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZzLmFwcGVuZEZpbGUoJ2xvY2FsLXJlc2NhdGUudHh0JywgSlNPTi5zdHJpbmdpZnkoe25vdzpuZXcgRGF0ZSgpLHVzZXI6Y29udGV4dC51c2VybmFtZSwgaXRlbUtleTogbG9jYWxTdG9yYWdlSXRlbUtleSwgaXRlbURhdGE6IGxvY2FsU3RvcmFnZUl0ZW19KSsnXFxuXFxuJywgJ3V0ZjgnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnb3BlcmF0aXZvX2dldCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXSxcclxuICAgICAgICB1bmxvZ2dlZDp0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdnZXRfcmFuZG9tX2ZyZWVfY2FzZScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbe25hbWU6J29wZXJhdGl2bycgICAgLCB0eXBlTmFtZTondGV4dCd9XSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbnNUb0V4cGlyZSA9IDMwO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5zU2luY2VCbG9xdWVkID0gYGRhdGVfcGFydCgnbWluJywgYWdlKGN1cnJlbnRfdGltZXN0YW1wLCBmZWNoYV9ibG9xdWVvKSlgO1xyXG4gICAgICAgICAgICBjb25zdCBlbmMgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0IGVuYyBmcm9tIHRlbSB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIChsaWJyZSBvciAke21pbnNTaW5jZUJsb3F1ZWR9ID4gJHttaW5zVG9FeHBpcmV9KSBsaW1pdCAxO2AsW3BhcmFtcy5vcGVyYXRpdm9dKS5mZXRjaFVuaXF1ZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBVUERBVEUgdGVtIHNldCBsaWJyZSA9IGZhbHNlLCBmZWNoYV9ibG9xdWVvPWN1cnJlbnRfdGltZXN0YW1wIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyYCxbcGFyYW1zLm9wZXJhdGl2bywgZW5jLnZhbHVlXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZW5jLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWNjaW9uX3RhcmVhc190ZW1fZWplY3V0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonY29uZGljaW9uJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidhY2Npb24nICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9ICBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgYWNjaW9uID0gcGFyYW1zLmFjY2lvbiBhcyBFc3RhZG9BY2Npb247XHJcbiAgICAgICAgICAgIGNvbnN0IEFOQUxJWkFSX0NPTkRJQ0lPTiA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKEFOQUxJWkFSX0NPTkRJQ0lPTil7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VtcGxlOmJvb2xlYW4gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBhY2Npb25fY3VtcGxlX2NvbmRpY2lvbigkNSwgJDYsICQ3LCAkOCwgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY29uZGljaW9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXN0YWRvc19hY2Npb25lcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZXN0YWRvID0gJDIgYW5kIGVhY2Npb24gPSAkMyBhbmQgZXN0YWRvX2Rlc3Rpbm8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClgLCBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbywgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVhY2Npb24sIFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlubyxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvLCBcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZW5jLCBcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbixcclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmKCFjdW1wbGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBObyBzZSBwdWRvIGVqZWN1dGFyIGxhIGFjY2nDs24sIG5vIHNlIGN1bXBsZSBsYSBjb25kaWNpw7NuIFwiJHtwYXJhbXMuY29uZGljaW9ufVwiIG8gYmllbiBlbCBlc3RhZG8gZXN0w6EgZGVzYWN0dWFsaXphZG8sIHJlZnJlc3F1ZSBsYSBncmlsbGEuYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgZW5jPSQyIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGFyZWEgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZW5jLCBcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsIFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlub1xyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGlmKGFjY2lvbi5ub21icmVfcHJvY2VkdXJlKXtcclxuICAgICAgICAgICAgICAgIGlmKGJlLnByb2NlZHVyZVthY2Npb24ubm9tYnJlX3Byb2NlZHVyZV0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVthY2Npb24ubm9tYnJlX3Byb2NlZHVyZV0uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcylcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBObyBleGlzdGUgZWwgcHJvY2VkdXJlIFwiJHthY2Npb24ubm9tYnJlX3Byb2NlZHVyZX1cIiBkZWZpbmlkbyBlbiBsYSB0YWJsYSBcImVzdGFkb3NfYWNjaW9uZXNcIiBwYXJhIGVsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvOiAke2FjY2lvbi5vcGVyYXRpdm99LCBlc3RhZG86ICR7YWNjaW9uLmVzdGFkb30sIGVhY2Npb246ICR7YWNjaW9uLmVhY2Npb259LmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3c7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGlzcG9uaWJpbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBhc2lnbmFkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rlc2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICdjYXJnYXInXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9hbmFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtvcGVyYXRpdm86cGFyYW1zLm9wZXJhdGl2bywgaWRfY2FzbzpwYXJhbXMuZW5jfSlcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV92ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gJzEnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub192ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZHB0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgLy9UT0RPIGFjw6EgaGF5IHF1ZSBwcmVwYXJhciBsYSBzaWd1aWVudGUgdGFyZWFcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9oYWJpbGl0YXJfZGVzaGFiaWxpdGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgaGFiaWxpdGFkYSA9IG5vdCBoYWJpbGl0YWRhXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgICBcclxuXTtcclxuIl19
|