dmencu 0.1.5

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 (148) hide show
  1. package/dist/client/client/client.js +372 -0
  2. package/dist/client/client/css/form-data-signals-2.styl +11 -0
  3. package/dist/client/client/css/form-data-signals.styl +68 -0
  4. package/dist/client/client/css/menu.styl +6 -0
  5. package/dist/client/client/img/ba_etiqueta.jpg +0 -0
  6. package/dist/client/client/img/logo_etiqueta.jpg +0 -0
  7. package/dist/client/client/img/mandatory.png +0 -0
  8. package/dist/client/client/img/optativo.png +0 -0
  9. package/dist/client/client/img/pk-mandatory.png +0 -0
  10. package/dist/client/client/img/wait4this.png +0 -0
  11. package/dist/client/client/menu.js +3 -0
  12. package/dist/client/client/tsconfig.json +14 -0
  13. package/dist/client/unlogged/abrir-formulario.js +99 -0
  14. package/dist/client/unlogged/bypass-formulario.js +1141 -0
  15. package/dist/client/unlogged/css/Roboto-Regular.ttf +0 -0
  16. package/dist/client/unlogged/css/bootstrap.min.css +7 -0
  17. package/dist/client/unlogged/css/formulario-react.styl +756 -0
  18. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
  19. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
  20. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
  21. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
  22. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
  23. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
  24. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
  25. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
  26. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
  27. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
  28. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
  29. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
  30. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
  31. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
  32. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
  33. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
  34. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
  35. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
  36. package/dist/client/unlogged/img/_login-logo-icon.png +0 -0
  37. package/dist/client/unlogged/img/_logo-128.png +0 -0
  38. package/dist/client/unlogged/img/_logo.png +0 -0
  39. package/dist/client/unlogged/img/borrar-valor.pdn +0 -0
  40. package/dist/client/unlogged/img/borrar-valor.png +0 -0
  41. package/dist/client/unlogged/img/fondo-salteado-crudo.pdn +0 -0
  42. package/dist/client/unlogged/img/fondo-salteado-error.png +0 -0
  43. package/dist/client/unlogged/img/fondo-salteado.pdn +0 -0
  44. package/dist/client/unlogged/img/fondo-salteado.png +0 -0
  45. package/dist/client/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
  46. package/dist/client/unlogged/img/login-logo-icon.png +0 -0
  47. package/dist/client/unlogged/img/logo-128.png +0 -0
  48. package/dist/client/unlogged/img/logo.png +0 -0
  49. package/dist/client/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
  50. package/dist/client/unlogged/offline.jade +10 -0
  51. package/dist/client/unlogged/redux-formulario.js +315 -0
  52. package/dist/client/unlogged/render-formulario.tsx +2103 -0
  53. package/dist/client/unlogged/render-general.tsx +228 -0
  54. package/dist/client/unlogged/tipos.js +19 -0
  55. package/dist/client/unlogged/tsconfig.json +15 -0
  56. package/dist/server/server/app-dmencu.js +641 -0
  57. package/dist/server/server/def-config.js +108 -0
  58. package/dist/server/server/procedures-dmencu.js +759 -0
  59. package/dist/server/server/server-dmencu.js +23 -0
  60. package/dist/server/server/table-areas.js +121 -0
  61. package/dist/server/server/table-comunas.js +29 -0
  62. package/dist/server/server/table-control_campo.js +100 -0
  63. package/dist/server/server/table-control_resumen.js +19 -0
  64. package/dist/server/server/table-encuestadores.js +19 -0
  65. package/dist/server/server/table-hogares.js +157 -0
  66. package/dist/server/server/table-hogares_sup.js +192 -0
  67. package/dist/server/server/table-lotes.js +44 -0
  68. package/dist/server/server/table-mis_encuestadores.js +78 -0
  69. package/dist/server/server/table-mis_tareas.js +19 -0
  70. package/dist/server/server/table-mis_tareas_areas.js +19 -0
  71. package/dist/server/server/table-mis_tareas_tem.js +19 -0
  72. package/dist/server/server/table-no_rea.js +33 -0
  73. package/dist/server/server/table-no_rea_sup.js +33 -0
  74. package/dist/server/server/table-operaciones.js +31 -0
  75. package/dist/server/server/table-parametros.js +40 -0
  76. package/dist/server/server/table-permisos.js +32 -0
  77. package/dist/server/server/table-personal.js +63 -0
  78. package/dist/server/server/table-personal_rol.js +43 -0
  79. package/dist/server/server/table-personas.js +449 -0
  80. package/dist/server/server/table-personas_sup.js +94 -0
  81. package/dist/server/server/table-recepcionistas.js +19 -0
  82. package/dist/server/server/table-recuperadores.js +19 -0
  83. package/dist/server/server/table-resultados_tarea.js +29 -0
  84. package/dist/server/server/table-roles.js +33 -0
  85. package/dist/server/server/table-roles_permisos.js +36 -0
  86. package/dist/server/server/table-roles_subordinados.js +33 -0
  87. package/dist/server/server/table-semanas.js +42 -0
  88. package/dist/server/server/table-sincronizaciones.js +31 -0
  89. package/dist/server/server/table-supervisores.js +19 -0
  90. package/dist/server/server/table-tareas.js +47 -0
  91. package/dist/server/server/table-tareas_areas.js +68 -0
  92. package/dist/server/server/table-tareas_tem.js +148 -0
  93. package/dist/server/server/table-tem.js +187 -0
  94. package/dist/server/server/table-tem_recepcion.js +19 -0
  95. package/dist/server/server/table-usuarios.js +59 -0
  96. package/dist/server/server/table-visitas.js +92 -0
  97. package/dist/server/server/table-visitas_sup.js +92 -0
  98. package/dist/server/server/table-viviendas.js +300 -0
  99. package/dist/server/server/types-dmencu.js +24 -0
  100. package/dist/server/unlogged/tipos.js +19 -0
  101. package/dist/unlogged/unlogged/abrir-formulario.js +99 -0
  102. package/dist/unlogged/unlogged/adapt.js +8 -0
  103. package/dist/unlogged/unlogged/bypass-formulario.js +1141 -0
  104. package/dist/unlogged/unlogged/css/Roboto-Regular.ttf +0 -0
  105. package/dist/unlogged/unlogged/css/bootstrap.min.css +7 -0
  106. package/dist/unlogged/unlogged/css/formulario-react.styl +756 -0
  107. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
  108. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
  109. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
  110. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
  111. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
  112. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
  113. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
  114. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
  115. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
  116. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
  117. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
  118. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
  119. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
  120. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
  121. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
  122. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
  123. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
  124. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
  125. package/dist/unlogged/unlogged/img/_login-logo-icon.png +0 -0
  126. package/dist/unlogged/unlogged/img/_logo-128.png +0 -0
  127. package/dist/unlogged/unlogged/img/_logo.png +0 -0
  128. package/dist/unlogged/unlogged/img/borrar-valor.pdn +0 -0
  129. package/dist/unlogged/unlogged/img/borrar-valor.png +0 -0
  130. package/dist/unlogged/unlogged/img/fondo-salteado-crudo.pdn +0 -0
  131. package/dist/unlogged/unlogged/img/fondo-salteado-error.png +0 -0
  132. package/dist/unlogged/unlogged/img/fondo-salteado.pdn +0 -0
  133. package/dist/unlogged/unlogged/img/fondo-salteado.png +0 -0
  134. package/dist/unlogged/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
  135. package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
  136. package/dist/unlogged/unlogged/img/logo-128.png +0 -0
  137. package/dist/unlogged/unlogged/img/logo.png +0 -0
  138. package/dist/unlogged/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
  139. package/dist/unlogged/unlogged/offline.jade +10 -0
  140. package/dist/unlogged/unlogged/redux-formulario.js +315 -0
  141. package/dist/unlogged/unlogged/render-formulario.js +1485 -0
  142. package/dist/unlogged/unlogged/render-formulario.tsx +2103 -0
  143. package/dist/unlogged/unlogged/render-general.js +185 -0
  144. package/dist/unlogged/unlogged/render-general.tsx +228 -0
  145. package/dist/unlogged/unlogged/tipos.js +19 -0
  146. package/dist/unlogged/unlogged/tsconfig.json +15 -0
  147. package/dist/unlogged/unlogged/unlogged.js +180 -0
  148. package/package.json +91 -0
@@ -0,0 +1,10 @@
1
+ doctype html
2
+ html(lang="en")
3
+ head
4
+ title.Offline
5
+ body
6
+ div#offline
7
+ h1 no hay conexion de internet
8
+ p verifique su conexión de internet y vuelva a intentarlo
9
+ a(href="campo") volver a hoja de ruta
10
+
@@ -0,0 +1,315 @@
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", "redux", "./tipos", "redux-typed-reducer", "like-ar", "best-globals"], factory);
17
+ }
18
+ })(function (require, exports) {
19
+ "use strict";
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.dmTraerDatosFormulario = exports.traerEstructura = exports.getCacheVersion = exports.gotoConsistir = exports.gotoCampo = exports.gotoSincronizar = exports.replaceSpecialWords = exports.dispatchers = void 0;
22
+ const redux_1 = require("redux");
23
+ const tipos_1 = require("./tipos");
24
+ const redux_typed_reducer_1 = require("redux-typed-reducer");
25
+ const likeAr = require("like-ar");
26
+ const bestGlobals = require("best-globals");
27
+ var my = myOwn;
28
+ const LOCAL_STORAGE_STATE_NAME = 'hdr-state';
29
+ function forPkToUrl(forPk, pilaForPk) {
30
+ var addrParams = myOwn.UriSearchToObject(location.hash || location.search || '');
31
+ myOwn.replaceAddrParams(Object.assign(Object.assign({}, addrParams), { state_forPk: forPk == null ? 'null' : (0, tipos_1.toPlainForPk)(forPk), state_pilaForPk: pilaForPk.map(tipos_1.toPlainForPk).join('|') }));
32
+ }
33
+ var reducers = {
34
+ MODO_DESPLIEGUE: (payload) => function (state) {
35
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { modoDespliegue: payload.modoDespliegue }) });
36
+ },
37
+ CAMBIAR_FORMULARIO: (payload) => function (state) {
38
+ var forPk = payload.forPk;
39
+ var pilaForPk = payload.apilarVuelta ? (state.opciones.forPk == null ? [] : [...state.opciones.pilaForPk, state.opciones.forPk]) : state.opciones.pilaForPk;
40
+ forPkToUrl(forPk, pilaForPk);
41
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { forPk,
42
+ pilaForPk }) });
43
+ },
44
+ VOLVER_DE_FORMULARIO: ({ magnitudRetroceso }) => function (state) {
45
+ var forPk = state.opciones.pilaForPk[state.opciones.pilaForPk.length - magnitudRetroceso] || null;
46
+ var pilaForPk = state.opciones.pilaForPk.slice(0, state.opciones.pilaForPk.length - magnitudRetroceso);
47
+ forPkToUrl(forPk, pilaForPk);
48
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { forPk,
49
+ pilaForPk }) });
50
+ },
51
+ ESTADO_CARGA: (payload) => function (state) {
52
+ return state;
53
+ //DESACTIVADO
54
+ //return {
55
+ // ...state,
56
+ // datos:{
57
+ // ...state.datos,
58
+ // cargas:{
59
+ // ...state.datos.cargas,
60
+ // [payload.idCarga]: {
61
+ // ...state.datos.cargas[payload.idCarga],
62
+ // estado_carga: payload.estado_carga
63
+ // }
64
+ // }
65
+ // }
66
+ //}
67
+ },
68
+ VOLVER_HDR: (_payload) => function (state) {
69
+ var forPk = null;
70
+ var pilaForPk = [];
71
+ forPkToUrl(forPk, pilaForPk);
72
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { forPk,
73
+ pilaForPk }) });
74
+ },
75
+ SET_OPCION: (payload) => function (state) {
76
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { [payload.opcion]: payload.valor }) });
77
+ },
78
+ RESET_OPCIONES: (_payload) => function (state) {
79
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { forPk: null }) });
80
+ },
81
+ REINICIAR_DEMO: (_payload) => function (state) {
82
+ if (!state.modo.demo)
83
+ return state;
84
+ return Object.assign(Object.assign({}, state), {
85
+ // @ts-ignore copio los datos iniciales
86
+ datos: bestGlobals.deepCopy(state.modo.demo) });
87
+ },
88
+ CONFIRMAR_BORRAR_RESPUESTA: (payload) => function (state) {
89
+ return Object.assign(Object.assign({}, state), { opciones: Object.assign(Object.assign({}, state.opciones), { forPk: payload.forPk, modoBorrarRespuesta: payload.variable }) });
90
+ },
91
+ };
92
+ /* FIN ACCIONES */
93
+ exports.dispatchers = (0, redux_typed_reducer_1.createDispatchers)(reducers);
94
+ const casilleroVacio = { salto: null, despliegue: null, aclaracion: null, ver_id: null, casilleros: [], leer: null,
95
+ despliegueEncabezado: null, despliegueContenido: null, despliegueOculta: null, despliegueTipoInput: null
96
+ };
97
+ const opcionesSiNo = [
98
+ Object.assign(Object.assign({}, casilleroVacio), { casillero: 1, tipoc: 'O', nombre: 'Sí' }),
99
+ Object.assign(Object.assign({}, casilleroVacio), { casillero: 2, tipoc: 'O', nombre: 'No' }),
100
+ ];
101
+ function aplanarLaCurva(casillerosData) {
102
+ var _a, _b, _c, _d, _e, _f, _g;
103
+ var data = casillerosData.data;
104
+ return Object.assign(Object.assign({}, data), { despliegueContenido: ((_a = data.despliegue) === null || _a === void 0 ? void 0 : _a.includes('horizontal')) ? 'horizontal' : ((_b = data.despliegue) === null || _b === void 0 ? void 0 : _b.includes('vertical')) ? 'vertical' : null, despliegueEncabezado: ((_c = data.despliegue) === null || _c === void 0 ? void 0 : _c.includes('lateral')) ? 'lateral' : ((_d = data.despliegue) === null || _d === void 0 ? void 0 : _d.includes('superior')) ? 'superior' : null, despliegueOculta: (_f = (_e = data.despliegue) === null || _e === void 0 ? void 0 : _e.includes('ocultar')) !== null && _f !== void 0 ? _f : null, despliegueTipoInput: ((_g = data.despliegue) === null || _g === void 0 ? void 0 : _g.includes('telefono')) ? 'tel' : null, casilleros: !casillerosData.childs.length && casillerosData.data.tipoc == 'OM' ? opcionesSiNo :
105
+ casillerosData.childs.map(casillero => aplanarLaCurva(casillero)) });
106
+ }
107
+ // type AnyRef<T extends {}>=[T, keyof T];
108
+ function rellenarVariablesYOpciones(idFormulario, estructura, casillero, unidadAnalisis, subordinadaVar, subordinadaValor) {
109
+ if (casillero.var_name != null || casillero.tipoc == 'FILTRO') {
110
+ var var_name;
111
+ if (casillero.tipoc == 'FILTRO') {
112
+ // @ts-ignore pongo como nombre de variable el filtro;
113
+ var_name = casillero.casillero;
114
+ }
115
+ else if (casillero.var_name.endsWith('!')) {
116
+ // @ts-ignore las variables espejo son las que terminan en !
117
+ var_name = casillero.var_name_especial.replace(/!+$/, '');
118
+ casillero.var_name = var_name;
119
+ }
120
+ else {
121
+ var_name = casillero.var_name;
122
+ }
123
+ let variableDef = {
124
+ tipo: casillero.tipoc == 'FILTRO' ? 'filtro' : casillero.tipoc == 'OM' || casillero.tipovar == 'si_no' ? 'opciones' : casillero.tipovar,
125
+ // @ts-ignore optativo podría no existir, quedará null.
126
+ optativa: casillero.optativo,
127
+ opciones: (casillero.tipoc == 'OM' || casillero.tipovar == 'opciones' || casillero.tipovar == 'si_no' ?
128
+ likeAr.createIndex(casillero.casilleros, 'casillero') : {}),
129
+ salto: casillero.salto,
130
+ saltoNsNr: 'salto_ns_nc' in casillero && casillero.salto_ns_nc || null,
131
+ funcionHabilitar: casillero.expresion_habilitar_js,
132
+ funcionAutoIngresar: casillero.expresion_autoingresar_js,
133
+ calculada:
134
+ // @ts-ignore // TODO. Averiguar si las preguntas y filtros pueden tener unidad de análisis
135
+ casillero.unidad_analisis && casillero.unidad_analisis != unidadAnalisis
136
+ || casillero.calculada,
137
+ libre: casillero.libre
138
+ };
139
+ if (subordinadaValor != undefined) {
140
+ variableDef.subordinadaVar = subordinadaVar;
141
+ variableDef.subordinadaValor = subordinadaValor;
142
+ }
143
+ estructura.variables[var_name] = variableDef;
144
+ }
145
+ else if (casillero.tipoc == 'BF') {
146
+ // var var_name = '$B.F:'+casillero.salto as IdVariable; //original
147
+ var saltoNombre = casillero.salto.substr(0, 2) == 'F:' ? casillero.salto.slice(2) : casillero.salto;
148
+ var var_name = '$B.F:' + saltoNombre;
149
+ casillero.var_name_BF = var_name;
150
+ let variableDef = Object.assign({ tipo: 'texto', libre: true }, (casillero.expresion_habilitar ? { funcionHabilitar: `valores['${casillero.expresion_habilitar}'] !==0 ` } : {}));
151
+ estructura.variables[var_name] = variableDef;
152
+ }
153
+ if (casillero.casilleros) {
154
+ casillero.casilleros.forEach((casilleroHijo) => rellenarVariablesYOpciones(idFormulario, estructura, casilleroHijo, unidadAnalisis, casillero.var_name ? casillero.var_name : casillero.tipoc == 'O' ? subordinadaVar : undefined, casillero.tipoc == 'O' ? casillero.casillero : undefined));
155
+ }
156
+ }
157
+ function obtenerDestinosCasilleros(casillero, destinos) {
158
+ if (destinos == null)
159
+ return obtenerDestinosCasilleros(casillero, {});
160
+ if (casillero.tipoc == 'FILTRO') {
161
+ destinos[casillero.casillero] = casillero.casillero;
162
+ }
163
+ else if (casillero.tipoc != 'F' && casillero.tipoc != 'O' && casillero.tipoc != 'OM') {
164
+ destinos[casillero.casillero] = casillero.primera_variable || null;
165
+ }
166
+ if (casillero.casilleros) {
167
+ casillero.casilleros.forEach(c => obtenerDestinosCasilleros(c, destinos));
168
+ }
169
+ return destinos;
170
+ }
171
+ function rellenarDestinos(estructura, destinos) {
172
+ function obtenerDestino(idVariableQueTieneUnDestino) {
173
+ return idVariableQueTieneUnDestino == 'fin' ? 'fin' : idVariableQueTieneUnDestino != null && destinos[idVariableQueTieneUnDestino] || null;
174
+ }
175
+ return Object.assign(Object.assign({}, estructura), { variables: likeAr(estructura.variables).map(variableDef => (Object.assign(Object.assign({}, variableDef), { salto: obtenerDestino(variableDef.salto), saltoNsNr: obtenerDestino(variableDef.saltoNsNr), opciones: variableDef.opciones != null ? likeAr(variableDef.opciones).map(opcionDef => ({ salto: obtenerDestino(opcionDef.salto) })).plain() : undefined }))).plain() });
176
+ }
177
+ function generarEstructuraRowValidator(casillero, idFormulario) {
178
+ var estructuraIncompleta = { variables: {}, marcaFin: 'fin' };
179
+ rellenarVariablesYOpciones(idFormulario, estructuraIncompleta, casillero,
180
+ // @ts-ignore ver si cualquier cosa puede tener unidad_analisis
181
+ casillero.unidad_analisis);
182
+ var destinos = obtenerDestinosCasilleros(casillero);
183
+ return rellenarDestinos(estructuraIncompleta, destinos);
184
+ }
185
+ function replaceSpecialWords(text, nombre, apellido, resultado) {
186
+ function capitalizeFirstLetter(text) {
187
+ return text.charAt(0).toUpperCase() + text.slice(1);
188
+ }
189
+ var simplificatedChars = {
190
+ "#nombre": capitalizeFirstLetter(nombre),
191
+ "#apellido": capitalizeFirstLetter(apellido),
192
+ "#resultado": resultado,
193
+ };
194
+ var re = new RegExp(Object.keys(simplificatedChars).join("|"), "gi");
195
+ return text.replace(re, function (matched) {
196
+ return simplificatedChars[matched.toLowerCase()];
197
+ });
198
+ }
199
+ exports.replaceSpecialWords = replaceSpecialWords;
200
+ function gotoSincronizar() {
201
+ history.replaceState(null, '', `${location.origin + location.pathname}/../menu#i=sincronizar`);
202
+ location.reload();
203
+ }
204
+ exports.gotoSincronizar = gotoSincronizar;
205
+ function gotoCampo() {
206
+ history.replaceState(null, '', `${location.origin + location.pathname}/../campo`);
207
+ location.reload();
208
+ }
209
+ exports.gotoCampo = gotoCampo;
210
+ function gotoConsistir(operativo, tarea, idEnc) {
211
+ history.replaceState(null, '', `${location.origin + location.pathname}/../menu#w=consistir_encuesta&up={"operativo":"${operativo}","tarea":"${tarea}","encuesta":${idEnc}}&autoproced=true`);
212
+ location.reload();
213
+ }
214
+ exports.gotoConsistir = gotoConsistir;
215
+ function getCacheVersion() {
216
+ return my.getLocalVar('app-cache-version');
217
+ }
218
+ exports.getCacheVersion = getCacheVersion;
219
+ var redirectIfNotLogged = function redirectIfNotLogged(err) {
220
+ if (err.message == my.messages.notLogged) {
221
+ setTimeout(() => {
222
+ history.replaceState(null, '', `${location.origin + location.pathname}/../login${location.hash}`);
223
+ location.reload();
224
+ }, 1500);
225
+ }
226
+ };
227
+ function traerEstructura(params) {
228
+ return __awaiter(this, void 0, void 0, function* () {
229
+ var estructura = yield my.ajax.operativo_estructura_completa(params);
230
+ var casillerosOriginales = estructura.formularios;
231
+ //TODO: GENERALIZAR
232
+ //@ts-ignore
233
+ // casillerosOriginales['F:F2_personas']=casillerosOriginales['F:F2'].childs.find(casillero=>casillero.data.casillero=='LP');
234
+ var mainForm;
235
+ //@ts-ignore
236
+ var casillerosTodosFormularios = likeAr(casillerosOriginales).map((casillerosJerarquizados, idFormulario) => {
237
+ var casillerosAplanados = aplanarLaCurva(casillerosJerarquizados);
238
+ if (casillerosAplanados.tipoc == 'F' && casillerosAplanados.formulario_principal) {
239
+ mainForm = idFormulario;
240
+ }
241
+ return {
242
+ casilleros: casillerosAplanados,
243
+ estructuraRowValidator: generarEstructuraRowValidator(casillerosAplanados, idFormulario)
244
+ };
245
+ }).plain();
246
+ estructura.formularios = casillerosTodosFormularios;
247
+ return estructura;
248
+ });
249
+ }
250
+ exports.traerEstructura = traerEstructura;
251
+ function dmTraerDatosFormulario(opts) {
252
+ return __awaiter(this, void 0, void 0, function* () {
253
+ var getCasoState = () => myOwn.getLocalVar(LOCAL_STORAGE_STATE_NAME);
254
+ var setCasoState = (casoState) => myOwn.setLocalVar(LOCAL_STORAGE_STATE_NAME, casoState);
255
+ var loadState = function loadState() {
256
+ return __awaiter(this, void 0, void 0, function* () {
257
+ var casoState = getCasoState();
258
+ var initialState = {
259
+ opciones: {
260
+ forPk: null,
261
+ pilaForPk: [],
262
+ modoDespliegue: 'relevamiento',
263
+ modoDirecto: false,
264
+ conCampoOpciones: false,
265
+ saltoAutomatico: true,
266
+ bienvenido: true,
267
+ modoBorrarRespuesta: null,
268
+ },
269
+ modo: {
270
+ //@ts-ignore es un booleano pero pongo ahí los datos de demo!
271
+ demo:
272
+ // @ts-ignore
273
+ myOwn.config.config.ambiente == 'test' || myOwn.config.config.ambiente == 'demo',
274
+ }
275
+ };
276
+ if (casoState) {
277
+ initialState = Object.assign(Object.assign({}, initialState), { opciones: casoState.opciones });
278
+ }
279
+ if (opts.forPkRaiz) {
280
+ initialState.opciones.forPk = opts.forPkRaiz;
281
+ initialState.opciones.modoDirecto = !!opts.forPkRaiz;
282
+ initialState.opciones.pilaForPk = [];
283
+ }
284
+ var addrParams = myOwn.UriSearchToObject(location.hash || location.search || '');
285
+ if (addrParams.state_forPk) {
286
+ initialState.opciones.forPk = JSON.parse(addrParams.state_forPk);
287
+ }
288
+ if (addrParams.state_pilaForPk) {
289
+ initialState.opciones.pilaForPk = addrParams.state_pilaForPk.split('|').map(j => JSON.parse(j));
290
+ }
291
+ return initialState;
292
+ });
293
+ };
294
+ var saveState = function saveState(state) {
295
+ setCasoState(state);
296
+ };
297
+ /* DEFINICION CONTROLADOR */
298
+ var initialState = yield loadState();
299
+ const hdrReducer = (0, redux_typed_reducer_1.createReducer)(reducers, initialState);
300
+ /* FIN DEFINICION CONTROLADOR */
301
+ /* CARGA Y GUARDADO DE STATE */
302
+ /* CREACION STORE */
303
+ const store = (0, redux_1.createStore)(hdrReducer, initialState);
304
+ saveState(store.getState());
305
+ store.subscribe(function () {
306
+ saveState(store.getState());
307
+ });
308
+ /* FIN CREACION STORE */
309
+ //HDR CON STORE CREADO
310
+ return store;
311
+ });
312
+ }
313
+ exports.dmTraerDatosFormulario = dmTraerDatosFormulario;
314
+ });
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtZm9ybXVsYXJpby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91bmxvZ2dlZC9yZWR1eC1mb3JtdWxhcmlvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLGlDQUFvQztJQUNwQyxtQ0FVaUI7SUFDakIsNkRBQW9GO0lBRXBGLGtDQUFrQztJQUNsQyw0Q0FBNEM7SUFJNUMsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDO0lBRWIsTUFBTSx3QkFBd0IsR0FBRSxXQUFXLENBQUM7SUFFNUMsU0FBUyxVQUFVLENBQUMsS0FBZ0IsRUFBRSxTQUFpQjtRQUNuRCxJQUFJLFVBQVUsR0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksSUFBRSxRQUFRLENBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxpQkFBaUIsaUNBQ2hCLFVBQVUsS0FDYixXQUFXLEVBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLG9CQUFZLEVBQUMsS0FBSyxDQUFDLEVBQ3hELGVBQWUsRUFBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQ3ZELENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxRQUFRLEdBQUM7UUFDVCxlQUFlLEVBQUUsQ0FBQyxPQUF3QyxFQUFFLEVBQUUsQ0FDMUQsVUFBUyxLQUFnQjtZQUNyQix1Q0FDTyxLQUFLLEtBQ1IsUUFBUSxrQ0FDRCxLQUFLLENBQUMsUUFBUSxLQUNqQixjQUFjLEVBQUMsT0FBTyxDQUFDLGNBQWMsT0FFNUM7UUFDTCxDQUFDO1FBQ0wsa0JBQWtCLEVBQUUsQ0FBQyxPQUE0QyxFQUFFLEVBQUUsQ0FDakUsVUFBUyxLQUFnQjtZQUNyQixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxD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U0FBUyxHQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDL0Y7b0JBQ0QsT0FBTyxZQUFZLENBQUM7Z0JBQ3hCLENBQUM7YUFBQSxDQUFBO1lBQ0QsSUFBSSxTQUFTLEdBQUcsU0FBUyxTQUFTLENBQUMsS0FBZTtnQkFDOUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQTtZQUNELDRCQUE0QjtZQUM1QixJQUFJLFlBQVksR0FBYSxNQUFNLFNBQVMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUEsbUNBQWEsRUFBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDekQsZ0NBQWdDO1lBQ2hDLCtCQUErQjtZQUMvQixvQkFBb0I7WUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBQSxtQkFBVyxFQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDNUIsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDWCxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFDSCx3QkFBd0I7WUFDeEIsc0JBQXNCO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7S0FBQTtJQTdERCx3REE2REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gXCJyZWR1eFwiO1xyXG5pbXBvcnQgeyBDYXNpbGxlcm9zSW1wbGVtZW50YWRvcywgQ2Fzb1N0YXRlLCBcclxuICAgIEVzdGFkb0NhcmdhLCBFc3RydWN0dXJhUm93VmFsaWRhdG9yLCBcclxuICAgIEZvcm11bGFyaW8sIEZvclBrLCBGb3JQa1JhaXosIFxyXG4gICAgSWRDYXJnYSwgSWREZXN0aW5vLCBJZEZvcm11bGFyaW8sIElkVmFyaWFibGUsIElkT3BlcmF0aXZvLCBcclxuICAgIE1vZG9EZXNwbGllZ3VlLCBcclxuICAgIE9wY2lvbixcclxuICAgIHRvUGxhaW5Gb3JQayxcclxuICAgIElkRmluLFxyXG4gICAgSWRFbmMsXHJcbiAgICBJZFRhcmVhLFxyXG59IGZyb20gXCIuL3RpcG9zXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVJlZHVjZXIsIGNyZWF0ZURpc3BhdGNoZXJzLCBBY3Rpb25zRnJvbSB9IGZyb20gXCJyZWR1eC10eXBlZC1yZWR1Y2VyXCI7XHJcbmltcG9ydCB7IE1vZG9BbG1hY2VuYW1pZW50byB9IGZyb20gXCIuL3RpcG9zXCJcclxuaW1wb3J0ICogYXMgbGlrZUFyIGZyb20gXCJsaWtlLWFyXCI7XHJcbmltcG9ydCAqIGFzIGJlc3RHbG9iYWxzIGZyb20gXCJiZXN0LWdsb2JhbHNcIjtcclxuXHJcbmltcG9ydCB7IE9wY2lvbiBhcyBSb3dWYWxpZGF0b3JPcGNpb24gfSBmcm9tIFwicm93LXZhbGlkYXRvclwiO1xyXG5cclxudmFyIG15PW15T3duO1xyXG5cclxuY29uc3QgTE9DQUxfU1RPUkFHRV9TVEFURV9OQU1FID0naGRyLXN0YXRlJztcclxuXHJcbmZ1bmN0aW9uIGZvclBrVG9VcmwoZm9yUGs6Rm9yUGt8bnVsbCwgcGlsYUZvclBrOkZvclBrW10pe1xyXG4gICAgdmFyIGFkZHJQYXJhbXM9bXlPd24uVXJpU2VhcmNoVG9PYmplY3QobG9jYXRpb24uaGFzaHx8bG9jYXRpb24uc2VhcmNofHwnJyk7XHJcbiAgICBteU93bi5yZXBsYWNlQWRkclBhcmFtcyh7XHJcbiAgICAgICAgLi4uYWRkclBhcmFtcywgXHJcbiAgICAgICAgc3RhdGVfZm9yUGs6Zm9yUGsgPT0gbnVsbCA/ICdudWxsJyA6IHRvUGxhaW5Gb3JQayhmb3JQayksIFxyXG4gICAgICAgIHN0YXRlX3BpbGFGb3JQazpwaWxhRm9yUGsubWFwKHRvUGxhaW5Gb3JQaykuam9pbignfCcpXHJcbiAgICB9KTtcclxufVxyXG5cclxudmFyIHJlZHVjZXJzPXtcclxuICAgIE1PRE9fREVTUExJRUdVRTogKHBheWxvYWQ6IHttb2RvRGVzcGxpZWd1ZTpNb2RvRGVzcGxpZWd1ZX0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBDYXNvU3RhdGUpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBvcGNpb25lczp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kb0Rlc3BsaWVndWU6cGF5bG9hZC5tb2RvRGVzcGxpZWd1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIENBTUJJQVJfRk9STVVMQVJJTzogKHBheWxvYWQ6IHtmb3JQazpGb3JQaywgYXBpbGFyVnVlbHRhOmJvb2xlYW59KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogQ2Fzb1N0YXRlKXtcclxuICAgICAgICAgICAgdmFyIGZvclBrID0gcGF5bG9hZC5mb3JQaztcclxuICAgICAgICAgICAgdmFyIHBpbGFGb3JQayA9IHBheWxvYWQuYXBpbGFyVnVlbHRhPyhcclxuICAgICAgICAgICAgICAgIHN0YXRlLm9wY2lvbmVzLmZvclBrPT1udWxsP1tdOlsuLi5zdGF0ZS5vcGNpb25lcy5waWxhRm9yUGssIHN0YXRlLm9wY2lvbmVzLmZvclBrXVxyXG4gICAgICAgICAgICApOnN0YXRlLm9wY2lvbmVzLnBpbGFGb3JQaztcclxuICAgICAgICAgICAgZm9yUGtUb1VybChmb3JQaywgcGlsYUZvclBrKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgb3BjaW9uZXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLm9wY2lvbmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvclBrLFxyXG4gICAgICAgICAgICAgICAgICAgIHBpbGFGb3JQa1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFZPTFZFUl9ERV9GT1JNVUxBUklPOiAoe21hZ25pdHVkUmV0cm9jZXNvfToge21hZ25pdHVkUmV0cm9jZXNvOm51bWJlcn0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBDYXNvU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIgZm9yUGsgPSBzdGF0ZS5vcGNpb25lcy5waWxhRm9yUGtbc3RhdGUub3BjaW9uZXMucGlsYUZvclBrLmxlbmd0aC1tYWduaXR1ZFJldHJvY2Vzb118fG51bGw7XHJcbiAgICAgICAgICAgIHZhciBwaWxhRm9yUGsgPSBzdGF0ZS5vcGNpb25lcy5waWxhRm9yUGsuc2xpY2UoMCxzdGF0ZS5vcGNpb25lcy5waWxhRm9yUGsubGVuZ3RoLW1hZ25pdHVkUmV0cm9jZXNvKTtcclxuICAgICAgICAgICAgZm9yUGtUb1VybChmb3JQaywgcGlsYUZvclBrKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgb3BjaW9uZXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLm9wY2lvbmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvclBrLFxyXG4gICAgICAgICAgICAgICAgICAgIHBpbGFGb3JQa1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIEVTVEFET19DQVJHQTogKHBheWxvYWQ6IHtpZENhcmdhOklkQ2FyZ2EsIGVzdGFkb19jYXJnYTpFc3RhZG9DYXJnYX0pID0+XHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IENhc29TdGF0ZSl7XHJcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZVxyXG4gICAgICAgICAgICAvL0RFU0FDVElWQURPXHJcbiAgICAgICAgICAgIC8vcmV0dXJuIHtcclxuICAgICAgICAgICAgLy8gICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgIC8vICAgIGRhdG9zOntcclxuICAgICAgICAgICAgLy8gICAgICAgIC4uLnN0YXRlLmRhdG9zLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgY2FyZ2FzOntcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAuLi5zdGF0ZS5kYXRvcy5jYXJnYXMsXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgW3BheWxvYWQuaWRDYXJnYV06IHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0b3MuY2FyZ2FzW3BheWxvYWQuaWRDYXJnYV0sXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGVzdGFkb19jYXJnYTogcGF5bG9hZC5lc3RhZG9fY2FyZ2FcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgIH1cclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfSxcclxuICAgIFZPTFZFUl9IRFI6IChfcGF5bG9hZDoge30pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBDYXNvU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIgZm9yUGsgPSBudWxsO1xyXG4gICAgICAgICAgICB2YXIgcGlsYUZvclBrOkZvclBrW10gPSBbXTtcclxuICAgICAgICAgICAgZm9yUGtUb1VybChmb3JQaywgcGlsYUZvclBrKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgb3BjaW9uZXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLm9wY2lvbmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvclBrLFxyXG4gICAgICAgICAgICAgICAgICAgIHBpbGFGb3JQa1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFNFVF9PUENJT046IChwYXlsb2FkOiB7b3BjaW9uOmtleW9mIENhc29TdGF0ZVsnb3BjaW9uZXMnXSwgdmFsb3I6YW55fSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IENhc29TdGF0ZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIG9wY2lvbmVzOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vcGNpb25lcyxcclxuICAgICAgICAgICAgICAgICAgICBbcGF5bG9hZC5vcGNpb25dOiBwYXlsb2FkLnZhbG9yXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgUkVTRVRfT1BDSU9ORVM6IChfcGF5bG9hZDoge30pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBDYXNvU3RhdGUpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBvcGNpb25lczp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yUGs6IG51bGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBSRUlOSUNJQVJfREVNTzogKF9wYXlsb2FkOiB7fSkgPT5cclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogQ2Fzb1N0YXRlKXtcclxuICAgICAgICAgICAgaWYoIXN0YXRlLm1vZG8uZGVtbykgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGNvcGlvIGxvcyBkYXRvcyBpbmljaWFsZXNcclxuICAgICAgICAgICAgICAgIGRhdG9zOmJlc3RHbG9iYWxzLmRlZXBDb3B5KHN0YXRlLm1vZG8uZGVtbylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBDT05GSVJNQVJfQk9SUkFSX1JFU1BVRVNUQTogKHBheWxvYWQ6IHtmb3JQazpGb3JQaywgdmFyaWFibGU6SWRWYXJpYWJsZXxudWxsfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IENhc29TdGF0ZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIG9wY2lvbmVzOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vcGNpb25lcyxcclxuICAgICAgICAgICAgICAgICAgICBmb3JQazpwYXlsb2FkLmZvclBrLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZG9Cb3JyYXJSZXNwdWVzdGE6IHBheWxvYWQudmFyaWFibGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEFjdGlvbkZvcm11bGFyaW9TdGF0ZSA9IEFjdGlvbnNGcm9tPHR5cGVvZiByZWR1Y2Vycz47XHJcbi8qIEZJTiBBQ0NJT05FUyAqL1xyXG5cclxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoZXJzID0gY3JlYXRlRGlzcGF0Y2hlcnMocmVkdWNlcnMpO1xyXG5cclxuaW50ZXJmYWNlIElEYXRhU2VwYXJhZGE8VCBleHRlbmRzIHt0aXBvYzpzdHJpbmd9PiB7XHJcbiAgICBkYXRhOlQsXHJcbiAgICBjaGlsZHM6SURhdGFTZXBhcmFkYTxUPltdXHJcbn1cclxuXHJcbnR5cGUgSURhdGFDb25DYXNpbGxlcm9zPFQ+ID0gVCAmIHtcclxuICAgIGNhc2lsbGVyb3M6cmVhZG9ubHkgSURhdGFDb25DYXNpbGxlcm9zPFQ+W11cclxufVxyXG5cclxuY29uc3QgY2FzaWxsZXJvVmFjaW89e3NhbHRvOm51bGwsIGRlc3BsaWVndWU6bnVsbCwgYWNsYXJhY2lvbjpudWxsLCB2ZXJfaWQ6bnVsbCwgY2FzaWxsZXJvczpbXSwgbGVlcjpudWxsLFxyXG4gICAgZGVzcGxpZWd1ZUVuY2FiZXphZG86bnVsbCwgZGVzcGxpZWd1ZUNvbnRlbmlkbzpudWxsLCBkZXNwbGllZ3VlT2N1bHRhOm51bGwsIGRlc3BsaWVndWVUaXBvSW5wdXQ6bnVsbFxyXG59XHJcblxyXG5jb25zdCBvcGNpb25lc1NpTm86IE9wY2lvbltdID0gW1xyXG4gICAgey4uLmNhc2lsbGVyb1ZhY2lvLCBjYXNpbGxlcm86MSwgdGlwb2M6J08nLCBub21icmU6J1PDrSd9LFxyXG4gICAgey4uLmNhc2lsbGVyb1ZhY2lvLCBjYXNpbGxlcm86MiwgdGlwb2M6J08nLCBub21icmU6J05vJ30sXHJcbl1cclxuXHJcbnR5cGUgQ2FyYWNlcml6YWNpb25Fc3RhZG9Sb3dWYWxpZGF0b3I9e1xyXG4gICAgY29ycmVjdG86Ym9vbGVhbixcclxuICAgIGNvblZhbG9yOmJvb2xlYW58bnVsbCwgLy8gbnVsbCA9IHVua25vd25cclxufVxyXG5cclxuZnVuY3Rpb24gYXBsYW5hckxhQ3VydmE8VCBleHRlbmRzIHt0aXBvYzpzdHJpbmcsIGRlc3BsaWVndWU/OnN0cmluZ30+KGNhc2lsbGVyb3NEYXRhOklEYXRhU2VwYXJhZGE8VD4pOklEYXRhQ29uQ2FzaWxsZXJvczxUfE9wY2lvbj57XHJcbiAgICB2YXIgZGF0YSA9IGNhc2lsbGVyb3NEYXRhLmRhdGFcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZGF0YSxcclxuICAgICAgICBkZXNwbGllZ3VlQ29udGVuaWRvOiBkYXRhLmRlc3BsaWVndWU/LmluY2x1ZGVzKCdob3Jpem9udGFsJyk/J2hvcml6b250YWwnOmRhdGEuZGVzcGxpZWd1ZT8uaW5jbHVkZXMoJ3ZlcnRpY2FsJyk/J3ZlcnRpY2FsJzpudWxsLFxyXG4gICAgICAgIGRlc3BsaWVndWVFbmNhYmV6YWRvOiBkYXRhLmRlc3BsaWVndWU/LmluY2x1ZGVzKCdsYXRlcmFsJyk/J2xhdGVyYWwnOmRhdGEuZGVzcGxpZWd1ZT8uaW5jbHVkZXMoJ3N1cGVyaW9yJyk/J3N1cGVyaW9yJzpudWxsLFxyXG4gICAgICAgIGRlc3BsaWVndWVPY3VsdGE6IGRhdGEuZGVzcGxpZWd1ZT8uaW5jbHVkZXMoJ29jdWx0YXInKT8/bnVsbCxcclxuICAgICAgICBkZXNwbGllZ3VlVGlwb0lucHV0OiBkYXRhLmRlc3BsaWVndWU/LmluY2x1ZGVzKCd0ZWxlZm9ubycpPyd0ZWwnOm51bGwsXHJcbiAgICAgICAgY2FzaWxsZXJvczogIWNhc2lsbGVyb3NEYXRhLmNoaWxkcy5sZW5ndGggJiYgY2FzaWxsZXJvc0RhdGEuZGF0YS50aXBvYz09J09NJyA/IG9wY2lvbmVzU2lObyA6XHJcbiAgICAgICAgICAgICBjYXNpbGxlcm9zRGF0YS5jaGlsZHMubWFwKGNhc2lsbGVybz0+YXBsYW5hckxhQ3VydmEoY2FzaWxsZXJvKSlcclxuICAgIH1cclxufVxyXG5cclxuLy8gdHlwZSBBbnlSZWY8VCBleHRlbmRzIHt9Pj1bVCwga2V5b2YgVF07XHJcblxyXG5mdW5jdGlvbiByZWxsZW5hclZhcmlhYmxlc1lPcGNpb25lcyhpZEZvcm11bGFyaW86SWRGb3JtdWxhcmlvLCBlc3RydWN0dXJhOkVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IsIGNhc2lsbGVybzpDYXNpbGxlcm9zSW1wbGVtZW50YWRvcywgdW5pZGFkQW5hbGlzaXM/OnN0cmluZ3xudWxsLFxyXG4gICAgc3Vib3JkaW5hZGFWYXI/OklkVmFyaWFibGUsIHN1Ym9yZGluYWRhVmFsb3I/OmFueVxyXG4pe1xyXG4gICAgaWYoY2FzaWxsZXJvLnZhcl9uYW1lICE9IG51bGwgfHwgY2FzaWxsZXJvLnRpcG9jPT0nRklMVFJPJyl7XHJcbiAgICAgICAgdmFyIHZhcl9uYW1lOklkVmFyaWFibGVcclxuICAgICAgICBpZihjYXNpbGxlcm8udGlwb2M9PSdGSUxUUk8nKXtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBwb25nbyBjb21vIG5vbWJyZSBkZSB2YXJpYWJsZSBlbCBmaWx0cm87XHJcbiAgICAgICAgICAgIHZhcl9uYW1lID0gY2FzaWxsZXJvLmNhc2lsbGVybztcclxuICAgICAgICB9ZWxzZSBpZihjYXNpbGxlcm8udmFyX25hbWUuZW5kc1dpdGgoJyEnKSl7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgbGFzIHZhcmlhYmxlcyBlc3Blam8gc29uIGxhcyBxdWUgdGVybWluYW4gZW4gIVxyXG4gICAgICAgICAgICB2YXJfbmFtZSA9IGNhc2lsbGVyby52YXJfbmFtZV9lc3BlY2lhbC5yZXBsYWNlKC8hKyQvLCcnKTtcclxuICAgICAgICAgICAgY2FzaWxsZXJvLnZhcl9uYW1lID0gdmFyX25hbWU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHZhcl9uYW1lID0gY2FzaWxsZXJvLnZhcl9uYW1lXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YXJpYWJsZURlZj17XHJcbiAgICAgICAgICAgIHRpcG86Y2FzaWxsZXJvLnRpcG9jPT0nRklMVFJPJz8nZmlsdHJvJzpjYXNpbGxlcm8udGlwb2M9PSdPTScgfHwgY2FzaWxsZXJvLnRpcG92YXI9PSdzaV9ubyc/J29wY2lvbmVzJzpjYXNpbGxlcm8udGlwb3ZhcixcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBvcHRhdGl2byBwb2Ryw61hIG5vIGV4aXN0aXIsIHF1ZWRhcsOhIG51bGwuXHJcbiAgICAgICAgICAgIG9wdGF0aXZhOmNhc2lsbGVyby5vcHRhdGl2byEsXHJcbiAgICAgICAgICAgIG9wY2lvbmVzOihjYXNpbGxlcm8udGlwb2M9PSdPTScgfHwgY2FzaWxsZXJvLnRpcG92YXI9PSdvcGNpb25lcycgfHwgY2FzaWxsZXJvLnRpcG92YXI9PSdzaV9ubyc/XHJcbiAgICAgICAgICAgICAgICBsaWtlQXIuY3JlYXRlSW5kZXgoY2FzaWxsZXJvLmNhc2lsbGVyb3MsICdjYXNpbGxlcm8nKTp7fSkgYXMgdW5rbm93biBhcyB7IFtrZXk6IHN0cmluZ106IFJvd1ZhbGlkYXRvck9wY2lvbjxJZFZhcmlhYmxlPiB9LFxyXG4gICAgICAgICAgICBzYWx0bzpjYXNpbGxlcm8uc2FsdG8gYXMgSWRWYXJpYWJsZSxcclxuICAgICAgICAgICAgc2FsdG9Oc05yOidzYWx0b19uc19uYycgaW4gY2FzaWxsZXJvICYmIGNhc2lsbGVyby5zYWx0b19uc19uYyB8fCBudWxsLFxyXG4gICAgICAgICAgICBmdW5jaW9uSGFiaWxpdGFyOmNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyX2pzLFxyXG4gICAgICAgICAgICBmdW5jaW9uQXV0b0luZ3Jlc2FyOmNhc2lsbGVyby5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzLFxyXG4gICAgICAgICAgICBjYWxjdWxhZGE6XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIC8vIFRPRE8uIEF2ZXJpZ3VhciBzaSBsYXMgcHJlZ3VudGFzIHkgZmlsdHJvcyBwdWVkZW4gdGVuZXIgdW5pZGFkIGRlIGFuw6FsaXNpc1xyXG4gICAgICAgICAgICAgICAgY2FzaWxsZXJvLnVuaWRhZF9hbmFsaXNpcyAmJiBjYXNpbGxlcm8udW5pZGFkX2FuYWxpc2lzIT11bmlkYWRBbmFsaXNpcyBcclxuICAgICAgICAgICAgICAgIHx8IGNhc2lsbGVyby5jYWxjdWxhZGEsXHJcbiAgICAgICAgICAgIGxpYnJlOmNhc2lsbGVyby5saWJyZVxyXG4gICAgICAgIH0gYXMgKHR5cGVvZiBlc3RydWN0dXJhLnZhcmlhYmxlcylbSWRWYXJpYWJsZV1cclxuICAgICAgICBpZihzdWJvcmRpbmFkYVZhbG9yICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlRGVmLnN1Ym9yZGluYWRhVmFyID0gc3Vib3JkaW5hZGFWYXI7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlRGVmLnN1Ym9yZGluYWRhVmFsb3IgPSBzdWJvcmRpbmFkYVZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlc3RydWN0dXJhLnZhcmlhYmxlc1t2YXJfbmFtZV09dmFyaWFibGVEZWY7XHJcbiAgICB9IGVsc2UgaWYgKGNhc2lsbGVyby50aXBvYz09J0JGJyl7XHJcbiAgICAgICAvLyB2YXIgdmFyX25hbWUgPSAnJEIuRjonK2Nhc2lsbGVyby5zYWx0byBhcyBJZFZhcmlhYmxlOyAgICAvL29yaWdpbmFsXHJcbiAgICAgICAgdmFyIHNhbHRvTm9tYnJlPWNhc2lsbGVyby5zYWx0byEuc3Vic3RyKDAsMik9PSdGOic/Y2FzaWxsZXJvLnNhbHRvIS5zbGljZSgyKTpjYXNpbGxlcm8uc2FsdG87XHJcbiAgICAgICAgdmFyIHZhcl9uYW1lID0gJyRCLkY6JytzYWx0b05vbWJyZSBhcyBJZFZhcmlhYmxlO1xyXG4gICAgICAgIGNhc2lsbGVyby52YXJfbmFtZV9CRiA9IHZhcl9uYW1lO1xyXG4gICAgICAgIGxldCB2YXJpYWJsZURlZj17XHJcbiAgICAgICAgICAgIHRpcG86J3RleHRvJyxcclxuICAgICAgICAgICAgbGlicmU6dHJ1ZSxcclxuICAgICAgICAgICAgLi4uKGNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyP3tmdW5jaW9uSGFiaWxpdGFyOmB2YWxvcmVzWycke2Nhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyfSddICE9PTAgYH06e30pLFxyXG4gICAgICAgIH1cclxuICAgICAgICBlc3RydWN0dXJhLnZhcmlhYmxlc1t2YXJfbmFtZV09dmFyaWFibGVEZWY7XHJcbiAgICB9XHJcbiAgICBpZihjYXNpbGxlcm8uY2FzaWxsZXJvcyl7XHJcbiAgICAgICAgY2FzaWxsZXJvLmNhc2lsbGVyb3MuZm9yRWFjaCgoY2FzaWxsZXJvSGlqbzpDYXNpbGxlcm9zSW1wbGVtZW50YWRvcyk9PlxyXG4gICAgICAgICAgICByZWxsZW5hclZhcmlhYmxlc1lPcGNpb25lcyhpZEZvcm11bGFyaW8sIGVzdHJ1Y3R1cmEsIGNhc2lsbGVyb0hpam8sIHVuaWRhZEFuYWxpc2lzLCBjYXNpbGxlcm8udmFyX25hbWU/Y2FzaWxsZXJvLnZhcl9uYW1lOmNhc2lsbGVyby50aXBvYz09J08nP3N1Ym9yZGluYWRhVmFyOnVuZGVmaW5lZCxjYXNpbGxlcm8udGlwb2M9PSdPJz9jYXNpbGxlcm8uY2FzaWxsZXJvOnVuZGVmaW5lZClcclxuICAgICAgICApXHJcbiAgICB9XHJcbn1cclxuXHJcbnR5cGUgUmVnaXN0cm9EZXN0aW5vcz17W2Rlc3Rpbm8gaW4gSWREZXN0aW5vXTpJZFZhcmlhYmxlfG51bGx9O1xyXG5cclxuZnVuY3Rpb24gb2J0ZW5lckRlc3Rpbm9zQ2FzaWxsZXJvcyhjYXNpbGxlcm86Q2FzaWxsZXJvc0ltcGxlbWVudGFkb3MsIGRlc3Rpbm9zPzpSZWdpc3Ryb0Rlc3Rpbm9zKTpSZWdpc3Ryb0Rlc3Rpbm9ze1xyXG4gICAgaWYoZGVzdGlub3M9PW51bGwpIHJldHVybiBvYnRlbmVyRGVzdGlub3NDYXNpbGxlcm9zKGNhc2lsbGVybywge30gYXMgUmVnaXN0cm9EZXN0aW5vcyk7XHJcbiAgICBpZihjYXNpbGxlcm8udGlwb2M9PSdGSUxUUk8nKXtcclxuICAgICAgICBkZXN0aW5vc1tjYXNpbGxlcm8uY2FzaWxsZXJvXT1jYXNpbGxlcm8uY2FzaWxsZXJvIGFzIElkVmFyaWFibGU7XHJcbiAgICB9ZWxzZSBpZihjYXNpbGxlcm8udGlwb2MhPSdGJyAmJiBjYXNpbGxlcm8udGlwb2MhPSdPJyAmJiBjYXNpbGxlcm8udGlwb2MhPSdPTScpe1xyXG4gICAgICAgIGRlc3Rpbm9zW2Nhc2lsbGVyby5jYXNpbGxlcm9dPWNhc2lsbGVyby5wcmltZXJhX3ZhcmlhYmxlfHxudWxsXHJcbiAgICB9XHJcbiAgICBpZihjYXNpbGxlcm8uY2FzaWxsZXJvcyl7XHJcbiAgICAgICAgY2FzaWxsZXJvLmNhc2lsbGVyb3MuZm9yRWFjaChjPT5vYnRlbmVyRGVzdGlub3NDYXNpbGxlcm9zKGMsZGVzdGlub3MpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZXN0aW5vcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVsbGVuYXJEZXN0aW5vcyhlc3RydWN0dXJhOkVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IsIGRlc3Rpbm9zOlJlZ2lzdHJvRGVzdGlub3MpOkVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3J7XHJcbiAgICBmdW5jdGlvbiBvYnRlbmVyRGVzdGlubyhpZFZhcmlhYmxlUXVlVGllbmVVbkRlc3Rpbm86SWRWYXJpYWJsZXxudWxsfHVuZGVmaW5lZHxJZEZpbik6SWRWYXJpYWJsZXxudWxse1xyXG4gICAgICAgIHJldHVybiBpZFZhcmlhYmxlUXVlVGllbmVVbkRlc3Rpbm89PSdmaW4nIGFzIElkVmFyaWFibGUgPyAnZmluJyBhcyBJZFZhcmlhYmxlIDogaWRWYXJpYWJsZVF1ZVRpZW5lVW5EZXN0aW5vIT1udWxsICYmIGRlc3Rpbm9zW2lkVmFyaWFibGVRdWVUaWVuZVVuRGVzdGlubyBhcyBJZERlc3Rpbm9dIHx8IG51bGxcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZXN0cnVjdHVyYSxcclxuICAgICAgICB2YXJpYWJsZXM6bGlrZUFyKGVzdHJ1Y3R1cmEudmFyaWFibGVzKS5tYXAodmFyaWFibGVEZWY9Pih7XHJcbiAgICAgICAgICAgIC4uLnZhcmlhYmxlRGVmLFxyXG4gICAgICAgICAgICBzYWx0bzpvYnRlbmVyRGVzdGlubyh2YXJpYWJsZURlZi5zYWx0byksXHJcbiAgICAgICAgICAgIHNhbHRvTnNOcjpvYnRlbmVyRGVzdGlubyh2YXJpYWJsZURlZi5zYWx0b05zTnIpLFxyXG4gICAgICAgICAgICBvcGNpb25lczp2YXJpYWJsZURlZi5vcGNpb25lcyE9bnVsbCA/IGxpa2VBcih2YXJpYWJsZURlZi5vcGNpb25lcykubWFwKG9wY2lvbkRlZj0+KHtzYWx0bzpvYnRlbmVyRGVzdGlubyhvcGNpb25EZWYuc2FsdG8pfSkpLnBsYWluKCk6dW5kZWZpbmVkXHJcbiAgICAgICAgfSkpLnBsYWluKClcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhckVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IoY2FzaWxsZXJvOkNhc2lsbGVyb3NJbXBsZW1lbnRhZG9zLCBpZEZvcm11bGFyaW86IElkRm9ybXVsYXJpbyk6RXN0cnVjdHVyYVJvd1ZhbGlkYXRvcntcclxuICAgIHZhciBlc3RydWN0dXJhSW5jb21wbGV0YTpFc3RydWN0dXJhUm93VmFsaWRhdG9yPXt2YXJpYWJsZXM6e30sIG1hcmNhRmluOidmaW4nfSBhcyB1bmtub3duIGFzIEVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3I7XHJcbiAgICByZWxsZW5hclZhcmlhYmxlc1lPcGNpb25lcyhpZEZvcm11bGFyaW8sIGVzdHJ1Y3R1cmFJbmNvbXBsZXRhLCBjYXNpbGxlcm8sIFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmVyIHNpIGN1YWxxdWllciBjb3NhIHB1ZWRlIHRlbmVyIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgIGNhc2lsbGVyby51bmlkYWRfYW5hbGlzaXNcclxuICAgICk7XHJcbiAgICB2YXIgZGVzdGlub3M9b2J0ZW5lckRlc3Rpbm9zQ2FzaWxsZXJvcyhjYXNpbGxlcm8pO1xyXG4gICAgcmV0dXJuIHJlbGxlbmFyRGVzdGlub3MoZXN0cnVjdHVyYUluY29tcGxldGEsIGRlc3Rpbm9zKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTcGVjaWFsV29yZHModGV4dDpzdHJpbmcsIG5vbWJyZTpzdHJpbmcsIGFwZWxsaWRvOnN0cmluZywgcmVzdWx0YWRvOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRleHQ6c3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xyXG4gICAgfVxyXG4gICAgdmFyIHNpbXBsaWZpY2F0ZWRDaGFyczp7W2s6c3RyaW5nXTpzdHJpbmd9PXtcclxuICAgICAgICBcIiNub21icmVcIjpjYXBpdGFsaXplRmlyc3RMZXR0ZXIobm9tYnJlKSxcclxuICAgICAgICBcIiNhcGVsbGlkb1wiOmNhcGl0YWxpemVGaXJzdExldHRlcihhcGVsbGlkbyksXHJcbiAgICAgICAgXCIjcmVzdWx0YWRvXCI6cmVzdWx0YWRvLFxyXG4gICAgfTtcclxuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMoc2ltcGxpZmljYXRlZENoYXJzKS5qb2luKFwifFwiKSxcImdpXCIpO1xyXG5cclxuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UocmUsIGZ1bmN0aW9uKG1hdGNoZWQpe1xyXG4gICAgICAgIHJldHVybiBzaW1wbGlmaWNhdGVkQ2hhcnNbbWF0Y2hlZC50b0xvd2VyQ2FzZSgpXTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ290b1NpbmNyb25pemFyKCl7XHJcbiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYCR7bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lfS8uLi9tZW51I2k9c2luY3Jvbml6YXJgKTtcclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpOyAgIFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ290b0NhbXBvKCl7XHJcbiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYCR7bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lfS8uLi9jYW1wb2ApO1xyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7ICAgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnb3RvQ29uc2lzdGlyKG9wZXJhdGl2bzpJZE9wZXJhdGl2byx0YXJlYTpJZFRhcmVhLCBpZEVuYzpJZEVuYyl7XHJcbiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYCR7bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lfS8uLi9tZW51I3c9Y29uc2lzdGlyX2VuY3Vlc3RhJnVwPXtcIm9wZXJhdGl2b1wiOlwiJHtvcGVyYXRpdm99XCIsXCJ0YXJlYVwiOlwiJHt0YXJlYX1cIixcImVuY3Vlc3RhXCI6JHtpZEVuY319JmF1dG9wcm9jZWQ9dHJ1ZWApO1xyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7ICAgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWNoZVZlcnNpb24oKXtcclxuICAgIHJldHVybiBteS5nZXRMb2NhbFZhcignYXBwLWNhY2hlLXZlcnNpb24nKTtcclxufVxyXG5cclxudmFyIHJlZGlyZWN0SWZOb3RMb2dnZWQgPSBmdW5jdGlvbiByZWRpcmVjdElmTm90TG9nZ2VkKGVycjpFcnJvcil7XHJcbiAgICBpZihlcnIubWVzc2FnZSA9PSBteS5tZXNzYWdlcy5ub3RMb2dnZWQpe1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIGAke2xvY2F0aW9uLm9yaWdpbitsb2NhdGlvbi5wYXRobmFtZX0vLi4vbG9naW4ke2xvY2F0aW9uLmhhc2h9YCk7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOyAgIFxyXG4gICAgICAgIH0sMTUwMClcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWVyRXN0cnVjdHVyYShwYXJhbXM6e29wZXJhdGl2bzogc3RyaW5nfSl7XHJcbiAgICB2YXIgZXN0cnVjdHVyYSA9ICBhd2FpdCBteS5hamF4Lm9wZXJhdGl2b19lc3RydWN0dXJhX2NvbXBsZXRhKHBhcmFtcyk7XHJcbiAgICB2YXIgY2FzaWxsZXJvc09yaWdpbmFsZXM6e30gPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zO1xyXG4gICAgLy9UT0RPOiBHRU5FUkFMSVpBUlxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICAvLyBjYXNpbGxlcm9zT3JpZ2luYWxlc1snRjpGMl9wZXJzb25hcyddPWNhc2lsbGVyb3NPcmlnaW5hbGVzWydGOkYyJ10uY2hpbGRzLmZpbmQoY2FzaWxsZXJvPT5jYXNpbGxlcm8uZGF0YS5jYXNpbGxlcm89PSdMUCcpO1xyXG4gICAgdmFyIG1haW5Gb3JtOklkRm9ybXVsYXJpb3x1bmRlZmluZWQ7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIHZhciBjYXNpbGxlcm9zVG9kb3NGb3JtdWxhcmlvczp7W2YgaW4gSWRGb3JtdWxhcmlvXTp7Y2FzaWxsZXJvczpGb3JtdWxhcmlvLCBlc3RydWN0dXJhUm93VmFsaWRhdG9yOkVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3J9fT1cclxuICAgICAgICBsaWtlQXIoY2FzaWxsZXJvc09yaWdpbmFsZXMpLm1hcChcclxuICAgICAgICAgICAgKGNhc2lsbGVyb3NKZXJhcnF1aXphZG9zOmFueSwgaWRGb3JtdWxhcmlvKT0+e1xyXG4gICAgICAgICAgICAgICAgdmFyIGNhc2lsbGVyb3NBcGxhbmFkb3M6Q2FzaWxsZXJvc0ltcGxlbWVudGFkb3MgPSBhcGxhbmFyTGFDdXJ2YShjYXNpbGxlcm9zSmVyYXJxdWl6YWRvcyk7XHJcbiAgICAgICAgICAgICAgICBpZihjYXNpbGxlcm9zQXBsYW5hZG9zLnRpcG9jPT0nRicgJiYgY2FzaWxsZXJvc0FwbGFuYWRvcy5mb3JtdWxhcmlvX3ByaW5jaXBhbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFpbkZvcm09aWRGb3JtdWxhcmlvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm9zOiBjYXNpbGxlcm9zQXBsYW5hZG9zLFxyXG4gICAgICAgICAgICAgICAgICAgIGVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3I6IGdlbmVyYXJFc3RydWN0dXJhUm93VmFsaWRhdG9yKGNhc2lsbGVyb3NBcGxhbmFkb3MsIGlkRm9ybXVsYXJpbylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICkucGxhaW4oKTtcclxuICAgIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MgPSBjYXNpbGxlcm9zVG9kb3NGb3JtdWxhcmlvc1xyXG4gICAgcmV0dXJuIGVzdHJ1Y3R1cmE7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkbVRyYWVyRGF0b3NGb3JtdWxhcmlvKG9wdHM6e29wZXJhdGl2bzpJZE9wZXJhdGl2bywgbW9kb0RlbW86Ym9vbGVhbiwgZm9yUGtSYWl6PzpGb3JQa1JhaXp9KXtcclxuICAgIHZhciBnZXRDYXNvU3RhdGU9KCk6Q2Fzb1N0YXRlPT4gbXlPd24uZ2V0TG9jYWxWYXIoTE9DQUxfU1RPUkFHRV9TVEFURV9OQU1FKTtcclxuICAgIHZhciBzZXRDYXNvU3RhdGU9KGNhc29TdGF0ZTpDYXNvU3RhdGUpPT4gbXlPd24uc2V0TG9jYWxWYXIoTE9DQUxfU1RPUkFHRV9TVEFURV9OQU1FLCBjYXNvU3RhdGUpO1xyXG4gICAgXHJcbiAgICB2YXIgbG9hZFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXRlKCk6UHJvbWlzZTxDYXNvU3RhdGU+e1xyXG4gICAgICAgIHZhciBjYXNvU3RhdGU6Q2Fzb1N0YXRlfG51bGwgPSBnZXRDYXNvU3RhdGUoKTtcclxuICAgICAgICB2YXIgaW5pdGlhbFN0YXRlID0ge1xyXG4gICAgICAgICAgICBvcGNpb25lczp7XHJcbiAgICAgICAgICAgICAgICBmb3JQazpudWxsLFxyXG4gICAgICAgICAgICAgICAgcGlsYUZvclBrOltdLFxyXG4gICAgICAgICAgICAgICAgbW9kb0Rlc3BsaWVndWU6J3JlbGV2YW1pZW50bycsXHJcbiAgICAgICAgICAgICAgICBtb2RvRGlyZWN0bzpmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbkNhbXBvT3BjaW9uZXM6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzYWx0b0F1dG9tYXRpY286dHJ1ZSwgXHJcbiAgICAgICAgICAgICAgICBiaWVudmVuaWRvOnRydWUsXHJcbiAgICAgICAgICAgICAgICBtb2RvQm9ycmFyUmVzcHVlc3RhOm51bGwsXHJcbiAgICAgICAgICAgIH0gYXMgQ2Fzb1N0YXRlW1wib3BjaW9uZXNcIl0sIC8vIHBvbmVyIGxvcyB2YWxvcmVzIHBvciBkZWZlY3RvIG3DoXMgYWJham9cclxuICAgICAgICAgICAgbW9kbzp7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgZXMgdW4gYm9vbGVhbm8gcGVybyBwb25nbyBhaMOtIGxvcyBkYXRvcyBkZSBkZW1vIVxyXG4gICAgICAgICAgICAgICAgZGVtbzogXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIG15T3duLmNvbmZpZy5jb25maWcuYW1iaWVudGU9PSd0ZXN0JyB8fCBteU93bi5jb25maWcuY29uZmlnLmFtYmllbnRlPT0nZGVtbycsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGFzIENhc29TdGF0ZTtcclxuICAgICAgICBpZihjYXNvU3RhdGUpe1xyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5pbml0aWFsU3RhdGUsIFxyXG4gICAgICAgICAgICAgICAgb3BjaW9uZXM6Y2Fzb1N0YXRlLm9wY2lvbmVzLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG9wdHMuZm9yUGtSYWl6KXtcclxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlLm9wY2lvbmVzLmZvclBrPW9wdHMuZm9yUGtSYWl6O1xyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGUub3BjaW9uZXMubW9kb0RpcmVjdG89ISFvcHRzLmZvclBrUmFpejtcclxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlLm9wY2lvbmVzLnBpbGFGb3JQaz1bXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFkZHJQYXJhbXM9bXlPd24uVXJpU2VhcmNoVG9PYmplY3QobG9jYXRpb24uaGFzaHx8bG9jYXRpb24uc2VhcmNofHwnJyk7XHJcbiAgICAgICAgaWYoYWRkclBhcmFtcy5zdGF0ZV9mb3JQayl7XHJcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZS5vcGNpb25lcy5mb3JQaz1KU09OLnBhcnNlKGFkZHJQYXJhbXMuc3RhdGVfZm9yUGspO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihhZGRyUGFyYW1zLnN0YXRlX3BpbGFGb3JQayl7XHJcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZS5vcGNpb25lcy5waWxhRm9yUGs9YWRkclBhcmFtcy5zdGF0ZV9waWxhRm9yUGsuc3BsaXQoJ3wnKS5tYXAoaj0+SlNPTi5wYXJzZShqKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XHJcbiAgICB9XHJcbiAgICB2YXIgc2F2ZVN0YXRlID0gZnVuY3Rpb24gc2F2ZVN0YXRlKHN0YXRlOkNhc29TdGF0ZSl7XHJcbiAgICAgICAgc2V0Q2Fzb1N0YXRlKHN0YXRlKTtcclxuICAgIH1cclxuICAgIC8qIERFRklOSUNJT04gQ09OVFJPTEFET1IgKi9cclxuICAgIHZhciBpbml0aWFsU3RhdGU6Q2Fzb1N0YXRlID0gYXdhaXQgbG9hZFN0YXRlKCk7XHJcbiAgICBjb25zdCBoZHJSZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihyZWR1Y2VycywgaW5pdGlhbFN0YXRlKTtcclxuICAgIC8qIEZJTiBERUZJTklDSU9OIENPTlRST0xBRE9SICovXHJcbiAgICAvKiBDQVJHQSBZIEdVQVJEQURPIERFIFNUQVRFICovXHJcbiAgICAvKiBDUkVBQ0lPTiBTVE9SRSAqL1xyXG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShoZHJSZWR1Y2VyLCBpbml0aWFsU3RhdGUpOyBcclxuICAgIHNhdmVTdGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgIHN0b3JlLnN1YnNjcmliZShmdW5jdGlvbigpe1xyXG4gICAgICAgICBzYXZlU3RhdGUoc3RvcmUuZ2V0U3RhdGUoKSk7XHJcbiAgICB9KTtcclxuICAgIC8qIEZJTiBDUkVBQ0lPTiBTVE9SRSAqL1xyXG4gICAgLy9IRFIgQ09OIFNUT1JFIENSRUFET1xyXG4gICAgcmV0dXJuIHN0b3JlO1xyXG59Il19