dmencu 3.2.20 → 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 (228) 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.d.ts +7 -0
  7. package/dist/client/unlogged/calculos-encuesta.js +213 -0
  8. package/dist/client/unlogged/helpers-casilleros.d.ts +14 -0
  9. package/dist/client/unlogged/helpers-casilleros.js +123 -0
  10. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  11. package/dist/client/unlogged/helpers-formulario.js +88 -0
  12. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  13. package/dist/client/unlogged/redux-formulario.js +21 -31
  14. package/dist/client/unlogged/render-formulario.d.ts +2 -6
  15. package/dist/client/unlogged/render-formulario.js +29 -68
  16. package/dist/client/unlogged/render-formulario.tsx +29 -57
  17. package/dist/client/unlogged/render-general.js +1 -1
  18. package/dist/client/unlogged/render-general.tsx +1 -1
  19. package/dist/client/unlogged/tipos.d.ts +74 -40
  20. package/dist/client/unlogged/tipos.js +1 -1
  21. package/dist/server/app-dmencu.d.ts +1428 -0
  22. package/dist/server/app-dmencu.js +1054 -0
  23. package/dist/server/def-config.d.ts +1 -0
  24. package/dist/server/def-config.js +123 -0
  25. package/dist/server/procedures-dmencu.d.ts +43 -0
  26. package/dist/server/procedures-dmencu.js +2295 -0
  27. package/dist/server/server/app-dmencu.d.ts +42 -91
  28. package/dist/server/server/app-dmencu.js +114 -52
  29. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  30. package/dist/server/server/procedures-dmencu.js +217 -78
  31. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  32. package/dist/server/server/setters-rea-no-rea.js +35 -0
  33. package/dist/server/server/table-areas.js +4 -4
  34. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  35. package/dist/server/server/table-control_campo.js +4 -4
  36. package/dist/server/server/table-no_rea.js +4 -2
  37. package/dist/server/server/table-no_rea_sup.js +7 -3
  38. package/dist/server/server/table-personal.js +1 -1
  39. package/dist/server/server/table-rea.js +9 -5
  40. package/dist/server/server/table-rea_sup.js +8 -4
  41. package/dist/server/server/table-tareas_tem.js +2 -2
  42. package/dist/server/server/table-tem.js +2 -2
  43. package/dist/server/server/types-dmencu.d.ts +34 -2
  44. package/dist/server/server/types-dmencu.js +2 -1
  45. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  46. package/dist/server/setters-rea-no-rea.js +35 -0
  47. package/dist/server/table-acciones.d.ts +2 -0
  48. package/dist/server/table-acciones.js +45 -0
  49. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  50. package/dist/server/table-area_enc_proximas.js +30 -0
  51. package/dist/server/table-areas.d.ts +4 -0
  52. package/dist/server/table-areas.js +112 -0
  53. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  54. package/dist/server/table-areas_asignacion_general.js +86 -0
  55. package/dist/server/table-barrios.d.ts +2 -0
  56. package/dist/server/table-barrios.js +35 -0
  57. package/dist/server/table-comunas.d.ts +2 -0
  58. package/dist/server/table-comunas.js +33 -0
  59. package/dist/server/table-control_campo.d.ts +12 -0
  60. package/dist/server/table-control_campo.js +119 -0
  61. package/dist/server/table-control_dias_carga.d.ts +2 -0
  62. package/dist/server/table-control_dias_carga.js +63 -0
  63. package/dist/server/table-control_resumen.d.ts +2 -0
  64. package/dist/server/table-control_resumen.js +19 -0
  65. package/dist/server/table-diccionario.d.ts +2 -0
  66. package/dist/server/table-diccionario.js +32 -0
  67. package/dist/server/table-dictra.d.ts +2 -0
  68. package/dist/server/table-dictra.js +46 -0
  69. package/dist/server/table-dicvar.d.ts +2 -0
  70. package/dist/server/table-dicvar.js +32 -0
  71. package/dist/server/table-encuestadores.d.ts +13 -0
  72. package/dist/server/table-encuestadores.js +75 -0
  73. package/dist/server/table-estados.d.ts +2 -0
  74. package/dist/server/table-estados.js +47 -0
  75. package/dist/server/table-estados_acciones.d.ts +2 -0
  76. package/dist/server/table-estados_acciones.js +40 -0
  77. package/dist/server/table-fracciones.d.ts +2 -0
  78. package/dist/server/table-fracciones.js +37 -0
  79. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  80. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  81. package/dist/server/table-historial_tem.d.ts +2 -0
  82. package/dist/server/table-historial_tem.js +57 -0
  83. package/dist/server/table-hogares.d.ts +2 -0
  84. package/dist/server/table-hogares.js +156 -0
  85. package/dist/server/table-hogares_sup.d.ts +2 -0
  86. package/dist/server/table-hogares_sup.js +191 -0
  87. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  88. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  89. package/dist/server/table-manzanas.d.ts +2 -0
  90. package/dist/server/table-manzanas.js +36 -0
  91. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  92. package/dist/server/table-mis_encuestadores.js +77 -0
  93. package/dist/server/table-mis_tareas.d.ts +2 -0
  94. package/dist/server/table-mis_tareas.js +18 -0
  95. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  96. package/dist/server/table-mis_tareas_areas.js +20 -0
  97. package/dist/server/table-modos_dm.d.ts +2 -0
  98. package/dist/server/table-modos_dm.js +28 -0
  99. package/dist/server/table-no_rea.js +38 -0
  100. package/dist/server/table-no_rea_sup.js +36 -0
  101. package/dist/server/table-operaciones.d.ts +2 -0
  102. package/dist/server/table-operaciones.js +30 -0
  103. package/dist/server/table-parametros.d.ts +2 -0
  104. package/dist/server/table-parametros.js +40 -0
  105. package/dist/server/table-permisos.d.ts +2 -0
  106. package/dist/server/table-permisos.js +31 -0
  107. package/dist/server/table-personal.d.ts +5 -0
  108. package/dist/server/table-personal.js +62 -0
  109. package/dist/server/table-personal_rol.d.ts +2 -0
  110. package/dist/server/table-personal_rol.js +42 -0
  111. package/dist/server/table-personas.d.ts +2 -0
  112. package/dist/server/table-personas.js +448 -0
  113. package/dist/server/table-personas_sup.d.ts +2 -0
  114. package/dist/server/table-personas_sup.js +93 -0
  115. package/dist/server/table-radios.d.ts +2 -0
  116. package/dist/server/table-radios.js +37 -0
  117. package/dist/server/table-rea.d.ts +2 -0
  118. package/dist/server/table-rea.js +38 -0
  119. package/dist/server/table-rea_sup.d.ts +2 -0
  120. package/dist/server/table-rea_sup.js +38 -0
  121. package/dist/server/table-recepcionistas.d.ts +2 -0
  122. package/dist/server/table-recepcionistas.js +18 -0
  123. package/dist/server/table-recuperadores.d.ts +2 -0
  124. package/dist/server/table-recuperadores.js +18 -0
  125. package/dist/server/table-roles.d.ts +2 -0
  126. package/dist/server/table-roles.js +33 -0
  127. package/dist/server/table-roles_permisos.d.ts +2 -0
  128. package/dist/server/table-roles_permisos.js +36 -0
  129. package/dist/server/table-roles_subordinados.d.ts +2 -0
  130. package/dist/server/table-roles_subordinados.js +31 -0
  131. package/dist/server/table-semanas.d.ts +2 -0
  132. package/dist/server/table-semanas.js +42 -0
  133. package/dist/server/table-sincronizaciones.d.ts +2 -0
  134. package/dist/server/table-sincronizaciones.js +30 -0
  135. package/dist/server/table-supervisores.d.ts +2 -0
  136. package/dist/server/table-supervisores.js +18 -0
  137. package/dist/server/table-tareas.d.ts +2 -0
  138. package/dist/server/table-tareas.js +48 -0
  139. package/dist/server/table-tareas_areas.d.ts +7 -0
  140. package/dist/server/table-tareas_areas.js +112 -0
  141. package/dist/server/table-tareas_proximas.d.ts +2 -0
  142. package/dist/server/table-tareas_proximas.js +48 -0
  143. package/dist/server/table-tareas_tem.d.ts +14 -0
  144. package/dist/server/table-tareas_tem.js +206 -0
  145. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  146. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  147. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  148. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  149. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  150. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  151. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  152. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  153. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  154. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  155. package/dist/server/table-tem.d.ts +3 -0
  156. package/dist/server/table-tem.js +247 -0
  157. package/dist/server/table-tem_asignacion.d.ts +2 -0
  158. package/dist/server/table-tem_asignacion.js +50 -0
  159. package/dist/server/table-tem_borradas.d.ts +2 -0
  160. package/dist/server/table-tem_borradas.js +35 -0
  161. package/dist/server/table-usuarios.d.ts +2 -0
  162. package/dist/server/table-usuarios.js +63 -0
  163. package/dist/server/table-visitas.d.ts +2 -0
  164. package/dist/server/table-visitas.js +91 -0
  165. package/dist/server/table-visitas_sup.d.ts +2 -0
  166. package/dist/server/table-visitas_sup.js +91 -0
  167. package/dist/server/table-viviendas.d.ts +2 -0
  168. package/dist/server/table-viviendas.js +299 -0
  169. package/dist/server/types-dmencu.d.ts +95 -0
  170. package/dist/server/types-dmencu.js +34 -0
  171. package/dist/server/unlogged/tipos.d.ts +74 -40
  172. package/dist/server/unlogged/tipos.js +1 -1
  173. package/dist/test/app-para-tests.d.ts +1115 -0
  174. package/dist/test/app-para-tests.js +95 -0
  175. package/dist/test/test-caches-rea.d.ts +1 -0
  176. package/dist/test/test-caches-rea.js +243 -0
  177. package/dist/test/test-ejemplo.d.ts +1 -0
  178. package/dist/test/test-ejemplo.js +29 -0
  179. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  180. package/dist/test/test-helpers-casilleros.js +154 -0
  181. package/dist/test/test-helpers-formulario.d.ts +1 -0
  182. package/dist/test/test-helpers-formulario.js +95 -0
  183. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  184. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  185. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  186. package/dist/test/test-menu-segun-rol.js +170 -0
  187. package/dist/test/test-rea-no-rea.d.ts +1 -0
  188. package/dist/test/test-rea-no-rea.js +589 -0
  189. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  190. package/dist/test/test-setters-rea-no-rea.js +95 -0
  191. package/dist/test/test.d.ts +8 -0
  192. package/dist/test/test.js +21 -0
  193. package/dist/unlogged/calculos-encuesta.d.ts +7 -0
  194. package/dist/unlogged/calculos-encuesta.js +213 -0
  195. package/dist/unlogged/helpers-casilleros.d.ts +14 -0
  196. package/dist/unlogged/helpers-casilleros.js +123 -0
  197. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  198. package/dist/unlogged/helpers-formulario.js +88 -0
  199. package/dist/unlogged/tipos.d.ts +575 -0
  200. package/dist/unlogged/tipos.js +21 -0
  201. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  202. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  203. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  204. package/dist/unlogged/unlogged/calculos-encuesta.d.ts +7 -0
  205. package/dist/unlogged/unlogged/calculos-encuesta.js +213 -0
  206. package/dist/unlogged/unlogged/helpers-casilleros.d.ts +14 -0
  207. package/dist/unlogged/unlogged/helpers-casilleros.js +123 -0
  208. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  209. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  210. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  211. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  212. package/dist/unlogged/unlogged/render-formulario.d.ts +2 -6
  213. package/dist/unlogged/unlogged/render-formulario.js +29 -68
  214. package/dist/unlogged/unlogged/render-formulario.tsx +29 -57
  215. package/dist/unlogged/unlogged/render-general.js +1 -1
  216. package/dist/unlogged/unlogged/render-general.tsx +1 -1
  217. package/dist/unlogged/unlogged/tipos.d.ts +74 -40
  218. package/dist/unlogged/unlogged/tipos.js +1 -1
  219. package/dist/unlogged/unlogged/unlogged.js +2 -2
  220. package/install/accion_cumple_condicion.sql +1 -1
  221. package/install/generador_accion_cumple_condicion.sql +2 -2
  222. package/install/tarea_cumple_condicion.sql +1 -1
  223. package/install/xcalcular_resultado_trg.sql +1 -1
  224. package/package.json +20 -17
  225. package/dist/server/server/table-no_rea copy.js +0 -38
  226. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  227. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  228. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -0,0 +1,1054 @@
1
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
+ if (k2 === undefined) k2 = k;
3
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
+ desc = { enumerable: true, get: function() { return m[k]; } };
6
+ }
7
+ Object.defineProperty(o, k2, desc);
8
+ }) : (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ o[k2] = m[k];
11
+ }));
12
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
+ };
15
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
+ return new (P || (P = Promise))(function (resolve, reject) {
18
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
22
+ });
23
+ };
24
+ (function (factory) {
25
+ if (typeof module === "object" && typeof module.exports === "object") {
26
+ var v = factory(require, exports);
27
+ if (v !== undefined) module.exports = v;
28
+ }
29
+ else if (typeof define === "function" && define.amd) {
30
+ define(["require", "exports", "procesamiento", "./procedures-dmencu", "pg-promise-strict", "mini-tools", "cast-error", "yazl", "express", "fs", "./table-roles", "./table-personal", "./table-recepcionistas", "./table-encuestadores", "./table-encuestadores", "./table-encuestadores", "./table-encuestadores", "./table-mis_encuestadores", "./table-recuperadores", "./table-supervisores", "./table-personal_rol", "./table-permisos", "./table-roles_permisos", "./table-modos_dm", "./table-parametros", "./table-roles_subordinados", "./table-no_rea", "./table-no_rea_sup", "./table-rea", "./table-rea_sup", "./table-tem", "./table-semanas", "./table-usuarios", "./table-operaciones", "./table-comunas", "./table-areas", "./table-sincronizaciones", "./table-tareas", "./table-tareas_tem", "./table-tareas_areas", "./table-areas_asignacion_general", "./table-grilla_hoja_ruta", "./table-tareas_areas", "./table-tareas_areas", "./table-tareas_areas", "./table-tareas_areas", "./table-mis_tareas", "./table-tem_asignacion", "./table-tareas_tem_recepcion", "./table-tareas_tem_ingreso", "./table-tareas_tem_fin_campo", "./table-tareas_tem_procesamiento", "./table-tareas_tem_analisis_campo", "./table-mis_tareas_areas", "./table-control_campo", "./table-control_resumen", "./table-control_dias_carga", "./table-viviendas", "./table-visitas", "./table-hogares", "./table-personas", "./table-visitas_sup", "./table-hogares_sup", "./table-personas_sup", "./table-diccionario", "./table-dictra", "./table-dicvar", "./table-estados", "./table-acciones", "./table-estados_acciones", "./table-tareas_proximas", "./table-historial_tem", "./table-inconsistencias_cumplen_condicion", "./table-tem_borradas", "./table-barrios", "./table-fracciones", "./table-radios", "./table-manzanas", "./table-area_enc_proximas", "./types-dmencu", "./def-config", "best-globals"], factory);
31
+ }
32
+ })(function (require, exports) {
33
+ "use strict";
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.AppDmEncu = exports.TABLAS_REA_NO_REA = exports.TABLAS_ESTRUCTURA = void 0;
36
+ exports.getModoByPolicy = getModoByPolicy;
37
+ exports.permisosSegunUsuario = permisosSegunUsuario;
38
+ exports.refrescarEstructuraAlModificarTabla = refrescarEstructuraAlModificarTabla;
39
+ exports.emergeAppDmEncu = emergeAppDmEncu;
40
+ const procesamiento_1 = require("procesamiento");
41
+ const procedures_dmencu_1 = require("./procedures-dmencu");
42
+ const pg = require("pg-promise-strict");
43
+ const miniTools = require("mini-tools");
44
+ const cast_error_1 = require("cast-error");
45
+ const yazl = require("yazl");
46
+ const express = require("express");
47
+ const fs_1 = require("fs");
48
+ const table_roles_1 = require("./table-roles");
49
+ const table_personal_1 = require("./table-personal");
50
+ const table_recepcionistas_1 = require("./table-recepcionistas");
51
+ const table_encuestadores_1 = require("./table-encuestadores");
52
+ const table_encuestadores_2 = require("./table-encuestadores");
53
+ const table_encuestadores_3 = require("./table-encuestadores");
54
+ const table_encuestadores_4 = require("./table-encuestadores");
55
+ const table_mis_encuestadores_1 = require("./table-mis_encuestadores");
56
+ const table_recuperadores_1 = require("./table-recuperadores");
57
+ const table_supervisores_1 = require("./table-supervisores");
58
+ const table_personal_rol_1 = require("./table-personal_rol");
59
+ const table_permisos_1 = require("./table-permisos");
60
+ const table_roles_permisos_1 = require("./table-roles_permisos");
61
+ const table_modos_dm_1 = require("./table-modos_dm");
62
+ const table_parametros_1 = require("./table-parametros");
63
+ const table_roles_subordinados_1 = require("./table-roles_subordinados");
64
+ const table_no_rea_1 = require("./table-no_rea");
65
+ const table_no_rea_sup_1 = require("./table-no_rea_sup");
66
+ const table_rea_1 = require("./table-rea");
67
+ const table_rea_sup_1 = require("./table-rea_sup");
68
+ const table_tem_1 = require("./table-tem");
69
+ const table_semanas_1 = require("./table-semanas");
70
+ const table_usuarios_1 = require("./table-usuarios");
71
+ const table_operaciones_1 = require("./table-operaciones");
72
+ const table_comunas_1 = require("./table-comunas");
73
+ const table_areas_1 = require("./table-areas");
74
+ const table_sincronizaciones_1 = require("./table-sincronizaciones");
75
+ const table_tareas_1 = require("./table-tareas");
76
+ const table_tareas_tem_1 = require("./table-tareas_tem");
77
+ const table_tareas_areas_1 = require("./table-tareas_areas");
78
+ const table_areas_asignacion_general_1 = require("./table-areas_asignacion_general");
79
+ const table_grilla_hoja_ruta_1 = require("./table-grilla_hoja_ruta");
80
+ const table_tareas_areas_2 = require("./table-tareas_areas");
81
+ const table_tareas_areas_3 = require("./table-tareas_areas");
82
+ const table_tareas_areas_4 = require("./table-tareas_areas");
83
+ const table_tareas_areas_5 = require("./table-tareas_areas");
84
+ const table_mis_tareas_1 = require("./table-mis_tareas");
85
+ const table_tem_asignacion_1 = require("./table-tem_asignacion");
86
+ const table_tareas_tem_recepcion_1 = require("./table-tareas_tem_recepcion");
87
+ const table_tareas_tem_ingreso_1 = require("./table-tareas_tem_ingreso");
88
+ const table_tareas_tem_fin_campo_1 = require("./table-tareas_tem_fin_campo");
89
+ const table_tareas_tem_procesamiento_1 = require("./table-tareas_tem_procesamiento");
90
+ const table_tareas_tem_analisis_campo_1 = require("./table-tareas_tem_analisis_campo");
91
+ const table_mis_tareas_areas_1 = require("./table-mis_tareas_areas");
92
+ const table_control_campo_1 = require("./table-control_campo");
93
+ const table_control_resumen_1 = require("./table-control_resumen");
94
+ const table_control_dias_carga_1 = require("./table-control_dias_carga");
95
+ const table_viviendas_1 = require("./table-viviendas");
96
+ const table_visitas_1 = require("./table-visitas");
97
+ const table_hogares_1 = require("./table-hogares");
98
+ const table_personas_1 = require("./table-personas");
99
+ const table_visitas_sup_1 = require("./table-visitas_sup");
100
+ const table_hogares_sup_1 = require("./table-hogares_sup");
101
+ const table_personas_sup_1 = require("./table-personas_sup");
102
+ const table_diccionario_1 = require("./table-diccionario");
103
+ const table_dictra_1 = require("./table-dictra");
104
+ const table_dicvar_1 = require("./table-dicvar");
105
+ const table_estados_1 = require("./table-estados");
106
+ const table_acciones_1 = require("./table-acciones");
107
+ const table_estados_acciones_1 = require("./table-estados_acciones");
108
+ const table_tareas_proximas_1 = require("./table-tareas_proximas");
109
+ const table_historial_tem_1 = require("./table-historial_tem");
110
+ const table_inconsistencias_cumplen_condicion_1 = require("./table-inconsistencias_cumplen_condicion");
111
+ const table_tem_borradas_1 = require("./table-tem_borradas");
112
+ const table_barrios_1 = require("./table-barrios");
113
+ const table_fracciones_1 = require("./table-fracciones");
114
+ const table_radios_1 = require("./table-radios");
115
+ const table_manzanas_1 = require("./table-manzanas");
116
+ const table_area_enc_proximas_1 = require("./table-area_enc_proximas");
117
+ __exportStar(require("./types-dmencu"), exports);
118
+ const def_config_1 = require("./def-config");
119
+ const best_globals_1 = require("best-globals");
120
+ const APP_DM_VERSION = "#22-12-15";
121
+ function getModoByPolicy(be) {
122
+ return be.config.server.policy == 'web' ? 'RELEVAMIENTO' : 'GABINETE';
123
+ }
124
+ // permisos que getContext agrega al contexto según el usuario logueado (o la falta de usuario)
125
+ function permisosSegunUsuario(caches, user) {
126
+ if (user == null) {
127
+ return { puede: caches.permisosParaNadie };
128
+ }
129
+ var rol = user.rol;
130
+ var permisosDelRol = rol != null ? caches.permisosRol[rol] : undefined;
131
+ if (permisosDelRol === null || permisosDelRol === void 0 ? void 0 : permisosDelRol.superuser) {
132
+ return { superuser: true, puede: caches.permisosSuperuser };
133
+ }
134
+ return { puede: permisosDelRol === null || permisosDelRol === void 0 ? void 0 : permisosDelRol.puede };
135
+ }
136
+ // tablas cuya modificación cambia la estructura que se manda a los dispositivos (ver operativo_estructura_completa)
137
+ exports.TABLAS_ESTRUCTURA = ['casilleros', 'semanas'];
138
+ // tablas de rea/no rea, que además se guardan en be.caches.tableContent (ver refreshCaches)
139
+ exports.TABLAS_REA_NO_REA = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
140
+ // envuelve table_record_save/table_record_delete para que al modificar esas tablas los dispositivos
141
+ // reciban la estructura nueva (timestampEstructura) y, si son de rea/no rea, se recarguen las caches
142
+ // con el mismo cliente (dentro de la misma transacción)
143
+ function refrescarEstructuraAlModificarTabla(be, coreFunction) {
144
+ return function (context, parameters, ...resto) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ var result = yield coreFunction(context, parameters, ...resto);
147
+ if (exports.TABLAS_ESTRUCTURA.includes(parameters.table)) {
148
+ be.caches.timestampEstructura = new Date().getTime();
149
+ console.log('se tocó la estructura', be.caches.timestampEstructura);
150
+ }
151
+ if (exports.TABLAS_REA_NO_REA.includes(parameters.table)) {
152
+ be.caches.timestampEstructura = new Date().getTime();
153
+ yield be.refreshCaches(context.client);
154
+ }
155
+ return result;
156
+ });
157
+ };
158
+ }
159
+ const registrarCronJobPasarAProie = (be) => __awaiter(void 0, void 0, void 0, function* () {
160
+ const ejecutarPasaje = () => __awaiter(void 0, void 0, void 0, function* () {
161
+ const log = (msg, data = '') => console.log(`${best_globals_1.datetime.now().toYmdHms()} [CRON:PROIE] ${msg}`, data);
162
+ try {
163
+ log('🚀 inicia cron pasaje a proie');
164
+ var result = yield be.inTransaction(null, (client) => __awaiter(void 0, void 0, void 0, function* () {
165
+ return yield (0, procedures_dmencu_1.pasarEncuestasAProie)(client);
166
+ }));
167
+ log('✅ result proc pasaje a proie:', result);
168
+ }
169
+ catch (err) {
170
+ var error = (0, cast_error_1.unexpected)(err);
171
+ log(`❌ error pasaje a proie: ${error.message}`);
172
+ }
173
+ finally {
174
+ log('🏁 termina cron proie');
175
+ }
176
+ });
177
+ yield ejecutarPasaje();
178
+ const interval = setInterval(ejecutarPasaje, 1000 * 60 * 60);
179
+ be.shutdownCallbackListAdd({
180
+ message: 'apaga cron pasar a proie',
181
+ fun: function () {
182
+ return __awaiter(this, void 0, void 0, function* () {
183
+ clearInterval(interval);
184
+ return Promise.resolve();
185
+ });
186
+ }
187
+ });
188
+ });
189
+ const getManifestImageIcons = (APP_NAME, sufijo) => [
190
+ {
191
+ "src": `../img/${APP_NAME}-logo-dm-32${sufijo}.png`,
192
+ "sizes": "32x32",
193
+ "type": "image/png"
194
+ },
195
+ {
196
+ "src": `../img/${APP_NAME}-logo-dm-48${sufijo}.png`,
197
+ "sizes": "48x48",
198
+ "type": "image/png"
199
+ },
200
+ {
201
+ "src": `../img/${APP_NAME}-logo-dm-64${sufijo}.png`,
202
+ "sizes": "64x64",
203
+ "type": "image/png"
204
+ },
205
+ {
206
+ "src": `../img/${APP_NAME}-logo-dm-72${sufijo}.png`,
207
+ "sizes": "72x72",
208
+ "type": "image/png"
209
+ },
210
+ {
211
+ "src": `../img/${APP_NAME}-logo-dm-192${sufijo}.png`,
212
+ "sizes": "192x192",
213
+ "type": "image/png"
214
+ },
215
+ {
216
+ "src": `../img/${APP_NAME}-logo-dm-512${sufijo}.png`,
217
+ "sizes": "512x512",
218
+ "type": "image/png"
219
+ }
220
+ ];
221
+ function emergeAppDmEncu(Base) {
222
+ return class AppDmEncu extends Base {
223
+ constructor(...args) {
224
+ super(args);
225
+ this.getSufijoFrombaseUrl = (baseUrl) => baseUrl.includes('test') || baseUrl.includes('/pr') ? '_test' :
226
+ baseUrl.includes('capa') ? '_capa' : '';
227
+ this.getAppName = () => __awaiter(this, void 0, void 0, function* () {
228
+ var be = this;
229
+ return (yield be.inTransaction(null, (client) => client.query("select operativo from parametros where unico_registro").fetchUniqueValue())).value;
230
+ });
231
+ this.caches.tableContent = this.caches.tableContent || {};
232
+ this.caches.tableContent.no_rea = [];
233
+ this.caches.tableContent.no_rea_groups = [];
234
+ this.caches.metaEncIncluirCasillerosSaltoREL = false;
235
+ this.caches.timestampEstructura = new Date().getTime();
236
+ this.caches.tableContent.conReaHogar = {};
237
+ }
238
+ // backend-plus lo declara sin parámetros pero lo llama con (context, usuario), por eso son opcionales
239
+ canChangePass(reqOrContext, userToChangePass) {
240
+ return __awaiter(this, void 0, void 0, function* () {
241
+ var be = this;
242
+ var usuarioLogueado = reqOrContext === null || reqOrContext === void 0 ? void 0 : reqOrContext.user;
243
+ if (reqOrContext == null || usuarioLogueado == null) {
244
+ return false;
245
+ }
246
+ var rol = usuarioLogueado.rol;
247
+ var result = yield be.inDbClient(null, (client) => __awaiter(this, void 0, void 0, function* () {
248
+ var q = be.db.quoteLiteral;
249
+ return (yield client.query(`
250
+ select *
251
+ from usuarios
252
+ where rol in (select rol_subordinado from roles_subordinados where rol = ${q(rol)})`).fetchAll()).rows;
253
+ }));
254
+ var puede = !!result.find((user) => user.usuario == userToChangePass);
255
+ var isAdmin = be.isAdmin(reqOrContext);
256
+ return isAdmin || puede;
257
+ });
258
+ }
259
+ getProcedures() {
260
+ const _super = Object.create(null, {
261
+ getProcedures: { get: () => super.getProcedures }
262
+ });
263
+ return __awaiter(this, void 0, void 0, function* () {
264
+ var be = this;
265
+ var procedimientoAReemplazar = ["caso_guardar", "caso_traer"];
266
+ var parentProc = yield _super.getProcedures.call(this);
267
+ parentProc = parentProc.filter((procedure) => !procedimientoAReemplazar.includes(procedure.action));
268
+ parentProc = parentProc.map(procDef => {
269
+ if (procDef.action == 'table_record_save' || procDef.action == 'table_record_delete') {
270
+ procDef.coreFunction = refrescarEstructuraAlModificarTabla(be, procDef.coreFunction);
271
+ }
272
+ return procDef;
273
+ });
274
+ return parentProc.concat(procedures_dmencu_1.ProceduresDmEncu);
275
+ });
276
+ }
277
+ checkDatabaseStructure(_client) {
278
+ return __awaiter(this, void 0, void 0, function* () {
279
+ });
280
+ }
281
+ addSchrödingerServices(mainApp, baseUrl) {
282
+ let be = this;
283
+ super.addSchrödingerServices(mainApp, baseUrl);
284
+ //permito levantar mis imagenes en aplicaciones dependientes
285
+ be.app.use('/img', express.static('node_modules/dmencu/dist/unlogged/unlogged/img'));
286
+ mainApp.use(function (req, _res, next) {
287
+ if (req.session && !req.session.install) {
288
+ req.session.install = Math.random().toString().replace('.', '');
289
+ }
290
+ next();
291
+ });
292
+ mainApp.get(baseUrl + '/salvar', function (req, res, _next) {
293
+ // @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
294
+ var { useragent } = req;
295
+ var htmlMain = be.mainPage({ useragent }, false, { skipMenu: true, offlineFile: true }).toHtmlDoc();
296
+ miniTools.serveText(htmlMain, 'html')(req, res);
297
+ });
298
+ mainApp.get(baseUrl + '/campo', function (req, res, _next) {
299
+ // @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
300
+ var { useragent, user } = req;
301
+ if (user) {
302
+ /** @type {{type:'js', src:string}[]} */
303
+ var webManifestPath = 'carga-dm/web-manifest.webmanifest';
304
+ var htmlMain = be.mainPage({ useragent, user }, false, { skipMenu: true, webManifestPath, offlineFile: true }).toHtmlDoc();
305
+ miniTools.serveText(htmlMain, 'html')(req, res);
306
+ }
307
+ else {
308
+ res.redirect(401, baseUrl + '/login#w=path&path=/campo');
309
+ }
310
+ });
311
+ mainApp.get(baseUrl + '/fallback-sincro', function (req, res, next) {
312
+ const jsonFallback = {
313
+ ok: false,
314
+ error: {
315
+ message: 'No se logró establecer la conexion con el servidor, compruebe su conexion de internet (respuesta desde fallback)'
316
+ }
317
+ };
318
+ miniTools.serveJson(jsonFallback)(req, res, next);
319
+ });
320
+ var createServiceWorker = function () {
321
+ return __awaiter(this, void 0, void 0, function* () {
322
+ var sw = yield fs_1.promises.readFile('node_modules/service-worker-admin/dist/service-worker-wo-manifest.js', 'utf8');
323
+ var manifest = yield be.createResourcesForCacheJson();
324
+ var swManifest = sw
325
+ .replace("'/*version*/'", JSON.stringify(manifest.version))
326
+ .replace("'/*appName*/'", JSON.stringify(manifest.appName))
327
+ .replace(/\[\s*\/\*urlsToCache\*\/\s*\]/, JSON.stringify(manifest.cache))
328
+ .replace(/\[\s*\/\*fallbacks\*\/\s*\]/, JSON.stringify(manifest.fallbacks || []))
329
+ .replace("'/*defaultFallback*/'", JSON.stringify(manifest.defaultFallback));
330
+ //.replace("/#CACHE$/", "/(a\\d+m\\d+p\\d+t\\d+_estructura.js)|(a\\d+m\\d+p\\d+t\\d+_hdr.json)/");
331
+ return swManifest;
332
+ });
333
+ };
334
+ mainApp.get(baseUrl + `/sw-manifest.js`, function (req, res, next) {
335
+ return __awaiter(this, void 0, void 0, function* () {
336
+ try {
337
+ miniTools.serveText(yield createServiceWorker(), 'application/javascript')(req, res);
338
+ }
339
+ catch (err) {
340
+ miniTools.serveErr(req, res, next)((0, cast_error_1.unexpected)(err));
341
+ }
342
+ });
343
+ });
344
+ mainApp.get(baseUrl + `/carga-dm/web-manifest.webmanifest`, function (req, res, next) {
345
+ return __awaiter(this, void 0, void 0, function* () {
346
+ const APP_NAME = yield be.getAppName();
347
+ const sufijo = be.getSufijoFrombaseUrl(baseUrl);
348
+ try {
349
+ const content = Object.assign({ "name": `${APP_NAME}${sufijo} Progressive Web App`, "short_name": `${APP_NAME}${sufijo} PWA`, "description": `Progressive Web App for ${APP_NAME}${sufijo}.`, "icons": getManifestImageIcons(APP_NAME, sufijo) }, be.getColorsJson(sufijo));
350
+ miniTools.serveText(JSON.stringify(content), 'application/json')(req, res);
351
+ }
352
+ catch (err) {
353
+ miniTools.serveErr(req, res, next)((0, cast_error_1.unexpected)(err));
354
+ }
355
+ });
356
+ });
357
+ }
358
+ getColorsJson(_sufijo) {
359
+ return {
360
+ "start_url": "../campo",
361
+ "display": "standalone",
362
+ "theme_color": "#3F51B5",
363
+ "background_color": "#6d60ed"
364
+ };
365
+ }
366
+ addLoggedServices() {
367
+ var be = this;
368
+ super.addLoggedServices();
369
+ be.app.get('/manifest.manifest', function (req, res, _next) {
370
+ return __awaiter(this, void 0, void 0, function* () {
371
+ miniTools.serveFile('src/client/manifest.manifest', {})(req, res);
372
+ });
373
+ });
374
+ this.app.get('/file', function (req, res) {
375
+ return __awaiter(this, void 0, void 0, function* () {
376
+ let result = yield be.inTransaction(req, (client) => client.query("select ruta from adjuntos where id_adjunto = $1", [req.query.id_adjunto])
377
+ .fetchUniqueValue());
378
+ var filePath = result.value;
379
+ miniTools.serveFile(filePath, {})(req, res);
380
+ });
381
+ });
382
+ this.app.get('/imagenes', function (req, res) {
383
+ return __awaiter(this, void 0, void 0, function* () {
384
+ miniTools.serveFile('local-images/' + req.query.pdf, {})(req, res);
385
+ });
386
+ });
387
+ this.app.get('/download/all', function (req, res, next) {
388
+ return __awaiter(this, void 0, void 0, function* () {
389
+ if (req.user == null || req.user.rol != 'admin') {
390
+ console.log('no está autorizado a bajarse todo', req.user);
391
+ return next();
392
+ }
393
+ let zip = new yazl.ZipFile();
394
+ zip.outputStream.pipe(res);
395
+ let base = 'local-attachments';
396
+ let files = yield fs_1.promises.readdir(base);
397
+ yield Promise.all(files.map(function (fileName) {
398
+ return __awaiter(this, void 0, void 0, function* () {
399
+ var filePath = base + '/' + fileName;
400
+ var stat = yield fs_1.promises.stat(filePath);
401
+ if (stat.isFile()) {
402
+ zip.addFile(filePath, fileName);
403
+ }
404
+ });
405
+ }));
406
+ zip.end();
407
+ });
408
+ });
409
+ }
410
+ postConfig() {
411
+ const _super = Object.create(null, {
412
+ postConfig: { get: () => super.postConfig }
413
+ });
414
+ return __awaiter(this, void 0, void 0, function* () {
415
+ yield _super.postConfig.call(this);
416
+ var be = this;
417
+ be.caches.metaEncIncluirCasillerosSaltoREL = false;
418
+ yield be.inTransaction(null, function (client) {
419
+ return __awaiter(this, void 0, void 0, function* () {
420
+ var qPermisos = `
421
+ SELECT jsonb_object_agg(r.rol,jsonb_build_object('superuser',r.superuser,'puede',(
422
+ SELECT jsonb_object_agg(rp.permiso,(
423
+ SELECT jsonb_object_agg(rpa.accion,rpa.habilitado)
424
+ FROM roles_permisos rpa
425
+ WHERE rpa.rol=rp.rol AND rpa.permiso=rp.permiso
426
+ ))
427
+ FROM roles_permisos rp
428
+ WHERE rp.rol=r.rol #condHabilitado#
429
+ )))
430
+ FROM roles r
431
+ `;
432
+ var results = [
433
+ yield client.query(qPermisos.replace('#condHabilitado#', '')).fetchUniqueValue(),
434
+ yield client.query(qPermisos.replace('#condHabilitado#', ` and rp.${pg.quoteIdent('habilitado')}`)).fetchUniqueValue(),
435
+ yield client.query(`
436
+ SELECT jsonb_object_agg(permiso,(
437
+ SELECT jsonb_object_agg(accion,true)
438
+ FROM permisos pa
439
+ WHERE pa.permiso=p.permiso
440
+ ))
441
+ FROM permisos p
442
+ `).fetchUniqueValue(),
443
+ yield client.query(`
444
+ SELECT jsonb_object_agg(permiso,(
445
+ SELECT jsonb_object_agg(accion,false)
446
+ FROM permisos pa
447
+ WHERE pa.permiso=p.permiso
448
+ ))
449
+ FROM permisos p
450
+ `).fetchUniqueValue()
451
+ ];
452
+ be.caches.permisosRol = results[0].value;
453
+ be.caches.permisosRolSoloTrue = results[1].value;
454
+ be.caches.permisosSuperuser = results[2].value;
455
+ be.caches.permisosParaNadie = results[3].value;
456
+ //console.dir(be.caches.permisosRolSoloTrue,{depth:9});
457
+ //console.dir(be.caches.permisosSuperuser,{depth:9});
458
+ //console.dir(be.caches.permisosParaNadie,{depth:9});
459
+ });
460
+ });
461
+ yield this.refreshCaches();
462
+ yield registrarCronJobPasarAProie(be);
463
+ });
464
+ }
465
+ configStaticConfig() {
466
+ super.configStaticConfig();
467
+ this.setStaticConfig(def_config_1.defConfig);
468
+ }
469
+ clientIncludes(req, opts) {
470
+ var be = this;
471
+ var unlogged = opts && opts.offlineFile;
472
+ var menuedResources = unlogged ? [
473
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'unlogged.js', path: 'dmencu' },
474
+ ] : [
475
+ { type: 'js', module: 'dmencu', modPath: '../../client/client', file: 'client.js', path: 'dmencu' },
476
+ ];
477
+ if (opts && opts.extraFiles) {
478
+ menuedResources = menuedResources.concat(opts.extraFiles);
479
+ }
480
+ let externalResources = [
481
+ { type: 'js', module: 'react', modPath: 'umd', file: 'react.production.min.js' },
482
+ { type: 'js', module: 'react-dom', modPath: 'umd', file: 'react-dom.production.min.js' },
483
+ //{ type: 'js', module: '@material-ui/core', modPath: 'umd', fileDevelopment:'material-ui.development.js', file:'material-ui.production.min.js' },
484
+ { type: 'js', module: '@mui/material', modPath: '../umd', file: 'material-ui.production.min.js' },
485
+ { type: 'js', module: 'redux', modPath: '../dist', file: 'redux.min.js' },
486
+ { type: 'js', module: 'react-redux', modPath: '../dist', file: 'react-redux.min.js' },
487
+ //{ type: 'js', module: 'qrcode', modPath: '../build', file: 'qrcode.js'},
488
+ ...super.clientIncludes(req, opts).filter(m => m.file != 'formularios.css')
489
+ .filter(m => !unlogged || true
490
+ && m.file != 'var-cal.js'
491
+ && m.file != 'var-cal.js'),
492
+ { type: 'js', module: 'service-worker-admin', file: 'service-worker-admin.js' },
493
+ { type: 'js', module: 'redux-typed-reducer', modPath: '../dist', file: 'redux-typed-reducer.js' }
494
+ ];
495
+ var resources = [
496
+ ...externalResources,
497
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'adapt.js', path: 'dmencu' },
498
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'tipos.js', path: 'dmencu' },
499
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'helpers-formulario.js', path: 'dmencu' },
500
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'calculos-encuesta.js', path: 'dmencu' },
501
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-config.js', path: 'dmencu' },
502
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-init.js', path: 'dmencu' },
503
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'redux-formulario.js', path: 'dmencu' },
504
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'helpers-casilleros.js', path: 'dmencu' },
505
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'bypass-formulario.js', path: 'dmencu' },
506
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-general.js', path: 'dmencu' },
507
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-formulario.js', path: 'dmencu' },
508
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'abrir-formulario.js', path: 'dmencu' },
509
+ { type: 'css', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'formulario-react.css', path: 'css' },
510
+ { type: 'css', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'bootstrap.min.css', path: 'css' },
511
+ { type: 'ttf', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'Roboto-Regular.ttf', path: 'css' },
512
+ ...menuedResources,
513
+ { type: 'css', module: 'dmencu', modPath: '../../client/client/css', file: 'menu.css', path: 'css' },
514
+ ];
515
+ return resources;
516
+ // .map(m=>({...m, file:m.fileDevelopment||m.file}));
517
+ }
518
+ refreshCaches() {
519
+ return __awaiter(this, arguments, void 0, function* (client = null) {
520
+ this.caches.tableContent = this.caches.tableContent || {};
521
+ // Función auxiliar para ejecutar las queries con el cliente provisto o uno nuevo
522
+ const executeQueries = (dbClient) => __awaiter(this, void 0, void 0, function* () {
523
+ this.caches.tableContent.no_rea = (yield dbClient.query(`select * from no_rea order by operativo, orden, no_rea`).fetchAll()).rows;
524
+ this.caches.tableContent.rea = (yield dbClient.query(`select * from rea order by operativo, orden, rea`).fetchAll()).rows;
525
+ this.caches.tableContent.no_rea_groups = (yield dbClient.query(`
526
+ select grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo order by 1
527
+ `).fetchAll()).rows;
528
+ this.caches.tableContent.no_rea_groups0 = (yield dbClient.query(`
529
+ select grupo0 as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo0 order by 1
530
+ `).fetchAll()).rows;
531
+ this.caches.tableContent.no_rea_sup = (yield dbClient.query(`select * from no_rea_sup order by operativo, orden, no_rea_sup`).fetchAll()).rows;
532
+ this.caches.tableContent.rea_sup = (yield dbClient.query(`select * from rea_sup order by operativo, orden, rea_sup`).fetchAll()).rows;
533
+ this.caches.tableContent.no_rea_sup_groups = (yield dbClient.query(`
534
+ select grupo_sup, jsonb_agg(to_json(r.*)) as codigos from no_rea_sup r group by grupo_sup order by 1
535
+ `).fetchAll()).rows;
536
+ this.caches.tableContent.no_rea_sup_groups0 = (yield dbClient.query(`
537
+ select grupo0_sup as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea_sup r group by grupo0_sup order by 1
538
+ `).fetchAll()).rows;
539
+ this.caches.tableContent.conReaHogar = (yield dbClient.query(`
540
+ select con_rea_hogar, operativo, config_sorteo from operativos join parametros using (operativo) where unico_registro
541
+ `).fetchUniqueRow()).row;
542
+ });
543
+ if (client) {
544
+ yield executeQueries(client);
545
+ }
546
+ else {
547
+ yield this.inDbClient(null, (dbClient) => __awaiter(this, void 0, void 0, function* () {
548
+ yield executeQueries(dbClient);
549
+ }));
550
+ }
551
+ console.log('caches', this.caches.tableContent);
552
+ console.log('caches ok');
553
+ });
554
+ }
555
+ //sqlNoreaCase(campoNecesario:string){
556
+ // var be=this;
557
+ // return `CASE ${be.caches.tableContent.no_rea.map(x=>
558
+ // ` WHEN norea = ${be.db.quoteLiteral(x.no_rea)}::integer THEN ${be.db.quoteLiteral(x[campoNecesario])}`
559
+ // ).join('')} WHEN TRUE THEN NULL END`
560
+ //}
561
+ getContext(req) {
562
+ var fatherContext = super.getContext(req);
563
+ return Object.assign(Object.assign({}, permisosSegunUsuario(this.caches, fatherContext.user)), fatherContext);
564
+ }
565
+ getContextForDump() {
566
+ var fatherContext = super.getContextForDump();
567
+ return Object.assign({ superuser: true, puede: this.caches.permisosSuperuser }, fatherContext);
568
+ }
569
+ getClientSetupForSendToFrontEnd(req) {
570
+ const _super = Object.create(null, {
571
+ getClientSetupForSendToFrontEnd: { get: () => super.getClientSetupForSendToFrontEnd }
572
+ });
573
+ return __awaiter(this, void 0, void 0, function* () {
574
+ var _a;
575
+ return Object.assign(Object.assign({}, (yield _super.getClientSetupForSendToFrontEnd.call(this, req))), { idper: (_a = req.user) === null || _a === void 0 ? void 0 : _a.idper });
576
+ });
577
+ }
578
+ createResourcesForCacheJson() {
579
+ return __awaiter(this, void 0, void 0, function* () {
580
+ var be = this;
581
+ const APP_NAME = yield be.getAppName();
582
+ const sufijo = be.getSufijoFrombaseUrl(be.config.server['base-url']);
583
+ var jsonResult = {
584
+ version: APP_DM_VERSION,
585
+ appName: 'dmencu',
586
+ cache: [
587
+ "campo",
588
+ "offline",
589
+ "fallback-sincro",
590
+ "lib/react.production.min.js",
591
+ "lib/react-dom.production.min.js",
592
+ "lib/material-ui.production.min.js",
593
+ "lib/redux.min.js",
594
+ "lib/react-redux.min.js",
595
+ //"lib/qrcode.js",
596
+ "lib/require-bro.js",
597
+ "lib/cast-error.js",
598
+ "lib/like-ar.js",
599
+ "lib/best-globals.js",
600
+ "lib/json4all.js",
601
+ "lib/js-to-html.js",
602
+ "lib/redux-typed-reducer.js",
603
+ "dmencu/adapt.js",
604
+ "dmencu/unlogged.js",
605
+ "lib/js-yaml.umd.min.js",
606
+ "lib/xlsx-now.umd.js",
607
+ "lib/xlsx-now-browser.umd.js",
608
+ "lib/lazy-some.js",
609
+ "lib/sql-tools.js",
610
+ "dialog-promise/dialog-promise.js",
611
+ "moment/min/moment.js",
612
+ "pikaday/pikaday.js",
613
+ "lib/polyfills-bro.js",
614
+ "lib/big.js",
615
+ "lib/type-store.js",
616
+ "lib/typed-controls.js",
617
+ "lib/ajax-best-promise.js",
618
+ "my-ajax.js",
619
+ "my-start.js",
620
+ "lib/my-localdb.js",
621
+ "lib/my-websqldb.js",
622
+ "lib/my-localdb.js.map",
623
+ "lib/my-websqldb.js.map",
624
+ "lib/my-things.js",
625
+ "lib/my-tables.js",
626
+ "lib/my-inform-net-status.js",
627
+ "lib/my-menu.js",
628
+ "lib/my-skin.js",
629
+ "lib/cliente-en-castellano.js",
630
+ "lib/service-worker-admin.js",
631
+ "lib/redux-typed-reducer.js",
632
+ "client_modules/operativos.js",
633
+ "client_modules/varcal.js",
634
+ "client_modules/form-structure.js",
635
+ "client_modules/meta-enc.js",
636
+ "client_modules/datos-ext.js",
637
+ "client_modules/consistencias.js",
638
+ "client_modules/procesamiento.js",
639
+ "dmencu/tipos.js",
640
+ "dmencu/render-config.js",
641
+ "dmencu/render-init.js",
642
+ "dmencu/helpers-casilleros.js",
643
+ "dmencu/helpers-formulario.js",
644
+ "dmencu/calculos-encuesta.js",
645
+ "dmencu/bypass-formulario.js",
646
+ "dmencu/redux-formulario.js",
647
+ "dmencu/render-general.js",
648
+ "dmencu/render-formulario.js",
649
+ "dmencu/abrir-formulario.js",
650
+ "client_modules/row-validator.js",
651
+ "client/menu.js",
652
+ "img/logo.png",
653
+ //"img/logo-dm.png",
654
+ "img/logo-128.png",
655
+ "img/main-loading.gif",
656
+ "img/borrar-valor.png",
657
+ "img/fondo-salteado-error.png",
658
+ "img/fondo-salteado.png",
659
+ "img/background-test.png",
660
+ //"client-setup",
661
+ "css/bootstrap.min.css",
662
+ "css/formulario-react.css",
663
+ "pikaday/pikaday.css",
664
+ "dialog-promise/dialog-promise.css",
665
+ "rel-enc/estados.css",
666
+ "css/my-tables.css",
667
+ "css/my-menu.css",
668
+ "css/my-things.css",
669
+ "css/menu.css",
670
+ "rel-enc/my-things2.css",
671
+ "css/formulario-react.css",
672
+ "css/Roboto-Regular.ttf",
673
+ "carga-dm/web-manifest.webmanifest",
674
+ ],
675
+ fallbacks: [
676
+ { path: 'dm_sincronizar', fallback: 'fallback-sincro' }
677
+ ],
678
+ defaultFallback: "offline"
679
+ };
680
+ jsonResult.cache = jsonResult.cache.concat(getManifestImageIcons(APP_NAME, sufijo).map((elem) => `menu/${elem.src}`));
681
+ var skin = be.config['client-setup'].skin;
682
+ if (skin && be.activeSkinFiles) {
683
+ var skinUrl = skin + '/';
684
+ jsonResult.cache.push(`${skin}/img/background-test.png`);
685
+ // Convertimos el Set a Array y mapeamos las rutas
686
+ var skinResources = Array.from(be.activeSkinFiles).map(function (pathRelativo) {
687
+ // Si es un .styl, lo pedimos como .css porque el Service Worker
688
+ // debe cachear el recurso final que el navegador solicita.
689
+ return skinUrl + pathRelativo.replace(/\.styl$/, '.css');
690
+ });
691
+ jsonResult.cache = jsonResult.cache.concat(skinResources);
692
+ }
693
+ return jsonResult;
694
+ });
695
+ }
696
+ getMenuControles(_context) {
697
+ return [
698
+ { menuType: 'proc', name: 'encuestas_procesamiento_pasar', label: 'pasar encuestas a procesamiento' },
699
+ { menuType: 'table', name: 'resumen', table: 'control_resumen', selectedByDefault: true },
700
+ { menuType: 'table', name: 'dominio', table: 'control_campo_dominio' },
701
+ { menuType: 'table', name: 'zona', table: 'control_campo_zona' },
702
+ { menuType: 'table', name: 'comuna', table: 'control_campo_comuna' },
703
+ { menuType: 'table', name: 'área', table: 'control_campo_area' },
704
+ ];
705
+ }
706
+ ;
707
+ getMenuVarios(context) {
708
+ var _a, _b, _c, _d, _e, _f;
709
+ let submenuVarios = [{ menuType: 'abrir_encuesta', name: 'abrir_encuesta' }];
710
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.editar) {
711
+ submenuVarios.push({ menuType: 'table', name: 'hoja_ruta', table: 'grilla_hoja_ruta', label: 'hoja de ruta' });
712
+ }
713
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.administrar) {
714
+ submenuVarios.push({ menuType: 'proc', name: 'encuestador_dms_mostrar', label: 'forzar descarga encuestas DM' });
715
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_blanquear_previsualizar', label: 'blanquear encuesta' });
716
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_borrar_previsualizar', label: 'quitar encuesta de la muestra' });
717
+ submenuVarios.push({ menuType: 'proc', name: 'encuestas_capacitacion_borrar', label: 'quitar encuestas de capa de la muestra' });
718
+ submenuVarios.push({ menuType: 'proc', name: 'operativo_migrar', label: 'migrar operativo' });
719
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_capa_a_prod_pasar', label: 'pasar encuestas de capa a prod' });
720
+ }
721
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.encuestas) === null || _f === void 0 ? void 0 : _f.procesar) {
722
+ submenuVarios.push({ menuType: 'proc', name: 'intercambiar_encuestas' });
723
+ }
724
+ return { menuType: 'menu', name: 'varios', menuContent: submenuVarios };
725
+ }
726
+ getMenuAsignacion(context) {
727
+ var _a, _b, _c, _d;
728
+ let filtroRecepcionista = context.user.rol == 'recepcionista' ? { recepcionista: context.user.idper } : {};
729
+ let submenuAsignacion = [];
730
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
731
+ submenuAsignacion.push({ menuType: 'table', name: 'general', table: 'areas_asignacion_general' });
732
+ }
733
+ submenuAsignacion.push({ menuType: 'table', name: 'encuestador', table: 't_encu_areas', ff: Object.assign({ tarea: 'encu' }, filtroRecepcionista) }, { menuType: 'table', name: 'ingresador', table: 't_ingr_areas', ff: Object.assign({ tarea: 'ingr' }, filtroRecepcionista) }, { menuType: 'table', name: 'recuperador', table: 'tareas_tem_asignacion_recu', ff: Object.assign({ tarea_actual: 'recu', tarea: 'recu' }, filtroRecepcionista) });
734
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.administrar) {
735
+ submenuAsignacion.push({ menuType: 'table', name: 'supervisor', table: 'tareas_tem_asignacion_supe', ff: Object.assign({ tarea_actual: 'supe', tarea: 'supe' }, filtroRecepcionista) });
736
+ }
737
+ ;
738
+ return { menuType: 'menu', name: 'asignacion', label: 'asignación', menuContent: submenuAsignacion };
739
+ }
740
+ getMenuRecepcion(context) {
741
+ var _a, _b;
742
+ let submenuRecepcion = [];
743
+ submenuRecepcion.push({ menuType: 'table', name: 'encuestador', table: 'encuestadores_asignados' }, { menuType: 'table', name: 'recuperador', table: 'recuperadores_asignados' }, { menuType: 'table', name: 'ingresador', table: 'ingresadores_asignados' });
744
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
745
+ submenuRecepcion.push({ menuType: 'table', name: 'supervisor', table: 'supervisores_asignados' }, { menuType: 'table', name: 'mis_supervisores', table: 'mis_supervisores_asignados' });
746
+ }
747
+ return { menuType: 'menu', name: 'recepcion', label: 'recepción', menuContent: submenuRecepcion };
748
+ }
749
+ getMenuCarto(context) {
750
+ var _a, _b;
751
+ let submenuCarto = [];
752
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
753
+ submenuCarto.push({ menuType: 'table', name: 'comunas', table: 'comunas' }, { menuType: 'table', name: 'barrios', table: 'barrios' }, { menuType: 'table', name: 'fracciones', table: 'fracciones' }, { menuType: 'table', name: 'radios', table: 'radios' }, { menuType: 'table', name: 'manzanas', table: 'manzanas' });
754
+ return { menuType: 'menu', name: 'carto', label: 'cartografía', menuContent: submenuCarto };
755
+ }
756
+ return null;
757
+ }
758
+ getMenuConfigurar(context) {
759
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
760
+ const menuConfigurar = [];
761
+ if (((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) || ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.encuestas) === null || _d === void 0 ? void 0 : _d.procesar)) {
762
+ const submenuMuestra = [
763
+ { menuType: 'table', name: 'tem', label: 'TEM' },
764
+ { menuType: 'proc', name: 'muestra_generar', label: 'generar muestra' },
765
+ { menuType: 'table', name: 'semanas' },
766
+ { menuType: 'table', name: 'area_enc_proximas' },
767
+ ];
768
+ menuConfigurar.push({
769
+ menuType: 'menu',
770
+ name: 'muestra',
771
+ label: 'muestra',
772
+ menuContent: submenuMuestra
773
+ });
774
+ }
775
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.casilleros_texto) === null || _f === void 0 ? void 0 : _f.editar) {
776
+ menuConfigurar.push({
777
+ menuType: 'menu',
778
+ name: 'metadatos',
779
+ menuContent: [
780
+ { menuType: 'table', name: 'operativos' },
781
+ { menuType: 'menu', name: 'rea/norea', menuContent: [
782
+ { menuType: 'table', name: 'rea' },
783
+ { menuType: 'table', name: 'no_rea' },
784
+ { menuType: 'table', name: 'rea_sup' },
785
+ { menuType: 'table', name: 'no_rea_sup' },
786
+ ] },
787
+ { menuType: 'table', name: 'formularios', table: 'casilleros_principales' },
788
+ { menuType: 'table', name: 'plano', table: 'casilleros' },
789
+ { menuType: 'table', name: 'variables', table: 'casilleros', fc: [{ column: 'var_name', operator: '!=\u2205', value: null }] },
790
+ { menuType: 'table', name: 'tipoc', label: 'tipos de celdas' },
791
+ { menuType: 'table', name: 'tipoc_tipoc', label: 'inclusiones de celdas' },
792
+ ]
793
+ });
794
+ }
795
+ if (context.superuser) {
796
+ menuConfigurar.push({
797
+ menuType: 'menu',
798
+ name: 'estados_acciones_tareas',
799
+ label: 'estados/acciones/tareas',
800
+ menuContent: [
801
+ { menuType: 'table', name: 'tareas' },
802
+ { menuType: 'table', name: 'estados' },
803
+ { menuType: 'table', name: 'acciones' },
804
+ { menuType: 'table', name: 'estados_acciones' },
805
+ { menuType: 'table', name: 'tareas_proximas' },
806
+ ]
807
+ }, { menuType: 'table', name: 'momentos_consistencia' }, { menuType: 'table', name: 'parametros' }, { menuType: 'table', name: 'modos_dm' });
808
+ }
809
+ if (((_h = (_g = context.puede) === null || _g === void 0 ? void 0 : _g.campo) === null || _h === void 0 ? void 0 : _h.administrar) || ((_k = (_j = context.puede) === null || _j === void 0 ? void 0 : _j.encuestas) === null || _k === void 0 ? void 0 : _k.procesar)) {
810
+ menuConfigurar.push({
811
+ menuType: 'menu',
812
+ name: 'usuarios',
813
+ menuContent: [
814
+ { menuType: 'table', name: 'usuarios', selectedByDefault: true },
815
+ { menuType: 'table', name: 'roles' },
816
+ { menuType: 'table', name: 'permisos' },
817
+ { menuType: 'table', name: 'roles_permisos' },
818
+ ]
819
+ });
820
+ }
821
+ return menuConfigurar;
822
+ }
823
+ // los mixins (meta-enc, procesamiento) lo declaran sin parámetros, pero backend-plus siempre lo llama con context.
824
+ // El tipo de retorno que declara operativos (MenuInfo[]) no admite formas que backend-plus sí acepta y dmencu usa
825
+ // (ff como objeto, fc con column); se devuelve MenuInfoBase[], que es lo que declara backend-plus.
826
+ // Quitar esta línea cuando se corrijan los tipos de menú en operativos/backend-plus (el compilador avisa si deja de hacer falta).
827
+ // @ts-expect-error MenuDefinition de operativos más estricto que el de backend-plus
828
+ getMenu(context) {
829
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
830
+ if (context == null) {
831
+ throw new Error('getMenu de dmencu requiere el context para armar el menú según los permisos');
832
+ }
833
+ let menu = [];
834
+ if (getModoByPolicy(context.be) === 'RELEVAMIENTO') {
835
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.relevar) {
836
+ menu.push({ menuType: 'path', name: 'relevamiento', path: '/campo' });
837
+ menu.push({ menuType: 'sincronizar_dm', name: 'sincronizar' }, { menuType: 'cambiar_modo_dm', name: 'cambiar_modo' });
838
+ }
839
+ }
840
+ else {
841
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.editar) {
842
+ menu.push(this.getMenuAsignacion(context), this.getMenuRecepcion(context));
843
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.campo) === null || _f === void 0 ? void 0 : _f.administrar) {
844
+ menu.push({ menuType: 'table', name: 'tareas_tem_fin_campo', label: 'espera fin de campo' });
845
+ menu.push({ menuType: 'table', name: 'tareas_tem_analisis_campo', label: 'análisis de campo' });
846
+ }
847
+ menu.push({
848
+ menuType: 'menu', name: 'supervision', label: 'supervisión', menuContent: [
849
+ { menuType: 'table', name: 'supervisar', table: 'tareas_tem_ingreso', ff: { tarea: 'supe', asignado: context.user.idper } }
850
+ ]
851
+ });
852
+ }
853
+ if (((_h = (_g = context.puede) === null || _g === void 0 ? void 0 : _g.campo) === null || _h === void 0 ? void 0 : _h.editar) || ((_k = (_j = context.puede) === null || _j === void 0 ? void 0 : _j.campo) === null || _k === void 0 ? void 0 : _k.administrar) || ((_m = (_l = context.puede) === null || _l === void 0 ? void 0 : _l.encuestas) === null || _m === void 0 ? void 0 : _m.procesar)) {
854
+ menu.push(this.getMenuVarios(context));
855
+ }
856
+ if (((_p = (_o = context.puede) === null || _o === void 0 ? void 0 : _o.campo) === null || _p === void 0 ? void 0 : _p.administrar) || ((_r = (_q = context.puede) === null || _q === void 0 ? void 0 : _q.encuestas) === null || _r === void 0 ? void 0 : _r.procesar)) {
857
+ menu.push({ menuType: 'menu', name: 'control', menuContent: this.getMenuControles(context) });
858
+ /*{menuType:'table', name:'participacion' , table:'control_campo_participacion' },*/
859
+ }
860
+ if ((_t = (_s = context.puede) === null || _s === void 0 ? void 0 : _s.encuestas) === null || _t === void 0 ? void 0 : _t.procesar) {
861
+ menu.push({
862
+ menuType: 'menu', name: 'procesar', menuContent: [
863
+ { menuType: 'table', name: 'variables' },
864
+ { menuType: 'table', name: 'variables_cuestionario', table: 'casilleros', td: { editable: false, allow: { update: false, import: false, delete: false, insert: false } }, fc: [{ column: 'var_name', operator: '!=\u2205', value: null }] },
865
+ { menuType: 'table', name: 'consistencias' },
866
+ { menuType: 'table', name: 'consistencias_cuestionario', table: 'casilleros', ff: { tipoc: 'CONS' } },
867
+ { menuType: 'table', name: 'inconsistencias' },
868
+ { menuType: 'table', name: 'tabla_datos' },
869
+ { menuType: 'table', name: 'diccionario', label: 'diccionarios' },
870
+ { menuType: 'table', name: 'tareas_tem_procesamiento', label: 'encuestas' },
871
+ ]
872
+ });
873
+ }
874
+ const menuConfigurar = this.getMenuConfigurar(context);
875
+ if (menuConfigurar.length) {
876
+ menu.push({ menuType: 'menu', name: 'configurar', menuContent: menuConfigurar });
877
+ }
878
+ const menuCarto = this.getMenuCarto(context);
879
+ if (menuCarto) {
880
+ menu.push(menuCarto);
881
+ }
882
+ }
883
+ return { menu };
884
+ }
885
+ prepareGetTables() {
886
+ var be = this;
887
+ super.prepareGetTables();
888
+ this.getTableDefinition = Object.assign(Object.assign({}, this.getTableDefinition), { roles: table_roles_1.roles,
889
+ usuarios: table_usuarios_1.usuarios,
890
+ personal: table_personal_1.personal,
891
+ recepcionistas: table_recepcionistas_1.recepcionistas,
892
+ encuestadores_asignados: table_encuestadores_1.encuestadores_asignados,
893
+ ingresadores_asignados: table_encuestadores_1.ingresadores_asignados,
894
+ recuperadores_asignados: table_encuestadores_2.recuperadores_asignados,
895
+ supervisores_asignados: table_encuestadores_3.supervisores_asignados,
896
+ mis_supervisores_asignados: table_encuestadores_4.mis_supervisores_asignados,
897
+ mis_encuestadores: table_mis_encuestadores_1.mis_encuestadores,
898
+ recuperadores: table_recuperadores_1.recuperadores,
899
+ supervisores: table_supervisores_1.supervisores,
900
+ personal_rol: table_personal_rol_1.personal_rol,
901
+ permisos: table_permisos_1.permisos,
902
+ roles_permisos: table_roles_permisos_1.roles_permisos,
903
+ roles_subordinados: table_roles_subordinados_1.roles_subordinados,
904
+ no_rea: table_no_rea_1.no_rea,
905
+ no_rea_sup: table_no_rea_sup_1.no_rea_sup,
906
+ rea: table_rea_1.rea,
907
+ rea_sup: table_rea_sup_1.rea_sup,
908
+ semanas: table_semanas_1.semanas,
909
+ estados: table_estados_1.estados,
910
+ acciones: table_acciones_1.acciones,
911
+ estados_acciones: table_estados_acciones_1.estados_acciones,
912
+ tareas_proximas: table_tareas_proximas_1.tareas_proximas,
913
+ tem: table_tem_1.tem,
914
+ historial_tem: table_historial_tem_1.historial_tem,
915
+ modos_dm: table_modos_dm_1.modos_dm,
916
+ parametros: table_parametros_1.parametros,
917
+ operaciones: table_operaciones_1.operaciones,
918
+ comunas: table_comunas_1.comunas,
919
+ areas: table_areas_1.areas,
920
+ sincronizaciones: table_sincronizaciones_1.sincronizaciones,
921
+ tareas: table_tareas_1.tareas,
922
+ tareas_tem: table_tareas_tem_1.tareas_tem,
923
+ tareas_tem_asignacion_encu: table_tareas_tem_1.tareas_tem_asignacion_encu,
924
+ tareas_tem_asignacion_recu: table_tareas_tem_1.tareas_tem_asignacion_recu,
925
+ tareas_tem_asignacion_supe: table_tareas_tem_1.tareas_tem_asignacion_supe,
926
+ tareas_tem_asignacion_ingr: table_tareas_tem_1.tareas_tem_asignacion_ingr,
927
+ tareas_areas: table_tareas_areas_1.tareas_areas,
928
+ areas_asignacion_general: table_areas_asignacion_general_1.areas_asignacion_general,
929
+ grilla_hoja_ruta: table_grilla_hoja_ruta_1.grilla_hoja_ruta,
930
+ t_encu_areas: table_tareas_areas_2.t_encu_areas,
931
+ t_recu_areas: table_tareas_areas_3.t_recu_areas,
932
+ t_supe_areas: table_tareas_areas_4.t_supe_areas,
933
+ t_ingr_areas: table_tareas_areas_5.t_ingr_areas,
934
+ mis_tareas: table_mis_tareas_1.mis_tareas,
935
+ tem_asignacion: table_tem_asignacion_1.tem_asignacion,
936
+ tareas_tem_recepcion: table_tareas_tem_recepcion_1.tareas_tem_recepcion,
937
+ tareas_tem_ingreso: table_tareas_tem_ingreso_1.tareas_tem_ingreso,
938
+ tareas_tem_fin_campo: table_tareas_tem_fin_campo_1.tareas_tem_fin_campo,
939
+ tareas_tem_procesamiento: table_tareas_tem_procesamiento_1.tareas_tem_procesamiento,
940
+ tareas_tem_analisis_campo: table_tareas_tem_analisis_campo_1.tareas_tem_analisis_campo,
941
+ mis_tareas_areas: table_mis_tareas_areas_1.mis_tareas_areas,
942
+ control_campo: table_control_campo_1.control_campo,
943
+ control_resumen: table_control_resumen_1.control_resumen, control_campo_zona: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x zona solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar, filtroWhere: 'dominio=3' }), control_campo_comuna: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x comuna solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar, filtroWhere: 'dominio=3' }), control_campo_area: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x area', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'text' }, { name: 'area', typeName: 'integer' }, { name: 'participacion_a', typeName: 'text' }, { name: 'clase_a', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_campo_participacion: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x participacion', camposCorte: [{ name: 'participacion', typeName: 'bigint' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_campo_dominio: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x dominio', camposCorte: [{ name: 'dominio', typeName: 'integer' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_dias_carga: table_control_dias_carga_1.control_dias_carga,
944
+ viviendas: table_viviendas_1.viviendas,
945
+ visitas: table_visitas_1.visitas,
946
+ hogares: table_hogares_1.hogares,
947
+ personas: table_personas_1.personas,
948
+ visitas_sup: table_visitas_sup_1.visitas_sup,
949
+ hogares_sup: table_hogares_sup_1.hogares_sup,
950
+ personas_sup: table_personas_sup_1.personas_sup,
951
+ diccionario: table_diccionario_1.diccionario,
952
+ dicvar: table_dicvar_1.dicvar,
953
+ dictra: table_dictra_1.dictra,
954
+ inconsistencias_cumplen_condicion: table_inconsistencias_cumplen_condicion_1.inconsistencias_cumplen_condicion,
955
+ tem_borradas: table_tem_borradas_1.tem_borradas,
956
+ barrios: table_barrios_1.barrios,
957
+ fracciones: table_fracciones_1.fracciones,
958
+ radios: table_radios_1.radios,
959
+ manzanas: table_manzanas_1.manzanas,
960
+ area_enc_proximas: table_area_enc_proximas_1.area_enc_proximas });
961
+ be.appendToTableDefinition('consistencias', function (tableDef, context) {
962
+ var _a, _b;
963
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar);
964
+ tableDef.fields.forEach(function (field) {
965
+ if (field.name == 'error_compilacion') {
966
+ if (field.visible) {
967
+ console.error('************ QUITAR ESTO error_compilacion ya es visible');
968
+ }
969
+ field.visible = true;
970
+ }
971
+ });
972
+ });
973
+ be.appendToTableDefinition('inconsistencias', function (tableDef, context) {
974
+ var _a, _b;
975
+ tableDef.sql = Object.assign(Object.assign({}, tableDef.sql), { isTable: true });
976
+ tableDef.fields.splice(2, 0, { name: 'vivienda', typeName: 'text', editable: false }, { name: 'hogar', typeName: 'bigint', editable: false }, { name: 'persona', typeName: 'bigint', editable: false }, { name: 'visita', typeName: 'bigint', editable: false });
977
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.justificar);
978
+ tableDef.fields.forEach(function (field) {
979
+ var _a, _b;
980
+ if (field.name == 'pk_integrada') {
981
+ field.visible = false;
982
+ }
983
+ if (field.name == 'justificacion') {
984
+ field.editable = (context === null || context === void 0 ? void 0 : context.forDump) || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.justificar);
985
+ }
986
+ });
987
+ tableDef.fields = tableDef.fields.concat(['tarea_actual', 'tarea_anterior'].map(fn => {
988
+ return { name: fn, typeName: 'text', editable: false, inTable: false };
989
+ }));
990
+ //sacar campos de vitales!
991
+ const regExpFieldsVita = new RegExp('^(comp|infe|cod_causa|domi)$');
992
+ tableDef.fields = tableDef.fields.filter(f => !(regExpFieldsVita.test(f.name)));
993
+ var q_inconsist = tableDef.sql.from;
994
+ tableDef.sql.from = `
995
+ (select i.*, t.tarea_actual, tarea_anterior
996
+ from ${q_inconsist} i
997
+ join tem t on i.vivienda=t.enc and i.operativo=t.operativo
998
+ left join tareas_tem tt on t.operativo=tt.operativo and t.enc=tt.enc and t.tarea_actual=tt.tarea
999
+ left join lateral (
1000
+ select tarea as tarea_anterior
1001
+ from historial_tem ht
1002
+ where t.operativo = ht.operativo and t.enc = ht.enc
1003
+ order by ts_salida desc
1004
+ limit 1
1005
+ ) as ta on true
1006
+ )
1007
+ `;
1008
+ });
1009
+ be.appendToTableDefinition('operativos', function (tableDef, context) {
1010
+ tableDef.fields.splice(2, 0, {
1011
+ name: 'config_sorteo',
1012
+ typeName: 'jsonb',
1013
+ editable: false
1014
+ }, {
1015
+ name: 'habilitacion_boton_formulario',
1016
+ typeName: 'jsonb',
1017
+ editable: false
1018
+ }, {
1019
+ name: 'disform_cerrado',
1020
+ typeName: 'boolean',
1021
+ defaultValue: false,
1022
+ editable: (context === null || context === void 0 ? void 0 : context.forDump) || context != null && ['admin', 'dis_conceptual'].includes(context.user.rol)
1023
+ }, {
1024
+ name: 'con_rea_hogar',
1025
+ typeName: 'boolean',
1026
+ editable: false,
1027
+ defaultDbValue: 'true'
1028
+ }, {
1029
+ name: 'permite_generar_muestra',
1030
+ typeName: 'boolean',
1031
+ editable: false,
1032
+ defaultDbValue: 'false'
1033
+ });
1034
+ });
1035
+ be.appendToTableDefinition('variables', function (tableDef, context) {
1036
+ var _a, _b;
1037
+ var esAdmin = (context === null || context === void 0 ? void 0 : context.user.rol) === 'admin';
1038
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar);
1039
+ tableDef.allow = { delete: esAdmin };
1040
+ });
1041
+ be.appendToTableDefinition('momentos_consistencia', function (tableDef, _context) {
1042
+ tableDef.fields.push({ name: 'condicion', typeName: 'text', nullable: false, defaultDbValue: 'true' });
1043
+ });
1044
+ be.appendToTableDefinition('parametros', function (tableDef) {
1045
+ tableDef.fields.push({ name: 'modo_dm_defecto', typeName: 'text', editable: true, nullable: false, defaultDbValue: "'capa'" });
1046
+ tableDef.foreignKeys = tableDef.foreignKeys || [];
1047
+ tableDef.foreignKeys.push({ references: 'modos_dm', fields: [{ source: 'modo_dm_defecto', target: 'modo_dm' }] });
1048
+ });
1049
+ }
1050
+ };
1051
+ }
1052
+ exports.AppDmEncu = emergeAppDmEncu((0, procesamiento_1.emergeAppProcesamiento)((0, procesamiento_1.emergeAppConsistencias)((0, procesamiento_1.emergeAppVarCal)((0, procesamiento_1.emergeAppDatosExt)((0, procesamiento_1.emergeAppOperativos)(procesamiento_1.AppBackend))))));
1053
+ });
1054
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRtZW5jdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwLWRtZW5jdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBaUhiLDBDQUVDO0lBR0Qsb0RBYUM7SUF3QkQsa0ZBZ0JDO0lBaUVELDBDQSsyQkM7SUF4bENELGlEQUE0TDtJQUM1TCwyREFBNkU7SUFFN0Usd0NBQXdDO0lBQ3hDLHdDQUF3QztJQVN4QywyQ0FBa0Q7SUFFbEQsNkJBQTZCO0lBRTdCLG1DQUFtQztJQUVuQywyQkFBb0M7SUFFcEMsK0NBQXNDO0lBQ3RDLHFEQUE0QztJQUM1QyxpRUFBd0Q7SUFDeEQsK0RBQXdGO0lBQ3hGLCtEQUFnRTtJQUNoRSwrREFBK0Q7SUFDL0QsK0RBQW1FO0lBQ25FLHVFQUE4RDtJQUM5RCwrREFBc0Q7SUFDdEQsNkRBQW9EO0lBQ3BELDZEQUFvRDtJQUNwRCxxREFBNEM7SUFDNUMsaUVBQXdEO0lBQ3hELHFEQUE0QztJQUM1Qyx5REFBZ0Q7SUFDaEQseUVBQWdFO0lBRWhFLGlEQUF3QztJQUN4Qyx5REFBZ0Q7SUFDaEQsMkNBQWtDO0lBQ2xDLG1EQUEwQztJQUMxQywyQ0FBa0M7SUFDbEMsbURBQTBDO0lBQzFDLHFEQUE0QztJQUM1QywyREFBa0Q7SUFDbEQsbURBQTBDO0lBQzFDLCtDQUFzQztJQUN0QyxxRUFBNEQ7SUFDNUQsaURBQXdDO0lBQ3hDLHlEQU00QjtJQUM1Qiw2REFBb0Q7SUFDcEQscUZBQTRFO0lBQzVFLHFFQUE0RDtJQUM1RCw2REFBb0Q7SUFDcEQsNkRBQW9EO0lBQ3BELDZEQUFvRDtJQUNwRCw2REFBb0Q7SUFDcEQseURBQWdEO0lBQ2hELGlFQUF3RDtJQUN4RCw2RUFBb0U7SUFDcEUseUVBQWdFO0lBQ2hFLDZFQUFvRTtJQUNwRSxxRkFBNEU7SUFDNUUsdUZBQThFO0lBQzlFLHFFQUE0RDtJQUM1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VSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUN6RixDQUFDO2dCQUNOLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztTQUNKLENBQUE7SUFDTCxDQUFDO0lBRVUsUUFBQSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUEsc0NBQXNCLEVBQUMsSUFBQSxzQ0FBc0IsRUFBQyxJQUFBLCtCQUFlLEVBQUMsSUFBQSxpQ0FBaUIsRUFBQyxJQUFBLG1DQUFtQixFQUFDLDBCQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCAqIGFzIHByb2Nlc2FtaWVudG8gZnJvbSBcInByb2Nlc2FtaWVudG9cIjtcclxuaW1wb3J0IHsgZW1lcmdlQXBwUHJvY2VzYW1pZW50bywgZW1lcmdlQXBwQ29uc2lzdGVuY2lhcywgZW1lcmdlQXBwVmFyQ2FsLCBlbWVyZ2VBcHBEYXRvc0V4dCwgZW1lcmdlQXBwT3BlcmF0aXZvcywgQXBwQmFja2VuZCwgQ2xpZW50TW9kdWxlRGVmaW5pdGlvbiwgT3B0c0NsaWVudFBhZ2UgfSBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5pbXBvcnQgeyBwYXNhckVuY3Vlc3Rhc0FQcm9pZSwgUHJvY2VkdXJlc0RtRW5jdSB9IGZyb20gXCIuL3Byb2NlZHVyZXMtZG1lbmN1XCI7XHJcblxyXG5pbXBvcnQgKiBhcyBwZyBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0ICogYXMgbWluaVRvb2xzIGZyb20gXCJtaW5pLXRvb2xzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBDbGllbnQsIENvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsXHJcbiAgICBNZW51SW5mb0Jhc2UsXHJcbiAgICBQdWVkZSxcclxuICAgIFJlcXVlc3QsIFJlc3BvbnNlLFxyXG4gICAgU3VmaWpvc0FtYmllbnRlLFxyXG59IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5cclxuaW1wb3J0IHsgZXhwZWN0ZWQsIHVuZXhwZWN0ZWQgfSBmcm9tIFwiY2FzdC1lcnJvclwiO1xyXG5cclxuaW1wb3J0ICogYXMgeWF6bCBmcm9tIFwieWF6bFwiO1xyXG5pbXBvcnQgeyBOZXh0RnVuY3Rpb24gfSBmcm9tIFwiZXhwcmVzcy1zZXJ2ZS1zdGF0aWMtY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XHJcblxyXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gXCJmc1wiO1xyXG5cclxuaW1wb3J0IHsgcm9sZXMgfSBmcm9tIFwiLi90YWJsZS1yb2xlc1wiO1xyXG5pbXBvcnQgeyBwZXJzb25hbCB9IGZyb20gXCIuL3RhYmxlLXBlcnNvbmFsXCI7XHJcbmltcG9ydCB7IHJlY2VwY2lvbmlzdGFzIH0gZnJvbSBcIi4vdGFibGUtcmVjZXBjaW9uaXN0YXNcIjtcclxuaW1wb3J0IHsgZW5jdWVzdGFkb3Jlc19hc2lnbmFkb3MsIGluZ3Jlc2Fkb3Jlc19hc2lnbmFkb3MgfSBmcm9tIFwiLi90YWJsZS1lbmN1ZXN0YWRvcmVzXCI7XHJcbmltcG9ydCB7IHJlY3VwZXJhZG9yZXNfYXNpZ25hZG9zIH0gZnJvbSBcIi4vdGFibGUtZW5jdWVzdGFkb3Jlc1wiO1xyXG5pbXBvcnQgeyBzdXBlcnZpc29yZXNfYXNpZ25hZG9zIH0gZnJvbSBcIi4vdGFibGUtZW5jdWVzdGFkb3Jlc1wiO1xyXG5pbXBvcnQgeyBtaXNfc3VwZXJ2aXNvcmVzX2FzaWduYWRvcyB9IGZyb20gXCIuL3RhYmxlLWVuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgbWlzX2VuY3Vlc3RhZG9yZXMgfSBmcm9tIFwiLi90YWJsZS1taXNfZW5jdWVzdGFkb3Jlc1wiO1xyXG5pbXBvcnQgeyByZWN1cGVyYWRvcmVzIH0gZnJvbSBcIi4vdGFibGUtcmVjdXBlcmFkb3Jlc1wiO1xyXG5pbXBvcnQgeyBzdXBlcnZpc29yZXMgfSBmcm9tIFwiLi90YWJsZS1zdXBlcnZpc29yZXNcIjtcclxuaW1wb3J0IHsgcGVyc29uYWxfcm9sIH0gZnJvbSBcIi4vdGFibGUtcGVyc29uYWxfcm9sXCI7XHJcbmltcG9ydCB7IHBlcm1pc29zIH0gZnJvbSBcIi4vdGFibGUtcGVybWlzb3NcIjtcclxuaW1wb3J0IHsgcm9sZXNfcGVybWlzb3MgfSBmcm9tIFwiLi90YWJsZS1yb2xlc19wZXJtaXNvc1wiO1xyXG5pbXBvcnQgeyBtb2Rvc19kbSB9IGZyb20gXCIuL3RhYmxlLW1vZG9zX2RtXCI7XHJcbmltcG9ydCB7IHBhcmFtZXRyb3MgfSBmcm9tIFwiLi90YWJsZS1wYXJhbWV0cm9zXCI7XHJcbmltcG9ydCB7IHJvbGVzX3N1Ym9yZGluYWRvcyB9IGZyb20gXCIuL3RhYmxlLXJvbGVzX3N1Ym9yZGluYWRvc1wiO1xyXG5cclxuaW1wb3J0IHsgbm9fcmVhIH0gZnJvbSBcIi4vdGFibGUtbm9fcmVhXCI7XHJcbmltcG9ydCB7IG5vX3JlYV9zdXAgfSBmcm9tIFwiLi90YWJsZS1ub19yZWFfc3VwXCI7XHJcbmltcG9ydCB7IHJlYSB9IGZyb20gXCIuL3RhYmxlLXJlYVwiO1xyXG5pbXBvcnQgeyByZWFfc3VwIH0gZnJvbSBcIi4vdGFibGUtcmVhX3N1cFwiO1xyXG5pbXBvcnQgeyB0ZW0gfSBmcm9tIFwiLi90YWJsZS10ZW1cIjtcclxuaW1wb3J0IHsgc2VtYW5hcyB9IGZyb20gXCIuL3RhYmxlLXNlbWFuYXNcIjtcclxuaW1wb3J0IHsgdXN1YXJpb3MgfSBmcm9tICcuL3RhYmxlLXVzdWFyaW9zJztcclxuaW1wb3J0IHsgb3BlcmFjaW9uZXMgfSBmcm9tICcuL3RhYmxlLW9wZXJhY2lvbmVzJztcclxuaW1wb3J0IHsgY29tdW5hcyB9IGZyb20gJy4vdGFibGUtY29tdW5hcyc7XHJcbmltcG9ydCB7IGFyZWFzIH0gZnJvbSAnLi90YWJsZS1hcmVhcyc7XHJcbmltcG9ydCB7IHNpbmNyb25pemFjaW9uZXMgfSBmcm9tICcuL3RhYmxlLXNpbmNyb25pemFjaW9uZXMnO1xyXG5pbXBvcnQgeyB0YXJlYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhcyc7XHJcbmltcG9ydCB7XHJcbiAgICB0YXJlYXNfdGVtLFxyXG4gICAgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX2VuY3UsXHJcbiAgICB0YXJlYXNfdGVtX2FzaWduYWNpb25fcmVjdSxcclxuICAgIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9zdXBlLFxyXG4gICAgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX2luZ3JcclxufSBmcm9tICcuL3RhYmxlLXRhcmVhc190ZW0nO1xyXG5pbXBvcnQgeyB0YXJlYXNfYXJlYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IGFyZWFzX2FzaWduYWNpb25fZ2VuZXJhbCB9IGZyb20gJy4vdGFibGUtYXJlYXNfYXNpZ25hY2lvbl9nZW5lcmFsJztcclxuaW1wb3J0IHsgZ3JpbGxhX2hvamFfcnV0YSB9IGZyb20gJy4vdGFibGUtZ3JpbGxhX2hvamFfcnV0YSc7XHJcbmltcG9ydCB7IHRfZW5jdV9hcmVhcyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX2FyZWFzJztcclxuaW1wb3J0IHsgdF9yZWN1X2FyZWFzIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyB0X3N1cGVfYXJlYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IHRfaW5ncl9hcmVhcyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX2FyZWFzJztcclxuaW1wb3J0IHsgbWlzX3RhcmVhcyB9IGZyb20gJy4vdGFibGUtbWlzX3RhcmVhcyc7XHJcbmltcG9ydCB7IHRlbV9hc2lnbmFjaW9uIH0gZnJvbSAnLi90YWJsZS10ZW1fYXNpZ25hY2lvbic7XHJcbmltcG9ydCB7IHRhcmVhc190ZW1fcmVjZXBjaW9uIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfdGVtX3JlY2VwY2lvbic7XHJcbmltcG9ydCB7IHRhcmVhc190ZW1faW5ncmVzbyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3RlbV9pbmdyZXNvJztcclxuaW1wb3J0IHsgdGFyZWFzX3RlbV9maW5fY2FtcG8gfSBmcm9tICcuL3RhYmxlLXRhcmVhc190ZW1fZmluX2NhbXBvJztcclxuaW1wb3J0IHsgdGFyZWFzX3RlbV9wcm9jZXNhbWllbnRvIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfdGVtX3Byb2Nlc2FtaWVudG8nO1xyXG5pbXBvcnQgeyB0YXJlYXNfdGVtX2FuYWxpc2lzX2NhbXBvIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfdGVtX2FuYWxpc2lzX2NhbXBvJztcclxuaW1wb3J0IHsgbWlzX3RhcmVhc19hcmVhcyB9IGZyb20gJy4vdGFibGUtbWlzX3RhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IGNvbnRyb2xfY2FtcG8gfSBmcm9tICcuL3RhYmxlLWNvbnRyb2xfY2FtcG8nO1xyXG5pbXBvcnQgeyBjb250cm9sX3Jlc3VtZW4gfSBmcm9tICcuL3RhYmxlLWNvbnRyb2xfcmVzdW1lbic7XHJcbmltcG9ydCB7IGNvbnRyb2xfZGlhc19jYXJnYSB9IGZyb20gJy4vdGFibGUtY29udHJvbF9kaWFzX2NhcmdhJztcclxuaW1wb3J0IHsgdml2aWVuZGFzIH0gZnJvbSAnLi90YWJsZS12aXZpZW5kYXMnO1xyXG5pbXBvcnQgeyB2aXNpdGFzIH0gZnJvbSAnLi90YWJsZS12aXNpdGFzJztcclxuaW1wb3J0IHsgaG9nYXJlcyB9IGZyb20gJy4vdGFibGUtaG9nYXJlcyc7XHJcbmltcG9ydCB7IHBlcnNvbmFzIH0gZnJvbSAnLi90YWJsZS1wZXJzb25hcyc7XHJcbmltcG9ydCB7IHZpc2l0YXNfc3VwIH0gZnJvbSAnLi90YWJsZS12aXNpdGFzX3N1cCc7XHJcbmltcG9ydCB7IGhvZ2FyZXNfc3VwIH0gZnJvbSAnLi90YWJsZS1ob2dhcmVzX3N1cCc7XHJcbmltcG9ydCB7IHBlcnNvbmFzX3N1cCB9IGZyb20gJy4vdGFibGUtcGVyc29uYXNfc3VwJztcclxuaW1wb3J0IHsgZGljY2lvbmFyaW8gfSBmcm9tICcuL3RhYmxlLWRpY2Npb25hcmlvJztcclxuaW1wb3J0IHsgZGljdHJhIH0gZnJvbSAnLi90YWJsZS1kaWN0cmEnO1xyXG5pbXBvcnQgeyBkaWN2YXIgfSBmcm9tICcuL3RhYmxlLWRpY3Zhcic7XHJcblxyXG5pbXBvcnQgeyBlc3RhZG9zIH0gZnJvbSAnLi90YWJsZS1lc3RhZG9zJztcclxuaW1wb3J0IHsgYWNjaW9uZXMgfSBmcm9tICcuL3RhYmxlLWFjY2lvbmVzJztcclxuaW1wb3J0IHsgZXN0YWRvc19hY2Npb25lcyB9IGZyb20gJy4vdGFibGUtZXN0YWRvc19hY2Npb25lcyc7XHJcbmltcG9ydCB7IHRhcmVhc19wcm94aW1hcyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3Byb3hpbWFzJztcclxuaW1wb3J0IHsgaGlzdG9yaWFsX3RlbSB9IGZyb20gJy4vdGFibGUtaGlzdG9yaWFsX3RlbSc7XHJcbmltcG9ydCB7IGluY29uc2lzdGVuY2lhc19jdW1wbGVuX2NvbmRpY2lvbiB9IGZyb20gJy4vdGFibGUtaW5jb25zaXN0ZW5jaWFzX2N1bXBsZW5fY29uZGljaW9uJztcclxuaW1wb3J0IHsgdGVtX2JvcnJhZGFzIH0gZnJvbSAnLi90YWJsZS10ZW1fYm9ycmFkYXMnO1xyXG5pbXBvcnQgeyBiYXJyaW9zIH0gZnJvbSBcIi4vdGFibGUtYmFycmlvc1wiO1xyXG5pbXBvcnQgeyBmcmFjY2lvbmVzIH0gZnJvbSBcIi4vdGFibGUtZnJhY2Npb25lc1wiO1xyXG5pbXBvcnQgeyByYWRpb3MgfSBmcm9tIFwiLi90YWJsZS1yYWRpb3NcIjtcclxuaW1wb3J0IHsgbWFuemFuYXMgfSBmcm9tIFwiLi90YWJsZS1tYW56YW5hc1wiO1xyXG5pbXBvcnQgeyBhcmVhX2VuY19wcm94aW1hcyB9IGZyb20gXCIuL3RhYmxlLWFyZWFfZW5jX3Byb3hpbWFzXCI7XHJcblxyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgZGVmQ29uZmlnIH0gZnJvbSBcIi4vZGVmLWNvbmZpZ1wiXHJcbmltcG9ydCB7IFByb2NlZHVyZURlZiB9IGZyb20gXCJiYWNrZW5kLXBsdXNcIjtcclxuaW1wb3J0IHsgdGFibGUgfSBmcm9tIFwiY29uc29sZVwiO1xyXG5cclxuaW1wb3J0IHsgZGF0ZXRpbWUgfSBmcm9tIFwiYmVzdC1nbG9iYWxzXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcblxyXG5cclxuY29uc3QgQVBQX0RNX1ZFUlNJT04gPSBcIiMyMi0xMi0xNVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZG9CeVBvbGljeShiZTogQXBwQmFja2VuZCkge1xyXG4gICAgcmV0dXJuIGJlLmNvbmZpZy5zZXJ2ZXIucG9saWN5ID09ICd3ZWInID8gJ1JFTEVWQU1JRU5UTycgOiAnR0FCSU5FVEUnO1xyXG59XHJcblxyXG4vLyBwZXJtaXNvcyBxdWUgZ2V0Q29udGV4dCBhZ3JlZ2EgYWwgY29udGV4dG8gc2Vnw7puIGVsIHVzdWFyaW8gbG9ndWVhZG8gKG8gbGEgZmFsdGEgZGUgdXN1YXJpbylcclxuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc29zU2VndW5Vc3VhcmlvKFxyXG4gICAgY2FjaGVzOiBQaWNrPEFwcEJhY2tlbmRbJ2NhY2hlcyddLCAncGVybWlzb3NSb2wnIHwgJ3Blcm1pc29zU3VwZXJ1c2VyJyB8ICdwZXJtaXNvc1BhcmFOYWRpZSc+LFxyXG4gICAgdXNlcjogQ29udGV4dFsndXNlciddIHwgdW5kZWZpbmVkXHJcbik6IHsgc3VwZXJ1c2VyPzogdHJ1ZSwgcHVlZGU/OiBQdWVkZSB9IHtcclxuICAgIGlmICh1c2VyID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4geyBwdWVkZTogY2FjaGVzLnBlcm1pc29zUGFyYU5hZGllIH07XHJcbiAgICB9XHJcbiAgICB2YXIgcm9sID0gdXNlci5yb2w7XHJcbiAgICB2YXIgcGVybWlzb3NEZWxSb2wgPSByb2wgIT0gbnVsbCA/IGNhY2hlcy5wZXJtaXNvc1JvbFtyb2xdIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKHBlcm1pc29zRGVsUm9sPy5zdXBlcnVzZXIpIHtcclxuICAgICAgICByZXR1cm4geyBzdXBlcnVzZXI6IHRydWUsIHB1ZWRlOiBjYWNoZXMucGVybWlzb3NTdXBlcnVzZXIgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHB1ZWRlOiBwZXJtaXNvc0RlbFJvbD8ucHVlZGUgfTtcclxufVxyXG5cclxuLy8gbG8gcXVlIHVzYW4gcmVmcmVzaENhY2hlcyB5IHJlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhIGRlbCBjbGllbnRlIGRlIGJhc2UgKGVsIENsaWVudCBkZSBwZy1wcm9taXNlLXN0cmljdCBsbyBjdW1wbGUpXHJcbmV4cG9ydCB0eXBlIENvbnN1bHRhRGIgPSB7XHJcbiAgICBmZXRjaEFsbCgpOiBQcm9taXNlPHBnLlJlc3VsdFJvd3M+XHJcbiAgICBmZXRjaFVuaXF1ZVJvdygpOiBQcm9taXNlPHBnLlJlc3VsdE9uZVJvdz5cclxufVxyXG5leHBvcnQgdHlwZSBDbGllbnRlRGIgPSB7XHJcbiAgICBxdWVyeShzcWw6IHN0cmluZyk6IENvbnN1bHRhRGJcclxufVxyXG5cclxuLy8gdGFibGFzIGN1eWEgbW9kaWZpY2FjacOzbiBjYW1iaWEgbGEgZXN0cnVjdHVyYSBxdWUgc2UgbWFuZGEgYSBsb3MgZGlzcG9zaXRpdm9zICh2ZXIgb3BlcmF0aXZvX2VzdHJ1Y3R1cmFfY29tcGxldGEpXHJcbmV4cG9ydCBjb25zdCBUQUJMQVNfRVNUUlVDVFVSQSA9IFsnY2FzaWxsZXJvcycsICdzZW1hbmFzJ107XHJcbi8vIHRhYmxhcyBkZSByZWEvbm8gcmVhLCBxdWUgYWRlbcOhcyBzZSBndWFyZGFuIGVuIGJlLmNhY2hlcy50YWJsZUNvbnRlbnQgKHZlciByZWZyZXNoQ2FjaGVzKVxyXG5leHBvcnQgY29uc3QgVEFCTEFTX1JFQV9OT19SRUEgPSBbJ3JlYScsICdub19yZWEnLCAncmVhX3N1cCcsICdub19yZWFfc3VwJ107XHJcblxyXG5leHBvcnQgdHlwZSBSZWZyZXNjYWRvckVzdHJ1Y3R1cmEgPSB7XHJcbiAgICBjYWNoZXM6IHsgdGltZXN0YW1wRXN0cnVjdHVyYTogbnVtYmVyIH1cclxuICAgIHJlZnJlc2hDYWNoZXMoY2xpZW50OiBDbGllbnRlRGIpOiBQcm9taXNlPHZvaWQ+XHJcbn1cclxuXHJcbi8vIGVudnVlbHZlIHRhYmxlX3JlY29yZF9zYXZlL3RhYmxlX3JlY29yZF9kZWxldGUgcGFyYSBxdWUgYWwgbW9kaWZpY2FyIGVzYXMgdGFibGFzIGxvcyBkaXNwb3NpdGl2b3NcclxuLy8gcmVjaWJhbiBsYSBlc3RydWN0dXJhIG51ZXZhICh0aW1lc3RhbXBFc3RydWN0dXJhKSB5LCBzaSBzb24gZGUgcmVhL25vIHJlYSwgc2UgcmVjYXJndWVuIGxhcyBjYWNoZXNcclxuLy8gY29uIGVsIG1pc21vIGNsaWVudGUgKGRlbnRybyBkZSBsYSBtaXNtYSB0cmFuc2FjY2nDs24pXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYTxDIGV4dGVuZHMgeyBjbGllbnQ6IENsaWVudGVEYiB9LCBQIGV4dGVuZHMgeyB0YWJsZTogc3RyaW5nIH0sIFIsIFJlc3RvIGV4dGVuZHMgKG9iamVjdCB8IHVuZGVmaW5lZClbXT4oXHJcbiAgICBiZTogUmVmcmVzY2Fkb3JFc3RydWN0dXJhLFxyXG4gICAgY29yZUZ1bmN0aW9uOiAoY29udGV4dDogQywgcGFyYW1ldGVyczogUCwgLi4ucmVzdG86IFJlc3RvKSA9PiBQcm9taXNlPFI+XHJcbik6IChjb250ZXh0OiBDLCBwYXJhbWV0ZXJzOiBQLCAuLi5yZXN0bzogUmVzdG8pID0+IFByb21pc2U8Uj4ge1xyXG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBDLCBwYXJhbWV0ZXJzOiBQLCAuLi5yZXN0bzogUmVzdG8pIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMsIC4uLnJlc3RvKTtcclxuICAgICAgICBpZiAoVEFCTEFTX0VTVFJVQ1RVUkEuaW5jbHVkZXMocGFyYW1ldGVycy50YWJsZSkpIHtcclxuICAgICAgICAgICAgYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlIHRvY8OzIGxhIGVzdHJ1Y3R1cmEnLCBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFRBQkxBU19SRUFfTk9fUkVBLmluY2x1ZGVzKHBhcmFtZXRlcnMudGFibGUpKSB7XHJcbiAgICAgICAgICAgIGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnJlZnJlc2hDYWNoZXMoY29udGV4dC5jbGllbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCByZWdpc3RyYXJDcm9uSm9iUGFzYXJBUHJvaWUgPSBhc3luYyAoYmU6IEFwcEJhY2tlbmQpID0+IHtcclxuICAgIGNvbnN0IGVqZWN1dGFyUGFzYWplID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxvZyA9IChtc2c6IHN0cmluZywgZGF0YTogYW55ID0gJycpID0+XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2RhdGV0aW1lLm5vdygpLnRvWW1kSG1zKCl9IFtDUk9OOlBST0lFXSAke21zZ31gLCBkYXRhKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2coJ/CfmoAgaW5pY2lhIGNyb24gcGFzYWplIGEgcHJvaWUnKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIChjbGllbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXNhckVuY3Vlc3Rhc0FQcm9pZShjbGllbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxvZygn4pyFIHJlc3VsdCBwcm9jIHBhc2FqZSBhIHByb2llOicsIHJlc3VsdCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJvciA9IHVuZXhwZWN0ZWQoZXJyKTtcclxuICAgICAgICAgICAgbG9nKGDinYwgZXJyb3IgcGFzYWplIGEgcHJvaWU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBsb2coJ/Cfj4EgdGVybWluYSBjcm9uIHByb2llJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGF3YWl0IGVqZWN1dGFyUGFzYWplKCk7XHJcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKGVqZWN1dGFyUGFzYWplLCAxMDAwICogNjAgKiA2MClcclxuICAgIGJlLnNodXRkb3duQ2FsbGJhY2tMaXN0QWRkKHtcclxuICAgICAgICBtZXNzYWdlOiAnYXBhZ2EgY3JvbiBwYXNhciBhIHByb2llJyxcclxuICAgICAgICBmdW46IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgZ2V0TWFuaWZlc3RJbWFnZUljb25zID0gKEFQUF9OQU1FOiBzdHJpbmcsIHN1Zmlqbzogc3RyaW5nKSA9PiBbXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTMyJHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjMyeDMyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTQ4JHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjQ4eDQ4XCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTY0JHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjY0eDY0XCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTcyJHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjcyeDcyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTE5MiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgIFwic2l6ZXNcIjogXCIxOTJ4MTkyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTUxMiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgIFwic2l6ZXNcIjogXCI1MTJ4NTEyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH1cclxuXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbWVyZ2VBcHBEbUVuY3U8VCBleHRlbmRzIHByb2Nlc2FtaWVudG8uQ29uc3RydWN0b3I8cHJvY2VzYW1pZW50by5BcHBQcm9jZXNhbWllbnRvVHlwZT4+KEJhc2U6IFQpIHtcclxuICAgIHJldHVybiBjbGFzcyBBcHBEbUVuY3UgZXh0ZW5kcyBCYXNlIHtcclxuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgICAgICAgICBzdXBlcihhcmdzKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50ID0gdGhpcy5jYWNoZXMudGFibGVDb250ZW50IHx8IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhID0gW11cclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMgPSBbXVxyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy5tZXRhRW5jSW5jbHVpckNhc2lsbGVyb3NTYWx0b1JFTCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRTdWZpam9Gcm9tYmFzZVVybCA9IChiYXNlVXJsOiBzdHJpbmcpID0+XHJcbiAgICAgICAgICAgIGJhc2VVcmwuaW5jbHVkZXMoJ3Rlc3QnKSB8fCBiYXNlVXJsLmluY2x1ZGVzKCcvcHInKSA/ICdfdGVzdCcgOlxyXG4gICAgICAgICAgICAgICAgYmFzZVVybC5pbmNsdWRlcygnY2FwYScpID8gJ19jYXBhJyA6ICcnO1xyXG5cclxuICAgICAgICBnZXRBcHBOYW1lID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICByZXR1cm4gKChhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIChjbGllbnQ6IHBnLkNsaWVudCkgPT5cclxuICAgICAgICAgICAgICAgIGNsaWVudC5xdWVyeShcInNlbGVjdCBvcGVyYXRpdm8gZnJvbSBwYXJhbWV0cm9zIHdoZXJlIHVuaWNvX3JlZ2lzdHJvXCIpLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICApKS52YWx1ZSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYmFja2VuZC1wbHVzIGxvIGRlY2xhcmEgc2luIHBhcsOhbWV0cm9zIHBlcm8gbG8gbGxhbWEgY29uIChjb250ZXh0LCB1c3VhcmlvKSwgcG9yIGVzbyBzb24gb3BjaW9uYWxlc1xyXG4gICAgICAgIG92ZXJyaWRlIGFzeW5jIGNhbkNoYW5nZVBhc3MocmVxT3JDb250ZXh0PzogUmVxdWVzdCB8IENvbnRleHQsIHVzZXJUb0NoYW5nZVBhc3M/OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciB1c3VhcmlvTG9ndWVhZG8gPSByZXFPckNvbnRleHQ/LnVzZXI7XHJcbiAgICAgICAgICAgIGlmIChyZXFPckNvbnRleHQgPT0gbnVsbCB8fCB1c3VhcmlvTG9ndWVhZG8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByb2wgPSB1c3VhcmlvTG9ndWVhZG8ucm9sO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUuaW5EYkNsaWVudChudWxsLCBhc3luYyAoY2xpZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcSA9IGJlLmRiLnF1b3RlTGl0ZXJhbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIFxyXG4gICAgICAgICAgICAgICAgICBmcm9tIHVzdWFyaW9zIFxyXG4gICAgICAgICAgICAgICAgICB3aGVyZSByb2wgaW4gKHNlbGVjdCByb2xfc3Vib3JkaW5hZG8gZnJvbSByb2xlc19zdWJvcmRpbmFkb3Mgd2hlcmUgcm9sID0gJHtxKHJvbCl9KWApLmZldGNoQWxsKCkpLnJvd3M7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBwdWVkZSA9ICEhcmVzdWx0LmZpbmQoKHVzZXIpID0+IHVzZXIudXN1YXJpbyA9PSB1c2VyVG9DaGFuZ2VQYXNzKTtcclxuICAgICAgICAgICAgdmFyIGlzQWRtaW4gPSBiZS5pc0FkbWluKHJlcU9yQ29udGV4dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpc0FkbWluIHx8IHB1ZWRlXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhc3luYyBnZXRQcm9jZWR1cmVzKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgcHJvY2VkaW1pZW50b0FSZWVtcGxhemFyID0gW1wiY2Fzb19ndWFyZGFyXCIsIFwiY2Fzb190cmFlclwiXTtcclxuICAgICAgICAgICAgdmFyIHBhcmVudFByb2MgPSBhd2FpdCBzdXBlci5nZXRQcm9jZWR1cmVzKCk7XHJcbiAgICAgICAgICAgIHBhcmVudFByb2MgPSBwYXJlbnRQcm9jLmZpbHRlcigocHJvY2VkdXJlOiBhbnkpID0+ICFwcm9jZWRpbWllbnRvQVJlZW1wbGF6YXIuaW5jbHVkZXMocHJvY2VkdXJlLmFjdGlvbikpO1xyXG4gICAgICAgICAgICBwYXJlbnRQcm9jID0gcGFyZW50UHJvYy5tYXAocHJvY0RlZiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY0RlZi5hY3Rpb24gPT0gJ3RhYmxlX3JlY29yZF9zYXZlJyB8fCBwcm9jRGVmLmFjdGlvbiA9PSAndGFibGVfcmVjb3JkX2RlbGV0ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jRGVmLmNvcmVGdW5jdGlvbiA9IHJlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhKGJlLCBwcm9jRGVmLmNvcmVGdW5jdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY0RlZjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudFByb2MuY29uY2F0KFByb2NlZHVyZXNEbUVuY3UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhc3luYyBjaGVja0RhdGFiYXNlU3RydWN0dXJlKF9jbGllbnQ6IENsaWVudCkge1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwOiBwcm9jZXNhbWllbnRvLkV4cHJlc3MsIGJhc2VVcmw6IHN0cmluZykge1xyXG4gICAgICAgICAgICBsZXQgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBzdXBlci5hZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwLCBiYXNlVXJsKTtcclxuICAgICAgICAgICAgLy9wZXJtaXRvIGxldmFudGFyIG1pcyBpbWFnZW5lcyBlbiBhcGxpY2FjaW9uZXMgZGVwZW5kaWVudGVzXHJcbiAgICAgICAgICAgIGJlLmFwcC51c2UoJy9pbWcnLCBleHByZXNzLnN0YXRpYygnbm9kZV9tb2R1bGVzL2RtZW5jdS9kaXN0L3VubG9nZ2VkL3VubG9nZ2VkL2ltZycpKVxyXG4gICAgICAgICAgICBtYWluQXBwLnVzZShmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCBfcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxLnNlc3Npb24gJiYgIXJlcS5zZXNzaW9uLmluc3RhbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXEuc2Vzc2lvbi5pbnN0YWxsID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9zYWx2YXInLCBmdW5jdGlvbiAocmVxLCByZXMsIF9uZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIHPDqSBxdWUgdm95IGEgcmVjaWJpciB1c2VyYWdlbnQgcG9yIGxvcyBtaWRkbGV3YXJlcyBkZSBCYWNrZW5kLXBsdXNcclxuICAgICAgICAgICAgICAgIHZhciB7IHVzZXJhZ2VudCB9ID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgdmFyIGh0bWxNYWluID0gYmUubWFpblBhZ2UoeyB1c2VyYWdlbnQgfSwgZmFsc2UsIHsgc2tpcE1lbnU6IHRydWUsIG9mZmxpbmVGaWxlOiB0cnVlIH0pLnRvSHRtbERvYygpO1xyXG4gICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChodG1sTWFpbiwgJ2h0bWwnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9jYW1wbycsIGZ1bmN0aW9uIChyZXEsIHJlcywgX25leHQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgc8OpIHF1ZSB2b3kgYSByZWNpYmlyIHVzZXJhZ2VudCBwb3IgbG9zIG1pZGRsZXdhcmVzIGRlIEJhY2tlbmQtcGx1c1xyXG4gICAgICAgICAgICAgICAgdmFyIHsgdXNlcmFnZW50LCB1c2VyIH0gPSByZXE7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7e3R5cGU6J2pzJywgc3JjOnN0cmluZ31bXX0gKi9cclxuICAgICAgICAgICAgICAgICAgICB2YXIgd2ViTWFuaWZlc3RQYXRoID0gJ2NhcmdhLWRtL3dlYi1tYW5pZmVzdC53ZWJtYW5pZmVzdCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxNYWluID0gYmUubWFpblBhZ2UoeyB1c2VyYWdlbnQsIHVzZXIgfSwgZmFsc2UsIHsgc2tpcE1lbnU6IHRydWUsIHdlYk1hbmlmZXN0UGF0aCwgb2ZmbGluZUZpbGU6IHRydWUgfSkudG9IdG1sRG9jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChodG1sTWFpbiwgJ2h0bWwnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcy5yZWRpcmVjdCg0MDEsIGJhc2VVcmwgKyAnL2xvZ2luI3c9cGF0aCZwYXRoPS9jYW1wbycpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9mYWxsYmFjay1zaW5jcm8nLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25GYWxsYmFjayA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05vIHNlIGxvZ3LDsyBlc3RhYmxlY2VyIGxhIGNvbmV4aW9uIGNvbiBlbCBzZXJ2aWRvciwgY29tcHJ1ZWJlIHN1IGNvbmV4aW9uIGRlIGludGVybmV0IChyZXNwdWVzdGEgZGVzZGUgZmFsbGJhY2spJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVKc29uKGpzb25GYWxsYmFjaykocmVxLCByZXMsIG5leHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGNyZWF0ZVNlcnZpY2VXb3JrZXIgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3cgPSBhd2FpdCBmcy5yZWFkRmlsZSgnbm9kZV9tb2R1bGVzL3NlcnZpY2Utd29ya2VyLWFkbWluL2Rpc3Qvc2VydmljZS13b3JrZXItd28tbWFuaWZlc3QuanMnLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hbmlmZXN0ID0gYXdhaXQgYmUuY3JlYXRlUmVzb3VyY2VzRm9yQ2FjaGVKc29uKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3dNYW5pZmVzdCA9IHN3XHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCInLyp2ZXJzaW9uKi8nXCIsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LnZlcnNpb24pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qYXBwTmFtZSovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5hcHBOYW1lKSlcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbXFxzKlxcL1xcKnVybHNUb0NhY2hlXFwqXFwvXFxzKlxcXS8sIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LmNhY2hlKSlcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbXFxzKlxcL1xcKmZhbGxiYWNrc1xcKlxcL1xccypcXF0vLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5mYWxsYmFja3MgfHwgW10pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qZGVmYXVsdEZhbGxiYWNrKi8nXCIsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LmRlZmF1bHRGYWxsYmFjaykpO1xyXG4gICAgICAgICAgICAgICAgLy8ucmVwbGFjZShcIi8jQ0FDSEUkL1wiLCBcIi8oYVxcXFxkK21cXFxcZCtwXFxcXGQrdFxcXFxkK19lc3RydWN0dXJhLmpzKXwoYVxcXFxkK21cXFxcZCtwXFxcXGQrdFxcXFxkK19oZHIuanNvbikvXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN3TWFuaWZlc3RcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgYC9zdy1tYW5pZmVzdC5qc2AsIGFzeW5jIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVUZXh0KGF3YWl0IGNyZWF0ZVNlcnZpY2VXb3JrZXIoKSwgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVFcnIocmVxLCByZXMsIG5leHQpKHVuZXhwZWN0ZWQoZXJyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgYC9jYXJnYS1kbS93ZWItbWFuaWZlc3Qud2VibWFuaWZlc3RgLCBhc3luYyBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEFQUF9OQU1FID0gYXdhaXQgYmUuZ2V0QXBwTmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VmaWpvID0gYmUuZ2V0U3VmaWpvRnJvbWJhc2VVcmwoYmFzZVVybCk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBgJHtBUFBfTkFNRX0ke3N1Zmlqb30gUHJvZ3Jlc3NpdmUgV2ViIEFwcGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2hvcnRfbmFtZVwiOiBgJHtBUFBfTkFNRX0ke3N1Zmlqb30gUFdBYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBgUHJvZ3Jlc3NpdmUgV2ViIEFwcCBmb3IgJHtBUFBfTkFNRX0ke3N1Zmlqb30uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpY29uc1wiOiBnZXRNYW5pZmVzdEltYWdlSWNvbnMoQVBQX05BTUUsIHN1ZmlqbyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJlLmdldENvbG9yc0pzb24oc3VmaWpvIGFzIFN1Zmlqb3NBbWJpZW50ZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChKU09OLnN0cmluZ2lmeShjb250ZW50KSwgJ2FwcGxpY2F0aW9uL2pzb24nKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVFcnIocmVxLCByZXMsIG5leHQpKHVuZXhwZWN0ZWQoZXJyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRDb2xvcnNKc29uKF9zdWZpam86IFN1Zmlqb3NBbWJpZW50ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgXCJzdGFydF91cmxcIjogXCIuLi9jYW1wb1wiLFxyXG4gICAgICAgICAgICAgICAgXCJkaXNwbGF5XCI6IFwic3RhbmRhbG9uZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ0aGVtZV9jb2xvclwiOiBcIiMzRjUxQjVcIixcclxuICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZF9jb2xvclwiOiBcIiM2ZDYwZWRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGFkZExvZ2dlZFNlcnZpY2VzKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBzdXBlci5hZGRMb2dnZWRTZXJ2aWNlcygpO1xyXG4gICAgICAgICAgICBiZS5hcHAuZ2V0KCcvbWFuaWZlc3QubWFuaWZlc3QnLCBhc3luYyBmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBfbmV4dDogTmV4dEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVGaWxlKCdzcmMvY2xpZW50L21hbmlmZXN0Lm1hbmlmZXN0Jywge30pKHJlcSwgcmVzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwLmdldCgnL2ZpbGUnLCBhc3luYyBmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihyZXEsXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWVudDogcGcuQ2xpZW50KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucXVlcnkoXCJzZWxlY3QgcnV0YSBmcm9tIGFkanVudG9zIHdoZXJlIGlkX2FkanVudG8gPSAkMVwiLCBbcmVxLnF1ZXJ5LmlkX2FkanVudG9dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlUGF0aCA9IHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoZmlsZVBhdGgsIHt9KShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFwcC5nZXQoJy9pbWFnZW5lcycsIGFzeW5jIGZ1bmN0aW9uIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoJ2xvY2FsLWltYWdlcy8nICsgcmVxLnF1ZXJ5LnBkZiwge30pKHJlcSwgcmVzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwLmdldCgnL2Rvd25sb2FkL2FsbCcsIGFzeW5jIGZ1bmN0aW9uIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6ICgpID0+IHZvaWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXEudXNlciA9PSBudWxsIHx8IHJlcS51c2VyLnJvbCAhPSAnYWRtaW4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGVzdMOhIGF1dG9yaXphZG8gYSBiYWphcnNlIHRvZG8nLCByZXEudXNlcilcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHppcCA9IG5ldyB5YXpsLlppcEZpbGUoKTtcclxuICAgICAgICAgICAgICAgIHppcC5vdXRwdXRTdHJlYW0ucGlwZShyZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhc2UgPSAnbG9jYWwtYXR0YWNobWVudHMnXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGJhc2UpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIGZ1bmN0aW9uIChmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVQYXRoID0gYmFzZSArICcvJyArIGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgemlwLmFkZEZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB6aXAuZW5kKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGFzeW5jIHBvc3RDb25maWcoKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnBvc3RDb25maWcoKTtcclxuICAgICAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICAgICAgYmUuY2FjaGVzLm1ldGFFbmNJbmNsdWlyQ2FzaWxsZXJvc1NhbHRvUkVMID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24gKGNsaWVudDogcGcuQ2xpZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcVBlcm1pc29zID0gYFxyXG4gICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhyLnJvbCxqc29uYl9idWlsZF9vYmplY3QoJ3N1cGVydXNlcicsci5zdXBlcnVzZXIsJ3B1ZWRlJywoXHJcbiAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHJwLnBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhycGEuYWNjaW9uLHJwYS5oYWJpbGl0YWRvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcnBhLnJvbD1ycC5yb2wgQU5EIHJwYS5wZXJtaXNvPXJwLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBycC5yb2w9ci5yb2wgI2NvbmRIYWJpbGl0YWRvI1xyXG4gICAgICAgICAgICAgICkpKVxyXG4gICAgICAgICAgICAgIEZST00gcm9sZXMgclxyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHFQZXJtaXNvcy5yZXBsYWNlKCcjY29uZEhhYmlsaXRhZG8jJywgJycpKS5mZXRjaFVuaXF1ZVZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHFQZXJtaXNvcy5yZXBsYWNlKCcjY29uZEhhYmlsaXRhZG8jJywgYCBhbmQgcnAuJHtwZy5xdW90ZUlkZW50KCdoYWJpbGl0YWRvJyl9YCkpLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhhY2Npb24sdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcGEucGVybWlzbz1wLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBcclxuICAgICAgICAgICAgICAgIGApLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhhY2Npb24sZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBwZXJtaXNvcyBwYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHBhLnBlcm1pc289cC5wZXJtaXNvXHJcbiAgICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgICAgRlJPTSBwZXJtaXNvcyBwXHJcbiAgICAgICAgICAgICAgICBgKS5mZXRjaFVuaXF1ZVZhbHVlKClcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMucGVybWlzb3NSb2wgPSByZXN1bHRzWzBdLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYmUuY2FjaGVzLnBlcm1pc29zUm9sU29sb1RydWUgPSByZXN1bHRzWzFdLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYmUuY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyID0gcmVzdWx0c1syXS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJlLmNhY2hlcy5wZXJtaXNvc1BhcmFOYWRpZSA9IHJlc3VsdHNbM10udmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGlyKGJlLmNhY2hlcy5wZXJtaXNvc1JvbFNvbG9UcnVlLHtkZXB0aDo5fSk7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGlyKGJlLmNhY2hlcy5wZXJtaXNvc1N1cGVydXNlcix7ZGVwdGg6OX0pO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRpcihiZS5jYWNoZXMucGVybWlzb3NQYXJhTmFkaWUse2RlcHRoOjl9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaENhY2hlcygpO1xyXG4gICAgICAgICAgICBhd2FpdCByZWdpc3RyYXJDcm9uSm9iUGFzYXJBUHJvaWUoYmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBjb25maWdTdGF0aWNDb25maWcoKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmNvbmZpZ1N0YXRpY0NvbmZpZygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRpY0NvbmZpZyhkZWZDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBjbGllbnRJbmNsdWRlcyhyZXE6IFJlcXVlc3QsIG9wdHM6IE9wdHNDbGllbnRQYWdlKTogQ2xpZW50TW9kdWxlRGVmaW5pdGlvbltdIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIHVubG9nZ2VkID0gb3B0cyAmJiBvcHRzLm9mZmxpbmVGaWxlO1xyXG4gICAgICAgICAgICB2YXIgbWVudWVkUmVzb3VyY2VzOiBDbGllbnRNb2R1bGVEZWZpbml0aW9uW10gPSB1bmxvZ2dlZCA/IFtcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkJywgZmlsZTogJ3VubG9nZ2VkLmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgXSA6IFtcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL2NsaWVudC9jbGllbnQnLCBmaWxlOiAnY2xpZW50LmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5leHRyYUZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBtZW51ZWRSZXNvdXJjZXMgPSBtZW51ZWRSZXNvdXJjZXMuY29uY2F0KG9wdHMuZXh0cmFGaWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGV4dGVybmFsUmVzb3VyY2VzOiBDbGllbnRNb2R1bGVEZWZpbml0aW9uW10gPSBbXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlYWN0JywgbW9kUGF0aDogJ3VtZCcsIGZpbGU6ICdyZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVhY3QtZG9tJywgbW9kUGF0aDogJ3VtZCcsIGZpbGU6ICdyZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnIH0sXHJcbiAgICAgICAgICAgICAgICAvL3sgdHlwZTogJ2pzJywgbW9kdWxlOiAnQG1hdGVyaWFsLXVpL2NvcmUnLCBtb2RQYXRoOiAndW1kJywgZmlsZURldmVsb3BtZW50OidtYXRlcmlhbC11aS5kZXZlbG9wbWVudC5qcycsIGZpbGU6J21hdGVyaWFsLXVpLnByb2R1Y3Rpb24ubWluLmpzJyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdAbXVpL21hdGVyaWFsJywgbW9kUGF0aDogJy4uL3VtZCcsIGZpbGU6ICdtYXRlcmlhbC11aS5wcm9kdWN0aW9uLm1pbi5qcycgfSxcclxuXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlZHV4JywgbW9kUGF0aDogJy4uL2Rpc3QnLCBmaWxlOiAncmVkdXgubWluLmpzJyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWFjdC1yZWR1eCcsIG1vZFBhdGg6ICcuLi9kaXN0JywgZmlsZTogJ3JlYWN0LXJlZHV4Lm1pbi5qcycgfSxcclxuICAgICAgICAgICAgICAgIC8veyB0eXBlOiAnanMnLCBtb2R1bGU6ICdxcmNvZGUnLCBtb2RQYXRoOiAnLi4vYnVpbGQnLCBmaWxlOiAncXJjb2RlLmpzJ30sXHJcbiAgICAgICAgICAgICAgICAuLi5zdXBlci5jbGllbnRJbmNsdWRlcyhyZXEsIG9wdHMpLmZpbHRlcihtID0+IG0uZmlsZSAhPSAnZm9ybXVsYXJpb3MuY3NzJylcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG0gPT4gIXVubG9nZ2VkIHx8IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbS5maWxlICE9ICd2YXItY2FsLmpzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBtLmZpbGUgIT0gJ3Zhci1jYWwuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnc2VydmljZS13b3JrZXItYWRtaW4nLCBmaWxlOiAnc2VydmljZS13b3JrZXItYWRtaW4uanMnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlZHV4LXR5cGVkLXJlZHVjZXInLCBtb2RQYXRoOiAnLi4vZGlzdCcsIGZpbGU6ICdyZWR1eC10eXBlZC1yZWR1Y2VyLmpzJyB9XHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXM6IENsaWVudE1vZHVsZURlZmluaXRpb25bXSA9IFtcclxuICAgICAgICAgICAgICAgIC4uLmV4dGVybmFsUmVzb3VyY2VzLFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAnYWRhcHQuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAndGlwb3MuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAnaGVscGVycy1mb3JtdWxhcmlvLmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkJywgZmlsZTogJ2NhbGN1bG9zLWVuY3Vlc3RhLmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkJywgZmlsZTogJ3JlbmRlci1jb25maWcuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAncmVuZGVyLWluaXQuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAncmVkdXgtZm9ybXVsYXJpby5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdoZWxwZXJzLWNhc2lsbGVyb3MuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAnYnlwYXNzLWZvcm11bGFyaW8uanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAncmVuZGVyLWdlbmVyYWwuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAncmVuZGVyLWZvcm11bGFyaW8uanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAnYWJyaXItZm9ybXVsYXJpby5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdjc3MnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQvY3NzJywgZmlsZTogJ2Zvcm11bGFyaW8tcmVhY3QuY3NzJywgcGF0aDogJ2NzcycgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2NzcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZC9jc3MnLCBmaWxlOiAnYm9vdHN0cmFwLm1pbi5jc3MnLCBwYXRoOiAnY3NzJyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAndHRmJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkL2NzcycsIGZpbGU6ICdSb2JvdG8tUmVndWxhci50dGYnLCBwYXRoOiAnY3NzJyB9LFxyXG4gICAgICAgICAgICAgICAgLi4ubWVudWVkUmVzb3VyY2VzLFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnY3NzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL2NsaWVudC9jbGllbnQvY3NzJywgZmlsZTogJ21lbnUuY3NzJywgcGF0aDogJ2NzcycgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzXHJcbiAgICAgICAgICAgIC8vIC5tYXAobT0+KHsuLi5tLCBmaWxlOm0uZmlsZURldmVsb3BtZW50fHxtLmZpbGV9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGFzeW5jIHJlZnJlc2hDYWNoZXMoY2xpZW50OiBDbGllbnRlRGIgfCBudWxsID0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQgPSB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQgfHwge307XHJcblxyXG4gICAgICAgICAgICAvLyBGdW5jacOzbiBhdXhpbGlhciBwYXJhIGVqZWN1dGFyIGxhcyBxdWVyaWVzIGNvbiBlbCBjbGllbnRlIHByb3Zpc3RvIG8gdW5vIG51ZXZvXHJcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVRdWVyaWVzID0gYXN5bmMgKGRiQ2xpZW50OkNsaWVudGVEYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYSA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBub19yZWEgb3JkZXIgYnkgb3BlcmF0aXZvLCBvcmRlbiwgbm9fcmVhYCkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5yZWEgPSAoYXdhaXQgZGJDbGllbnQucXVlcnkoYHNlbGVjdCAqIGZyb20gcmVhIG9yZGVyIGJ5IG9wZXJhdGl2bywgb3JkZW4sIHJlYWApLmZldGNoQWxsKCkpLnJvd3M7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMgPSAoYXdhaXQgZGJDbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBzZWxlY3QgZ3J1cG8sIGpzb25iX2FnZyh0b19qc29uKHIuKikpIGFzIGNvZGlnb3MgZnJvbSBub19yZWEgciBncm91cCBieSBncnVwbyBvcmRlciBieSAxXHJcbiAgICAgICAgYCkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3VwczAgPSAoYXdhaXQgZGJDbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBzZWxlY3QgZ3J1cG8wIGFzIGdydXBvLCBqc29uYl9hZ2codG9fanNvbihyLiopKSBhcyBjb2RpZ29zIGZyb20gbm9fcmVhIHIgZ3JvdXAgYnkgZ3J1cG8wIG9yZGVyIGJ5IDFcclxuICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwID0gKGF3YWl0IGRiQ2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIG5vX3JlYV9zdXAgb3JkZXIgYnkgb3BlcmF0aXZvLCBvcmRlbiwgbm9fcmVhX3N1cGApLmZldGNoQWxsKCkpLnJvd3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQucmVhX3N1cCA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSByZWFfc3VwIG9yZGVyIGJ5IG9wZXJhdGl2bywgb3JkZW4sIHJlYV9zdXBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwX2dyb3VwcyA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgIHNlbGVjdCBncnVwb19zdXAsIGpzb25iX2FnZyh0b19qc29uKHIuKikpIGFzIGNvZGlnb3MgZnJvbSBub19yZWFfc3VwIHIgZ3JvdXAgYnkgZ3J1cG9fc3VwIG9yZGVyIGJ5IDFcclxuICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwX2dyb3VwczAgPSAoYXdhaXQgZGJDbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBzZWxlY3QgZ3J1cG8wX3N1cCBhcyBncnVwbywganNvbmJfYWdnKHRvX2pzb24oci4qKSkgYXMgY29kaWdvcyBmcm9tIG5vX3JlYV9zdXAgciBncm91cCBieSBncnVwbzBfc3VwIG9yZGVyIGJ5IDFcclxuICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgIHNlbGVjdCBjb25fcmVhX2hvZ2FyLCBvcGVyYXRpdm8sIGNvbmZpZ19zb3J0ZW8gZnJvbSBvcGVyYXRpdm9zIGpvaW4gcGFyYW1ldHJvcyB1c2luZyAob3BlcmF0aXZvKSB3aGVyZSB1bmljb19yZWdpc3Ryb1xyXG4gICAgICAgIGApLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGllbnQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWN1dGVRdWVyaWVzKGNsaWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluRGJDbGllbnQobnVsbCwgYXN5bmMgKGRiQ2xpZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZVF1ZXJpZXMoZGJDbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NhY2hlcycsIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudClcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NhY2hlcyBvaycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3NxbE5vcmVhQ2FzZShjYW1wb05lY2VzYXJpbzpzdHJpbmcpe1xyXG4gICAgICAgIC8vICAgIHZhciBiZT10aGlzO1xyXG4gICAgICAgIC8vICAgIHJldHVybiBgQ0FTRSAke2JlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLm1hcCh4PT5cclxuICAgICAgICAvLyAgICAgICAgYCBXSEVOIG5vcmVhICA9ICR7YmUuZGIucXVvdGVMaXRlcmFsKHgubm9fcmVhKX06OmludGVnZXIgVEhFTiAke2JlLmRiLnF1b3RlTGl0ZXJhbCh4W2NhbXBvTmVjZXNhcmlvXSl9YFxyXG4gICAgICAgIC8vICAgICkuam9pbignJyl9IFdIRU4gVFJVRSBUSEVOIE5VTEwgRU5EYFxyXG4gICAgICAgIC8vfSAgICBcclxuICAgICAgICBvdmVycmlkZSBnZXRDb250ZXh0KHJlcTogUmVxdWVzdCk6IENvbnRleHQge1xyXG4gICAgICAgICAgICB2YXIgZmF0aGVyQ29udGV4dCA9IHN1cGVyLmdldENvbnRleHQocmVxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGVybWlzb3NTZWd1blVzdWFyaW8odGhpcy5jYWNoZXMsIGZhdGhlckNvbnRleHQudXNlciksIC4uLmZhdGhlckNvbnRleHQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3ZlcnJpZGUgZ2V0Q29udGV4dEZvckR1bXAoKTogQ29udGV4dCB7XHJcbiAgICAgICAgICAgIHZhciBmYXRoZXJDb250ZXh0ID0gc3VwZXIuZ2V0Q29udGV4dEZvckR1bXAoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgc3VwZXJ1c2VyOiB0cnVlLCBwdWVkZTogdGhpcy5jYWNoZXMucGVybWlzb3NTdXBlcnVzZXIsIC4uLmZhdGhlckNvbnRleHQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3ZlcnJpZGUgYXN5bmMgZ2V0Q2xpZW50U2V0dXBGb3JTZW5kVG9Gcm9udEVuZChyZXE6IFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLihhd2FpdCBzdXBlci5nZXRDbGllbnRTZXR1cEZvclNlbmRUb0Zyb250RW5kKHJlcSkpLFxyXG4gICAgICAgICAgICAgICAgaWRwZXI6IHJlcS51c2VyPy5pZHBlclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFzeW5jIGNyZWF0ZVJlc291cmNlc0ZvckNhY2hlSnNvbigpIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICAgICAgY29uc3QgQVBQX05BTUUgPSBhd2FpdCBiZS5nZXRBcHBOYW1lKClcclxuICAgICAgICAgICAgY29uc3Qgc3VmaWpvID0gYmUuZ2V0U3VmaWpvRnJvbWJhc2VVcmwoYmUuY29uZmlnLnNlcnZlclsnYmFzZS11cmwnXSk7XHJcblxyXG4gICAgICAgICAgICB2YXIganNvblJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcnNpb246IEFQUF9ETV9WRVJTSU9OLFxyXG4gICAgICAgICAgICAgICAgYXBwTmFtZTogJ2RtZW5jdScsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiY2FtcG9cIixcclxuICAgICAgICAgICAgICAgICAgICBcIm9mZmxpbmVcIixcclxuICAgICAgICAgICAgICAgICAgICBcImZhbGxiYWNrLXNpbmNyb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbWF0ZXJpYWwtdWkucHJvZHVjdGlvbi5taW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9yZWR1eC5taW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9yZWFjdC1yZWR1eC5taW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICAvL1wibGliL3FyY29kZS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlcXVpcmUtYnJvLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvY2FzdC1lcnJvci5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2xpa2UtYXIuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9iZXN0LWdsb2JhbHMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9qc29uNGFsbC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2pzLXRvLWh0bWwuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9yZWR1eC10eXBlZC1yZWR1Y2VyLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvYWRhcHQuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS91bmxvZ2dlZC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2pzLXlhbWwudW1kLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3hsc3gtbm93LnVtZC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3hsc3gtbm93LWJyb3dzZXIudW1kLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbGF6eS1zb21lLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvc3FsLXRvb2xzLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaWFsb2ctcHJvbWlzZS9kaWFsb2ctcHJvbWlzZS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibW9tZW50L21pbi9tb21lbnQuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcInBpa2FkYXkvcGlrYWRheS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3BvbHlmaWxscy1icm8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9iaWcuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi90eXBlLXN0b3JlLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvdHlwZWQtY29udHJvbHMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9hamF4LWJlc3QtcHJvbWlzZS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibXktYWpheC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibXktc3RhcnQuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9teS1sb2NhbGRiLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktd2Vic3FsZGIuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9teS1sb2NhbGRiLmpzLm1hcFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LXdlYnNxbGRiLmpzLm1hcFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LXRoaW5ncy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LXRhYmxlcy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LWluZm9ybS1uZXQtc3RhdHVzLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktbWVudS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LXNraW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9jbGllbnRlLWVuLWNhc3RlbGxhbm8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9zZXJ2aWNlLXdvcmtlci1hZG1pbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlZHV4LXR5cGVkLXJlZHVjZXIuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL29wZXJhdGl2b3MuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL3ZhcmNhbC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvZm9ybS1zdHJ1Y3R1cmUuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL21ldGEtZW5jLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjbGllbnRfbW9kdWxlcy9kYXRvcy1leHQuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL2NvbnNpc3RlbmNpYXMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL3Byb2Nlc2FtaWVudG8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS90aXBvcy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3JlbmRlci1jb25maWcuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9yZW5kZXItaW5pdC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L2hlbHBlcnMtY2FzaWxsZXJvcy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L2hlbHBlcnMtZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L2NhbGN1bG9zLWVuY3Vlc3RhLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvYnlwYXNzLWZvcm11bGFyaW8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9yZWR1eC1mb3JtdWxhcmlvLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvcmVuZGVyLWdlbmVyYWwuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9yZW5kZXItZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L2FicmlyLWZvcm11bGFyaW8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL3Jvdy12YWxpZGF0b3IuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudC9tZW51LmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbWcvbG9nby5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAvL1wiaW1nL2xvZ28tZG0ucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbWcvbG9nby0xMjgucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbWcvbWFpbi1sb2FkaW5nLmdpZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaW1nL2JvcnJhci12YWxvci5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9mb25kby1zYWx0ZWFkby1lcnJvci5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9mb25kby1zYWx0ZWFkby5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9iYWNrZ3JvdW5kLXRlc3QucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgLy9cImNsaWVudC1zZXR1cFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL2Jvb3RzdHJhcC5taW4uY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvZm9ybXVsYXJpby1yZWFjdC5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcInBpa2FkYXkvcGlrYWRheS5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRpYWxvZy1wcm9taXNlL2RpYWxvZy1wcm9taXNlLmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicmVsLWVuYy9lc3RhZG9zLmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL215LXRhYmxlcy5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNzcy9teS1tZW51LmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL215LXRoaW5ncy5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNzcy9tZW51LmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicmVsLWVuYy9teS10aGluZ3MyLmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL2Zvcm11bGFyaW8tcmVhY3QuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvUm9ib3RvLVJlZ3VsYXIudHRmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjYXJnYS1kbS93ZWItbWFuaWZlc3Qud2VibWFuaWZlc3RcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBmYWxsYmFja3M6W1xyXG4gICAgICAgICAgICAgICAgICAgIHtwYXRoOiAnZG1fc2luY3Jvbml6YXInLCBmYWxsYmFjazonZmFsbGJhY2stc2luY3JvJ31cclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0RmFsbGJhY2s6IFwib2ZmbGluZVwiXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGpzb25SZXN1bHQuY2FjaGUgPSBqc29uUmVzdWx0LmNhY2hlLmNvbmNhdChnZXRNYW5pZmVzdEltYWdlSWNvbnMoQVBQX05BTUUsIHN1ZmlqbykubWFwKChlbGVtKSA9PiBgbWVudS8ke2VsZW0uc3JjfWApKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBza2luID0gYmUuY29uZmlnWydjbGllbnQtc2V0dXAnXS5za2luO1xyXG4gICAgICAgICAgICBpZiAoc2tpbiAmJiBiZS5hY3RpdmVTa2luRmlsZXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBza2luVXJsID0gc2tpbiArICcvJztcclxuICAgICAgICAgICAgICAgIGpzb25SZXN1bHQuY2FjaGUucHVzaChgJHtza2lufS9pbWcvYmFja2dyb3VuZC10ZXN0LnBuZ2ApO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydGltb3MgZWwgU2V0IGEgQXJyYXkgeSBtYXBlYW1vcyBsYXMgcnV0YXNcclxuICAgICAgICAgICAgICAgIHZhciBza2luUmVzb3VyY2VzID0gQXJyYXkuZnJvbShiZS5hY3RpdmVTa2luRmlsZXMpLm1hcChmdW5jdGlvbiAocGF0aFJlbGF0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2kgZXMgdW4gLnN0eWwsIGxvIHBlZGltb3MgY29tbyAuY3NzIHBvcnF1ZSBlbCBTZXJ2aWNlIFdvcmtlciBcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJlIGNhY2hlYXIgZWwgcmVjdXJzbyBmaW5hbCBxdWUgZWwgbmF2ZWdhZG9yIHNvbGljaXRhLlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBza2luVXJsICsgcGF0aFJlbGF0aXZvLnJlcGxhY2UoL1xcLnN0eWwkLywgJy5jc3MnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGpzb25SZXN1bHQuY2FjaGUgPSBqc29uUmVzdWx0LmNhY2hlLmNvbmNhdChza2luUmVzb3VyY2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ganNvblJlc3VsdFxyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRNZW51Q29udHJvbGVzKF9jb250ZXh0OiBDb250ZXh0KTogTWVudUluZm9CYXNlW10ge1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnZW5jdWVzdGFzX3Byb2Nlc2FtaWVudG9fcGFzYXInLCBsYWJlbDogJ3Bhc2FyIGVuY3Vlc3RhcyBhIHByb2Nlc2FtaWVudG8nIH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncmVzdW1lbicsIHRhYmxlOiAnY29udHJvbF9yZXN1bWVuJywgc2VsZWN0ZWRCeURlZmF1bHQ6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdkb21pbmlvJywgdGFibGU6ICdjb250cm9sX2NhbXBvX2RvbWluaW8nIH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnem9uYScsIHRhYmxlOiAnY29udHJvbF9jYW1wb196b25hJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2NvbXVuYScsIHRhYmxlOiAnY29udHJvbF9jYW1wb19jb211bmEnIH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnw6FyZWEnLCB0YWJsZTogJ2NvbnRyb2xfY2FtcG9fYXJlYScgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZ2V0TWVudVZhcmlvcyhjb250ZXh0OiBDb250ZXh0KTogTWVudUluZm9CYXNlIHtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnVWYXJpb3M6IE1lbnVJbmZvQmFzZVtdID0gW3sgbWVudVR5cGU6ICdhYnJpcl9lbmN1ZXN0YScsIG5hbWU6ICdhYnJpcl9lbmN1ZXN0YScgfV1cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5lZGl0YXIpIHtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnaG9qYV9ydXRhJywgdGFibGU6ICdncmlsbGFfaG9qYV9ydXRhJywgbGFiZWw6ICdob2phIGRlIHJ1dGEnIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhcikge1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICdwcm9jJywgbmFtZTogJ2VuY3Vlc3RhZG9yX2Rtc19tb3N0cmFyJywgbGFiZWw6ICdmb3J6YXIgZGVzY2FyZ2EgZW5jdWVzdGFzIERNJyB9KTtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdlbmN1ZXN0YV9ibGFucXVlYXJfcHJldmlzdWFsaXphcicsIGxhYmVsOiAnYmxhbnF1ZWFyIGVuY3Vlc3RhJyB9KTtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdlbmN1ZXN0YV9ib3JyYXJfcHJldmlzdWFsaXphcicsIGxhYmVsOiAncXVpdGFyIGVuY3Vlc3RhIGRlIGxhIG11ZXN0cmEnIH0pO1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICdwcm9jJywgbmFtZTogJ2VuY3Vlc3Rhc19jYXBhY2l0YWNpb25fYm9ycmFyJywgbGFiZWw6ICdxdWl0YXIgZW5jdWVzdGFzIGRlIGNhcGEgZGUgbGEgbXVlc3RyYScgfSk7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51VmFyaW9zLnB1c2goeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnb3BlcmF0aXZvX21pZ3JhcicsIGxhYmVsOiAnbWlncmFyIG9wZXJhdGl2bycgfSk7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51VmFyaW9zLnB1c2goeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnZW5jdWVzdGFfY2FwYV9hX3Byb2RfcGFzYXInLCBsYWJlbDogJ3Bhc2FyIGVuY3Vlc3RhcyBkZSBjYXBhIGEgcHJvZCcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIpIHtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdpbnRlcmNhbWJpYXJfZW5jdWVzdGFzJyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geyBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAndmFyaW9zJywgbWVudUNvbnRlbnQ6IHN1Ym1lbnVWYXJpb3MgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRNZW51QXNpZ25hY2lvbihjb250ZXh0OiBDb250ZXh0KTogTWVudUluZm9CYXNlIHtcclxuICAgICAgICAgICAgbGV0IGZpbHRyb1JlY2VwY2lvbmlzdGEgPSBjb250ZXh0LnVzZXIucm9sID09ICdyZWNlcGNpb25pc3RhJyA/IHsgcmVjZXBjaW9uaXN0YTogY29udGV4dC51c2VyLmlkcGVyIH0gOiB7fTtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnVBc2lnbmFjaW9uOiBNZW51SW5mb0Jhc2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51QXNpZ25hY2lvbi5wdXNoKHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdnZW5lcmFsJywgdGFibGU6ICdhcmVhc19hc2lnbmFjaW9uX2dlbmVyYWwnIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN1Ym1lbnVBc2lnbmFjaW9uLnB1c2goXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZW5jdWVzdGFkb3InLCB0YWJsZTogJ3RfZW5jdV9hcmVhcycsIGZmOiB7IHRhcmVhOiAnZW5jdScsIC4uLmZpbHRyb1JlY2VwY2lvbmlzdGEgfSB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2luZ3Jlc2Fkb3InLCB0YWJsZTogJ3RfaW5ncl9hcmVhcycsIGZmOiB7IHRhcmVhOiAnaW5ncicsIC4uLmZpbHRyb1JlY2VwY2lvbmlzdGEgfSB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JlY3VwZXJhZG9yJywgdGFibGU6ICd0YXJlYXNfdGVtX2FzaWduYWNpb25fcmVjdScsIGZmOiB7IHRhcmVhX2FjdHVhbDogJ3JlY3UnLCB0YXJlYTogJ3JlY3UnLCAuLi5maWx0cm9SZWNlcGNpb25pc3RhIH0gfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhcikge1xyXG4gICAgICAgICAgICAgICAgc3VibWVudUFzaWduYWNpb24ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnc3VwZXJ2aXNvcicsIHRhYmxlOiAndGFyZWFzX3RlbV9hc2lnbmFjaW9uX3N1cGUnLCBmZjogeyB0YXJlYV9hY3R1YWw6ICdzdXBlJywgdGFyZWE6ICdzdXBlJywgLi4uZmlsdHJvUmVjZXBjaW9uaXN0YSB9IH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4geyBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAnYXNpZ25hY2lvbicsIGxhYmVsOiAnYXNpZ25hY2nDs24nLCBtZW51Q29udGVudDogc3VibWVudUFzaWduYWNpb24gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRNZW51UmVjZXBjaW9uKGNvbnRleHQ6IENvbnRleHQpOiBNZW51SW5mb0Jhc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3VibWVudVJlY2VwY2lvbjogTWVudUluZm9CYXNlW10gPSBbXVxyXG4gICAgICAgICAgICBzdWJtZW51UmVjZXBjaW9uLnB1c2goXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZW5jdWVzdGFkb3InLCB0YWJsZTogJ2VuY3Vlc3RhZG9yZXNfYXNpZ25hZG9zJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JlY3VwZXJhZG9yJywgdGFibGU6ICdyZWN1cGVyYWRvcmVzX2FzaWduYWRvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdpbmdyZXNhZG9yJywgdGFibGU6ICdpbmdyZXNhZG9yZXNfYXNpZ25hZG9zJyB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51UmVjZXBjaW9uLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3N1cGVydmlzb3InLCB0YWJsZTogJ3N1cGVydmlzb3Jlc19hc2lnbmFkb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ21pc19zdXBlcnZpc29yZXMnLCB0YWJsZTogJ21pc19zdXBlcnZpc29yZXNfYXNpZ25hZG9zJyB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdyZWNlcGNpb24nLCBsYWJlbDogJ3JlY2VwY2nDs24nLCBtZW51Q29udGVudDogc3VibWVudVJlY2VwY2lvbiB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXRNZW51Q2FydG8oY29udGV4dDogQ29udGV4dCk6IE1lbnVJbmZvQmFzZSB8IG51bGwge1xyXG4gICAgICAgICAgICBsZXQgc3VibWVudUNhcnRvOiBNZW51SW5mb0Jhc2VbXSA9IFtdXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5jYW1wbz8uYWRtaW5pc3RyYXIpIHtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVDYXJ0by5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdjb211bmFzJywgdGFibGU6ICdjb211bmFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdiYXJyaW9zJywgdGFibGU6ICdiYXJyaW9zJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdmcmFjY2lvbmVzJywgdGFibGU6ICdmcmFjY2lvbmVzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdyYWRpb3MnLCB0YWJsZTogJ3JhZGlvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnbWFuemFuYXMnLCB0YWJsZTogJ21hbnphbmFzJyB9LFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVudVR5cGU6ICdtZW51JywgbmFtZTogJ2NhcnRvJywgbGFiZWw6ICdjYXJ0b2dyYWbDrWEnLCBtZW51Q29udGVudDogc3VibWVudUNhcnRvIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0TWVudUNvbmZpZ3VyYXIoY29udGV4dDogQ29udGV4dCk6IE1lbnVJbmZvQmFzZVtdIHtcclxuICAgICAgICAgICAgY29uc3QgbWVudUNvbmZpZ3VyYXI6IE1lbnVJbmZvQmFzZVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyIHx8IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Ym1lbnVNdWVzdHJhOiBNZW51SW5mb0Jhc2VbXSA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGVtJywgbGFiZWw6ICdURU0nIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnbXVlc3RyYV9nZW5lcmFyJywgbGFiZWw6ICdnZW5lcmFyIG11ZXN0cmEnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3NlbWFuYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2FyZWFfZW5jX3Byb3hpbWFzJyB9LFxyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgIG1lbnVDb25maWd1cmFyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlOiAnbWVudScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ211ZXN0cmEnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnbXVlc3RyYScsXHJcbiAgICAgICAgICAgICAgICAgICAgbWVudUNvbnRlbnQ6IHN1Ym1lbnVNdWVzdHJhXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhc2lsbGVyb3NfdGV4dG8/LmVkaXRhcikge1xyXG4gICAgICAgICAgICAgICAgbWVudUNvbmZpZ3VyYXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudVR5cGU6ICdtZW51JyxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWV0YWRhdG9zJyxcclxuICAgICAgICAgICAgICAgICAgICBtZW51Q29udGVudDogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnb3BlcmF0aXZvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAncmVhL25vcmVhJywgbWVudUNvbnRlbnQ6W1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JlYScgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdub19yZWEnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncmVhX3N1cCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdub19yZWFfc3VwJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2Zvcm11bGFyaW9zJywgdGFibGU6ICdjYXNpbGxlcm9zX3ByaW5jaXBhbGVzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncGxhbm8nLCB0YWJsZTogJ2Nhc2lsbGVyb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd2YXJpYWJsZXMnLCB0YWJsZTogJ2Nhc2lsbGVyb3MnLCBmYzogW3sgY29sdW1uOiAndmFyX25hbWUnLCBvcGVyYXRvcjogJyE9XFx1MjIwNScsIHZhbHVlOiBudWxsIH1dIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0aXBvYycsIGxhYmVsOiAndGlwb3MgZGUgY2VsZGFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGlwb2NfdGlwb2MnLCBsYWJlbDogJ2luY2x1c2lvbmVzIGRlIGNlbGRhcycgfSxcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuc3VwZXJ1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICBtZW51Q29uZmlndXJhci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudVR5cGU6ICdtZW51JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VzdGFkb3NfYWNjaW9uZXNfdGFyZWFzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdlc3RhZG9zL2FjY2lvbmVzL3RhcmVhcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVDb250ZW50OiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGFyZWFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2VzdGFkb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnYWNjaW9uZXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZXN0YWRvc19hY2Npb25lcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0YXJlYXNfcHJveGltYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdtb21lbnRvc19jb25zaXN0ZW5jaWEnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3BhcmFtZXRyb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ21vZG9zX2RtJyB9LFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhciB8fCBjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyKSB7XHJcbiAgICAgICAgICAgICAgICBtZW51Q29uZmlndXJhci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51VHlwZTogJ21lbnUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd1c3VhcmlvcycsXHJcbiAgICAgICAgICAgICAgICAgICAgbWVudUNvbnRlbnQ6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3VzdWFyaW9zJywgc2VsZWN0ZWRCeURlZmF1bHQ6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JvbGVzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncGVybWlzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdyb2xlc19wZXJtaXNvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1lbnVDb25maWd1cmFyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbG9zIG1peGlucyAobWV0YS1lbmMsIHByb2Nlc2FtaWVudG8pIGxvIGRlY2xhcmFuIHNpbiBwYXLDoW1ldHJvcywgcGVybyBiYWNrZW5kLXBsdXMgc2llbXByZSBsbyBsbGFtYSBjb24gY29udGV4dC5cclxuICAgICAgICAvLyBFbCB0aXBvIGRlIHJldG9ybm8gcXVlIGRlY2xhcmEgb3BlcmF0aXZvcyAoTWVudUluZm9bXSkgbm8gYWRtaXRlIGZvcm1hcyBxdWUgYmFja2VuZC1wbHVzIHPDrSBhY2VwdGEgeSBkbWVuY3UgdXNhXHJcbiAgICAgICAgLy8gKGZmIGNvbW8gb2JqZXRvLCBmYyBjb24gY29sdW1uKTsgc2UgZGV2dWVsdmUgTWVudUluZm9CYXNlW10sIHF1ZSBlcyBsbyBxdWUgZGVjbGFyYSBiYWNrZW5kLXBsdXMuXHJcbiAgICAgICAgLy8gUXVpdGFyIGVzdGEgbMOtbmVhIGN1YW5kbyBzZSBjb3JyaWphbiBsb3MgdGlwb3MgZGUgbWVuw7ogZW4gb3BlcmF0aXZvcy9iYWNrZW5kLXBsdXMgKGVsIGNvbXBpbGFkb3IgYXZpc2Egc2kgZGVqYSBkZSBoYWNlciBmYWx0YSkuXHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBNZW51RGVmaW5pdGlvbiBkZSBvcGVyYXRpdm9zIG3DoXMgZXN0cmljdG8gcXVlIGVsIGRlIGJhY2tlbmQtcGx1c1xyXG4gICAgICAgIG92ZXJyaWRlIGdldE1lbnUoY29udGV4dD86IENvbnRleHQpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRNZW51IGRlIGRtZW5jdSByZXF1aWVyZSBlbCBjb250ZXh0IHBhcmEgYXJtYXIgZWwgbWVuw7ogc2Vnw7puIGxvcyBwZXJtaXNvcycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBtZW51OiBNZW51SW5mb0Jhc2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoZ2V0TW9kb0J5UG9saWN5KGNvbnRleHQuYmUpID09PSAnUkVMRVZBTUlFTlRPJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucmVsZXZhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaCh7IG1lbnVUeXBlOiAncGF0aCcsIG5hbWU6ICdyZWxldmFtaWVudG8nLCBwYXRoOiAnL2NhbXBvJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3NpbmNyb25pemFyX2RtJywgbmFtZTogJ3NpbmNyb25pemFyJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAnY2FtYmlhcl9tb2RvX2RtJywgbmFtZTogJ2NhbWJpYXJfbW9kbycgfSxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5lZGl0YXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWVudUFzaWduYWNpb24oY29udGV4dCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWVudVJlY2VwY2lvbihjb250ZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3RhcmVhc190ZW1fZmluX2NhbXBvJywgbGFiZWw6ICdlc3BlcmEgZmluIGRlIGNhbXBvJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3RhcmVhc190ZW1fYW5hbGlzaXNfY2FtcG8nLCBsYWJlbDogJ2Fuw6FsaXNpcyBkZSBjYW1wbycgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAnc3VwZXJ2aXNpb24nLCBsYWJlbDogJ3N1cGVydmlzacOzbicsIG1lbnVDb250ZW50OiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3N1cGVydmlzYXInLCB0YWJsZTogJ3RhcmVhc190ZW1faW5ncmVzbycsIGZmOiB7IHRhcmVhOiAnc3VwZScsIGFzaWduYWRvOiBjb250ZXh0LnVzZXIuaWRwZXIgfSB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmVkaXRhciB8fCBjb250ZXh0LnB1ZWRlPy5jYW1wbz8uYWRtaW5pc3RyYXIgfHwgY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzPy5wcm9jZXNhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaCh0aGlzLmdldE1lbnVWYXJpb3MoY29udGV4dCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhciB8fCBjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdjb250cm9sJywgbWVudUNvbnRlbnQ6IHRoaXMuZ2V0TWVudUNvbnRyb2xlcyhjb250ZXh0KSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAvKnttZW51VHlwZTondGFibGUnLCBuYW1lOidwYXJ0aWNpcGFjaW9uJyAgICAgICAgLCB0YWJsZTonY29udHJvbF9jYW1wb19wYXJ0aWNpcGFjaW9uJyAgfSwqL1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAncHJvY2VzYXInLCBtZW51Q29udGVudDogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd2YXJpYWJsZXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3ZhcmlhYmxlc19jdWVzdGlvbmFyaW8nLCB0YWJsZTogJ2Nhc2lsbGVyb3MnLCB0ZDogeyBlZGl0YWJsZTogZmFsc2UsIGFsbG93OiB7IHVwZGF0ZTogZmFsc2UsIGltcG9ydDogZmFsc2UsIGRlbGV0ZTogZmFsc2UsIGluc2VydDogZmFsc2UgfSB9LCBmYzogW3sgY29sdW1uOiAndmFyX25hbWUnLCBvcGVyYXRvcjogJyE9XFx1MjIwNScsIHZhbHVlOiBudWxsIH1dIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2NvbnNpc3RlbmNpYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2NvbnNpc3RlbmNpYXNfY3Vlc3Rpb25hcmlvJywgdGFibGU6ICdjYXNpbGxlcm9zJywgZmY6IHsgdGlwb2M6ICdDT05TJyB9IH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2luY29uc2lzdGVuY2lhcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGFibGFfZGF0b3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2RpY2Npb25hcmlvJywgbGFiZWw6ICdkaWNjaW9uYXJpb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3RhcmVhc190ZW1fcHJvY2VzYW1pZW50bycsIGxhYmVsOiAnZW5jdWVzdGFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW51Q29uZmlndXJhciA9IHRoaXMuZ2V0TWVudUNvbmZpZ3VyYXIoY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVudUNvbmZpZ3VyYXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKHsgbWVudVR5cGU6ICdtZW51JywgbmFtZTogJ2NvbmZpZ3VyYXInLCBtZW51Q29udGVudDogbWVudUNvbmZpZ3VyYXIgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW51Q2FydG8gPSB0aGlzLmdldE1lbnVDYXJ0byhjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChtZW51Q2FydG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2gobWVudUNhcnRvKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geyBtZW51IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIHByZXBhcmVHZXRUYWJsZXMoKSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgICAgIHN1cGVyLnByZXBhcmVHZXRUYWJsZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRUYWJsZURlZmluaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldFRhYmxlRGVmaW5pdGlvblxyXG4gICAgICAgICAgICAgICAgLCByb2xlc1xyXG4gICAgICAgICAgICAgICAgLCB1c3Vhcmlvc1xyXG4gICAgICAgICAgICAgICAgLCBwZXJzb25hbFxyXG4gICAgICAgICAgICAgICAgLCByZWNlcGNpb25pc3Rhc1xyXG4gICAgICAgICAgICAgICAgLCBlbmN1ZXN0YWRvcmVzX2FzaWduYWRvc1xyXG4gICAgICAgICAgICAgICAgLCBpbmdyZXNhZG9yZXNfYXNpZ25hZG9zXHJcbiAgICAgICAgICAgICAgICAsIHJlY3VwZXJhZG9yZXNfYXNpZ25hZG9zXHJcbiAgICAgICAgICAgICAgICAsIHN1cGVydmlzb3Jlc19hc2lnbmFkb3NcclxuICAgICAgICAgICAgICAgICwgbWlzX3N1cGVydmlzb3Jlc19hc2lnbmFkb3NcclxuICAgICAgICAgICAgICAgICwgbWlzX2VuY3Vlc3RhZG9yZXNcclxuICAgICAgICAgICAgICAgICwgcmVjdXBlcmFkb3Jlc1xyXG4gICAgICAgICAgICAgICAgLCBzdXBlcnZpc29yZXNcclxuICAgICAgICAgICAgICAgICwgcGVyc29uYWxfcm9sXHJcbiAgICAgICAgICAgICAgICAsIHBlcm1pc29zXHJcbiAgICAgICAgICAgICAgICAsIHJvbGVzX3Blcm1pc29zXHJcbiAgICAgICAgICAgICAgICAsIHJvbGVzX3N1Ym9yZGluYWRvc1xyXG4gICAgICAgICAgICAgICAgLCBub19yZWFcclxuICAgICAgICAgICAgICAgICwgbm9fcmVhX3N1cFxyXG4gICAgICAgICAgICAgICAgLCByZWFcclxuICAgICAgICAgICAgICAgICwgcmVhX3N1cFxyXG4gICAgICAgICAgICAgICAgLCBzZW1hbmFzXHJcbiAgICAgICAgICAgICAgICAsIGVzdGFkb3NcclxuICAgICAgICAgICAgICAgICwgYWNjaW9uZXNcclxuICAgICAgICAgICAgICAgICwgZXN0YWRvc19hY2Npb25lc1xyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfcHJveGltYXNcclxuICAgICAgICAgICAgICAgICwgdGVtXHJcbiAgICAgICAgICAgICAgICAsIGhpc3RvcmlhbF90ZW1cclxuICAgICAgICAgICAgICAgICwgbW9kb3NfZG1cclxuICAgICAgICAgICAgICAgICwgcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICAgICAgLCBvcGVyYWNpb25lc1xyXG4gICAgICAgICAgICAgICAgLCBjb211bmFzXHJcbiAgICAgICAgICAgICAgICAsIGFyZWFzXHJcbiAgICAgICAgICAgICAgICAsIHNpbmNyb25pemFjaW9uZXNcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX2VuY3VcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX3JlY3VcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX3N1cGVcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX2luZ3JcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX2FyZWFzXHJcbiAgICAgICAgICAgICAgICAsIGFyZWFzX2FzaWduYWNpb25fZ2VuZXJhbFxyXG4gICAgICAgICAgICAgICAgLCBncmlsbGFfaG9qYV9ydXRhXHJcbiAgICAgICAgICAgICAgICAsIHRfZW5jdV9hcmVhc1xyXG4gICAgICAgICAgICAgICAgLCB0X3JlY3VfYXJlYXNcclxuICAgICAgICAgICAgICAgICwgdF9zdXBlX2FyZWFzXHJcbiAgICAgICAgICAgICAgICAsIHRfaW5ncl9hcmVhc1xyXG4gICAgICAgICAgICAgICAgLCBtaXNfdGFyZWFzXHJcbiAgICAgICAgICAgICAgICAsIHRlbV9hc2lnbmFjaW9uXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fcmVjZXBjaW9uXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1faW5ncmVzb1xyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfdGVtX2Zpbl9jYW1wb1xyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfdGVtX3Byb2Nlc2FtaWVudG9cclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9hbmFsaXNpc19jYW1wb1xyXG4gICAgICAgICAgICAgICAgLCBtaXNfdGFyZWFzX2FyZWFzXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9cclxuICAgICAgICAgICAgICAgICwgY29udHJvbF9yZXN1bWVuXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fem9uYTogY29udGV4dCA9PiBjb250cm9sX2NhbXBvKGNvbnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgeyBub21icmU6ICdjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOiAnY29udHJvbCBjYW1wbyB4IHpvbmEgc29sbyBjZW1lbnRvJywgY2FtcG9zQ29ydGU6IFt7IG5hbWU6ICd6b25hJywgdHlwZU5hbWU6ICd0ZXh0JyB9XSwgc2luaG9nZmluOiAhY29udGV4dC5iZS5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyLmNvbl9yZWFfaG9nYXIsIGZpbHRyb1doZXJlOiAnZG9taW5pbz0zJyB9XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fY29tdW5hOiBjb250ZXh0ID0+IGNvbnRyb2xfY2FtcG8oY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICB7IG5vbWJyZTogJ2NvbnRyb2xfY2FtcG9fY29tdW5hJywgdGl0bGU6ICdjb250cm9sIGNhbXBvIHggY29tdW5hIHNvbG8gY2VtZW50bycsIGNhbXBvc0NvcnRlOiBbeyBuYW1lOiAnem9uYScsIHR5cGVOYW1lOiAndGV4dCcgfSwgeyBuYW1lOiAnbnJvY29tdW5hJywgdHlwZU5hbWU6ICd0ZXh0JyB9XSwgc2luaG9nZmluOiAhY29udGV4dC5iZS5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyLmNvbl9yZWFfaG9nYXIsIGZpbHRyb1doZXJlOiAnZG9taW5pbz0zJyB9XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fYXJlYTogY29udGV4dCA9PiBjb250cm9sX2NhbXBvKGNvbnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgeyBub21icmU6ICdjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOiAnY29udHJvbCBjYW1wbyB4IGFyZWEnLCBjYW1wb3NDb3J0ZTogW3sgbmFtZTogJ3pvbmEnLCB0eXBlTmFtZTogJ3RleHQnIH0sIHsgbmFtZTogJ25yb2NvbXVuYScsIHR5cGVOYW1lOiAndGV4dCcgfSwgeyBuYW1lOiAnYXJlYScsIHR5cGVOYW1lOiAnaW50ZWdlcicgfSwgeyBuYW1lOiAncGFydGljaXBhY2lvbl9hJywgdHlwZU5hbWU6ICd0ZXh0JyB9LCB7IG5hbWU6ICdjbGFzZV9hJywgdHlwZU5hbWU6ICd0ZXh0JyB9XSwgc2luaG9nZmluOiAhY29udGV4dC5iZS5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyLmNvbl9yZWFfaG9nYXIgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX3BhcnRpY2lwYWNpb246IGNvbnRleHQgPT4gY29udHJvbF9jYW1wbyhjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbm9tYnJlOiAnY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTogJ2NvbnRyb2wgY2FtcG8geCBwYXJ0aWNpcGFjaW9uJywgY2FtcG9zQ29ydGU6IFt7IG5hbWU6ICdwYXJ0aWNpcGFjaW9uJywgdHlwZU5hbWU6ICdiaWdpbnQnIH1dLCBzaW5ob2dmaW46ICFjb250ZXh0LmJlLmNhY2hlcy50YWJsZUNvbnRlbnQuY29uUmVhSG9nYXIuY29uX3JlYV9ob2dhciB9XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fZG9taW5pbzogY29udGV4dCA9PiBjb250cm9sX2NhbXBvKGNvbnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgeyBub21icmU6ICdjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOiAnY29udHJvbCBjYW1wbyB4IGRvbWluaW8nLCBjYW1wb3NDb3J0ZTogW3sgbmFtZTogJ2RvbWluaW8nLCB0eXBlTmFtZTogJ2ludGVnZXInIH1dLCBzaW5ob2dmaW46ICFjb250ZXh0LmJlLmNhY2hlcy50YWJsZUNvbnRlbnQuY29uUmVhSG9nYXIuY29uX3JlYV9ob2dhciB9XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfZGlhc19jYXJnYVxyXG4gICAgICAgICAgICAgICAgLCB2aXZpZW5kYXNcclxuICAgICAgICAgICAgICAgICwgdmlzaXRhc1xyXG4gICAgICAgICAgICAgICAgLCBob2dhcmVzXHJcbiAgICAgICAgICAgICAgICAsIHBlcnNvbmFzXHJcbiAgICAgICAgICAgICAgICAsIHZpc2l0YXNfc3VwXHJcbiAgICAgICAgICAgICAgICAsIGhvZ2FyZXNfc3VwXHJcbiAgICAgICAgICAgICAgICAsIHBlcnNvbmFzX3N1cFxyXG4gICAgICAgICAgICAgICAgLCBkaWNjaW9uYXJpb1xyXG4gICAgICAgICAgICAgICAgLCBkaWN2YXJcclxuICAgICAgICAgICAgICAgICwgZGljdHJhXHJcbiAgICAgICAgICAgICAgICAsIGluY29uc2lzdGVuY2lhc19jdW1wbGVuX2NvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgLCB0ZW1fYm9ycmFkYXNcclxuICAgICAgICAgICAgICAgICwgYmFycmlvc1xyXG4gICAgICAgICAgICAgICAgLCBmcmFjY2lvbmVzXHJcbiAgICAgICAgICAgICAgICAsIHJhZGlvc1xyXG4gICAgICAgICAgICAgICAgLCBtYW56YW5hc1xyXG4gICAgICAgICAgICAgICAgLCBhcmVhX2VuY19wcm94aW1hc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJlLmFwcGVuZFRvVGFibGVEZWZpbml0aW9uKCdjb25zaXN0ZW5jaWFzJywgZnVuY3Rpb24gKHRhYmxlRGVmLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5lZGl0YWJsZSA9IHRhYmxlRGVmLmVkaXRhYmxlIHx8IGNvbnRleHQ/LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gJ2Vycm9yX2NvbXBpbGFjaW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqIFFVSVRBUiBFU1RPIGVycm9yX2NvbXBpbGFjaW9uIHlhIGVzIHZpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignaW5jb25zaXN0ZW5jaWFzJywgZnVuY3Rpb24gKHRhYmxlRGVmLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5zcWwgPSB7IC4uLnRhYmxlRGVmLnNxbCwgaXNUYWJsZTogdHJ1ZSB9O1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnNwbGljZSgyLCAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3ZpdmllbmRhJywgdHlwZU5hbWU6ICd0ZXh0JywgZWRpdGFibGU6IGZhbHNlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnaG9nYXInLCB0eXBlTmFtZTogJ2JpZ2ludCcsIGVkaXRhYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3BlcnNvbmEnLCB0eXBlTmFtZTogJ2JpZ2ludCcsIGVkaXRhYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3Zpc2l0YScsIHR5cGVOYW1lOiAnYmlnaW50JywgZWRpdGFibGU6IGZhbHNlIH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZWRpdGFibGUgPSB0YWJsZURlZi5lZGl0YWJsZSB8fCBjb250ZXh0Py5wdWVkZT8uZW5jdWVzdGFzPy5qdXN0aWZpY2FyO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gJ3BrX2ludGVncmFkYScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQubmFtZSA9PSAnanVzdGlmaWNhY2lvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZWRpdGFibGUgPSBjb250ZXh0Py5mb3JEdW1wIHx8IGNvbnRleHQ/LnB1ZWRlPy5lbmN1ZXN0YXM/Lmp1c3RpZmljYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcyA9IHRhYmxlRGVmLmZpZWxkcy5jb25jYXQoWyd0YXJlYV9hY3R1YWwnLCAndGFyZWFfYW50ZXJpb3InXS5tYXAoZm4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGZuLCB0eXBlTmFtZTogJ3RleHQnLCBlZGl0YWJsZTogZmFsc2UsIGluVGFibGU6IGZhbHNlIH1cclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLy9zYWNhciBjYW1wb3MgZGUgdml0YWxlcyEgXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWdFeHBGaWVsZHNWaXRhID0gbmV3IFJlZ0V4cCgnXihjb21wfGluZmV8Y29kX2NhdXNhfGRvbWkpJCcpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzID0gdGFibGVEZWYuZmllbGRzLmZpbHRlcihmID0+ICEocmVnRXhwRmllbGRzVml0YS50ZXN0KGYubmFtZSkpKVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBxX2luY29uc2lzdCA9IHRhYmxlRGVmLnNxbCEuZnJvbVxyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuc3FsIS5mcm9tID0gYFxyXG4gICAgICAgICAgICAgICAgKHNlbGVjdCBpLiosIHQudGFyZWFfYWN0dWFsLCB0YXJlYV9hbnRlcmlvclxyXG4gICAgICAgICAgICAgICAgICBmcm9tICR7cV9pbmNvbnNpc3R9IGkgXHJcbiAgICAgICAgICAgICAgICAgIGpvaW4gdGVtIHQgb24gaS52aXZpZW5kYT10LmVuYyBhbmQgaS5vcGVyYXRpdm89dC5vcGVyYXRpdm8gXHJcbiAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiB0YXJlYXNfdGVtIHR0IG9uIHQub3BlcmF0aXZvPXR0Lm9wZXJhdGl2byBhbmQgdC5lbmM9dHQuZW5jIGFuZCB0LnRhcmVhX2FjdHVhbD10dC50YXJlYSBcclxuICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGxhdGVyYWwgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgdGFyZWEgYXMgdGFyZWFfYW50ZXJpb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gaGlzdG9yaWFsX3RlbSBodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm8gPSBodC5vcGVyYXRpdm8gYW5kIHQuZW5jID0gaHQuZW5jXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciBieSB0c19zYWxpZGEgZGVzY1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgMVxyXG4gICAgICAgICAgICAgICAgICAgICkgYXMgdGEgb24gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgKSAgIFxyXG4gICAgICAgICAgICBgXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJlLmFwcGVuZFRvVGFibGVEZWZpbml0aW9uKCdvcGVyYXRpdm9zJywgZnVuY3Rpb24gKHRhYmxlRGVmLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuc3BsaWNlKDIsIDAsIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29uZmlnX3NvcnRlbycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6ICdqc29uYicsXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2hhYmlsaXRhY2lvbl9ib3Rvbl9mb3JtdWxhcmlvJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogJ2pzb25iJyxcclxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGlzZm9ybV9jZXJyYWRvJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGNvbnRleHQ/LmZvckR1bXAgfHwgY29udGV4dCAhPSBudWxsICYmIFsnYWRtaW4nLCAnZGlzX2NvbmNlcHR1YWwnXS5pbmNsdWRlcyhjb250ZXh0LnVzZXIucm9sKVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb25fcmVhX2hvZ2FyJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RGJWYWx1ZTogJ3RydWUnXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Blcm1pdGVfZ2VuZXJhcl9tdWVzdHJhJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RGJWYWx1ZTogJ2ZhbHNlJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJlLmFwcGVuZFRvVGFibGVEZWZpbml0aW9uKCd2YXJpYWJsZXMnLCBmdW5jdGlvbiAodGFibGVEZWYsIGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlc0FkbWluID0gY29udGV4dD8udXNlci5yb2wgPT09ICdhZG1pbic7XHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5lZGl0YWJsZSA9IHRhYmxlRGVmLmVkaXRhYmxlIHx8IGNvbnRleHQ/LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuYWxsb3cgPSB7IGRlbGV0ZTogZXNBZG1pbiB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignbW9tZW50b3NfY29uc2lzdGVuY2lhJywgZnVuY3Rpb24gKHRhYmxlRGVmLCBfY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnY29uZGljaW9uJywgdHlwZU5hbWU6ICd0ZXh0JywgbnVsbGFibGU6IGZhbHNlLCBkZWZhdWx0RGJWYWx1ZTogJ3RydWUnIH0sXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbigncGFyYW1ldHJvcycsIGZ1bmN0aW9uICh0YWJsZURlZikge1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnbW9kb19kbV9kZWZlY3RvJywgdHlwZU5hbWU6ICd0ZXh0JywgZWRpdGFibGU6IHRydWUsIG51bGxhYmxlOiBmYWxzZSwgZGVmYXVsdERiVmFsdWU6IFwiJ2NhcGEnXCIgfSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5mb3JlaWduS2V5cyA9IHRhYmxlRGVmLmZvcmVpZ25LZXlzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZm9yZWlnbktleXMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7IHJlZmVyZW5jZXM6ICdtb2Rvc19kbScsIGZpZWxkczogW3sgc291cmNlOiAnbW9kb19kbV9kZWZlY3RvJywgdGFyZ2V0OiAnbW9kb19kbScgfV0gfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgQXBwRG1FbmN1ID0gZW1lcmdlQXBwRG1FbmN1KGVtZXJnZUFwcFByb2Nlc2FtaWVudG8oZW1lcmdlQXBwQ29uc2lzdGVuY2lhcyhlbWVyZ2VBcHBWYXJDYWwoZW1lcmdlQXBwRGF0b3NFeHQoZW1lcmdlQXBwT3BlcmF0aXZvcyhBcHBCYWNrZW5kKSkpKSkpO1xyXG5leHBvcnQgdHlwZSBBcHBBcHBEbUVuY3VUeXBlID0gSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHBEbUVuY3U+OyJdfQ==