dmencu 3.2.21 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +42 -42
  2. package/dist/client/client/client.js +3 -3
  3. package/dist/client/unlogged/abrir-formulario.js +1 -1
  4. package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
  5. package/dist/client/unlogged/bypass-formulario.js +84 -219
  6. package/dist/client/unlogged/calculos-encuesta.js +112 -38
  7. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  8. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  9. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  10. package/dist/client/unlogged/helpers-formulario.js +88 -0
  11. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  12. package/dist/client/unlogged/redux-formulario.js +21 -31
  13. package/dist/client/unlogged/render-formulario.d.ts +2 -6
  14. package/dist/client/unlogged/render-formulario.js +29 -68
  15. package/dist/client/unlogged/render-formulario.tsx +29 -57
  16. package/dist/client/unlogged/render-general.js +1 -1
  17. package/dist/client/unlogged/render-general.tsx +1 -1
  18. package/dist/client/unlogged/tipos.d.ts +74 -40
  19. package/dist/client/unlogged/tipos.js +1 -1
  20. package/dist/server/app-dmencu.d.ts +1428 -0
  21. package/dist/server/app-dmencu.js +1054 -0
  22. package/dist/server/def-config.d.ts +1 -0
  23. package/dist/server/def-config.js +123 -0
  24. package/dist/server/procedures-dmencu.d.ts +43 -0
  25. package/dist/server/procedures-dmencu.js +2295 -0
  26. package/dist/server/server/app-dmencu.d.ts +42 -91
  27. package/dist/server/server/app-dmencu.js +114 -52
  28. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  29. package/dist/server/server/procedures-dmencu.js +77 -51
  30. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  31. package/dist/server/server/setters-rea-no-rea.js +35 -0
  32. package/dist/server/server/table-areas.js +4 -4
  33. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  34. package/dist/server/server/table-control_campo.js +4 -4
  35. package/dist/server/server/table-no_rea.js +4 -2
  36. package/dist/server/server/table-no_rea_sup.js +7 -3
  37. package/dist/server/server/table-personal.js +1 -1
  38. package/dist/server/server/table-tareas_tem.js +2 -2
  39. package/dist/server/server/table-tem.js +2 -2
  40. package/dist/server/server/types-dmencu.d.ts +34 -2
  41. package/dist/server/server/types-dmencu.js +2 -1
  42. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  43. package/dist/server/setters-rea-no-rea.js +35 -0
  44. package/dist/server/table-acciones.d.ts +2 -0
  45. package/dist/server/table-acciones.js +45 -0
  46. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  47. package/dist/server/table-area_enc_proximas.js +30 -0
  48. package/dist/server/table-areas.d.ts +4 -0
  49. package/dist/server/table-areas.js +112 -0
  50. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  51. package/dist/server/table-areas_asignacion_general.js +86 -0
  52. package/dist/server/table-barrios.d.ts +2 -0
  53. package/dist/server/table-barrios.js +35 -0
  54. package/dist/server/table-comunas.d.ts +2 -0
  55. package/dist/server/table-comunas.js +33 -0
  56. package/dist/server/table-control_campo.d.ts +12 -0
  57. package/dist/server/table-control_campo.js +119 -0
  58. package/dist/server/table-control_dias_carga.d.ts +2 -0
  59. package/dist/server/table-control_dias_carga.js +63 -0
  60. package/dist/server/table-control_resumen.d.ts +2 -0
  61. package/dist/server/table-control_resumen.js +19 -0
  62. package/dist/server/table-diccionario.d.ts +2 -0
  63. package/dist/server/table-diccionario.js +32 -0
  64. package/dist/server/table-dictra.d.ts +2 -0
  65. package/dist/server/table-dictra.js +46 -0
  66. package/dist/server/table-dicvar.d.ts +2 -0
  67. package/dist/server/table-dicvar.js +32 -0
  68. package/dist/server/table-encuestadores.d.ts +13 -0
  69. package/dist/server/table-encuestadores.js +75 -0
  70. package/dist/server/table-estados.d.ts +2 -0
  71. package/dist/server/table-estados.js +47 -0
  72. package/dist/server/table-estados_acciones.d.ts +2 -0
  73. package/dist/server/table-estados_acciones.js +40 -0
  74. package/dist/server/table-fracciones.d.ts +2 -0
  75. package/dist/server/table-fracciones.js +37 -0
  76. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  77. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  78. package/dist/server/table-historial_tem.d.ts +2 -0
  79. package/dist/server/table-historial_tem.js +57 -0
  80. package/dist/server/table-hogares.d.ts +2 -0
  81. package/dist/server/table-hogares.js +156 -0
  82. package/dist/server/table-hogares_sup.d.ts +2 -0
  83. package/dist/server/table-hogares_sup.js +191 -0
  84. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  85. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  86. package/dist/server/table-manzanas.d.ts +2 -0
  87. package/dist/server/table-manzanas.js +36 -0
  88. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  89. package/dist/server/table-mis_encuestadores.js +77 -0
  90. package/dist/server/table-mis_tareas.d.ts +2 -0
  91. package/dist/server/table-mis_tareas.js +18 -0
  92. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  93. package/dist/server/table-mis_tareas_areas.js +20 -0
  94. package/dist/server/table-modos_dm.d.ts +2 -0
  95. package/dist/server/table-modos_dm.js +28 -0
  96. package/dist/server/table-no_rea.js +38 -0
  97. package/dist/server/table-no_rea_sup.js +36 -0
  98. package/dist/server/table-operaciones.d.ts +2 -0
  99. package/dist/server/table-operaciones.js +30 -0
  100. package/dist/server/table-parametros.d.ts +2 -0
  101. package/dist/server/table-parametros.js +40 -0
  102. package/dist/server/table-permisos.d.ts +2 -0
  103. package/dist/server/table-permisos.js +31 -0
  104. package/dist/server/table-personal.d.ts +5 -0
  105. package/dist/server/table-personal.js +62 -0
  106. package/dist/server/table-personal_rol.d.ts +2 -0
  107. package/dist/server/table-personal_rol.js +42 -0
  108. package/dist/server/table-personas.d.ts +2 -0
  109. package/dist/server/table-personas.js +448 -0
  110. package/dist/server/table-personas_sup.d.ts +2 -0
  111. package/dist/server/table-personas_sup.js +93 -0
  112. package/dist/server/table-radios.d.ts +2 -0
  113. package/dist/server/table-radios.js +37 -0
  114. package/dist/server/table-rea.d.ts +2 -0
  115. package/dist/server/table-rea.js +38 -0
  116. package/dist/server/table-rea_sup.d.ts +2 -0
  117. package/dist/server/table-rea_sup.js +38 -0
  118. package/dist/server/table-recepcionistas.d.ts +2 -0
  119. package/dist/server/table-recepcionistas.js +18 -0
  120. package/dist/server/table-recuperadores.d.ts +2 -0
  121. package/dist/server/table-recuperadores.js +18 -0
  122. package/dist/server/table-roles.d.ts +2 -0
  123. package/dist/server/table-roles.js +33 -0
  124. package/dist/server/table-roles_permisos.d.ts +2 -0
  125. package/dist/server/table-roles_permisos.js +36 -0
  126. package/dist/server/table-roles_subordinados.d.ts +2 -0
  127. package/dist/server/table-roles_subordinados.js +31 -0
  128. package/dist/server/table-semanas.d.ts +2 -0
  129. package/dist/server/table-semanas.js +42 -0
  130. package/dist/server/table-sincronizaciones.d.ts +2 -0
  131. package/dist/server/table-sincronizaciones.js +30 -0
  132. package/dist/server/table-supervisores.d.ts +2 -0
  133. package/dist/server/table-supervisores.js +18 -0
  134. package/dist/server/table-tareas.d.ts +2 -0
  135. package/dist/server/table-tareas.js +48 -0
  136. package/dist/server/table-tareas_areas.d.ts +7 -0
  137. package/dist/server/table-tareas_areas.js +112 -0
  138. package/dist/server/table-tareas_proximas.d.ts +2 -0
  139. package/dist/server/table-tareas_proximas.js +48 -0
  140. package/dist/server/table-tareas_tem.d.ts +14 -0
  141. package/dist/server/table-tareas_tem.js +206 -0
  142. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  143. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  144. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  145. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  146. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  147. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  148. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  149. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  150. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  151. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  152. package/dist/server/table-tem.d.ts +3 -0
  153. package/dist/server/table-tem.js +247 -0
  154. package/dist/server/table-tem_asignacion.d.ts +2 -0
  155. package/dist/server/table-tem_asignacion.js +50 -0
  156. package/dist/server/table-tem_borradas.d.ts +2 -0
  157. package/dist/server/table-tem_borradas.js +35 -0
  158. package/dist/server/table-usuarios.d.ts +2 -0
  159. package/dist/server/table-usuarios.js +63 -0
  160. package/dist/server/table-visitas.d.ts +2 -0
  161. package/dist/server/table-visitas.js +91 -0
  162. package/dist/server/table-visitas_sup.d.ts +2 -0
  163. package/dist/server/table-visitas_sup.js +91 -0
  164. package/dist/server/table-viviendas.d.ts +2 -0
  165. package/dist/server/table-viviendas.js +299 -0
  166. package/dist/server/types-dmencu.d.ts +95 -0
  167. package/dist/server/types-dmencu.js +34 -0
  168. package/dist/server/unlogged/tipos.d.ts +74 -40
  169. package/dist/server/unlogged/tipos.js +1 -1
  170. package/dist/test/app-para-tests.d.ts +1115 -0
  171. package/dist/test/app-para-tests.js +95 -0
  172. package/dist/test/test-caches-rea.d.ts +1 -0
  173. package/dist/test/test-caches-rea.js +243 -0
  174. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  175. package/dist/test/test-helpers-casilleros.js +154 -0
  176. package/dist/test/test-helpers-formulario.d.ts +1 -0
  177. package/dist/test/test-helpers-formulario.js +95 -0
  178. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  179. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  180. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  181. package/dist/test/test-menu-segun-rol.js +170 -0
  182. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  183. package/dist/test/test-setters-rea-no-rea.js +95 -0
  184. package/dist/test/test.d.ts +6 -0
  185. package/dist/test/test.js +8 -2
  186. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  187. package/dist/unlogged/helpers-casilleros.js +12 -18
  188. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  189. package/dist/unlogged/helpers-formulario.js +88 -0
  190. package/dist/unlogged/tipos.d.ts +1 -1
  191. package/dist/unlogged/tipos.js +1 -1
  192. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  193. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  194. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  195. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  196. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  197. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  198. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  199. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  200. package/dist/unlogged/unlogged/render-formulario.d.ts +2 -6
  201. package/dist/unlogged/unlogged/render-formulario.js +29 -68
  202. package/dist/unlogged/unlogged/render-formulario.tsx +29 -57
  203. package/dist/unlogged/unlogged/render-general.js +1 -1
  204. package/dist/unlogged/unlogged/render-general.tsx +1 -1
  205. package/dist/unlogged/unlogged/tipos.d.ts +74 -40
  206. package/dist/unlogged/unlogged/tipos.js +1 -1
  207. package/dist/unlogged/unlogged/unlogged.js +2 -2
  208. package/install/accion_cumple_condicion.sql +1 -1
  209. package/install/generador_accion_cumple_condicion.sql +2 -2
  210. package/install/tarea_cumple_condicion.sql +1 -1
  211. package/install/xcalcular_resultado_trg.sql +1 -1
  212. package/package.json +20 -17
  213. package/dist/server/server/table-no_rea copy.js +0 -38
  214. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  215. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  216. package/dist/unlogged/bypass-formulario.js +0 -1226
  217. package/dist/unlogged/redux-formulario.d.ts +0 -440
  218. package/dist/unlogged/redux-formulario.js +0 -324
  219. package/dist/unlogged/render-config.d.ts +0 -52
  220. package/dist/unlogged/render-config.js +0 -161
  221. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  222. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  223. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  224. package/dist/unlogged/unlogged/helpers.js +0 -129
  225. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  226. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -0,0 +1,243 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ (function (factory) {
11
+ if (typeof module === "object" && typeof module.exports === "object") {
12
+ var v = factory(require, exports);
13
+ if (v !== undefined) module.exports = v;
14
+ }
15
+ else if (typeof define === "function" && define.amd) {
16
+ define(["require", "exports", "mocha", "node:assert", "../server/procedures-dmencu"], factory);
17
+ }
18
+ })(function (require, exports) {
19
+ "use strict";
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const mocha_1 = require("mocha");
22
+ const assert = require("node:assert");
23
+ const procedures_dmencu_1 = require("../server/procedures-dmencu");
24
+ // Mini base en memoria: aplica un "update ... set col=$n, col='lit', col=null, col=current_timestamp where col=$n and ..."
25
+ // sobre las filas de una tabla. Sólo entiende las asignaciones y condiciones que arman las consultas de dmencu.
26
+ class TablaFalsa {
27
+ constructor(nombre, filas) {
28
+ this.nombre = nombre;
29
+ this.filas = filas;
30
+ this.ahora = '2026-01-01T00:00:00.000Z';
31
+ }
32
+ update(sql, params) {
33
+ var partes = /^\s*update (\w+)\s+set ([\s\S]+?)\s+where ([\s\S]+?)\s+returning/.exec(sql);
34
+ assert.ok(partes, `consulta no reconocida: ${sql}`);
35
+ assert.strictEqual(partes[1], this.nombre, 'la consulta actualiza otra tabla');
36
+ var asignaciones = partes[2].split(',').map(asignacion => asignacion.trim());
37
+ var condiciones = partes[3].split(/\s+and\s+/).map(condicion => condicion.trim());
38
+ var valorDe = (expresion) => {
39
+ var parametro = /^\$(\d+)$/.exec(expresion);
40
+ if (parametro) {
41
+ assert.ok(Number(parametro[1]) <= params.length, `falta el parámetro ${expresion}`);
42
+ return params[Number(parametro[1]) - 1];
43
+ }
44
+ if (expresion == 'null')
45
+ return null;
46
+ if (expresion == 'current_timestamp')
47
+ return this.ahora;
48
+ var literal = /^'(.*)'$/.exec(expresion);
49
+ assert.ok(literal, `expresión no reconocida: ${expresion}`);
50
+ return literal[1];
51
+ };
52
+ var cumple = (fila) => condiciones.every(condicion => {
53
+ var [columna, expresion] = condicion.split(/\s*=\s*/);
54
+ return fila[columna] === valorDe(expresion);
55
+ });
56
+ var cambios = asignaciones.map(asignacion => {
57
+ var _a;
58
+ var [columna, expresion] = asignacion.split(/\s*=\s*/);
59
+ assert.ok(columna in ((_a = this.filas[0]) !== null && _a !== void 0 ? _a : {}), `la tabla ${this.nombre} no tiene la columna ${columna}`);
60
+ return { columna, valor: valorDe(expresion) };
61
+ });
62
+ var afectadas = this.filas.filter(cumple);
63
+ afectadas.forEach(fila => cambios.forEach(cambio => { fila[cambio.columna] = cambio.valor; }));
64
+ return afectadas.length;
65
+ }
66
+ }
67
+ const OPERATIVO = 'etoi211';
68
+ const ENC = '1001';
69
+ const OTRA_ENC = '1002';
70
+ const TOKEN = 'token-dm-1';
71
+ const respuestasReal = {
72
+ resumenEstado: 'ok', codRea: 1, codNoRea: null,
73
+ resumenEstadoSup: 'vacio', codReaSup: null, codNoReaSup: null,
74
+ };
75
+ const respuestasNoRea = {
76
+ resumenEstado: 'no rea', codRea: null, codNoRea: 3,
77
+ resumenEstadoSup: 'vacio', codReaSup: null, codNoReaSup: null,
78
+ };
79
+ const respuestasSup = {
80
+ resumenEstado: 'ok', codRea: 1, codNoRea: null,
81
+ resumenEstadoSup: 'no rea', codReaSup: null, codNoReaSup: 71,
82
+ };
83
+ function filaTem(enc) {
84
+ return {
85
+ operativo: OPERATIVO, enc, json_encuesta: null, fecha_modif_encuesta: null,
86
+ resumen_estado: 'vacio', norea: null, rea: null,
87
+ resumen_estado_sup: 'vacio', norea_sup: null, rea_sup: null,
88
+ };
89
+ }
90
+ function filaTareasTem(enc, tarea, cargadoDm = TOKEN) {
91
+ return {
92
+ operativo: OPERATIVO, enc, tarea, estado: 'C', cargado_dm: cargadoDm, operacion: null,
93
+ dm_resumen_estado: 'vacio', dm_norea: null, dm_rea: null,
94
+ dm_resumen_estado_sup: 'vacio', dm_norea_sup: null, dm_rea_sup: null,
95
+ };
96
+ }
97
+ (0, mocha_1.describe)('dmencu - impacto de rea / no rea en la base', () => {
98
+ (0, mocha_1.describe)('tem (consultaUpdateTem)', () => {
99
+ function aplicar(respuestas, tarea, enc = ENC) {
100
+ var tem = new TablaFalsa('tem', [filaTem(ENC), filaTem(OTRA_ENC)]);
101
+ var consulta = (0, procedures_dmencu_1.consultaUpdateTem)(OPERATIVO, enc, respuestas, tarea);
102
+ var afectadas = tem.update(consulta.sql, consulta.params);
103
+ return { tem, afectadas, consulta };
104
+ }
105
+ (0, mocha_1.it)('una encuesta realizada guarda resumen y código de rea, y deja norea en null', () => {
106
+ var { tem, afectadas } = aplicar(respuestasReal, 'encu');
107
+ assert.strictEqual(afectadas, 1);
108
+ assert.strictEqual(tem.filas[0].resumen_estado, 'ok');
109
+ assert.strictEqual(tem.filas[0].rea, 1);
110
+ assert.strictEqual(tem.filas[0].norea, null);
111
+ });
112
+ (0, mocha_1.it)('una no rea guarda el código de no rea y deja rea en null', () => {
113
+ var { tem } = aplicar(respuestasNoRea, 'encu');
114
+ assert.strictEqual(tem.filas[0].resumen_estado, 'no rea');
115
+ assert.strictEqual(tem.filas[0].norea, 3);
116
+ assert.strictEqual(tem.filas[0].rea, null);
117
+ });
118
+ (0, mocha_1.it)('si la encuesta antes era no rea y ahora es rea, se borra la no rea', () => {
119
+ var tem = new TablaFalsa('tem', [Object.assign(Object.assign({}, filaTem(ENC)), { norea: 3, resumen_estado: 'no rea' })]);
120
+ var consulta = (0, procedures_dmencu_1.consultaUpdateTem)(OPERATIVO, ENC, respuestasReal, 'encu');
121
+ tem.update(consulta.sql, consulta.params);
122
+ assert.strictEqual(tem.filas[0].norea, null);
123
+ assert.strictEqual(tem.filas[0].rea, 1);
124
+ });
125
+ (0, mocha_1.it)('para la tarea supe guarda las columnas _sup y no toca las de la encuesta', () => {
126
+ var { tem } = aplicar(respuestasSup, 'supe');
127
+ assert.strictEqual(tem.filas[0].resumen_estado_sup, 'no rea');
128
+ assert.strictEqual(tem.filas[0].norea_sup, 71);
129
+ assert.strictEqual(tem.filas[0].rea_sup, null);
130
+ assert.strictEqual(tem.filas[0].resumen_estado, 'vacio');
131
+ assert.strictEqual(tem.filas[0].rea, null);
132
+ });
133
+ (0, mocha_1.it)('para una tarea que no es supe no toca las columnas _sup', () => {
134
+ var { tem } = aplicar(respuestasSup, 'encu');
135
+ assert.strictEqual(tem.filas[0].resumen_estado_sup, 'vacio');
136
+ assert.strictEqual(tem.filas[0].norea_sup, null);
137
+ });
138
+ (0, mocha_1.it)('guarda las respuestas y la fecha de modificación', () => {
139
+ var { tem } = aplicar(respuestasReal, 'encu');
140
+ assert.deepStrictEqual(tem.filas[0].json_encuesta, respuestasReal);
141
+ assert.strictEqual(tem.filas[0].fecha_modif_encuesta, tem.ahora);
142
+ });
143
+ (0, mocha_1.it)('sólo modifica la encuesta indicada', () => {
144
+ var { tem } = aplicar(respuestasReal, 'encu');
145
+ assert.deepStrictEqual(tem.filas[1], filaTem(OTRA_ENC));
146
+ });
147
+ (0, mocha_1.it)('no afecta ninguna fila si la encuesta no existe', () => {
148
+ var { afectadas } = aplicar(respuestasReal, 'encu', '9999');
149
+ assert.strictEqual(afectadas, 0);
150
+ });
151
+ });
152
+ (0, mocha_1.describe)('guardarEncuestaEnTem (ejecuta la consulta sobre el cliente)', () => {
153
+ function clienteSobre(tem) {
154
+ return {
155
+ query: (sql, params) => ({
156
+ fetchUniqueRow: () => __awaiter(this, void 0, void 0, function* () {
157
+ var rowCount = tem.update(sql, params);
158
+ if (rowCount != 1) {
159
+ throw new Error(`se esperaba una fila y se actualizaron ${rowCount}`);
160
+ }
161
+ return { rowCount };
162
+ })
163
+ })
164
+ };
165
+ }
166
+ (0, mocha_1.it)('impacta el resultado en la TEM', () => __awaiter(void 0, void 0, void 0, function* () {
167
+ var tem = new TablaFalsa('tem', [filaTem(ENC), filaTem(OTRA_ENC)]);
168
+ yield (0, procedures_dmencu_1.guardarEncuestaEnTem)({ client: clienteSobre(tem) }, OPERATIVO, ENC, respuestasNoRea, 'encu');
169
+ assert.strictEqual(tem.filas[0].norea, 3);
170
+ assert.strictEqual(tem.filas[0].resumen_estado, 'no rea');
171
+ assert.deepStrictEqual(tem.filas[1], filaTem(OTRA_ENC));
172
+ }));
173
+ (0, mocha_1.it)('falla si la encuesta no existe en la TEM', () => __awaiter(void 0, void 0, void 0, function* () {
174
+ var tem = new TablaFalsa('tem', [filaTem(OTRA_ENC)]);
175
+ yield assert.rejects((0, procedures_dmencu_1.guardarEncuestaEnTem)({ client: clienteSobre(tem) }, OPERATIVO, ENC, respuestasReal, 'encu'), /se esperaba una fila/);
176
+ }));
177
+ });
178
+ (0, mocha_1.describe)('tareas_tem (consultaUpdateTareasTemPorDescarga)', () => {
179
+ function aplicar(respuestas, tarea, opts = {}) {
180
+ var _a, _b, _c;
181
+ var filas = (_a = opts.filas) !== null && _a !== void 0 ? _a : [filaTareasTem(ENC, 'encu'), filaTareasTem(ENC, 'supe'), filaTareasTem(OTRA_ENC, 'encu')];
182
+ var tareasTem = new TablaFalsa('tareas_tem', filas);
183
+ var consulta = (0, procedures_dmencu_1.consultaUpdateTareasTemPorDescarga)({
184
+ operativo: OPERATIVO, idEnc: ENC, tarea, token: (_b = opts.token) !== null && _b !== void 0 ? _b : TOKEN,
185
+ respuestasUAPrincipal: respuestas, pasaADescargar: (_c = opts.pasaADescargar) !== null && _c !== void 0 ? _c : false
186
+ });
187
+ var afectadas = tareasTem.update(consulta.sql, consulta.params);
188
+ return { tareasTem, afectadas };
189
+ }
190
+ (0, mocha_1.it)('una encuesta realizada guarda en dm_* el resumen y el código de rea', () => {
191
+ var { tareasTem, afectadas } = aplicar(respuestasReal, 'encu');
192
+ assert.strictEqual(afectadas, 1);
193
+ assert.strictEqual(tareasTem.filas[0].dm_resumen_estado, 'ok');
194
+ assert.strictEqual(tareasTem.filas[0].dm_rea, 1);
195
+ assert.strictEqual(tareasTem.filas[0].dm_norea, null);
196
+ });
197
+ (0, mocha_1.it)('una no rea guarda en dm_* el código de no rea', () => {
198
+ var { tareasTem } = aplicar(respuestasNoRea, 'encu');
199
+ assert.strictEqual(tareasTem.filas[0].dm_resumen_estado, 'no rea');
200
+ assert.strictEqual(tareasTem.filas[0].dm_norea, 3);
201
+ assert.strictEqual(tareasTem.filas[0].dm_rea, null);
202
+ });
203
+ (0, mocha_1.it)('para la tarea supe guarda dm_*_sup y no toca los de la encuesta', () => {
204
+ var { tareasTem } = aplicar(respuestasSup, 'supe');
205
+ var supe = tareasTem.filas[1];
206
+ assert.strictEqual(supe.dm_resumen_estado_sup, 'no rea');
207
+ assert.strictEqual(supe.dm_norea_sup, 71);
208
+ assert.strictEqual(supe.dm_resumen_estado, 'vacio');
209
+ assert.strictEqual(supe.dm_rea, null);
210
+ });
211
+ (0, mocha_1.it)('pasa la tarea a descargada y libera el token del dispositivo', () => {
212
+ var { tareasTem } = aplicar(respuestasReal, 'encu');
213
+ assert.strictEqual(tareasTem.filas[0].estado, 'D');
214
+ assert.strictEqual(tareasTem.filas[0].cargado_dm, null);
215
+ });
216
+ (0, mocha_1.it)('sólo modifica la tarea de la encuesta indicada', () => {
217
+ var { tareasTem } = aplicar(respuestasReal, 'encu');
218
+ assert.deepStrictEqual(tareasTem.filas[1], filaTareasTem(ENC, 'supe'));
219
+ assert.deepStrictEqual(tareasTem.filas[2], filaTareasTem(OTRA_ENC, 'encu'));
220
+ });
221
+ (0, mocha_1.it)('si el dispositivo ya no es el dueño de la encuesta (otro token) no modifica nada', () => {
222
+ var filas = [filaTareasTem(ENC, 'encu', 'token-de-otro-dm')];
223
+ var { tareasTem, afectadas } = aplicar(respuestasReal, 'encu', { filas });
224
+ assert.strictEqual(afectadas, 0);
225
+ assert.deepStrictEqual(tareasTem.filas[0], filaTareasTem(ENC, 'encu', 'token-de-otro-dm'));
226
+ });
227
+ (0, mocha_1.it)('si la encuesta ya no está cargada en ningún dispositivo no modifica nada', () => {
228
+ var filas = [filaTareasTem(ENC, 'encu', null)];
229
+ var { afectadas } = aplicar(respuestasReal, 'encu', { filas });
230
+ assert.strictEqual(afectadas, 0);
231
+ });
232
+ (0, mocha_1.it)('con cambio de modo o de usuario marca la operación como descargar', () => {
233
+ var { tareasTem } = aplicar(respuestasReal, 'encu', { pasaADescargar: true });
234
+ assert.strictEqual(tareasTem.filas[0].operacion, 'descargar');
235
+ });
236
+ (0, mocha_1.it)('sin cambio de modo ni de usuario no modifica la operación', () => {
237
+ var { tareasTem } = aplicar(respuestasReal, 'encu', { pasaADescargar: false });
238
+ assert.strictEqual(tareasTem.filas[0].operacion, null);
239
+ });
240
+ });
241
+ });
242
+ });
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1pbXBhY3RvLXJlYS1uby1yZWEtZW4tYmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC90ZXN0LWltcGFjdG8tcmVhLW5vLXJlYS1lbi1iZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLGlDQUFxQztJQUVyQyxzQ0FBdUM7SUFFdkMsbUVBRXFDO0lBT3JDLDJIQUEySDtJQUMzSCxnSEFBZ0g7SUFDaEgsTUFBTSxVQUFVO1FBRVosWUFBbUIsTUFBYyxFQUFTLEtBQWE7WUFBcEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtZQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7WUFEdkQsVUFBSyxHQUFHLDBCQUEwQixDQUFDO1FBQ3dCLENBQUM7UUFFNUQsTUFBTSxDQUFDLEdBQVcsRUFBRSxNQUFzQjtZQUN0QyxJQUFJLE1BQU0sR0FBRyxrRUFBa0UsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQy9FLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLE9BQU8sR0FBRyxDQUFD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TSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzlFLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFBLFVBQUUsRUFBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7Z0JBQ2pFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0Jyk7XG5cbmltcG9ydCB7XG4gICAgQ2xpZW50ZVBhcmFUZW0sIGNvbnN1bHRhVXBkYXRlVGFyZWFzVGVtUG9yRGVzY2FyZ2EsIGNvbnN1bHRhVXBkYXRlVGVtLCBndWFyZGFyRW5jdWVzdGFFblRlbVxufSBmcm9tICcuLi9zZXJ2ZXIvcHJvY2VkdXJlcy1kbWVuY3UnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbWV0cm9TcWwgfSBmcm9tICcuLi9zZXJ2ZXIvc2V0dGVycy1yZWEtbm8tcmVhJztcbmltcG9ydCB0eXBlIHsgSWRPcGVyYXRpdm8sIElkVGFyZWEsIFJlc3VsdGFkb1Jlc3VtZW4gfSBmcm9tICcuLi91bmxvZ2dlZC90aXBvcyc7XG5cbnR5cGUgVmFsb3IgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IG9iamVjdDtcbnR5cGUgRmlsYSA9IHsgW2NvbHVtbmE6IHN0cmluZ106IFZhbG9yIH07XG5cbi8vIE1pbmkgYmFzZSBlbiBtZW1vcmlhOiBhcGxpY2EgdW4gXCJ1cGRhdGUgLi4uIHNldCBjb2w9JG4sIGNvbD0nbGl0JywgY29sPW51bGwsIGNvbD1jdXJyZW50X3RpbWVzdGFtcCB3aGVyZSBjb2w9JG4gYW5kIC4uLlwiXG4vLyBzb2JyZSBsYXMgZmlsYXMgZGUgdW5hIHRhYmxhLiBTw7NsbyBlbnRpZW5kZSBsYXMgYXNpZ25hY2lvbmVzIHkgY29uZGljaW9uZXMgcXVlIGFybWFuIGxhcyBjb25zdWx0YXMgZGUgZG1lbmN1LlxuY2xhc3MgVGFibGFGYWxzYSB7XG4gICAgYWhvcmEgPSAnMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaJztcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbm9tYnJlOiBzdHJpbmcsIHB1YmxpYyBmaWxhczogRmlsYVtdKSB7IH1cblxuICAgIHVwZGF0ZShzcWw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0cm9TcWxbXSk6IG51bWJlciB7XG4gICAgICAgIHZhciBwYXJ0ZXMgPSAvXlxccyp1cGRhdGUgKFxcdyspXFxzK3NldCAoW1xcc1xcU10rPylcXHMrd2hlcmUgKFtcXHNcXFNdKz8pXFxzK3JldHVybmluZy8uZXhlYyhzcWwpO1xuICAgICAgICBhc3NlcnQub2socGFydGVzLCBgY29uc3VsdGEgbm8gcmVjb25vY2lkYTogJHtzcWx9YCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJ0ZXNbMV0sIHRoaXMubm9tYnJlLCAnbGEgY29uc3VsdGEgYWN0dWFsaXphIG90cmEgdGFibGEnKTtcbiAgICAgICAgdmFyIGFzaWduYWNpb25lcyA9IHBhcnRlc1syXS5zcGxpdCgnLCcpLm1hcChhc2lnbmFjaW9uID0+IGFzaWduYWNpb24udHJpbSgpKTtcbiAgICAgICAgdmFyIGNvbmRpY2lvbmVzID0gcGFydGVzWzNdLnNwbGl0KC9cXHMrYW5kXFxzKy8pLm1hcChjb25kaWNpb24gPT4gY29uZGljaW9uLnRyaW0oKSk7XG4gICAgICAgIHZhciB2YWxvckRlID0gKGV4cHJlc2lvbjogc3RyaW5nKTogVmFsb3IgPT4ge1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRybyA9IC9eXFwkKFxcZCspJC8uZXhlYyhleHByZXNpb24pO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRybykge1xuICAgICAgICAgICAgICAgIGFzc2VydC5vayhOdW1iZXIocGFyYW1ldHJvWzFdKSA8PSBwYXJhbXMubGVuZ3RoLCBgZmFsdGEgZWwgcGFyw6FtZXRybyAke2V4cHJlc2lvbn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zW051bWJlcihwYXJhbWV0cm9bMV0pIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwcmVzaW9uID09ICdudWxsJykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoZXhwcmVzaW9uID09ICdjdXJyZW50X3RpbWVzdGFtcCcpIHJldHVybiB0aGlzLmFob3JhO1xuICAgICAgICAgICAgdmFyIGxpdGVyYWwgPSAvXicoLiopJyQvLmV4ZWMoZXhwcmVzaW9uKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhsaXRlcmFsLCBgZXhwcmVzacOzbiBubyByZWNvbm9jaWRhOiAke2V4cHJlc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybiBsaXRlcmFsWzFdO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY3VtcGxlID0gKGZpbGE6IEZpbGEpID0+IGNvbmRpY2lvbmVzLmV2ZXJ5KGNvbmRpY2lvbiA9PiB7XG4gICAgICAgICAgICB2YXIgW2NvbHVtbmEsIGV4cHJlc2lvbl0gPSBjb25kaWNpb24uc3BsaXQoL1xccyo9XFxzKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGFbY29sdW1uYV0gPT09IHZhbG9yRGUoZXhwcmVzaW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjYW1iaW9zID0gYXNpZ25hY2lvbmVzLm1hcChhc2lnbmFjaW9uID0+IHtcbiAgICAgICAgICAgIHZhciBbY29sdW1uYSwgZXhwcmVzaW9uXSA9IGFzaWduYWNpb24uc3BsaXQoL1xccyo9XFxzKi8pO1xuICAgICAgICAgICAgYXNzZXJ0Lm9rKGNvbHVtbmEgaW4gKHRoaXMuZmlsYXNbMF0gPz8ge30pLCBgbGEgdGFibGEgJHt0aGlzLm5vbWJyZX0gbm8gdGllbmUgbGEgY29sdW1uYSAke2NvbHVtbmF9YCk7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW5hLCB2YWxvcjogdmFsb3JEZShleHByZXNpb24pIH07XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYWZlY3RhZGFzID0gdGhpcy5maWxhcy5maWx0ZXIoY3VtcGxlKTtcbiAgICAgICAgYWZlY3RhZGFzLmZvckVhY2goZmlsYSA9PiBjYW1iaW9zLmZvckVhY2goY2FtYmlvID0+IHsgZmlsYVtjYW1iaW8uY29sdW1uYV0gPSBjYW1iaW8udmFsb3I7IH0pKTtcbiAgICAgICAgcmV0dXJuIGFmZWN0YWRhcy5sZW5ndGg7XG4gICAgfVxufVxuXG5jb25zdCBPUEVSQVRJVk8gPSAnZXRvaTIxMScgYXMgSWRPcGVyYXRpdm87XG5jb25zdCBFTkMgPSAnMTAwMSc7XG5jb25zdCBPVFJBX0VOQyA9ICcxMDAyJztcbmNvbnN0IFRPS0VOID0gJ3Rva2VuLWRtLTEnO1xuXG5jb25zdCByZXNwdWVzdGFzUmVhbDogUmVzdWx0YWRvUmVzdW1lbiA9IHtcbiAgICByZXN1bWVuRXN0YWRvOiAnb2snLCBjb2RSZWE6IDEsIGNvZE5vUmVhOiBudWxsLFxuICAgIHJlc3VtZW5Fc3RhZG9TdXA6ICd2YWNpbycsIGNvZFJlYVN1cDogbnVsbCwgY29kTm9SZWFTdXA6IG51bGwsXG59O1xuY29uc3QgcmVzcHVlc3Rhc05vUmVhOiBSZXN1bHRhZG9SZXN1bWVuID0ge1xuICAgIHJlc3VtZW5Fc3RhZG86ICdubyByZWEnLCBjb2RSZWE6IG51bGwsIGNvZE5vUmVhOiAzLFxuICAgIHJlc3VtZW5Fc3RhZG9TdXA6ICd2YWNpbycsIGNvZFJlYVN1cDogbnVsbCwgY29kTm9SZWFTdXA6IG51bGwsXG59O1xuY29uc3QgcmVzcHVlc3Rhc1N1cDogUmVzdWx0YWRvUmVzdW1lbiA9IHtcbiAgICByZXN1bWVuRXN0YWRvOiAnb2snLCBjb2RSZWE6IDEsIGNvZE5vUmVhOiBudWxsLFxuICAgIHJlc3VtZW5Fc3RhZG9TdXA6ICdubyByZWEnLCBjb2RSZWFTdXA6IG51bGwsIGNvZE5vUmVhU3VwOiA3MSxcbn07XG5cbmZ1bmN0aW9uIGZpbGFUZW0oZW5jOiBzdHJpbmcpOiBGaWxhIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpdm86IE9QRVJBVElWTywgZW5jLCBqc29uX2VuY3Vlc3RhOiBudWxsLCBmZWNoYV9tb2RpZl9lbmN1ZXN0YTogbnVsbCxcbiAgICAgICAgcmVzdW1lbl9lc3RhZG86ICd2YWNpbycsIG5vcmVhOiBudWxsLCByZWE6IG51bGwsXG4gICAgICAgIHJlc3VtZW5fZXN0YWRvX3N1cDogJ3ZhY2lvJywgbm9yZWFfc3VwOiBudWxsLCByZWFfc3VwOiBudWxsLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZpbGFUYXJlYXNUZW0oZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcsIGNhcmdhZG9EbTogc3RyaW5nIHwgbnVsbCA9IFRPS0VOKTogRmlsYSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIGVuYywgdGFyZWEsIGVzdGFkbzogJ0MnLCBjYXJnYWRvX2RtOiBjYXJnYWRvRG0sIG9wZXJhY2lvbjogbnVsbCxcbiAgICAgICAgZG1fcmVzdW1lbl9lc3RhZG86ICd2YWNpbycsIGRtX25vcmVhOiBudWxsLCBkbV9yZWE6IG51bGwsXG4gICAgICAgIGRtX3Jlc3VtZW5fZXN0YWRvX3N1cDogJ3ZhY2lvJywgZG1fbm9yZWFfc3VwOiBudWxsLCBkbV9yZWFfc3VwOiBudWxsLFxuICAgIH07XG59XG5cbmRlc2NyaWJlKCdkbWVuY3UgLSBpbXBhY3RvIGRlIHJlYSAvIG5vIHJlYSBlbiBsYSBiYXNlJywgKCkgPT4ge1xuXG4gICAgZGVzY3JpYmUoJ3RlbSAoY29uc3VsdGFVcGRhdGVUZW0pJywgKCkgPT4ge1xuICAgICAgICBmdW5jdGlvbiBhcGxpY2FyKHJlc3B1ZXN0YXM6IFJlc3VsdGFkb1Jlc3VtZW4sIHRhcmVhOiBJZFRhcmVhLCBlbmM6IHN0cmluZyA9IEVOQykge1xuICAgICAgICAgICAgdmFyIHRlbSA9IG5ldyBUYWJsYUZhbHNhKCd0ZW0nLCBbZmlsYVRlbShFTkMpLCBmaWxhVGVtKE9UUkFfRU5DKV0pO1xuICAgICAgICAgICAgdmFyIGNvbnN1bHRhID0gY29uc3VsdGFVcGRhdGVUZW0oT1BFUkFUSVZPLCBlbmMsIHJlc3B1ZXN0YXMsIHRhcmVhKTtcbiAgICAgICAgICAgIHZhciBhZmVjdGFkYXMgPSB0ZW0udXBkYXRlKGNvbnN1bHRhLnNxbCwgY29uc3VsdGEucGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybiB7IHRlbSwgYWZlY3RhZGFzLCBjb25zdWx0YSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaXQoJ3VuYSBlbmN1ZXN0YSByZWFsaXphZGEgZ3VhcmRhIHJlc3VtZW4geSBjw7NkaWdvIGRlIHJlYSwgeSBkZWphIG5vcmVhIGVuIG51bGwnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0ZW0sIGFmZWN0YWRhcyB9ID0gYXBsaWNhcihyZXNwdWVzdGFzUmVhbCwgJ2VuY3UnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZmVjdGFkYXMsIDEpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5yZXN1bWVuX2VzdGFkbywgJ29rJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLnJlYSwgMSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLm5vcmVhLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd1bmEgbm8gcmVhIGd1YXJkYSBlbCBjw7NkaWdvIGRlIG5vIHJlYSB5IGRlamEgcmVhIGVuIG51bGwnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0ZW0gfSA9IGFwbGljYXIocmVzcHVlc3Rhc05vUmVhLCAnZW5jdScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5yZXN1bWVuX2VzdGFkbywgJ25vIHJlYScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5ub3JlYSwgMyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLnJlYSwgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2kgbGEgZW5jdWVzdGEgYW50ZXMgZXJhIG5vIHJlYSB5IGFob3JhIGVzIHJlYSwgc2UgYm9ycmEgbGEgbm8gcmVhJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHRlbSA9IG5ldyBUYWJsYUZhbHNhKCd0ZW0nLCBbeyAuLi5maWxhVGVtKEVOQyksIG5vcmVhOiAzLCByZXN1bWVuX2VzdGFkbzogJ25vIHJlYScgfV0pO1xuICAgICAgICAgICAgdmFyIGNvbnN1bHRhID0gY29uc3VsdGFVcGRhdGVUZW0oT1BFUkFUSVZPLCBFTkMsIHJlc3B1ZXN0YXNSZWFsLCAnZW5jdScpO1xuICAgICAgICAgICAgdGVtLnVwZGF0ZShjb25zdWx0YS5zcWwsIGNvbnN1bHRhLnBhcmFtcyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLm5vcmVhLCBudWxsKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0ucmVhLCAxKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwYXJhIGxhIHRhcmVhIHN1cGUgZ3VhcmRhIGxhcyBjb2x1bW5hcyBfc3VwIHkgbm8gdG9jYSBsYXMgZGUgbGEgZW5jdWVzdGEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0ZW0gfSA9IGFwbGljYXIocmVzcHVlc3Rhc1N1cCwgJ3N1cGUnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0ucmVzdW1lbl9lc3RhZG9fc3VwLCAnbm8gcmVhJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLm5vcmVhX3N1cCwgNzEpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5yZWFfc3VwLCBudWxsKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0ucmVzdW1lbl9lc3RhZG8sICd2YWNpbycpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5yZWEsIG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3BhcmEgdW5hIHRhcmVhIHF1ZSBubyBlcyBzdXBlIG5vIHRvY2EgbGFzIGNvbHVtbmFzIF9zdXAnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0ZW0gfSA9IGFwbGljYXIocmVzcHVlc3Rhc1N1cCwgJ2VuY3UnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0ucmVzdW1lbl9lc3RhZG9fc3VwLCAndmFjaW8nKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0ubm9yZWFfc3VwLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdndWFyZGEgbGFzIHJlc3B1ZXN0YXMgeSBsYSBmZWNoYSBkZSBtb2RpZmljYWNpw7NuJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgdGVtIH0gPSBhcGxpY2FyKHJlc3B1ZXN0YXNSZWFsLCAnZW5jdScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0ZW0uZmlsYXNbMF0uanNvbl9lbmN1ZXN0YSwgcmVzcHVlc3Rhc1JlYWwpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5mZWNoYV9tb2RpZl9lbmN1ZXN0YSwgdGVtLmFob3JhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzw7NsbyBtb2RpZmljYSBsYSBlbmN1ZXN0YSBpbmRpY2FkYScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciB7IHRlbSB9ID0gYXBsaWNhcihyZXNwdWVzdGFzUmVhbCwgJ2VuY3UnKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodGVtLmZpbGFzWzFdLCBmaWxhVGVtKE9UUkFfRU5DKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnbm8gYWZlY3RhIG5pbmd1bmEgZmlsYSBzaSBsYSBlbmN1ZXN0YSBubyBleGlzdGUnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBhZmVjdGFkYXMgfSA9IGFwbGljYXIocmVzcHVlc3Rhc1JlYWwsICdlbmN1JywgJzk5OTknKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZmVjdGFkYXMsIDApO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdndWFyZGFyRW5jdWVzdGFFblRlbSAoZWplY3V0YSBsYSBjb25zdWx0YSBzb2JyZSBlbCBjbGllbnRlKScsICgpID0+IHtcbiAgICAgICAgZnVuY3Rpb24gY2xpZW50ZVNvYnJlKHRlbTogVGFibGFGYWxzYSk6IENsaWVudGVQYXJhVGVtIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IChzcWw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0cm9TcWxbXSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVbmlxdWVSb3c6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dDb3VudCA9IHRlbS51cGRhdGUoc3FsLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0NvdW50ICE9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlIGVzcGVyYWJhIHVuYSBmaWxhIHkgc2UgYWN0dWFsaXphcm9uICR7cm93Q291bnR9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByb3dDb3VudCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaXQoJ2ltcGFjdGEgZWwgcmVzdWx0YWRvIGVuIGxhIFRFTScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciB0ZW0gPSBuZXcgVGFibGFGYWxzYSgndGVtJywgW2ZpbGFUZW0oRU5DKSwgZmlsYVRlbShPVFJBX0VOQyldKTtcbiAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKHsgY2xpZW50OiBjbGllbnRlU29icmUodGVtKSB9LCBPUEVSQVRJVk8sIEVOQywgcmVzcHVlc3Rhc05vUmVhLCAnZW5jdScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlbS5maWxhc1swXS5ub3JlYSwgMyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGVtLmZpbGFzWzBdLnJlc3VtZW5fZXN0YWRvLCAnbm8gcmVhJyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRlbS5maWxhc1sxXSwgZmlsYVRlbShPVFJBX0VOQykpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2ZhbGxhIHNpIGxhIGVuY3Vlc3RhIG5vIGV4aXN0ZSBlbiBsYSBURU0nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgdGVtID0gbmV3IFRhYmxhRmFsc2EoJ3RlbScsIFtmaWxhVGVtKE9UUkFfRU5DKV0pO1xuICAgICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAgICAgZ3VhcmRhckVuY3Vlc3RhRW5UZW0oeyBjbGllbnQ6IGNsaWVudGVTb2JyZSh0ZW0pIH0sIE9QRVJBVElWTywgRU5DLCByZXNwdWVzdGFzUmVhbCwgJ2VuY3UnKSxcbiAgICAgICAgICAgICAgICAvc2UgZXNwZXJhYmEgdW5hIGZpbGEvXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd0YXJlYXNfdGVtIChjb25zdWx0YVVwZGF0ZVRhcmVhc1RlbVBvckRlc2NhcmdhKScsICgpID0+IHtcbiAgICAgICAgZnVuY3Rpb24gYXBsaWNhcihyZXNwdWVzdGFzOiBSZXN1bHRhZG9SZXN1bWVuLCB0YXJlYTogSWRUYXJlYSwgb3B0czogeyB0b2tlbj86IHN0cmluZywgcGFzYUFEZXNjYXJnYXI/OiBib29sZWFuLCBmaWxhcz86IEZpbGFbXSB9ID0ge30pIHtcbiAgICAgICAgICAgIHZhciBmaWxhcyA9IG9wdHMuZmlsYXMgPz8gW2ZpbGFUYXJlYXNUZW0oRU5DLCAnZW5jdScpLCBmaWxhVGFyZWFzVGVtKEVOQywgJ3N1cGUnKSwgZmlsYVRhcmVhc1RlbShPVFJBX0VOQywgJ2VuY3UnKV07XG4gICAgICAgICAgICB2YXIgdGFyZWFzVGVtID0gbmV3IFRhYmxhRmFsc2EoJ3RhcmVhc190ZW0nLCBmaWxhcyk7XG4gICAgICAgICAgICB2YXIgY29uc3VsdGEgPSBjb25zdWx0YVVwZGF0ZVRhcmVhc1RlbVBvckRlc2NhcmdhKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IE9QRVJBVElWTywgaWRFbmM6IEVOQywgdGFyZWEsIHRva2VuOiBvcHRzLnRva2VuID8/IFRPS0VOLFxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogcmVzcHVlc3RhcywgcGFzYUFEZXNjYXJnYXI6IG9wdHMucGFzYUFEZXNjYXJnYXIgPz8gZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGFmZWN0YWRhcyA9IHRhcmVhc1RlbS51cGRhdGUoY29uc3VsdGEuc3FsLCBjb25zdWx0YS5wYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdGFyZWFzVGVtLCBhZmVjdGFkYXMgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KCd1bmEgZW5jdWVzdGEgcmVhbGl6YWRhIGd1YXJkYSBlbiBkbV8qIGVsIHJlc3VtZW4geSBlbCBjw7NkaWdvIGRlIHJlYScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciB7IHRhcmVhc1RlbSwgYWZlY3RhZGFzIH0gPSBhcGxpY2FyKHJlc3B1ZXN0YXNSZWFsLCAnZW5jdScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFmZWN0YWRhcywgMSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGFyZWFzVGVtLmZpbGFzWzBdLmRtX3Jlc3VtZW5fZXN0YWRvLCAnb2snKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0YXJlYXNUZW0uZmlsYXNbMF0uZG1fcmVhLCAxKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0YXJlYXNUZW0uZmlsYXNbMF0uZG1fbm9yZWEsIG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3VuYSBubyByZWEgZ3VhcmRhIGVuIGRtXyogZWwgY8OzZGlnbyBkZSBubyByZWEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0YXJlYXNUZW0gfSA9IGFwbGljYXIocmVzcHVlc3Rhc05vUmVhLCAnZW5jdScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRhcmVhc1RlbS5maWxhc1swXS5kbV9yZXN1bWVuX2VzdGFkbywgJ25vIHJlYScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRhcmVhc1RlbS5maWxhc1swXS5kbV9ub3JlYSwgMyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGFyZWFzVGVtLmZpbGFzWzBdLmRtX3JlYSwgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgncGFyYSBsYSB0YXJlYSBzdXBlIGd1YXJkYSBkbV8qX3N1cCB5IG5vIHRvY2EgbG9zIGRlIGxhIGVuY3Vlc3RhJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgdGFyZWFzVGVtIH0gPSBhcGxpY2FyKHJlc3B1ZXN0YXNTdXAsICdzdXBlJyk7XG4gICAgICAgICAgICB2YXIgc3VwZSA9IHRhcmVhc1RlbS5maWxhc1sxXTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdXBlLmRtX3Jlc3VtZW5fZXN0YWRvX3N1cCwgJ25vIHJlYScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHN1cGUuZG1fbm9yZWFfc3VwLCA3MSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3VwZS5kbV9yZXN1bWVuX2VzdGFkbywgJ3ZhY2lvJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3VwZS5kbV9yZWEsIG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Bhc2EgbGEgdGFyZWEgYSBkZXNjYXJnYWRhIHkgbGliZXJhIGVsIHRva2VuIGRlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciB7IHRhcmVhc1RlbSB9ID0gYXBsaWNhcihyZXNwdWVzdGFzUmVhbCwgJ2VuY3UnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0YXJlYXNUZW0uZmlsYXNbMF0uZXN0YWRvLCAnRCcpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRhcmVhc1RlbS5maWxhc1swXS5jYXJnYWRvX2RtLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzw7NsbyBtb2RpZmljYSBsYSB0YXJlYSBkZSBsYSBlbmN1ZXN0YSBpbmRpY2FkYScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciB7IHRhcmVhc1RlbSB9ID0gYXBsaWNhcihyZXNwdWVzdGFzUmVhbCwgJ2VuY3UnKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodGFyZWFzVGVtLmZpbGFzWzFdLCBmaWxhVGFyZWFzVGVtKEVOQywgJ3N1cGUnKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRhcmVhc1RlbS5maWxhc1syXSwgZmlsYVRhcmVhc1RlbShPVFJBX0VOQywgJ2VuY3UnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2kgZWwgZGlzcG9zaXRpdm8geWEgbm8gZXMgZWwgZHVlw7FvIGRlIGxhIGVuY3Vlc3RhIChvdHJvIHRva2VuKSBubyBtb2RpZmljYSBuYWRhJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGZpbGFzID0gW2ZpbGFUYXJlYXNUZW0oRU5DLCAnZW5jdScsICd0b2tlbi1kZS1vdHJvLWRtJyldO1xuICAgICAgICAgICAgdmFyIHsgdGFyZWFzVGVtLCBhZmVjdGFkYXMgfSA9IGFwbGljYXIocmVzcHVlc3Rhc1JlYWwsICdlbmN1JywgeyBmaWxhcyB9KTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZmVjdGFkYXMsIDApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0YXJlYXNUZW0uZmlsYXNbMF0sIGZpbGFUYXJlYXNUZW0oRU5DLCAnZW5jdScsICd0b2tlbi1kZS1vdHJvLWRtJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3NpIGxhIGVuY3Vlc3RhIHlhIG5vIGVzdMOhIGNhcmdhZGEgZW4gbmluZ8O6biBkaXNwb3NpdGl2byBubyBtb2RpZmljYSBuYWRhJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGZpbGFzID0gW2ZpbGFUYXJlYXNUZW0oRU5DLCAnZW5jdScsIG51bGwpXTtcbiAgICAgICAgICAgIHZhciB7IGFmZWN0YWRhcyB9ID0gYXBsaWNhcihyZXNwdWVzdGFzUmVhbCwgJ2VuY3UnLCB7IGZpbGFzIH0pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFmZWN0YWRhcywgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnY29uIGNhbWJpbyBkZSBtb2RvIG8gZGUgdXN1YXJpbyBtYXJjYSBsYSBvcGVyYWNpw7NuIGNvbW8gZGVzY2FyZ2FyJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgdGFyZWFzVGVtIH0gPSBhcGxpY2FyKHJlc3B1ZXN0YXNSZWFsLCAnZW5jdScsIHsgcGFzYUFEZXNjYXJnYXI6IHRydWUgfSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGFyZWFzVGVtLmZpbGFzWzBdLm9wZXJhY2lvbiwgJ2Rlc2NhcmdhcicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3NpbiBjYW1iaW8gZGUgbW9kbyBuaSBkZSB1c3VhcmlvIG5vIG1vZGlmaWNhIGxhIG9wZXJhY2nDs24nLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyB0YXJlYXNUZW0gfSA9IGFwbGljYXIocmVzcHVlc3Rhc1JlYWwsICdlbmN1JywgeyBwYXNhQURlc2NhcmdhcjogZmFsc2UgfSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGFyZWFzVGVtLmZpbGFzWzBdLm9wZXJhY2lvbiwgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,170 @@
1
+ (function (factory) {
2
+ if (typeof module === "object" && typeof module.exports === "object") {
3
+ var v = factory(require, exports);
4
+ if (v !== undefined) module.exports = v;
5
+ }
6
+ else if (typeof define === "function" && define.amd) {
7
+ define(["require", "exports", "mocha", "node:assert", "../server/app-dmencu", "./app-para-tests"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const mocha_1 = require("mocha");
13
+ const assert = require("node:assert");
14
+ const app_dmencu_1 = require("../server/app-dmencu");
15
+ const app_para_tests_1 = require("./app-para-tests");
16
+ const GABINETE = '';
17
+ const RELEVAMIENTO = 'web';
18
+ function nombres(menu) {
19
+ return menu.map(item => item.name);
20
+ }
21
+ function submenu(menu, nombre) {
22
+ var item = menu.find(item => item.name == nombre);
23
+ assert.ok(item, `falta el menú ${nombre}`);
24
+ return item.menuContent;
25
+ }
26
+ function menuDelRol(policy, rol, idper) {
27
+ var be = (0, app_para_tests_1.crearAppParaTests)(policy);
28
+ return be.getMenu((0, app_para_tests_1.contextoDelRol)(be, rol, idper)).menu;
29
+ }
30
+ (0, mocha_1.describe)('dmencu - menú según rol y policy', () => {
31
+ (0, mocha_1.describe)('getModoByPolicy', () => {
32
+ (0, mocha_1.it)('policy web es RELEVAMIENTO (dispositivos)', () => {
33
+ assert.strictEqual((0, app_dmencu_1.getModoByPolicy)((0, app_para_tests_1.crearAppParaTests)(RELEVAMIENTO)), 'RELEVAMIENTO');
34
+ });
35
+ (0, mocha_1.it)('cualquier otra policy es GABINETE', () => {
36
+ assert.strictEqual((0, app_dmencu_1.getModoByPolicy)((0, app_para_tests_1.crearAppParaTests)('')), 'GABINETE');
37
+ assert.strictEqual((0, app_dmencu_1.getModoByPolicy)((0, app_para_tests_1.crearAppParaTests)('otra')), 'GABINETE');
38
+ });
39
+ });
40
+ (0, mocha_1.describe)('permisosSegunUsuario (lo que getContext agrega al contexto)', () => {
41
+ const permisos = (0, app_para_tests_1.permisosDeInstalacion)();
42
+ const caches = Object.assign(Object.assign({}, permisos), { permisosRolSoloTrue: permisos.permisosRol });
43
+ (0, mocha_1.it)('sin usuario logueado no puede nada', () => {
44
+ assert.deepStrictEqual((0, app_dmencu_1.permisosSegunUsuario)(caches, undefined), { puede: permisos.permisosParaNadie });
45
+ });
46
+ (0, mocha_1.it)('un rol superuser (admin) es superuser y puede todo', () => {
47
+ assert.deepStrictEqual((0, app_dmencu_1.permisosSegunUsuario)(caches, { rol: 'admin' }), { superuser: true, puede: permisos.permisosSuperuser });
48
+ });
49
+ (0, mocha_1.it)('un rol común tiene los permisos de su rol y no es superuser', () => {
50
+ var _a, _b, _c, _d;
51
+ var resultado = (0, app_dmencu_1.permisosSegunUsuario)(caches, { rol: 'encuestador' });
52
+ assert.strictEqual(resultado.superuser, undefined);
53
+ assert.strictEqual((_b = (_a = resultado.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.relevar, true);
54
+ assert.strictEqual((_d = (_c = resultado.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.editar, false);
55
+ });
56
+ (0, mocha_1.it)('un rol que no existe no tiene permisos', () => {
57
+ assert.deepStrictEqual((0, app_dmencu_1.permisosSegunUsuario)(caches, { rol: 'inexistente' }), { puede: undefined });
58
+ });
59
+ (0, mocha_1.it)('los permisos para nadie tienen todas las acciones en false', () => {
60
+ var _a, _b, _c;
61
+ assert.strictEqual((_a = permisos.permisosParaNadie.encuestas) === null || _a === void 0 ? void 0 : _a.relevar, false);
62
+ assert.strictEqual((_b = permisos.permisosParaNadie.campo) === null || _b === void 0 ? void 0 : _b.administrar, false);
63
+ assert.strictEqual((_c = permisos.permisosParaNadie.casilleros_texto) === null || _c === void 0 ? void 0 : _c.editar, false);
64
+ });
65
+ });
66
+ (0, mocha_1.describe)('en RELEVAMIENTO (policy web)', () => {
67
+ (0, mocha_1.it)('quien releva (encuestador) ve hoja de ruta, sincronizar y cambiar modo', () => {
68
+ assert.deepStrictEqual(menuDelRol(RELEVAMIENTO, 'encuestador'), [
69
+ { menuType: 'path', name: 'relevamiento', path: '/campo' },
70
+ { menuType: 'sincronizar_dm', name: 'sincronizar' },
71
+ { menuType: 'cambiar_modo_dm', name: 'cambiar_modo' },
72
+ ]);
73
+ });
74
+ (0, mocha_1.it)('recuperador y supervisor también relevan', () => {
75
+ assert.deepStrictEqual(nombres(menuDelRol(RELEVAMIENTO, 'recuperador')), ['relevamiento', 'sincronizar', 'cambiar_modo']);
76
+ assert.deepStrictEqual(nombres(menuDelRol(RELEVAMIENTO, 'supervisor')), ['relevamiento', 'sincronizar', 'cambiar_modo']);
77
+ });
78
+ (0, mocha_1.it)('quien no releva no ve nada aunque tenga permisos de gabinete', () => {
79
+ assert.deepStrictEqual(menuDelRol(RELEVAMIENTO, 'recepcionista'), []);
80
+ assert.deepStrictEqual(menuDelRol(RELEVAMIENTO, 'coor_campo'), []);
81
+ assert.deepStrictEqual(menuDelRol(RELEVAMIENTO, 'dis_conceptual'), []);
82
+ });
83
+ });
84
+ (0, mocha_1.describe)('en GABINETE', () => {
85
+ (0, mocha_1.it)('el encuestador no ve nada (releva sólo en el dispositivo)', () => {
86
+ assert.deepStrictEqual(menuDelRol(GABINETE, 'encuestador'), []);
87
+ });
88
+ (0, mocha_1.it)('un rol sin permisos (auxiliar) no ve nada', () => {
89
+ assert.deepStrictEqual(menuDelRol(GABINETE, 'auxiliar'), []);
90
+ });
91
+ (0, mocha_1.it)('admin (superuser) ve todos los menús', () => {
92
+ var menu = menuDelRol(GABINETE, 'admin');
93
+ assert.deepStrictEqual(nombres(menu), [
94
+ 'asignacion', 'recepcion', 'tareas_tem_fin_campo', 'tareas_tem_analisis_campo', 'supervision',
95
+ 'varios', 'control', 'procesar', 'configurar', 'carto'
96
+ ]);
97
+ assert.deepStrictEqual(nombres(submenu(menu, 'configurar')), [
98
+ 'muestra', 'metadatos', 'estados_acciones_tareas', 'momentos_consistencia', 'parametros', 'modos_dm', 'usuarios'
99
+ ]);
100
+ });
101
+ (0, mocha_1.it)('el coordinador de campo administra campo y procesa, pero no edita metadatos ni ve lo de superuser', () => {
102
+ var menu = menuDelRol(GABINETE, 'coor_campo');
103
+ assert.deepStrictEqual(nombres(menu), [
104
+ 'asignacion', 'recepcion', 'tareas_tem_fin_campo', 'tareas_tem_analisis_campo', 'supervision',
105
+ 'varios', 'control', 'procesar', 'configurar', 'carto'
106
+ ]);
107
+ assert.deepStrictEqual(nombres(submenu(menu, 'configurar')), ['muestra', 'usuarios']);
108
+ assert.deepStrictEqual(nombres(submenu(menu, 'asignacion')), ['general', 'encuestador', 'ingresador', 'recuperador', 'supervisor']);
109
+ assert.deepStrictEqual(nombres(submenu(menu, 'recepcion')), ['encuestador', 'recuperador', 'ingresador', 'supervisor', 'mis_supervisores']);
110
+ assert.ok(nombres(submenu(menu, 'varios')).includes('operativo_migrar'));
111
+ assert.ok(nombres(submenu(menu, 'varios')).includes('intercambiar_encuestas'));
112
+ });
113
+ (0, mocha_1.it)('el subcoordinador administra campo pero no procesa', () => {
114
+ var menu = menuDelRol(GABINETE, 'subcoor_campo');
115
+ assert.deepStrictEqual(nombres(menu), [
116
+ 'asignacion', 'recepcion', 'tareas_tem_fin_campo', 'tareas_tem_analisis_campo', 'supervision',
117
+ 'varios', 'control', 'configurar', 'carto'
118
+ ]);
119
+ assert.ok(!nombres(submenu(menu, 'varios')).includes('intercambiar_encuestas'));
120
+ });
121
+ (0, mocha_1.it)('procesamiento procesa pero no edita campo', () => {
122
+ var menu = menuDelRol(GABINETE, 'procesamiento');
123
+ assert.deepStrictEqual(nombres(menu), ['varios', 'control', 'procesar', 'configurar']);
124
+ assert.deepStrictEqual(nombres(submenu(menu, 'varios')), ['abrir_encuesta', 'intercambiar_encuestas']);
125
+ });
126
+ (0, mocha_1.it)('el ingresador edita campo sin administrar: asignación y recepción reducidas, sin control ni configuración', () => {
127
+ var menu = menuDelRol(GABINETE, 'ingresador');
128
+ assert.deepStrictEqual(nombres(menu), ['asignacion', 'recepcion', 'supervision', 'varios']);
129
+ assert.deepStrictEqual(nombres(submenu(menu, 'asignacion')), ['encuestador', 'ingresador', 'recuperador']);
130
+ assert.deepStrictEqual(nombres(submenu(menu, 'recepcion')), ['encuestador', 'recuperador', 'ingresador']);
131
+ assert.deepStrictEqual(nombres(submenu(menu, 'varios')), ['abrir_encuesta', 'hoja_ruta']);
132
+ });
133
+ (0, mocha_1.it)('diseño conceptual sólo edita metadatos (incluidas las tablas de rea/no rea)', () => {
134
+ var menu = menuDelRol(GABINETE, 'dis_conceptual');
135
+ assert.deepStrictEqual(nombres(menu), ['configurar']);
136
+ var metadatos = submenu(submenu(menu, 'configurar'), 'metadatos');
137
+ assert.deepStrictEqual(nombres(submenu(metadatos, 'rea/norea')), ['rea', 'no_rea', 'rea_sup', 'no_rea_sup']);
138
+ });
139
+ (0, mocha_1.it)('al recepcionista la asignación le filtra sus propias áreas', () => {
140
+ var asignacion = submenu(menuDelRol(GABINETE, 'recepcionista', 'REC7'), 'asignacion');
141
+ assert.deepStrictEqual(asignacion.map(item => item.ff), [
142
+ { tarea: 'encu', recepcionista: 'REC7' },
143
+ { tarea: 'ingr', recepcionista: 'REC7' },
144
+ { tarea_actual: 'recu', tarea: 'recu', recepcionista: 'REC7' },
145
+ ]);
146
+ });
147
+ (0, mocha_1.it)('a los demás roles la asignación no les filtra por recepcionista', () => {
148
+ var asignacion = submenu(menuDelRol(GABINETE, 'ingresador'), 'asignacion');
149
+ assert.deepStrictEqual(asignacion.map(item => item.ff), [
150
+ { tarea: 'encu' },
151
+ { tarea: 'ingr' },
152
+ { tarea_actual: 'recu', tarea: 'recu' },
153
+ ]);
154
+ });
155
+ (0, mocha_1.it)('la supervisión muestra las encuestas asignadas al usuario', () => {
156
+ var supervision = submenu(menuDelRol(GABINETE, 'ingresador', 'ING3'), 'supervision');
157
+ assert.deepStrictEqual(supervision, [
158
+ { menuType: 'table', name: 'supervisar', table: 'tareas_tem_ingreso', ff: { tarea: 'supe', asignado: 'ING3' } }
159
+ ]);
160
+ });
161
+ });
162
+ (0, mocha_1.describe)('getMenu sin context', () => {
163
+ (0, mocha_1.it)('lanza un error claro', () => {
164
+ var be = (0, app_para_tests_1.crearAppParaTests)(GABINETE);
165
+ assert.throws(() => be.getMenu(), /requiere el context/);
166
+ });
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1tZW51LXNlZ3VuLXJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3QtbWVudS1zZWd1bi1yb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFBQSxpQ0FBcUM7SUFFckMsc0NBQXVDO0lBRXZDLHFEQUE2RTtJQUU3RSxxREFBNEY7SUFFNUYsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztJQUUzQixTQUFTLE9BQU8sQ0FBQyxJQUFvQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFNBQVMsT0FBTyxDQUFDLElBQW9CLEVBQUUsTUFBYztRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxpQkFBaUIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELFNBQVMsVUFBVSxDQUFDLE1BQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUMzRCxJQUFJLEVBQUUsR0FBRyxJQUFBLGtDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLCtCQUFjLEVBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBQSxnQkFBUSxFQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUU5QyxJQUFBLGdCQUFRLEVBQUMsaUJBQWlCLEVBQUUsR0FBRyxF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QUFHLEVBQUU7Z0JBQ2pFLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUU7b0JBQ2hDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRTtpQkFDbEgsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsZ0JBQVEsRUFBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7WUFDakMsSUFBQSxVQUFFLEVBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO2dCQUM1QixJQUFJLEVBQUUsR0FBRyxJQUFBLGtDQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0Jyk7XG5cbmltcG9ydCB7IGdldE1vZG9CeVBvbGljeSwgcGVybWlzb3NTZWd1blVzdWFyaW8gfSBmcm9tICcuLi9zZXJ2ZXIvYXBwLWRtZW5jdSc7XG5pbXBvcnQgdHlwZSB7IE1lbnVJbmZvQmFzZSB9IGZyb20gJy4uL3NlcnZlci90eXBlcy1kbWVuY3UnO1xuaW1wb3J0IHsgY29udGV4dG9EZWxSb2wsIGNyZWFyQXBwUGFyYVRlc3RzLCBwZXJtaXNvc0RlSW5zdGFsYWNpb24gfSBmcm9tICcuL2FwcC1wYXJhLXRlc3RzJztcblxuY29uc3QgR0FCSU5FVEUgPSAnJztcbmNvbnN0IFJFTEVWQU1JRU5UTyA9ICd3ZWInO1xuXG5mdW5jdGlvbiBub21icmVzKG1lbnU6IE1lbnVJbmZvQmFzZVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBtZW51Lm1hcChpdGVtID0+IGl0ZW0ubmFtZSk7XG59XG5cbmZ1bmN0aW9uIHN1Ym1lbnUobWVudTogTWVudUluZm9CYXNlW10sIG5vbWJyZTogc3RyaW5nKTogTWVudUluZm9CYXNlW10ge1xuICAgIHZhciBpdGVtID0gbWVudS5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09IG5vbWJyZSk7XG4gICAgYXNzZXJ0Lm9rKGl0ZW0sIGBmYWx0YSBlbCBtZW7DuiAke25vbWJyZX1gKTtcbiAgICByZXR1cm4gaXRlbS5tZW51Q29udGVudDtcbn1cblxuZnVuY3Rpb24gbWVudURlbFJvbChwb2xpY3k6IHN0cmluZywgcm9sOiBzdHJpbmcsIGlkcGVyPzogc3RyaW5nKTogTWVudUluZm9CYXNlW10ge1xuICAgIHZhciBiZSA9IGNyZWFyQXBwUGFyYVRlc3RzKHBvbGljeSk7XG4gICAgcmV0dXJuIGJlLmdldE1lbnUoY29udGV4dG9EZWxSb2woYmUsIHJvbCwgaWRwZXIpKS5tZW51O1xufVxuXG5kZXNjcmliZSgnZG1lbmN1IC0gbWVuw7ogc2Vnw7puIHJvbCB5IHBvbGljeScsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdnZXRNb2RvQnlQb2xpY3knLCAoKSA9PiB7XG4gICAgICAgIGl0KCdwb2xpY3kgd2ViIGVzIFJFTEVWQU1JRU5UTyAoZGlzcG9zaXRpdm9zKScsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRNb2RvQnlQb2xpY3koY3JlYXJBcHBQYXJhVGVzdHMoUkVMRVZBTUlFTlRPKSksICdSRUxFVkFNSUVOVE8nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdjdWFscXVpZXIgb3RyYSBwb2xpY3kgZXMgR0FCSU5FVEUnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0TW9kb0J5UG9saWN5KGNyZWFyQXBwUGFyYVRlc3RzKCcnKSksICdHQUJJTkVURScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldE1vZG9CeVBvbGljeShjcmVhckFwcFBhcmFUZXN0cygnb3RyYScpKSwgJ0dBQklORVRFJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Blcm1pc29zU2VndW5Vc3VhcmlvIChsbyBxdWUgZ2V0Q29udGV4dCBhZ3JlZ2EgYWwgY29udGV4dG8pJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJtaXNvcyA9IHBlcm1pc29zRGVJbnN0YWxhY2lvbigpO1xuICAgICAgICBjb25zdCBjYWNoZXMgPSB7IC4uLnBlcm1pc29zLCBwZXJtaXNvc1JvbFNvbG9UcnVlOiBwZXJtaXNvcy5wZXJtaXNvc1JvbCB9O1xuICAgICAgICBpdCgnc2luIHVzdWFyaW8gbG9ndWVhZG8gbm8gcHVlZGUgbmFkYScsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGVybWlzb3NTZWd1blVzdWFyaW8oY2FjaGVzLCB1bmRlZmluZWQpLCB7IHB1ZWRlOiBwZXJtaXNvcy5wZXJtaXNvc1BhcmFOYWRpZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd1biByb2wgc3VwZXJ1c2VyIChhZG1pbikgZXMgc3VwZXJ1c2VyIHkgcHVlZGUgdG9kbycsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGVybWlzb3NTZWd1blVzdWFyaW8oY2FjaGVzLCB7IHJvbDogJ2FkbWluJyB9KSwgeyBzdXBlcnVzZXI6IHRydWUsIHB1ZWRlOiBwZXJtaXNvcy5wZXJtaXNvc1N1cGVydXNlciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd1biByb2wgY29tw7puIHRpZW5lIGxvcyBwZXJtaXNvcyBkZSBzdSByb2wgeSBubyBlcyBzdXBlcnVzZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0YWRvID0gcGVybWlzb3NTZWd1blVzdWFyaW8oY2FjaGVzLCB7IHJvbDogJ2VuY3Vlc3RhZG9yJyB9KTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHRhZG8uc3VwZXJ1c2VyLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdGFkby5wdWVkZT8uZW5jdWVzdGFzPy5yZWxldmFyLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHRhZG8ucHVlZGU/LmNhbXBvPy5lZGl0YXIsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd1biByb2wgcXVlIG5vIGV4aXN0ZSBubyB0aWVuZSBwZXJtaXNvcycsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGVybWlzb3NTZWd1blVzdWFyaW8oY2FjaGVzLCB7IHJvbDogJ2luZXhpc3RlbnRlJyB9KSwgeyBwdWVkZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2xvcyBwZXJtaXNvcyBwYXJhIG5hZGllIHRpZW5lbiB0b2RhcyBsYXMgYWNjaW9uZXMgZW4gZmFsc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGVybWlzb3MucGVybWlzb3NQYXJhTmFkaWUuZW5jdWVzdGFzPy5yZWxldmFyLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGVybWlzb3MucGVybWlzb3NQYXJhTmFkaWUuY2FtcG8/LmFkbWluaXN0cmFyLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGVybWlzb3MucGVybWlzb3NQYXJhTmFkaWUuY2FzaWxsZXJvc190ZXh0bz8uZWRpdGFyLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2VuIFJFTEVWQU1JRU5UTyAocG9saWN5IHdlYiknLCAoKSA9PiB7XG4gICAgICAgIGl0KCdxdWllbiByZWxldmEgKGVuY3Vlc3RhZG9yKSB2ZSBob2phIGRlIHJ1dGEsIHNpbmNyb25pemFyIHkgY2FtYmlhciBtb2RvJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChtZW51RGVsUm9sKFJFTEVWQU1JRU5UTywgJ2VuY3Vlc3RhZG9yJyksIFtcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAncGF0aCcsIG5hbWU6ICdyZWxldmFtaWVudG8nLCBwYXRoOiAnL2NhbXBvJyB9LFxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICdzaW5jcm9uaXphcl9kbScsIG5hbWU6ICdzaW5jcm9uaXphcicgfSxcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAnY2FtYmlhcl9tb2RvX2RtJywgbmFtZTogJ2NhbWJpYXJfbW9kbycgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3JlY3VwZXJhZG9yIHkgc3VwZXJ2aXNvciB0YW1iacOpbiByZWxldmFuJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKG1lbnVEZWxSb2woUkVMRVZBTUlFTlRPLCAncmVjdXBlcmFkb3InKSksIFsncmVsZXZhbWllbnRvJywgJ3NpbmNyb25pemFyJywgJ2NhbWJpYXJfbW9kbyddKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhtZW51RGVsUm9sKFJFTEVWQU1JRU5UTywgJ3N1cGVydmlzb3InKSksIFsncmVsZXZhbWllbnRvJywgJ3NpbmNyb25pemFyJywgJ2NhbWJpYXJfbW9kbyddKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdxdWllbiBubyByZWxldmEgbm8gdmUgbmFkYSBhdW5xdWUgdGVuZ2EgcGVybWlzb3MgZGUgZ2FiaW5ldGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1lbnVEZWxSb2woUkVMRVZBTUlFTlRPLCAncmVjZXBjaW9uaXN0YScpLCBbXSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1lbnVEZWxSb2woUkVMRVZBTUlFTlRPLCAnY29vcl9jYW1wbycpLCBbXSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1lbnVEZWxSb2woUkVMRVZBTUlFTlRPLCAnZGlzX2NvbmNlcHR1YWwnKSwgW10pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlbiBHQUJJTkVURScsICgpID0+IHtcbiAgICAgICAgaXQoJ2VsIGVuY3Vlc3RhZG9yIG5vIHZlIG5hZGEgKHJlbGV2YSBzw7NsbyBlbiBlbCBkaXNwb3NpdGl2byknLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1lbnVEZWxSb2woR0FCSU5FVEUsICdlbmN1ZXN0YWRvcicpLCBbXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgndW4gcm9sIHNpbiBwZXJtaXNvcyAoYXV4aWxpYXIpIG5vIHZlIG5hZGEnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1lbnVEZWxSb2woR0FCSU5FVEUsICdhdXhpbGlhcicpLCBbXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYWRtaW4gKHN1cGVydXNlcikgdmUgdG9kb3MgbG9zIG1lbsO6cycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gbWVudURlbFJvbChHQUJJTkVURSwgJ2FkbWluJyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG5vbWJyZXMobWVudSksIFtcbiAgICAgICAgICAgICAgICAnYXNpZ25hY2lvbicsICdyZWNlcGNpb24nLCAndGFyZWFzX3RlbV9maW5fY2FtcG8nLCAndGFyZWFzX3RlbV9hbmFsaXNpc19jYW1wbycsICdzdXBlcnZpc2lvbicsXG4gICAgICAgICAgICAgICAgJ3ZhcmlvcycsICdjb250cm9sJywgJ3Byb2Nlc2FyJywgJ2NvbmZpZ3VyYXInLCAnY2FydG8nXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhzdWJtZW51KG1lbnUsICdjb25maWd1cmFyJykpLCBbXG4gICAgICAgICAgICAgICAgJ211ZXN0cmEnLCAnbWV0YWRhdG9zJywgJ2VzdGFkb3NfYWNjaW9uZXNfdGFyZWFzJywgJ21vbWVudG9zX2NvbnNpc3RlbmNpYScsICdwYXJhbWV0cm9zJywgJ21vZG9zX2RtJywgJ3VzdWFyaW9zJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnZWwgY29vcmRpbmFkb3IgZGUgY2FtcG8gYWRtaW5pc3RyYSBjYW1wbyB5IHByb2Nlc2EsIHBlcm8gbm8gZWRpdGEgbWV0YWRhdG9zIG5pIHZlIGxvIGRlIHN1cGVydXNlcicsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gbWVudURlbFJvbChHQUJJTkVURSwgJ2Nvb3JfY2FtcG8nKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhtZW51KSwgW1xuICAgICAgICAgICAgICAgICdhc2lnbmFjaW9uJywgJ3JlY2VwY2lvbicsICd0YXJlYXNfdGVtX2Zpbl9jYW1wbycsICd0YXJlYXNfdGVtX2FuYWxpc2lzX2NhbXBvJywgJ3N1cGVydmlzaW9uJyxcbiAgICAgICAgICAgICAgICAndmFyaW9zJywgJ2NvbnRyb2wnLCAncHJvY2VzYXInLCAnY29uZmlndXJhcicsICdjYXJ0bydcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKHN1Ym1lbnUobWVudSwgJ2NvbmZpZ3VyYXInKSksIFsnbXVlc3RyYScsICd1c3VhcmlvcyddKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhzdWJtZW51KG1lbnUsICdhc2lnbmFjaW9uJykpLCBbJ2dlbmVyYWwnLCAnZW5jdWVzdGFkb3InLCAnaW5ncmVzYWRvcicsICdyZWN1cGVyYWRvcicsICdzdXBlcnZpc29yJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKHN1Ym1lbnUobWVudSwgJ3JlY2VwY2lvbicpKSwgWydlbmN1ZXN0YWRvcicsICdyZWN1cGVyYWRvcicsICdpbmdyZXNhZG9yJywgJ3N1cGVydmlzb3InLCAnbWlzX3N1cGVydmlzb3JlcyddKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhub21icmVzKHN1Ym1lbnUobWVudSwgJ3ZhcmlvcycpKS5pbmNsdWRlcygnb3BlcmF0aXZvX21pZ3JhcicpKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhub21icmVzKHN1Ym1lbnUobWVudSwgJ3ZhcmlvcycpKS5pbmNsdWRlcygnaW50ZXJjYW1iaWFyX2VuY3Vlc3RhcycpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdlbCBzdWJjb29yZGluYWRvciBhZG1pbmlzdHJhIGNhbXBvIHBlcm8gbm8gcHJvY2VzYScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gbWVudURlbFJvbChHQUJJTkVURSwgJ3N1YmNvb3JfY2FtcG8nKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhtZW51KSwgW1xuICAgICAgICAgICAgICAgICdhc2lnbmFjaW9uJywgJ3JlY2VwY2lvbicsICd0YXJlYXNfdGVtX2Zpbl9jYW1wbycsICd0YXJlYXNfdGVtX2FuYWxpc2lzX2NhbXBvJywgJ3N1cGVydmlzaW9uJyxcbiAgICAgICAgICAgICAgICAndmFyaW9zJywgJ2NvbnRyb2wnLCAnY29uZmlndXJhcicsICdjYXJ0bydcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0Lm9rKCFub21icmVzKHN1Ym1lbnUobWVudSwgJ3ZhcmlvcycpKS5pbmNsdWRlcygnaW50ZXJjYW1iaWFyX2VuY3Vlc3RhcycpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwcm9jZXNhbWllbnRvIHByb2Nlc2EgcGVybyBubyBlZGl0YSBjYW1wbycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gbWVudURlbFJvbChHQUJJTkVURSwgJ3Byb2Nlc2FtaWVudG8nKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhtZW51KSwgWyd2YXJpb3MnLCAnY29udHJvbCcsICdwcm9jZXNhcicsICdjb25maWd1cmFyJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKHN1Ym1lbnUobWVudSwgJ3ZhcmlvcycpKSwgWydhYnJpcl9lbmN1ZXN0YScsICdpbnRlcmNhbWJpYXJfZW5jdWVzdGFzJ10pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2VsIGluZ3Jlc2Fkb3IgZWRpdGEgY2FtcG8gc2luIGFkbWluaXN0cmFyOiBhc2lnbmFjacOzbiB5IHJlY2VwY2nDs24gcmVkdWNpZGFzLCBzaW4gY29udHJvbCBuaSBjb25maWd1cmFjacOzbicsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gbWVudURlbFJvbChHQUJJTkVURSwgJ2luZ3Jlc2Fkb3InKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhtZW51KSwgWydhc2lnbmFjaW9uJywgJ3JlY2VwY2lvbicsICdzdXBlcnZpc2lvbicsICd2YXJpb3MnXSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG5vbWJyZXMoc3VibWVudShtZW51LCAnYXNpZ25hY2lvbicpKSwgWydlbmN1ZXN0YWRvcicsICdpbmdyZXNhZG9yJywgJ3JlY3VwZXJhZG9yJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKHN1Ym1lbnUobWVudSwgJ3JlY2VwY2lvbicpKSwgWydlbmN1ZXN0YWRvcicsICdyZWN1cGVyYWRvcicsICdpbmdyZXNhZG9yJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKHN1Ym1lbnUobWVudSwgJ3ZhcmlvcycpKSwgWydhYnJpcl9lbmN1ZXN0YScsICdob2phX3J1dGEnXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnZGlzZcOxbyBjb25jZXB0dWFsIHPDs2xvIGVkaXRhIG1ldGFkYXRvcyAoaW5jbHVpZGFzIGxhcyB0YWJsYXMgZGUgcmVhL25vIHJlYSknLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgbWVudSA9IG1lbnVEZWxSb2woR0FCSU5FVEUsICdkaXNfY29uY2VwdHVhbCcpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChub21icmVzKG1lbnUpLCBbJ2NvbmZpZ3VyYXInXSk7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdG9zID0gc3VibWVudShzdWJtZW51KG1lbnUsICdjb25maWd1cmFyJyksICdtZXRhZGF0b3MnKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9tYnJlcyhzdWJtZW51KG1ldGFkYXRvcywgJ3JlYS9ub3JlYScpKSwgWydyZWEnLCAnbm9fcmVhJywgJ3JlYV9zdXAnLCAnbm9fcmVhX3N1cCddKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdhbCByZWNlcGNpb25pc3RhIGxhIGFzaWduYWNpw7NuIGxlIGZpbHRyYSBzdXMgcHJvcGlhcyDDoXJlYXMnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYXNpZ25hY2lvbiA9IHN1Ym1lbnUobWVudURlbFJvbChHQUJJTkVURSwgJ3JlY2VwY2lvbmlzdGEnLCAnUkVDNycpLCAnYXNpZ25hY2lvbicpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhc2lnbmFjaW9uLm1hcChpdGVtID0+IGl0ZW0uZmYpLCBbXG4gICAgICAgICAgICAgICAgeyB0YXJlYTogJ2VuY3UnLCByZWNlcGNpb25pc3RhOiAnUkVDNycgfSxcbiAgICAgICAgICAgICAgICB7IHRhcmVhOiAnaW5ncicsIHJlY2VwY2lvbmlzdGE6ICdSRUM3JyB9LFxuICAgICAgICAgICAgICAgIHsgdGFyZWFfYWN0dWFsOiAncmVjdScsIHRhcmVhOiAncmVjdScsIHJlY2VwY2lvbmlzdGE6ICdSRUM3JyB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYSBsb3MgZGVtw6FzIHJvbGVzIGxhIGFzaWduYWNpw7NuIG5vIGxlcyBmaWx0cmEgcG9yIHJlY2VwY2lvbmlzdGEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYXNpZ25hY2lvbiA9IHN1Ym1lbnUobWVudURlbFJvbChHQUJJTkVURSwgJ2luZ3Jlc2Fkb3InKSwgJ2FzaWduYWNpb24nKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYXNpZ25hY2lvbi5tYXAoaXRlbSA9PiBpdGVtLmZmKSwgW1xuICAgICAgICAgICAgICAgIHsgdGFyZWE6ICdlbmN1JyB9LFxuICAgICAgICAgICAgICAgIHsgdGFyZWE6ICdpbmdyJyB9LFxuICAgICAgICAgICAgICAgIHsgdGFyZWFfYWN0dWFsOiAncmVjdScsIHRhcmVhOiAncmVjdScgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2xhIHN1cGVydmlzacOzbiBtdWVzdHJhIGxhcyBlbmN1ZXN0YXMgYXNpZ25hZGFzIGFsIHVzdWFyaW8nLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgc3VwZXJ2aXNpb24gPSBzdWJtZW51KG1lbnVEZWxSb2woR0FCSU5FVEUsICdpbmdyZXNhZG9yJywgJ0lORzMnKSwgJ3N1cGVydmlzaW9uJyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHN1cGVydmlzaW9uLCBbXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3N1cGVydmlzYXInLCB0YWJsZTogJ3RhcmVhc190ZW1faW5ncmVzbycsIGZmOiB7IHRhcmVhOiAnc3VwZScsIGFzaWduYWRvOiAnSU5HMycgfSB9XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0TWVudSBzaW4gY29udGV4dCcsICgpID0+IHtcbiAgICAgICAgaXQoJ2xhbnphIHVuIGVycm9yIGNsYXJvJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoR0FCSU5FVEUpO1xuICAgICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBiZS5nZXRNZW51KCksIC9yZXF1aWVyZSBlbCBjb250ZXh0Lyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};