dmencu 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/client/client/client.js +372 -0
  2. package/dist/client/client/css/form-data-signals-2.styl +11 -0
  3. package/dist/client/client/css/form-data-signals.styl +68 -0
  4. package/dist/client/client/css/menu.styl +6 -0
  5. package/dist/client/client/img/ba_etiqueta.jpg +0 -0
  6. package/dist/client/client/img/logo_etiqueta.jpg +0 -0
  7. package/dist/client/client/img/mandatory.png +0 -0
  8. package/dist/client/client/img/optativo.png +0 -0
  9. package/dist/client/client/img/pk-mandatory.png +0 -0
  10. package/dist/client/client/img/wait4this.png +0 -0
  11. package/dist/client/client/menu.js +3 -0
  12. package/dist/client/client/tsconfig.json +14 -0
  13. package/dist/client/unlogged/abrir-formulario.js +99 -0
  14. package/dist/client/unlogged/bypass-formulario.js +1141 -0
  15. package/dist/client/unlogged/css/Roboto-Regular.ttf +0 -0
  16. package/dist/client/unlogged/css/bootstrap.min.css +7 -0
  17. package/dist/client/unlogged/css/formulario-react.styl +756 -0
  18. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
  19. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
  20. package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
  21. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
  22. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
  23. package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
  24. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
  25. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
  26. package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
  27. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
  28. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
  29. package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
  30. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
  31. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
  32. package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
  33. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
  34. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
  35. package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
  36. package/dist/client/unlogged/img/_login-logo-icon.png +0 -0
  37. package/dist/client/unlogged/img/_logo-128.png +0 -0
  38. package/dist/client/unlogged/img/_logo.png +0 -0
  39. package/dist/client/unlogged/img/borrar-valor.pdn +0 -0
  40. package/dist/client/unlogged/img/borrar-valor.png +0 -0
  41. package/dist/client/unlogged/img/fondo-salteado-crudo.pdn +0 -0
  42. package/dist/client/unlogged/img/fondo-salteado-error.png +0 -0
  43. package/dist/client/unlogged/img/fondo-salteado.pdn +0 -0
  44. package/dist/client/unlogged/img/fondo-salteado.png +0 -0
  45. package/dist/client/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
  46. package/dist/client/unlogged/img/login-logo-icon.png +0 -0
  47. package/dist/client/unlogged/img/logo-128.png +0 -0
  48. package/dist/client/unlogged/img/logo.png +0 -0
  49. package/dist/client/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
  50. package/dist/client/unlogged/offline.jade +10 -0
  51. package/dist/client/unlogged/redux-formulario.js +315 -0
  52. package/dist/client/unlogged/render-formulario.tsx +2103 -0
  53. package/dist/client/unlogged/render-general.tsx +228 -0
  54. package/dist/client/unlogged/tipos.js +19 -0
  55. package/dist/client/unlogged/tsconfig.json +15 -0
  56. package/dist/server/server/app-dmencu.js +641 -0
  57. package/dist/server/server/def-config.js +108 -0
  58. package/dist/server/server/procedures-dmencu.js +759 -0
  59. package/dist/server/server/server-dmencu.js +23 -0
  60. package/dist/server/server/table-areas.js +121 -0
  61. package/dist/server/server/table-comunas.js +29 -0
  62. package/dist/server/server/table-control_campo.js +100 -0
  63. package/dist/server/server/table-control_resumen.js +19 -0
  64. package/dist/server/server/table-encuestadores.js +19 -0
  65. package/dist/server/server/table-hogares.js +157 -0
  66. package/dist/server/server/table-hogares_sup.js +192 -0
  67. package/dist/server/server/table-lotes.js +44 -0
  68. package/dist/server/server/table-mis_encuestadores.js +78 -0
  69. package/dist/server/server/table-mis_tareas.js +19 -0
  70. package/dist/server/server/table-mis_tareas_areas.js +19 -0
  71. package/dist/server/server/table-mis_tareas_tem.js +19 -0
  72. package/dist/server/server/table-no_rea.js +33 -0
  73. package/dist/server/server/table-no_rea_sup.js +33 -0
  74. package/dist/server/server/table-operaciones.js +31 -0
  75. package/dist/server/server/table-parametros.js +40 -0
  76. package/dist/server/server/table-permisos.js +32 -0
  77. package/dist/server/server/table-personal.js +63 -0
  78. package/dist/server/server/table-personal_rol.js +43 -0
  79. package/dist/server/server/table-personas.js +449 -0
  80. package/dist/server/server/table-personas_sup.js +94 -0
  81. package/dist/server/server/table-recepcionistas.js +19 -0
  82. package/dist/server/server/table-recuperadores.js +19 -0
  83. package/dist/server/server/table-resultados_tarea.js +29 -0
  84. package/dist/server/server/table-roles.js +33 -0
  85. package/dist/server/server/table-roles_permisos.js +36 -0
  86. package/dist/server/server/table-roles_subordinados.js +33 -0
  87. package/dist/server/server/table-semanas.js +42 -0
  88. package/dist/server/server/table-sincronizaciones.js +31 -0
  89. package/dist/server/server/table-supervisores.js +19 -0
  90. package/dist/server/server/table-tareas.js +47 -0
  91. package/dist/server/server/table-tareas_areas.js +68 -0
  92. package/dist/server/server/table-tareas_tem.js +148 -0
  93. package/dist/server/server/table-tem.js +187 -0
  94. package/dist/server/server/table-tem_recepcion.js +19 -0
  95. package/dist/server/server/table-usuarios.js +59 -0
  96. package/dist/server/server/table-visitas.js +92 -0
  97. package/dist/server/server/table-visitas_sup.js +92 -0
  98. package/dist/server/server/table-viviendas.js +300 -0
  99. package/dist/server/server/types-dmencu.js +24 -0
  100. package/dist/server/unlogged/tipos.js +19 -0
  101. package/dist/unlogged/unlogged/abrir-formulario.js +99 -0
  102. package/dist/unlogged/unlogged/adapt.js +8 -0
  103. package/dist/unlogged/unlogged/bypass-formulario.js +1141 -0
  104. package/dist/unlogged/unlogged/css/Roboto-Regular.ttf +0 -0
  105. package/dist/unlogged/unlogged/css/bootstrap.min.css +7 -0
  106. package/dist/unlogged/unlogged/css/formulario-react.styl +756 -0
  107. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
  108. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
  109. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
  110. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
  111. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
  112. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
  113. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
  114. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
  115. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
  116. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
  117. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
  118. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
  119. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
  120. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
  121. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
  122. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
  123. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
  124. package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
  125. package/dist/unlogged/unlogged/img/_login-logo-icon.png +0 -0
  126. package/dist/unlogged/unlogged/img/_logo-128.png +0 -0
  127. package/dist/unlogged/unlogged/img/_logo.png +0 -0
  128. package/dist/unlogged/unlogged/img/borrar-valor.pdn +0 -0
  129. package/dist/unlogged/unlogged/img/borrar-valor.png +0 -0
  130. package/dist/unlogged/unlogged/img/fondo-salteado-crudo.pdn +0 -0
  131. package/dist/unlogged/unlogged/img/fondo-salteado-error.png +0 -0
  132. package/dist/unlogged/unlogged/img/fondo-salteado.pdn +0 -0
  133. package/dist/unlogged/unlogged/img/fondo-salteado.png +0 -0
  134. package/dist/unlogged/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
  135. package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
  136. package/dist/unlogged/unlogged/img/logo-128.png +0 -0
  137. package/dist/unlogged/unlogged/img/logo.png +0 -0
  138. package/dist/unlogged/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
  139. package/dist/unlogged/unlogged/offline.jade +10 -0
  140. package/dist/unlogged/unlogged/redux-formulario.js +315 -0
  141. package/dist/unlogged/unlogged/render-formulario.js +1485 -0
  142. package/dist/unlogged/unlogged/render-formulario.tsx +2103 -0
  143. package/dist/unlogged/unlogged/render-general.js +185 -0
  144. package/dist/unlogged/unlogged/render-general.tsx +228 -0
  145. package/dist/unlogged/unlogged/tipos.js +19 -0
  146. package/dist/unlogged/unlogged/tsconfig.json +15 -0
  147. package/dist/unlogged/unlogged/unlogged.js +180 -0
  148. package/package.json +91 -0
@@ -0,0 +1,1141 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ (function (factory) {
11
+ if (typeof module === "object" && typeof module.exports === "object") {
12
+ var v = factory(require, exports);
13
+ if (v !== undefined) module.exports = v;
14
+ }
15
+ else if (typeof define === "function" && define.amd) {
16
+ define(["require", "exports", "like-ar", "row-validator", "best-globals", "./tipos"], factory);
17
+ }
18
+ })(function (require, exports) {
19
+ "use strict";
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.calcularResumenVivienda = exports.calcularPermiteBorrarBF = exports.calcularDisabledBF = exports.calcularActualBF = exports.getFormulariosForIdVivienda = exports.calcularFeedbackEncuesta = exports.calcularFeedbackHojaDeRuta = exports.getMainFormForVivienda = exports.numberOrStringIncIfArray = exports.calcularFeedbackUnidadAnalisis = exports.verificarSorteo = exports.defOperativo = exports.getFuncionValorar = exports.getFuncionHabilitar = exports.getFuncionCompilada = exports.miniCompiladorSQlJs = exports.MAXCP = exports.ultimaVaribleVivienda = exports.dispatchByPass = exports.accion_borrar_formulario = exports.accion_abrir_formulario = exports.accion_agregar_formulario = exports.accion_borrar_visita = exports.accion_modificar_visita = exports.accion_agregar_visita = exports.accion_registrar_nota = exports.accion_registrar_respuesta = exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = exports.NO_CAMBIAR__SOLO_TRAER_STATUS = exports.accion_id_pregunta = exports.setValorDistinto = exports.setAttrDistinto = exports.calcularElementoEnfocado = exports.volcadoInicialElementosRegistrados = exports.registrarElemento = exports.getEstructura = exports.getDirty = exports.getFeedbackRowValidator = exports.getDatosByPass = exports.setDatosByPass = exports.setEstructura = exports.intentarBackup = exports.setEncolarBackup = exports.setPersistirDatosByPass = exports.setCalcularVariables = void 0;
22
+ const like_ar_1 = require("like-ar");
23
+ const row_validator_1 = require("row-validator");
24
+ const best_globals_1 = require("best-globals");
25
+ const tipos_1 = require("./tipos");
26
+ var especiales = {};
27
+ function setCalcularVariables(calcularVariables) {
28
+ especiales.calcularVariables = calcularVariables;
29
+ }
30
+ exports.setCalcularVariables = setCalcularVariables;
31
+ var datosByPass = {};
32
+ //@ts-ignore arranca en blanco
33
+ var estructura = null;
34
+ let persistirDatosByPassInterno = () => {
35
+ throw new Error('persistirDatosByPass SIN DEFINIR');
36
+ };
37
+ function setPersistirDatosByPass(persistirDatosByPassFun) {
38
+ persistirDatosByPassInterno = persistirDatosByPassFun;
39
+ }
40
+ exports.setPersistirDatosByPass = setPersistirDatosByPass;
41
+ function persistirDatosByPass(dbpp) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ yield persistirDatosByPassInterno(dbpp);
44
+ datosByPass.dirty = false;
45
+ refrescarMarcaDirty();
46
+ });
47
+ }
48
+ function setEncolarBackup(encolarBackupFun) {
49
+ encolarBackup = encolarBackupFun;
50
+ }
51
+ exports.setEncolarBackup = setEncolarBackup;
52
+ let encolarBackup = () => {
53
+ throw new Error("SIN ESPECIFICAR encolarBackup");
54
+ };
55
+ var intentarBackup = (forPk) => {
56
+ var { respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true);
57
+ var token = datosByPass.token;
58
+ if (token) {
59
+ encolarBackup(token, forPkRaiz, respuestasRaiz);
60
+ }
61
+ else {
62
+ console.log("no hay token, no se pudo hacer el backup");
63
+ }
64
+ };
65
+ exports.intentarBackup = intentarBackup;
66
+ function setEstructura(estructuraACargar) {
67
+ var _a;
68
+ estructura = estructuraACargar;
69
+ exports.defOperativo.UAprincipal = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find(ua => !!ua.principal)) === null || _a === void 0 ? void 0 : _a.unidad_analisis;
70
+ exports.defOperativo.defFor = (0, like_ar_1.strict)(estructura.formularios).map(f => ({ hermano: f.casilleros.hermano })).plain();
71
+ exports.defOperativo.defUA = (0, like_ar_1.strict)(estructura.unidades_analisis).map((uaDef, ua) => ({
72
+ pk: uaDef.pk_agregada,
73
+ incluidas: (0, like_ar_1.strict)(uaDef.hijas).keys(),
74
+ idsFor: (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == ua).keys()
75
+ })).plain();
76
+ return estructura;
77
+ }
78
+ exports.setEstructura = setEstructura;
79
+ function setDatosByPass(dbpp) {
80
+ datosByPass = Object.assign(Object.assign({ dirty: false }, dbpp), { feedbackRowValidator: {} });
81
+ calcularFeedbackHojaDeRuta();
82
+ }
83
+ exports.setDatosByPass = setDatosByPass;
84
+ var getDatosByPass = () => datosByPass;
85
+ exports.getDatosByPass = getDatosByPass;
86
+ function objetoVacio(o) {
87
+ for (var k in o) {
88
+ return false;
89
+ }
90
+ return true;
91
+ }
92
+ function getFeedbackRowValidator() {
93
+ if (!datosByPass.feedbackRowValidator || objetoVacio(datosByPass.feedbackRowValidator)) {
94
+ calcularFeedbackHojaDeRuta();
95
+ }
96
+ return datosByPass.feedbackRowValidator;
97
+ }
98
+ exports.getFeedbackRowValidator = getFeedbackRowValidator;
99
+ function getDirty() {
100
+ return datosByPass.dirty;
101
+ }
102
+ exports.getDirty = getDirty;
103
+ function getEstructura() {
104
+ return estructura;
105
+ }
106
+ exports.getEstructura = getEstructura;
107
+ var registroElementosGlobal = {};
108
+ function registrarElemento(def) {
109
+ // @ts-ignore Sí, podría ser que los tipos de T sean distintos, pero van a ser coherentes
110
+ var registroElementos = registroElementosGlobal;
111
+ registroElementos[def.id] = def;
112
+ }
113
+ exports.registrarElemento = registrarElemento;
114
+ function respuestasForPk(forPk, conAumentadas, agregarSiFalta) {
115
+ var respuestasAumentadas = {};
116
+ // @ts-expect-error lo que sobrar de respuestas no me importa...
117
+ var respuestas = datosByPass.respuestas;
118
+ var respuestasRaiz;
119
+ var forPkRaiz;
120
+ var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
121
+ var forPkApilada = forPk;
122
+ var pila = [];
123
+ while (unidad_analisis) {
124
+ var uaDef = estructura.unidades_analisis[unidad_analisis];
125
+ pila.push([unidad_analisis, uaDef, forPkApilada]);
126
+ forPkApilada = Object.assign({}, forPkApilada);
127
+ delete forPkApilada[uaDef.pk_agregada];
128
+ unidad_analisis = uaDef.padre;
129
+ }
130
+ while (pila.length) {
131
+ [unidad_analisis, uaDef, forPkApilada] = pila.pop();
132
+ var valorPkOPosicion = forPkApilada[uaDef.pk_agregada];
133
+ if (valorPkOPosicion == undefined) {
134
+ throw new Error(`falta un valor para ${JSON.stringify(uaDef.pk_agregada)}`);
135
+ }
136
+ if (respuestas[unidad_analisis] == null) {
137
+ respuestas[unidad_analisis] = [];
138
+ }
139
+ var respuestasAnterior = respuestas;
140
+ let posicion = respuestas[unidad_analisis] instanceof Array ? valorPkOPosicion - 1 : valorPkOPosicion;
141
+ respuestas = respuestas[unidad_analisis][posicion];
142
+ if (respuestas == null) {
143
+ if (agregarSiFalta) {
144
+ respuestas = {};
145
+ respuestasAnterior[unidad_analisis][posicion] = respuestas;
146
+ persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
147
+ }
148
+ else {
149
+ throw new Error(`No existe el elemento '${posicion}' en la unidad_analisis '${unidad_analisis}'`);
150
+ }
151
+ }
152
+ forPkRaiz || (forPkRaiz = forPkApilada);
153
+ // @ts-expect-error Sé que es raíz por cómo estoy revolviendo la pila
154
+ respuestasRaiz || (respuestasRaiz = respuestas);
155
+ if (conAumentadas) {
156
+ respuestasAumentadas = Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestas), { [uaDef.pk_agregada]: valorPkOPosicion });
157
+ }
158
+ }
159
+ return {
160
+ respuestas, respuestasAumentadas,
161
+ // @ts-ignore Sé que la pila tiene al menos un elemento por lo tanto esto está lleno seguro.
162
+ respuestasRaiz, forPkRaiz, unidadAnalisis: uaDef
163
+ };
164
+ }
165
+ function volcadoInicialElementosRegistrados(forPkRaiz) {
166
+ var { respuestasAumentadas } = respuestasForPk(forPkRaiz, true);
167
+ var registroElementos = registroElementosGlobal;
168
+ var plainForPk = (0, tipos_1.toPlainForPk)(forPkRaiz);
169
+ var rowValidator = datosByPass.feedbackRowValidator[plainForPk];
170
+ for (var id in registroElementos) {
171
+ var def = registroElementos[id];
172
+ if (def.elemento) {
173
+ if (!document.body.contains(def.elemento)) {
174
+ def.elemento = undefined;
175
+ }
176
+ }
177
+ if (!def.elemento) {
178
+ def.elemento = document.getElementById(def.id);
179
+ }
180
+ if (!def.elemento) {
181
+ // console.log('BUSCANDO el elemento registrado ',id,'no está en el DOM')
182
+ continue;
183
+ }
184
+ var value = def.fun(respuestasAumentadas, rowValidator, def.elemento, datosByPass.feedbackRowValidator, estructura);
185
+ if ('prop' in def) {
186
+ setValorDistinto(def.elemento, def.prop, value);
187
+ }
188
+ if ('attr' in def) {
189
+ setAttrDistinto(def.elemento, def.attr, value);
190
+ }
191
+ if ('style' in def) {
192
+ setValorDistinto(def.elemento.style, def.style, value);
193
+ }
194
+ }
195
+ if (rowValidator.actual) {
196
+ var { top, bottom } = calcularElementoEnfocado(rowValidator.actual);
197
+ if (top != null && bottom != null) {
198
+ // @ts-ignore
199
+ document.getElementById('fab-activo-arriba').elTopVisibilizar = top;
200
+ // @ts-ignore
201
+ document.getElementById('fab-activo-abajo').elBottomVisibilizar = bottom;
202
+ }
203
+ }
204
+ }
205
+ exports.volcadoInicialElementosRegistrados = volcadoInicialElementosRegistrados;
206
+ function calcularElementoEnfocado(idVariable) {
207
+ var _a;
208
+ var elementoVariableAEnfocar = document.getElementById(idVariable == 'fin' ? `boton-volver-2` : `var-${idVariable}`)
209
+ || document.getElementById(`seccion-boton-formulario-${idVariable}`);
210
+ var elemento = elementoVariableAEnfocar;
211
+ var MARGEN_SCROLL = 64;
212
+ var altoPantalla = window.innerHeight * 0.7 - MARGEN_SCROLL;
213
+ var elementoEntero = elemento; // es el elemento que va a entar entero en pantalla, define el bottom
214
+ var rectElementoEntero = null;
215
+ var elementoSuperior = null; // es el elemento que va a mostrarse desde arriba aunque no entre entero, define el top
216
+ var rectElementoSuperior = null;
217
+ while (elemento != null) {
218
+ if (elemento.classList.contains('variable')
219
+ || elemento.classList.contains('multiple')
220
+ || elemento.classList.contains('pregunta')
221
+ || elemento.classList.contains('conjuntopreguntas')
222
+ || elemento.classList.contains('seccion-boton-formulario')
223
+ || elemento.classList.contains('botonformulario')) {
224
+ if (elementoSuperior == null && elemento.clientHeight < altoPantalla) {
225
+ elementoEntero = elemento;
226
+ }
227
+ else {
228
+ if (rectElementoEntero == null) {
229
+ elementoSuperior = elementoEntero;
230
+ rectElementoEntero = myOwn.getRect(elementoEntero);
231
+ rectElementoSuperior = rectElementoEntero;
232
+ }
233
+ var rect = myOwn.getRect(elemento);
234
+ if (rectElementoEntero.top + rectElementoEntero.height - rect.top < altoPantalla) {
235
+ elementoSuperior = elemento;
236
+ rectElementoSuperior = rect;
237
+ }
238
+ else {
239
+ elemento = null;
240
+ }
241
+ }
242
+ }
243
+ elemento = (_a = elemento === null || elemento === void 0 ? void 0 : elemento.parentElement) !== null && _a !== void 0 ? _a : null;
244
+ }
245
+ if (elementoSuperior == null) {
246
+ elementoSuperior = elementoEntero;
247
+ }
248
+ var result = {};
249
+ if (elementoEntero != null) {
250
+ if (rectElementoEntero == null) {
251
+ rectElementoEntero = myOwn.getRect(elementoEntero);
252
+ }
253
+ result.elementoInputVariable = elementoVariableAEnfocar;
254
+ var top = (rectElementoSuperior !== null && rectElementoSuperior !== void 0 ? rectElementoSuperior : rectElementoEntero).top - MARGEN_SCROLL;
255
+ result.top = top;
256
+ result.bottom = rectElementoEntero.top + rectElementoEntero.height;
257
+ if (top < document.documentElement.scrollTop) {
258
+ result.desenfoque = 'arriba';
259
+ }
260
+ else if (rectElementoEntero.top + rectElementoEntero.height > document.documentElement.scrollTop + altoPantalla) {
261
+ result.desenfoque = 'abajo';
262
+ }
263
+ else {
264
+ result.enfocado = true;
265
+ }
266
+ }
267
+ return result;
268
+ }
269
+ exports.calcularElementoEnfocado = calcularElementoEnfocado;
270
+ function setAttrDistinto(objeto, name, valor) {
271
+ if (objeto && objeto.getAttribute(name) != valor) {
272
+ objeto.setAttribute(name, valor);
273
+ }
274
+ }
275
+ exports.setAttrDistinto = setAttrDistinto;
276
+ function setValorDistinto(objeto, name, valor) {
277
+ if (objeto[name] != valor) {
278
+ objeto[name] = valor;
279
+ }
280
+ }
281
+ exports.setValorDistinto = setValorDistinto;
282
+ function calcularVariablesBotonFormulario(_forPk) {
283
+ }
284
+ ;
285
+ function accion_id_pregunta(_payload, _datosByPass) {
286
+ }
287
+ exports.accion_id_pregunta = accion_id_pregunta;
288
+ exports.NO_CAMBIAR__SOLO_TRAER_STATUS = Symbol('NO_CAMBIAR_SOLO_TRAER_STATUS');
289
+ exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = Symbol('NO_CAMBIAR_VERIFICAR_SI_ES_NECESARIO');
290
+ function refrescarMarcaDirty() {
291
+ var botonGrabar = document.getElementById("save-button");
292
+ if (botonGrabar) {
293
+ if (botonGrabar.disabled !== !datosByPass.dirty) {
294
+ botonGrabar.disabled = !datosByPass.dirty;
295
+ }
296
+ }
297
+ }
298
+ function accion_registrar_respuesta(payload, _datosByPass) {
299
+ var _a;
300
+ let token = 'AVERIGUAR TODO';
301
+ let { forPk, respuesta, variable } = payload;
302
+ var { respuestas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk);
303
+ var unidad_analisis = estructura.formularios[forPk.formulario];
304
+ var recentModified = false;
305
+ var valorAnterior = variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS ? respuestas[variable] : null;
306
+ if (respuesta !== exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS) {
307
+ if (respuesta === '') {
308
+ respuesta = null;
309
+ }
310
+ else if (estructura.formularios[forPk.formulario].estructuraRowValidator.variables[variable].tipo == 'numero') {
311
+ if (respuesta != null) {
312
+ respuesta = Number(respuesta);
313
+ }
314
+ }
315
+ // si es un falsy (0 == false) tengo que comparar con !==
316
+ recentModified = respuesta ? valorAnterior != respuesta : valorAnterior !== respuesta;
317
+ if (recentModified) {
318
+ respuestas[variable] = respuesta !== null && respuesta !== void 0 ? respuesta : null; // cambio undefined por null
319
+ }
320
+ }
321
+ var feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
322
+ var siguienteVariable;
323
+ if (variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS && (recentModified || exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && ((_a = feedbackRow.autoIngresadas) === null || _a === void 0 ? void 0 : _a[variable]))) {
324
+ variablesCalculadas(respuestasRaiz, forPk);
325
+ if (estructura.configSorteo && !(datosByPass === null || datosByPass === void 0 ? void 0 : datosByPass.soloLectura)) {
326
+ verificarSorteo({
327
+ configuracionSorteo: estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPk.vivienda)],
328
+ respuestas,
329
+ respuestasRaiz,
330
+ variableActual: variable,
331
+ forPk: forPk
332
+ });
333
+ }
334
+ datosByPass.dirty = datosByPass.dirty || recentModified;
335
+ respuestasRaiz.$dirty = respuestasRaiz.$dirty || recentModified;
336
+ refrescarMarcaDirty();
337
+ calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
338
+ feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
339
+ calcularVariablesBotonFormulario(forPk);
340
+ volcadoInicialElementosRegistrados(forPk);
341
+ persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
342
+ siguienteVariable = variable;
343
+ do {
344
+ siguienteVariable = feedbackRow.feedback[siguienteVariable].siguiente;
345
+ } while (valorAnterior == null && recentModified && siguienteVariable != null && siguienteVariable != 'fin' && estructura.formularios[forPk.formulario].estructuraRowValidator.variables[siguienteVariable].funcionAutoIngresar);
346
+ if (siguienteVariable == null && feedbackRow.feedback[variable].estado == 'valida') {
347
+ siguienteVariable = 'fin';
348
+ }
349
+ }
350
+ return { recentModified, siguienteVariable, variableActual: feedbackRow.actual };
351
+ }
352
+ exports.accion_registrar_respuesta = accion_registrar_respuesta;
353
+ function accion_registrar_nota(payload, _datosByPass) {
354
+ let { forPkRaiz, tarea, nota } = payload;
355
+ console.log("FALTA // TODO");
356
+ }
357
+ exports.accion_registrar_nota = accion_registrar_nota;
358
+ function accion_agregar_visita(payload, _datosByPass) {
359
+ let { forPkRaiz, observaciones } = payload;
360
+ /*
361
+ if(!datosByPass.hojaDeRuta[vivienda].visitas){
362
+ datosByPass.hojaDeRuta[vivienda].visitas = [];
363
+ }
364
+ var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
365
+ visitas.push({
366
+ fecha: datetime.now().toYmd(),
367
+ hora: datetime.now().toHm(),
368
+ idper: null, // TODO: VER DE DONDE SE SACA EL IDPER state.datos.idper,
369
+ observaciones:observaciones
370
+ })
371
+ */
372
+ }
373
+ exports.accion_agregar_visita = accion_agregar_visita;
374
+ function accion_modificar_visita(payload, _datosByPass) {
375
+ let { forPkRaiz, index, opcion, valor } = payload;
376
+ // var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
377
+ // visitas[index][opcion] = valor;
378
+ }
379
+ exports.accion_modificar_visita = accion_modificar_visita;
380
+ function accion_borrar_visita(payload, _datosByPass) {
381
+ let { forPkRaiz, index } = payload;
382
+ // var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
383
+ // visitas.splice(index, 1);
384
+ }
385
+ exports.accion_borrar_visita = accion_borrar_visita;
386
+ function accion_agregar_formulario({ forPk }, _datosByPass) {
387
+ var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz } = respuestasForPk(forPk, true, true);
388
+ variablesCalculadas(respuestasRaiz, forPk);
389
+ calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
390
+ calcularVariablesBotonFormulario(forPk);
391
+ }
392
+ exports.accion_agregar_formulario = accion_agregar_formulario;
393
+ function accion_abrir_formulario({ forPk }, _datosByPass) {
394
+ var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz } = respuestasForPk(forPk, true, true);
395
+ variablesCalculadas(respuestasRaiz, forPk);
396
+ calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
397
+ calcularVariablesBotonFormulario(forPk);
398
+ }
399
+ exports.accion_abrir_formulario = accion_abrir_formulario;
400
+ function accion_borrar_formulario({ forPk, forPkPadre }) {
401
+ var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true, true);
402
+ var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
403
+ var uaDef = estructura.unidades_analisis[unidad_analisis];
404
+ var index = forPk[uaDef.pk_agregada];
405
+ respuestasAumentadas[unidad_analisis].pop();
406
+ variablesCalculadas(respuestasRaiz, forPkPadre);
407
+ datosByPass.dirty = datosByPass.dirty || true;
408
+ respuestasRaiz.$dirty = respuestasRaiz.$dirty || true;
409
+ refrescarMarcaDirty();
410
+ calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
411
+ calcularVariablesBotonFormulario(forPkPadre);
412
+ volcadoInicialElementosRegistrados(forPkPadre);
413
+ persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
414
+ }
415
+ exports.accion_borrar_formulario = accion_borrar_formulario;
416
+ function dispatchByPass(fun, payload) {
417
+ return fun(payload, datosByPass);
418
+ }
419
+ exports.dispatchByPass = dispatchByPass;
420
+ //////////////////////////////////////////////////////////////////////////
421
+ exports.ultimaVaribleVivienda = 'NO_ESTA_DEFINIDA_AUN//TODO';
422
+ exports.MAXCP = 20;
423
+ /* REDUCERS */
424
+ var reemplazosHabilitar = {
425
+ false: 'false',
426
+ true: 'true',
427
+ "=": '==',
428
+ "<>": '!=',
429
+ "&": '&&',
430
+ "|": '||',
431
+ "OR": '||',
432
+ "AND": '&&',
433
+ "or": '||',
434
+ "and": '&&',
435
+ "not": '!',
436
+ "NOT": '!',
437
+ };
438
+ const helpersCasilleros = {
439
+ null2zero(posibleNull) {
440
+ if (posibleNull == null) {
441
+ return 0;
442
+ }
443
+ return posibleNull;
444
+ },
445
+ div0err(numerador, denominador, pk) {
446
+ if (denominador == 0) {
447
+ throw new Error("Error en " + pk + " division por cero de " + numerador);
448
+ }
449
+ return numerador / denominador;
450
+ },
451
+ funs: {
452
+ blanco(x) {
453
+ return x !== 0 && !x;
454
+ },
455
+ hoy() {
456
+ return best_globals_1.date.today().toDmy();
457
+ },
458
+ fecha_valida(x) {
459
+ var formato_valido = /^([1-9]|0[1-9]|[12]\d|3[01])\/([1-9]|0[1-9]|1[012])\/20\d\d$/.test(x);
460
+ var xDate;
461
+ var conversionOk;
462
+ conversionOk = true;
463
+ if (formato_valido) {
464
+ const [d, m, y] = x.split('/');
465
+ try {
466
+ xDate = new Date(`${y}/${m}/${d}`);
467
+ }
468
+ catch (err) {
469
+ conversionOk = false;
470
+ }
471
+ }
472
+ ;
473
+ //faltaria validar que no sea una fecha futura y que sea una fecha en el rango del operativo
474
+ return formato_valido && conversionOk;
475
+ },
476
+ informado(x) {
477
+ return x !== undefined && x !== null && (!(x instanceof Array) || x.length !== 0)
478
+ && (!(x instanceof Object) || Object.keys(x).length !== 0);
479
+ },
480
+ nsnc(x) {
481
+ return x == -9;
482
+ },
483
+ par(x) {
484
+ return x % 2 == 0;
485
+ },
486
+ /*
487
+ dbo:{
488
+ datoFamiliar(encu:string,hog:number,per:number, dato:string){
489
+ var xpersonas=personas;
490
+ return encu==enc && hog==hogar && informado(xpersonas) && per<= xpersonas.length && per>=1 && !!xpersonas[per-1][dato]? xpersonas[per-1][dato]:null
491
+ },
492
+ edadfamiliar(encu:string,hog:number,per:number){
493
+ var xpersonas=personas;
494
+ return datoFamiliar(encu:string,hog:number,per:number,'edad')
495
+ },
496
+ existeindividual(encu:string,hog:number,per:number){
497
+ var xpersonas=personas;
498
+ return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1 && !!personas[per-1]['entreaind']
499
+ },
500
+ existemiembro(encu:string,hog:number,per:number){
501
+ var xpersonas=personas;
502
+ return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1
503
+ },
504
+ nroconyuges(encu:string,hog:number){
505
+ var xpersonas=personas
506
+ return xpersonas.filter( per->per.p4==2).length
507
+ },
508
+ nrojefes(encu:string,hog:number,per:number){
509
+ return personas.filter( per->per.p4==1).length
510
+ },
511
+ parentescofamiliar(encu:string,hog:number,per:number){
512
+ return datoFamiliar(encu:string,hog:number,per:number,'p4')
513
+ },
514
+ sexofamiliar(encu:string,hog:number,per:number){
515
+ var xpersonas=personas;
516
+ return encu==enc && hog==hogar && !!xpersonas && per<= xpersonas.length && per>=1 && !!xpersonas[per-1].sexo? xpersonas[per-1]['sexo']:null
517
+ },
518
+ sitconyjefe(encu:string,hog:number){
519
+ return datoFamiliar(encu:string,hog:number,1,'p5')
520
+ }
521
+ } */
522
+ }
523
+ };
524
+ var funcionesHabilitar = {};
525
+ var funcionesValorar = {};
526
+ function miniCompiladorSQlJs(expresionCasiSQL) {
527
+ var expresion = expresionCasiSQL.replace(/\u00A0/g, ' ');
528
+ var cuerpo = expresion.replace(/\bis distinct from\b/gi, '!=').replace(/\b.+?\b/g, function (elToken) {
529
+ var elTokenTrimeado = elToken.trim();
530
+ if (elTokenTrimeado in reemplazosHabilitar) {
531
+ return reemplazosHabilitar[elTokenTrimeado];
532
+ }
533
+ else if (/^\d+\.?\d*$/.test(elTokenTrimeado)) {
534
+ return elToken;
535
+ }
536
+ else if (/^\W+$/.test(elTokenTrimeado)) {
537
+ return elToken;
538
+ }
539
+ else if (/^\s+$/.test(elToken)) {
540
+ return elToken;
541
+ }
542
+ return 'helpers.null2zero(valores.' + elToken + ')';
543
+ });
544
+ return cuerpo;
545
+ }
546
+ exports.miniCompiladorSQlJs = miniCompiladorSQlJs;
547
+ function getFuncionCompilada(conjuntoDeFunciones) {
548
+ return function (nombreFuncionComoExpresionJs) {
549
+ if (!conjuntoDeFunciones[nombreFuncionComoExpresionJs]) {
550
+ var cuerpo = nombreFuncionComoExpresionJs;
551
+ try {
552
+ // var cuerpo = miniCompiladorSQlJs(nombreFuncionComoExpresionJs);
553
+ var internalFun = new Function('valores', 'helpers', 'return ' + cuerpo);
554
+ conjuntoDeFunciones[nombreFuncionComoExpresionJs] = function (valores) {
555
+ try {
556
+ var result = internalFun(valores, helpersCasilleros);
557
+ }
558
+ catch (err) {
559
+ console.log('ERROR EJECUCCION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs);
560
+ console.log(cuerpo);
561
+ console.log(valores);
562
+ throw err;
563
+ }
564
+ return result;
565
+ };
566
+ }
567
+ catch (err) {
568
+ console.log('ERROR COMPILACION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs);
569
+ console.log(cuerpo);
570
+ throw err;
571
+ }
572
+ }
573
+ return conjuntoDeFunciones[nombreFuncionComoExpresionJs];
574
+ };
575
+ }
576
+ exports.getFuncionCompilada = getFuncionCompilada;
577
+ exports.getFuncionHabilitar = getFuncionCompilada(funcionesHabilitar);
578
+ exports.getFuncionValorar = getFuncionCompilada(funcionesValorar);
579
+ var rowValidator = (0, row_validator_1.getRowValidator)({ getFuncionHabilitar: exports.getFuncionHabilitar, getFuncionValorar: exports.getFuncionValorar });
580
+ var buscarNoReaEnRespuestas = (unidadesARecorrerPrm, unidadAnalisis, respuestas, noReasTarea, nombNoRea) => {
581
+ var nrcodigo = null;
582
+ var esvalor = false;
583
+ var rvalor = null;
584
+ var rvariable;
585
+ var rnorea = null;
586
+ // var result={nrcod:String, esval:Boolean};
587
+ if (unidadesARecorrerPrm.includes(unidadAnalisis.unidad_analisis)) {
588
+ for (let noRea of noReasTarea) { //estructura.noReas, estructura.noReasSup
589
+ if (nombNoRea == 'no_rea') {
590
+ var { variable, valor, no_rea } = noRea;
591
+ rnorea = no_rea;
592
+ rvalor = valor;
593
+ rvariable = variable;
594
+ }
595
+ else {
596
+ var { variable_sup, valor_sup, no_rea_sup } = noRea;
597
+ rnorea = no_rea_sup;
598
+ rvalor = valor_sup;
599
+ rvariable = variable_sup;
600
+ }
601
+ if (respuestas[rvariable] == rvalor) {
602
+ nrcodigo = rnorea; //no_rea, no_rea_sup
603
+ esvalor = true;
604
+ return { nrcodigo, esvalor };
605
+ }
606
+ else {
607
+ nrcodigo = null;
608
+ esvalor = false;
609
+ }
610
+ }
611
+ }
612
+ for (let ua of ((0, like_ar_1.strict)(unidadAnalisis === null || unidadAnalisis === void 0 ? void 0 : unidadAnalisis.hijas).array())) {
613
+ if ((ua === null || ua === void 0 ? void 0 : ua.unidad_analisis) && respuestas[ua.unidad_analisis] instanceof Array) {
614
+ for (let respuestasHijas of respuestas[ua === null || ua === void 0 ? void 0 : ua.unidad_analisis]) {
615
+ let result = buscarNoReaEnRespuestas(unidadesARecorrerPrm, ua, respuestasHijas, noReasTarea, nombNoRea);
616
+ if (result.esvalor) {
617
+ nrcodigo = result.nrcodigo;
618
+ esvalor = result.esvalor;
619
+ return { nrcodigo, esvalor };
620
+ break;
621
+ }
622
+ else {
623
+ nrcodigo = null;
624
+ esvalor = false;
625
+ // return {nrcodigo, esvalor}
626
+ }
627
+ }
628
+ }
629
+ }
630
+ return { nrcodigo, esvalor };
631
+ };
632
+ ////// TODOS LOS NOMBRES DE variables o formularios o casilleros deben estar en el objeto operativo
633
+ //// QUITARLO Y REEMPLAZARLO por buscar en estructura.unidad_analisis y estructura.formulario
634
+ exports.defOperativo = {
635
+ //TODO: GENERALIZAR
636
+ //esNorea:(respuestas:Respuestas)=>{
637
+ // const NO_REA_VAR = 'entreav' as IdVariable;
638
+ // return respuestas[NO_REA_VAR] && respuestas[NO_REA_VAR]!=1
639
+ //},
640
+ esNorea: (respuestas) => {
641
+ //TODO GENERALIZAR
642
+ var unidadesARecorrer = ['viviendas', 'hogares', 'personas'];
643
+ var uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
644
+ var esNoRea = false;
645
+ var codNoRea = null;
646
+ /*
647
+ var buscarNoReaEnRespuestas = (unidadAnalisis:UnidadAnalisis, respuestas:Respuestas)=>{
648
+ if(unidadesARecorrer.includes(unidadAnalisis.unidad_analisis)){
649
+ for(let noRea of estructura.noReas){
650
+ var {variable, valor, no_rea} = noRea;
651
+ if(respuestas[variable as IdVariable]==valor){
652
+ codNoRea = no_rea;
653
+ esNoRea = true;
654
+ return true
655
+ }
656
+ }
657
+ }
658
+ for(let ua of (likeAr(unidadAnalisis?.hijas).array())){
659
+ if(ua?.unidad_analisis && respuestas[ua.unidad_analisis] instanceof Array){
660
+ for(let respuestasHijas of respuestas[ua?.unidad_analisis]){
661
+ let result = buscarNoReaEnRespuestas(ua,respuestasHijas);
662
+ if(result){
663
+ break;
664
+ }
665
+ }
666
+ }
667
+ }
668
+ return false
669
+ }
670
+ buscarNoReaEnRespuestas(uaPrincipal!,respuestas);
671
+ return {codNoRea,esNoRea}
672
+ */
673
+ let resnorea = buscarNoReaEnRespuestas(unidadesARecorrer, uaPrincipal, respuestas, estructura.noReas, 'no_rea');
674
+ codNoRea = resnorea.nrcodigo;
675
+ esNoRea = resnorea.esvalor;
676
+ return { codNoRea, esNoRea };
677
+ },
678
+ esNoreaSup: (respuestas) => {
679
+ //TODO GENERALIZAR buscarNoreaRespuestas
680
+ var unidadesARecorrerSup = ['viviendas', 'hogares_sup', 'personas_sup'];
681
+ var uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
682
+ var esNoReaSup = false;
683
+ var codNoReaSup = null;
684
+ let resnorea = buscarNoReaEnRespuestas(unidadesARecorrerSup, uaPrincipal, respuestas, estructura.noReasSup, 'no_rea_sup'); //con los parametros que necesitariamos para generalizar
685
+ codNoReaSup = resnorea.nrcodigo;
686
+ esNoReaSup = resnorea.esvalor;
687
+ return { codNoReaSup, esNoReaSup };
688
+ },
689
+ esRealizada: (respuestas) => {
690
+ //TODO GENERALIZAR
691
+ var esRea = false;
692
+ var codRea = null;
693
+ if (!respuestas['identif']) {
694
+ return { codRea, esRea };
695
+ }
696
+ else if (respuestas['identif'] == 2 || respuestas['resid_hog'] == 2 || respuestas['contact'] == 2) {
697
+ codRea = 2;
698
+ esRea = false;
699
+ }
700
+ else {
701
+ var reahs = [];
702
+ var respuestasHs = respuestas['hogares'];
703
+ if (respuestasHs) {
704
+ for (let respuestasH of respuestasHs) {
705
+ var reah;
706
+ var selec;
707
+ if (respuestasH['entrea'] != 1 || respuestasH['prejue1'] == 2 || respuestasH['tp'] == 0) {
708
+ reah = 2;
709
+ }
710
+ else {
711
+ selec = respuestasH['cr_num_miembro'];
712
+ if (respuestasH['personas'] && respuestasH.personas[selec - 1]) {
713
+ var respuestasP = respuestasH.personas[selec - 1];
714
+ var resp_entrea_ind = respuestasP['entreaind'];
715
+ if (resp_entrea_ind == null) { //queremos contemplar el undefined
716
+ reah = 3;
717
+ }
718
+ else {
719
+ reah = Number(resp_entrea_ind);
720
+ }
721
+ }
722
+ else {
723
+ reah = 3;
724
+ }
725
+ }
726
+ reahs.push(reah);
727
+ }
728
+ if (reahs.every(rh => rh == 1)) {
729
+ codRea = 1;
730
+ esRea = true;
731
+ }
732
+ else if (reahs.every(rh => rh == 2)) {
733
+ codRea = 2;
734
+ esRea = false;
735
+ }
736
+ else if (reahs.every(rh => rh == 1 || rh == 3)) {
737
+ codRea = 3;
738
+ esRea = false;
739
+ }
740
+ else {
741
+ codRea = 4;
742
+ esRea = false;
743
+ }
744
+ }
745
+ else {
746
+ codRea = 3;
747
+ esRea = false;
748
+ }
749
+ }
750
+ return { codRea, esRea };
751
+ },
752
+ esRealizadaSup: (respuestas) => {
753
+ //TODO GENERALIZAR
754
+ var esReaSup = false;
755
+ var codReaSup = null;
756
+ if (!respuestas['confir_tel_sup'] && !respuestas['sp1a']) {
757
+ return { codReaSup, esReaSup };
758
+ }
759
+ else if (respuestas['confir_tel_sup'] == 2 || respuestas['confir_dom_sup'] == 2 || respuestas['sp1a'] == 2 || respuestas['sp1b'] == 2 || respuestas['sp1c'] == 2) {
760
+ codReaSup = 2;
761
+ esReaSup = false;
762
+ }
763
+ else {
764
+ var reahs = [];
765
+ var respuestasHs = respuestas['hogares_sup'];
766
+ if (respuestasHs) {
767
+ for (let respuestasH of respuestasHs) {
768
+ var reah;
769
+ var selec;
770
+ if (respuestasH['entrea_sup'] == 2 || respuestasH['spr1_sup'] == 2 || respuestasH['sp4'] == 3 || respuestasH['total_rango_sup'] == 0) {
771
+ reah = 2;
772
+ }
773
+ else {
774
+ if (respuestasH['entrea_sup']) {
775
+ reah = 1;
776
+ }
777
+ else {
778
+ reah = 3;
779
+ }
780
+ }
781
+ reahs.push(reah);
782
+ }
783
+ if (reahs.every(rh => rh == 1)) {
784
+ codReaSup = 1;
785
+ esReaSup = true;
786
+ }
787
+ else if (reahs.every(rh => rh == 2)) {
788
+ codReaSup = 2;
789
+ esReaSup = false;
790
+ }
791
+ else if (reahs.every(rh => rh == 1 || rh == 3)) {
792
+ codReaSup = 3;
793
+ esReaSup = false;
794
+ }
795
+ else {
796
+ codReaSup = 4;
797
+ esReaSup = false;
798
+ }
799
+ }
800
+ else {
801
+ codReaSup = 3;
802
+ esReaSup = false;
803
+ }
804
+ }
805
+ return { codReaSup, esReaSup };
806
+ },
807
+ UAprincipal: '',
808
+ defUA: {},
809
+ defFor: {}
810
+ };
811
+ function num(num) {
812
+ //@ts-ignore la gracia es meter num cuando es string
813
+ if (isNaN(num - 0))
814
+ return 0;
815
+ //@ts-ignore la gracia es meter num cuando es string
816
+ return num - 0;
817
+ }
818
+ var funcionesConocidas = {};
819
+ function verificarSorteo(opts) {
820
+ var _a, _b, _c;
821
+ const resetearSorteo = (opts) => {
822
+ var _a;
823
+ var { respuestas } = opts;
824
+ respuestas[configuracionSorteo.resultado] = null;
825
+ respuestas[configuracionSorteo.cantidad_sorteables] = null;
826
+ respuestas[configuracionSorteo.disparador] = null;
827
+ (_a = configuracionSorteo.sorteado_mostrar) === null || _a === void 0 ? void 0 : _a.forEach((mostrar) => respuestas[mostrar.target] = null);
828
+ if ('var_letra' in configuracionSorteo.param_metodo) {
829
+ if (respuestas[unidadAnalisis] && respuestas[unidadAnalisis] instanceof Array) {
830
+ for (var per of respuestas[unidadAnalisis]) {
831
+ per[configuracionSorteo.param_metodo.var_letra] = null;
832
+ }
833
+ }
834
+ }
835
+ };
836
+ var { configuracionSorteo, variableActual, respuestas, forPk, respuestasRaiz } = opts;
837
+ var idEnc = forPk.vivienda;
838
+ var { respuestasAumentadas } = respuestasForPk(forPk, true);
839
+ var expr_incompletitud_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.expr_incompletitud_js[respuestasAumentadas.vdominio].expr);
840
+ var filtro_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.filtro_js[respuestasAumentadas.vdominio].expr);
841
+ var unidadAnalisis = configuracionSorteo.unidad_analisis;
842
+ if (configuracionSorteo.parametros.includes(variableActual)) {
843
+ var uaPadre = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == unidadAnalisis)) === null || _a === void 0 ? void 0 : _a.padre;
844
+ var pkAgregadaPadre = (_b = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == uaPadre)) === null || _b === void 0 ? void 0 : _b.pk_agregada;
845
+ if (uaPadre && respuestasAumentadas[uaPadre]) {
846
+ //@ts-ignore pkAgregadaPadre existe e indica la posicion del padre
847
+ var padre = respuestasAumentadas[uaPadre][Number(respuestasAumentadas[pkAgregadaPadre]) - 1];
848
+ if (variableActual != configuracionSorteo.cantidad_total) {
849
+ padre[configuracionSorteo.cantidad_total] = padre[unidadAnalisis].length; //si agrega desde boton agregar
850
+ }
851
+ resetearSorteo({ respuestas: padre });
852
+ respuestas = padre;
853
+ }
854
+ }
855
+ if (respuestas[unidadAnalisis] != null) {
856
+ if (respuestas[unidadAnalisis] instanceof Array) {
857
+ var respuestasUA = respuestas[unidadAnalisis];
858
+ if (respuestas[configuracionSorteo.disparador] != 1) {
859
+ if (respuestas[configuracionSorteo.disparador] == 2) {
860
+ respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length + 1;
861
+ }
862
+ resetearSorteo({ respuestas });
863
+ }
864
+ let cantidadTotal = Number(respuestas[configuracionSorteo.cantidad_total]);
865
+ if (cantidadTotal < respuestasUA.length) {
866
+ // doble asignación para que lo cargue en respuestas
867
+ respuestasUA = respuestasUA.filter((p, i) => configuracionSorteo.parametros.some((param) => p[param] || i <= cantidadTotal - 1));
868
+ respuestas[unidadAnalisis] = respuestasUA;
869
+ }
870
+ while (cantidadTotal > respuestasUA.length) {
871
+ respuestasUA.push({});
872
+ }
873
+ respuestas[configuracionSorteo.incompletas] = respuestasUA.filter(p => expr_incompletitud_fun(p)).length;
874
+ if (respuestas[configuracionSorteo.disparador] == 1 &&
875
+ !respuestas[configuracionSorteo.resultado] &&
876
+ respuestas[configuracionSorteo.incompletas] == 0) {
877
+ var sortear = respuestasUA.filter(p => filtro_fun(p));
878
+ if (sortear.length) {
879
+ respuestasUA.forEach((per, i) => per.$p0 = i + 1);
880
+ configuracionSorteo.orden.push({ variable: "$p0", orden: 1 });
881
+ sortear.sort((0, best_globals_1.compareForOrder)(configuracionSorteo.orden.map(elem => ({ column: elem.variable, order: elem.orden }))));
882
+ var posicionSorteada = null;
883
+ if (configuracionSorteo.metodo == 'hash') {
884
+ throw new Error('NO IMPLEMENTADO');
885
+ /*posicionSorteada=(
886
+ configuracionSorteo.param_metodo.var_coef.reduce(
887
+ ((sum, pair)=>sum + datosVivienda.tem[pair.var] * pair.coef),
888
+ 0
889
+ ) % configuracionSorteo.param_metodo.divisor
890
+ ) % sortear.length*/
891
+ }
892
+ else {
893
+ var letra = 'A';
894
+ const varLetra = configuracionSorteo.param_metodo.var_letra;
895
+ for (var persona of sortear) {
896
+ respuestasUA.find((_per, i) => i == persona.$p0 - 1)[varLetra] = letra;
897
+ persona[varLetra] = letra;
898
+ letra = String.fromCharCode(letra.charCodeAt(0) + 1);
899
+ }
900
+ var tablaAleatoriaMiembros = configuracionSorteo.param_metodo.tabla.map((lista) => lista.split(''));
901
+ var resto = idEnc % 10;
902
+ var columnaTablaAleatoria = resto ? resto - 1 : 9;
903
+ if (sortear.length > tablaAleatoriaMiembros.length) {
904
+ sortear.splice(tablaAleatoriaMiembros.length); //descarto candidatos si son más que lo que permite la tabla
905
+ }
906
+ var filaTablaAleatoria = sortear.length - 1;
907
+ var letraSeleccionada = tablaAleatoriaMiembros[filaTablaAleatoria][columnaTablaAleatoria];
908
+ posicionSorteada = respuestasUA.findIndex((p) => p[varLetra] == letraSeleccionada) + 1;
909
+ respuestas[configuracionSorteo.resultado] = posicionSorteada;
910
+ respuestas[configuracionSorteo.cantidad_sorteables] = sortear.length;
911
+ (_c = configuracionSorteo.sorteado_mostrar) === null || _c === void 0 ? void 0 : _c.forEach((mostrar) => respuestas[mostrar.target] = respuestasUA[respuestas[configuracionSorteo.resultado] - 1][mostrar.source]);
912
+ }
913
+ }
914
+ else {
915
+ respuestas[configuracionSorteo.cantidad_sorteables] = 0;
916
+ }
917
+ }
918
+ respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length || null; //no queremos el valor 0
919
+ respuestas[configuracionSorteo.variableBotonFormularioUA] = 'ok';
920
+ if (configuracionSorteo.variableBotonFormularioUAIndividual) {
921
+ respuestas[configuracionSorteo.variableBotonFormularioUAIndividual] = 'ok';
922
+ }
923
+ }
924
+ }
925
+ }
926
+ exports.verificarSorteo = verificarSorteo;
927
+ function variablesCalculadas(respuestasRaiz, forPk) {
928
+ if (especiales.calcularVariables) {
929
+ especiales.calcularVariables(respuestasRaiz, forPk);
930
+ }
931
+ }
932
+ function calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, UA, forPk, respuestasAumentadas, // incluyen la de todos los padres y ansestros,
933
+ respuestasPadre, opts) {
934
+ // recorriend UA personas y mascotas
935
+ for (var UAincluida of exports.defOperativo.defUA[UA].incluidas) {
936
+ var pkNueva = exports.defOperativo.defUA[UAincluida].pk;
937
+ var conjuntoRespuestasUA = respuestas[UAincluida];
938
+ (0, like_ar_1.strict)(conjuntoRespuestasUA).forEach((respuestasHijo, valorPkOPosicion) => {
939
+ var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
940
+ calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestasHijo, UAincluida, Object.assign(Object.assign({}, forPk), { [pkNueva]: valorPk }), Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestasHijo), { [pkNueva]: valorPk }), respuestas, opts);
941
+ });
942
+ }
943
+ // S1 , A1
944
+ for (var esHermano of [true, false]) {
945
+ for (var formulario of exports.defOperativo.defUA[UA].idsFor)
946
+ if (!!esHermano == !!exports.defOperativo.defFor[formulario].hermano) {
947
+ var plainForPk = (0, tipos_1.toPlainForPk)(Object.assign(Object.assign({}, forPk), { formulario }));
948
+ var maxPasosAutoingresadas = 10;
949
+ var varAutoIngresadas = [];
950
+ do {
951
+ var huboAutoingresos = false;
952
+ feedbackRowValidator[plainForPk] =
953
+ rowValidator(Object.assign({ marcaFin: 'fin' }, formularios[formulario].estructuraRowValidator), respuestasAumentadas, opts);
954
+ var { resumen, autoIngresadas } = feedbackRowValidator[plainForPk];
955
+ var varName;
956
+ if (autoIngresadas != null) {
957
+ for (varName in autoIngresadas) {
958
+ var cambio = respuestas[varName] !== autoIngresadas[varName];
959
+ if (cambio) {
960
+ respuestas[varName] = autoIngresadas[varName];
961
+ respuestasAumentadas[varName] = autoIngresadas[varName];
962
+ varAutoIngresadas.push(varName);
963
+ huboAutoingresos = true;
964
+ }
965
+ }
966
+ }
967
+ } while (huboAutoingresos && maxPasosAutoingresadas-- > 0);
968
+ varAutoIngresadas.forEach(varname => {
969
+ // feedbackRowValidator[plainForPk].estados[varname as IdVariable] = 'actual';
970
+ });
971
+ var BF_varname = '$B.' + formulario;
972
+ var formPrincipalForVivienda = (0, exports.getMainFormForVivienda)(forPk.vivienda);
973
+ if (estructura.configSorteo && !estructura.configSorteo[formPrincipalForVivienda]) {
974
+ throw new Error(`no hay configuracion de sorteo para el formulario ${formPrincipalForVivienda}`);
975
+ }
976
+ var configSorteoFormulario = estructura.configSorteo && estructura.configSorteo[formPrincipalForVivienda];
977
+ var resumenOrNull = configSorteoFormulario &&
978
+ configSorteoFormulario.variableBotonFormularioUAIndividual &&
979
+ configSorteoFormulario.variableBotonFormularioUAIndividual == BF_varname ?
980
+ 'ok'
981
+ : resumen == 'vacio' ?
982
+ null
983
+ : resumen;
984
+ if (esHermano) {
985
+ respuestas[BF_varname] = resumenOrNull;
986
+ }
987
+ else if (respuestasPadre != null) {
988
+ respuestasPadre[BF_varname] = resumenOrNull;
989
+ }
990
+ }
991
+ }
992
+ }
993
+ exports.calcularFeedbackUnidadAnalisis = calcularFeedbackUnidadAnalisis;
994
+ function numberOrStringIncIfArray(numberOrString, object) {
995
+ // @ts-expect-error estoy usando isNaN para ver si es o no un número sumable
996
+ if (isNaN(numberOrString)) {
997
+ return numberOrString;
998
+ }
999
+ return Number(numberOrString) + (object instanceof Array ? 1 : 0);
1000
+ }
1001
+ exports.numberOrStringIncIfArray = numberOrStringIncIfArray;
1002
+ var getMainFormForVivienda = (vivienda) => {
1003
+ //@ts-ignore la vivienda es el parametro correcto
1004
+ return datosByPass.informacionHdr[vivienda].tarea.main_form;
1005
+ };
1006
+ exports.getMainFormForVivienda = getMainFormForVivienda;
1007
+ function calcularFeedbackHojaDeRuta() {
1008
+ (0, like_ar_1.strict)(estructura.unidades_analisis).filter(uaDef => !uaDef.padre).forEach(uaDef => {
1009
+ var esPrincipal = (f, enc) => {
1010
+ let formularioPrincipal = (0, exports.getMainFormForVivienda)(enc);
1011
+ return formularioPrincipal ? formularioPrincipal == f.id_casillero : f.formulario_principal;
1012
+ };
1013
+ var conjuntoRespuestasUA = datosByPass.respuestas[uaDef.unidad_analisis];
1014
+ (0, like_ar_1.beingArray)(conjuntoRespuestasUA).forEach((respuestas, valorPkOPosicion) => {
1015
+ var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
1016
+ (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == uaDef.unidad_analisis && esPrincipal(f.casilleros, valorPk)).forEach((_defF, formulario) => {
1017
+ var forPkRaiz = { formulario, [uaDef.pk_agregada]: valorPk };
1018
+ calcularFeedback(respuestas, forPkRaiz, {});
1019
+ });
1020
+ });
1021
+ });
1022
+ }
1023
+ exports.calcularFeedbackHojaDeRuta = calcularFeedbackHojaDeRuta;
1024
+ function calcularFeedbackEncuesta(feedbackRowValidator, formularios, forPkRaiz, respuestas, opts) {
1025
+ var forPk = Object.assign({}, forPkRaiz);
1026
+ calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, exports.defOperativo.UAprincipal, forPk, respuestas, null, opts);
1027
+ }
1028
+ exports.calcularFeedbackEncuesta = calcularFeedbackEncuesta;
1029
+ function calcularFeedback(respuestas, forPkRaiz, opts) {
1030
+ var resumenEstado;
1031
+ // @ts-ignore Partial
1032
+ var nuevosRows = {};
1033
+ calcularFeedbackEncuesta(nuevosRows, estructura.formularios, forPkRaiz, respuestas, opts);
1034
+ datosByPass.feedbackRowValidator = (0, like_ar_1.strict)(datosByPass.feedbackRowValidator).filter((_feedback, plainPk) => JSON.parse(plainPk).vivienda != forPkRaiz.vivienda).plain();
1035
+ datosByPass.feedbackRowValidator = Object.assign(Object.assign({}, datosByPass.feedbackRowValidator), nuevosRows);
1036
+ datosByPass.respuestas.viviendas[forPkRaiz.vivienda] = Object.assign(Object.assign({}, datosByPass.respuestas.viviendas[forPkRaiz.vivienda]), calcularResumenVivienda(forPkRaiz, nuevosRows, respuestas));
1037
+ }
1038
+ var getFormulariosForIdVivienda = (idVivienda) => {
1039
+ var mainFormForVivienda = (0, exports.getMainFormForVivienda)(idVivienda);
1040
+ var formsFeedback = [mainFormForVivienda];
1041
+ var buscarFormulariosHijos = (idFormulario) => {
1042
+ estructura.formularios[idFormulario].casilleros.casilleros.forEach((casillero) => {
1043
+ var _a;
1044
+ if (casillero.tipoc == 'BF') {
1045
+ var formHijo = (((_a = casillero.salto) === null || _a === void 0 ? void 0 : _a.startsWith('F:')) ? casillero.salto : 'F:' + casillero.salto);
1046
+ if (formHijo) {
1047
+ formsFeedback.push(formHijo);
1048
+ buscarFormulariosHijos(formHijo);
1049
+ }
1050
+ }
1051
+ });
1052
+ };
1053
+ buscarFormulariosHijos(mainFormForVivienda);
1054
+ return formsFeedback;
1055
+ };
1056
+ exports.getFormulariosForIdVivienda = getFormulariosForIdVivienda;
1057
+ var calcularActualBF = (configSorteoFormulario, numElementoUA, numActual, formulario, r) => !!(configSorteoFormulario &&
1058
+ configSorteoFormulario.id_formulario_individual &&
1059
+ configSorteoFormulario.id_formulario_individual == formulario
1060
+ ?
1061
+ numElementoUA == (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado])
1062
+ :
1063
+ numActual == numElementoUA);
1064
+ exports.calcularActualBF = calcularActualBF;
1065
+ var calcularDisabledBF = (configSorteoFormulario, numElementoUA, formulario, r) => !!(configSorteoFormulario &&
1066
+ configSorteoFormulario.id_formulario_individual == formulario &&
1067
+ numElementoUA != (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado]));
1068
+ exports.calcularDisabledBF = calcularDisabledBF;
1069
+ var calcularPermiteBorrarBF = (configSorteoFormulario, formulario) => !(configSorteoFormulario &&
1070
+ configSorteoFormulario.id_formulario_individual == formulario);
1071
+ exports.calcularPermiteBorrarBF = calcularPermiteBorrarBF;
1072
+ function calcularResumenVivienda(forPkRaiz, feedbackRowValidator, respuestas) {
1073
+ var { codRea, esRea } = exports.defOperativo.esRealizada(respuestas);
1074
+ var { codNoRea, esNoRea } = exports.defOperativo.esNorea(respuestas);
1075
+ var { codReaSup, esReaSup } = exports.defOperativo.esRealizadaSup(respuestas);
1076
+ var { codNoReaSup, esNoReaSup } = exports.defOperativo.esNoreaSup(respuestas);
1077
+ var formsFeedback = (0, exports.getFormulariosForIdVivienda)(forPkRaiz.vivienda);
1078
+ var configuracionSorteoFormulario = estructura.configSorteo && estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPkRaiz.vivienda)];
1079
+ var feedBackVivienda = (0, like_ar_1.strict)(feedbackRowValidator).filter((_row, plainPk) => {
1080
+ var tieneIndividual = configuracionSorteoFormulario && !!(configuracionSorteoFormulario.id_formulario_individual && configuracionSorteoFormulario.id_formulario_padre);
1081
+ return JSON.parse(plainPk).vivienda == forPkRaiz.vivienda &&
1082
+ formsFeedback.includes(JSON.parse(plainPk).formulario) &&
1083
+ (tieneIndividual ?
1084
+ !(0, exports.calcularDisabledBF)(configuracionSorteoFormulario, JSON.parse(plainPk).persona, JSON.parse(plainPk).formulario, JSON.parse(plainPk).hogar ? respuestasForPk({
1085
+ vivienda: forPkRaiz.vivienda,
1086
+ formulario: configuracionSorteoFormulario.id_formulario_padre,
1087
+ hogar: JSON.parse(plainPk).hogar
1088
+ }).respuestas : {})
1089
+ : true);
1090
+ }).array();
1091
+ var prioridades = {
1092
+ 'no rea': { prioridad: 1, cantidad: 0 },
1093
+ 'con problemas': { prioridad: 2, cantidad: 0 },
1094
+ 'incompleto': { prioridad: 3, cantidad: 0 },
1095
+ 'vacio': { prioridad: 4, cantidad: 0 },
1096
+ 'cita pactada': { prioridad: 5, cantidad: 0 },
1097
+ 'ok': { prioridad: 6, cantidad: 0 }
1098
+ };
1099
+ var min = 6;
1100
+ var minResumen = 'ok';
1101
+ for (var feedback of feedBackVivienda) {
1102
+ var resumen = feedback.resumen;
1103
+ prioridades[resumen].cantidad++;
1104
+ if (prioridades[resumen].prioridad < min) {
1105
+ min = prioridades[resumen].prioridad;
1106
+ minResumen = resumen;
1107
+ }
1108
+ }
1109
+ if (minResumen == 'vacio' && prioridades['ok'].cantidad || minResumen == 'incompleto') {
1110
+ if (false /*respuestas[sp1]==2 && respuestas[sp6]==null*/) {
1111
+ minResumen = 'cita pactada';
1112
+ }
1113
+ else {
1114
+ minResumen = 'incompleto';
1115
+ }
1116
+ }
1117
+ //TODO ARREGLAR ESTE HORROR, GENERALIZAR
1118
+ var tarea = datosByPass.informacionHdr[forPkRaiz.vivienda].tarea.tarea;
1119
+ var resumenEstado;
1120
+ var resumenEstadoSup;
1121
+ if (tarea == 'supe') {
1122
+ resumenEstadoSup = esNoReaSup ? 'no rea' : minResumen;
1123
+ //para que coloree bien en la hdr del DM (luego en bbdd no se guarda)
1124
+ resumenEstado = resumenEstadoSup;
1125
+ }
1126
+ else {
1127
+ resumenEstado = esNoRea ? 'no rea' : minResumen;
1128
+ }
1129
+ var resultado = {
1130
+ resumenEstado,
1131
+ resumenEstadoSup,
1132
+ codRea,
1133
+ codNoRea,
1134
+ codReaSup,
1135
+ codNoReaSup
1136
+ };
1137
+ return resultado;
1138
+ }
1139
+ exports.calcularResumenVivienda = calcularResumenVivienda;
1140
+ });
1141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdW5sb2dnZWQvYnlwYXNzLWZvcm11bGFyaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEscUNBQXVEO0lBRXZELGlEQUFvRztJQUVwRywrQ0FBK0Q7SUFFL0QsbUNBY2lCO0lBRWpCLElBQUksVUFBVSxHQUFHLEVBRWhCLENBQUE7SUFDRCxTQUFnQixvQkFBb0IsQ0FBQyxpQkFBbUU7UUFDcEcsVUFBVSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFBO0lBQ3BELENBQUM7SUFGRCxvREFFQztJQVNELElBQUksV0FBVyxHQUFHLEVBQWlCLENBQUE7SUFFbkMsOEJBQThCO0lBQzlCLElBQUksVUFBVSxHQUFjLElBQWtCLENBQUM7SUFFL0MsSUFBSSwyQkFBMkIsR0FBZ0QsR0FBRSxFQUFFO1FBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUE7SUFFRCxTQUFnQix1QkFBdUIsQ0FBQyx1QkFBbUQ7UUFDdkYsMkJBQTJCLEdBQUcsdUJBQXVCLENBQUM7SUFDMUQsQ0FBQztJQUZELDBEQUVDO0lBRUQsU0FBZSxvQkFBb0IsQ0FBQyxJQUE0Qjs7WUFDNUQsTUFBTSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtZQUN6QixtQkFBbUIsRUFBRSxDQUFDO1FBQzFCLENBQUM7S0FBQTtJQUVELFNBQWdCLGdCQUFnQixDQUM1QixnQkFBK0Y7UUFFL0YsYUFBYSxHQUFHLGdCQUFnQixDQUFBO0lBQ3BDLENBQUM7SUFKRCw0Q0FJQztJQUVELElBQUksYUFBYSxHQUFrRixHQUFFLEVBQUU7UUFDbkcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBQ3BELENBQUMsQ0FBQTtJQUVNLElBQUksY0FBYyxHQUFHLENBQUMsS0FBVyxFQUFDLEVBQUU7UUFDdkMsSUFBSSxFQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzlELElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBRyxLQUFLLEVBQUM7WUFDTCxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQTtTQUNsRDthQUFJO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1NBQzFEO0lBQ0wsQ0FBQyxDQUFBO0lBUlUsUUFBQSxjQUFjLGtCQVF4QjtJQUVELFNBQWdCLGFBQWEsQ0FBQyxpQkFBNEI7O1FBQ3RELFVBQVUsR0FBRyxpQkFBaUIsQ0FBQztRQUMvQixvQkFBWSxDQUFDLFdBQVcsR0FBRyxNQUFBLElBQUEsZ0JBQU0sRUFBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFBLEVBQUUsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQywwQ0FBRSxlQUFnQixDQUFBO1FBQzFHLG9CQUFZLENBQUMsTUFBTSxHQUFHLElBQUEsZ0JBQU0sRUFBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxFQUFFLENBQUEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN0RyxvQkFBWSxDQUFDLEtBQUssR0FBRyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxFQUFFLENBQUEsQ0FBQztZQUN4RSxFQUFFLEVBQUMsS0FBSyxDQUFDLFdBQXlCO1lBQ2xDLFNBQVMsRUFBRSxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNyQyxNQUFNLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLEVBQUUsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7U0FDOUYsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDWCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBVkQsc0NBVUM7SUFFRCxTQUFnQixjQUFjLENBQUMsSUFBK0M7UUFDMUUsV0FBVyxpQ0FDUCxLQUFLLEVBQUMsS0FBSyxJQUNSLElBQUksS0FDUCxvQkFBb0IsRUFBQyxFQUF5QyxHQUNqRSxDQUFBO1FBQ0QsMEJBQTBCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBUEQsd0NBT0M7SUFFTSxJQUFJLGNBQWMsR0FBRyxHQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUE7SUFBakMsUUFBQSxjQUFjLGtCQUFtQjtJQUU1QyxTQUFTLFdBQVcsQ0FBQyxDQUFRO1FBQ3pCLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBZ0IsdUJBQXVCO1FBQ25DLElBQUcsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFDO1lBQ2xGLDBCQUEwQixFQUFFLENBQUM7U0FDaEM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztJQUM1QyxDQUFDO0lBTEQsMERBS0M7SUFFRCxTQUFnQixRQUFRO1FBQ3BCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQTtJQUM1QixDQUFDO0lBRkQsNEJBRUM7SUFFRCxTQUFnQixhQUFhO1FBQ3pCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFGRCxzQ0FFQztJQThCRCxJQUFJLHVCQUF1QixHQUFHLEVBQThDLENBQUM7SUFFN0UsU0FBZ0IsaUJBQWlCLENBQWtDLEdBQXVCO1FBQ3RGLHlGQUF5RjtRQUN6RixJQUFJLGlCQUFpQixHQUF3Qix1QkFBdUIsQ0FBQztRQUNyRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BDLENBQUM7SUFKRCw4Q0FJQztJQU1ELFNBQVMsZUFBZSxDQUFDLEtBQVcsRUFBRSxhQUFzQixFQUFFLGNBQXVCO1FBQ2pGLElBQUksb0JBQW9CLEdBQUcsRUFBZ0IsQ0FBQztRQUM1QyxnRUFBZ0U7UUFDaEUsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQXdCLENBQUM7UUFDdEQsSUFBSSxjQUE4QixDQUFDO1FBQ25DLElBQUksU0FBZ0IsQ0FBQztRQUNyQixJQUFJLGVBQWUsR0FBOEIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQTtRQUNwSCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQTJFLEVBQUUsQ0FBQztRQUN0RixPQUFNLGVBQWUsRUFBQztZQUNsQixJQUFJLEtBQUssR0FBa0IsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbEQsWUFBWSxxQkFBSyxZQUFZLENBQUMsQ0FBQztZQUMvQixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDdEMsZUFBZSxHQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7U0FDOUI7UUFDRCxPQUFNLElBQUksQ0FBQyxNQUFNLEVBQUM7WUFDZCxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRyxDQUFBO1lBQ3BELElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2RCxJQUFHLGdCQUFnQixJQUFJLFNBQVMsRUFBQztnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQzlFO1lBQ0QsSUFBRyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxFQUFDO2dCQUNuQyxVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxrQkFBa0IsR0FBQyxVQUFVLENBQUM7WUFDbEMsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEtBQUssQ0FBQSxDQUFDLENBQUEsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBLENBQUMsQ0FBQSxnQkFBZ0IsQ0FBQTtZQUNqRyxVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25ELElBQUcsVUFBVSxJQUFJLElBQUksRUFBQztnQkFDbEIsSUFBRyxjQUFjLEVBQUM7b0JBQ2QsVUFBVSxHQUFHLEVBQWdCLENBQUE7b0JBQzdCLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQTtvQkFDMUQsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQkFBMEI7aUJBQ2hFO3FCQUFJO29CQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFFBQVEsNEJBQTRCLGVBQWUsR0FBRyxDQUFDLENBQUM7aUJBQ3JHO2FBQ0o7WUFDRCxTQUFTLEtBQVQsU0FBUyxHQUFLLFlBQVksRUFBQztZQUMzQixxRUFBcUU7WUFDckUsY0FBYyxLQUFkLGNBQWMsR0FBSyxVQUFVLEVBQUM7WUFDOUIsSUFBRyxhQUFhLEVBQUM7Z0JBQ2Isb0JBQW9CLGlEQUFPLG9CQUFvQixHQUFLLFVBQVUsS0FBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxnQkFBZ0IsR0FBQyxDQUFBO2FBQ3hHO1NBQ0o7UUFDRCxPQUFPO1lBQ0gsVUFBVSxFQUFFLG9CQUFvQjtZQUNoQyw2RkFBNkY7WUFDN0YsY0FBYyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSztTQUNuRCxDQUFBO0lBQ0wsQ0FBQztJQUVELFNBQWdCLGtDQUFrQyxDQUFDLFNBQW1CO1FBQ2xFLElBQUksRUFBQyxvQkFBb0IsRUFBQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDN0QsSUFBSSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztRQUNoRCxJQUFJLFVBQVUsR0FBRyxJQUFBLG9CQUFZLEVBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEMsSUFBSSxZQUFZLEdBQUksV0FBVyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pFLEtBQUksSUFBSSxFQUFFLElBQUksaUJBQWlCLEVBQUM7WUFDNUIsSUFBSSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsSUFBRyxHQUFHLENBQUMsUUFBUSxFQUFDO2dCQUNaLElBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUM7b0JBQ3JDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO2lCQUM1QjthQUNKO1lBQ0QsSUFBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUM7Z0JBQ2IsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQTBCLENBQUM7YUFDM0U7WUFDRCxJQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQztnQkFDYix5RUFBeUU7Z0JBQ3pFLFNBQVM7YUFDWjtZQUNELElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BILElBQUcsTUFBTSxJQUFJLEdBQUcsRUFBQztnQkFDYixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7YUFDbEQ7WUFDRCxJQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUM7Z0JBQ2IsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTthQUNqRDtZQUNELElBQUcsT0FBTyxJQUFJLEdBQUcsRUFBQztnQkFDZCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO2FBQ3pEO1NBQ0o7UUFDRCxJQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUM7WUFDbkIsSUFBSSxFQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUMsR0FBRyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEUsSUFBRyxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBRyxJQUFJLEVBQUM7Z0JBQzVCLGFBQWE7Z0JBQ2IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztnQkFDcEUsYUFBYTtnQkFDYixRQUFRLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDO2FBQzVFO1NBQ0o7SUFDTCxDQUFDO0lBdkNELGdGQXVDQztJQUVELFNBQWdCLHdCQUF3QixDQUFDLFVBQTJCOztRQUNoRSxJQUFJLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxJQUFFLEtBQUssQ0FBQSxDQUFDLENBQUEsZ0JBQWdCLENBQUEsQ0FBQyxDQUFBLE9BQU8sVUFBVSxFQUFFLENBQUM7ZUFDeEcsUUFBUSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQztRQUN4QyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDO1FBQzFELElBQUksY0FBYyxHQUFvQixRQUFRLENBQUMsQ0FBQyxxRUFBcUU7UUFDckgsSUFBSSxrQkFBa0IsR0FBeUMsSUFBSSxDQUFDO1FBQ3BFLElBQUksZ0JBQWdCLEdBQW9CLElBQUksQ0FBQyxDQUFDLHVGQUF1RjtRQUNySSxJQUFJLG9CQUFvQixHQUF5QyxJQUFJLENBQUM7UUFDdEUsT0FBTSxRQUFRLElBQUksSUFBSSxFQUFDO1lBQ25CLElBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO21CQUN2QyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7bUJBQ3ZDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQzttQkFDdkMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7bUJBQ2hELFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDO21CQUN2RCxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNoRDtnQkFDRyxJQUFHLGdCQUFnQixJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksRUFBQztvQkFDaEUsY0FBYyxHQUFHLFFBQVEsQ0FBQztpQkFDN0I7cUJBQUk7b0JBQ0QsSUFBRyxrQkFBa0IsSUFBSSxJQUFJLEVBQUM7d0JBQzFCLGdCQUFnQixHQUFHLGNBQWMsQ0FBQTt3QkFDakMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFlLENBQUMsQ0FBQTt3QkFDbkQsb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7cUJBQzdDO29CQUNELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ25DLElBQUcsa0JBQWtCLENBQUMsR0FBRyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksRUFBQzt3QkFDNUUsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO3dCQUM1QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7cUJBQy9CO3lCQUFJO3dCQUNELFFBQVEsR0FBRyxJQUFJLENBQUM7cUJBQ25CO2lCQUNKO2FBQ0o7WUFDRCxRQUFRLEdBQUcsTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsYUFBYSxtQ0FBSSxJQUFJLENBQUM7U0FDOUM7UUFDRCxJQUFHLGdCQUFnQixJQUFJLElBQUksRUFBQztZQUN4QixnQkFBZ0IsR0FBRyxjQUFjLENBQUM7U0FDckM7UUFDRCxJQUFJLE1BQU0sR0FNTixFQUFFLENBQUM7UUFDUCxJQUFHLGNBQWMsSUFBSSxJQUFJLEVBQUM7WUFDdEIsSUFBRyxrQkFBa0IsSUFBSSxJQUFJLEVBQUM7Z0JBQzFCLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7YUFDckQ7WUFDRCxNQUFNLENBQUMscUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7WUFDeEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsYUFBcEIsb0JBQW9CLGNBQXBCLG9CQUFvQixHQUFFLGtCQUFrQixDQUFDLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQztZQUN6RSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsR0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDakUsSUFBRyxHQUFHLEdBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxVQUFVLEdBQUMsUUFBUSxDQUFDO2FBQzlCO2lCQUFLLElBQUcsa0JBQWtCLENBQUMsR0FBRyxHQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsR0FBRyxZQUFZLEVBQUM7Z0JBQzFHLE1BQU0sQ0FBQyxVQUFVLEdBQUMsT0FBTyxDQUFDO2FBQzdCO2lCQUFJO2dCQUNELE1BQU0sQ0FBQyxRQUFRLEdBQUMsSUFBSSxDQUFBO2FBQ3ZCO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBaEVELDREQWdFQztJQUVELFNBQWdCLGVBQWUsQ0FDM0IsTUFBc0YsRUFDdEYsSUFBTSxFQUNOLEtBQVk7UUFFWixJQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBQztZQUM1QyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFSRCwwQ0FRQztJQUVELFNBQWdCLGdCQUFnQixDQUM1QixNQUFRLEVBQ1IsSUFBTSxFQUNOLEtBQVU7UUFFVixJQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFSRCw0Q0FRQztJQUVELFNBQVMsZ0NBQWdDLENBQUMsTUFBWTtJQUV0RCxDQUFDO0lBQUEsQ0FBQztJQUdGLFNBQWdCLGtCQUFrQixDQUFDLFFBQTZDLEVBQUUsWUFBd0I7SUFDMUcsQ0FBQztJQURELGdEQUNDO0lBRVksUUFBQSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUN0RSxRQUFBLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO0lBRW5HLFNBQVMsbUJBQW1CO1FBQ3hCLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFzQixDQUFDO1FBQzlFLElBQUcsV0FBVyxFQUFDO1lBQ1gsSUFBRyxXQUFXLENBQUMsUUFBUSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBQztnQkFDM0MsV0FBVyxDQUFDLFFBQVEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7YUFDN0M7U0FDSjtJQUNMLENBQUM7SUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxPQUkxQyxFQUFFLFlBQXdCOztRQUN2QixJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTtRQUM1QixJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFDLEdBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLElBQUksZUFBZSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLGFBQWEsR0FBRyxRQUFRLElBQUkscUNBQTZCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVGLElBQUcsU0FBUyxLQUFLLDZDQUFxQyxJQUFJLFFBQVEsSUFBSSxxQ0FBNkIsRUFBQztZQUNoRyxJQUFHLFNBQVMsS0FBSyxFQUFFLEVBQUM7Z0JBQ2hCLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDcEI7aUJBQUssSUFBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFFLFFBQVEsRUFBQztnQkFDeEcsSUFBRyxTQUFTLElBQUksSUFBSSxFQUFDO29CQUNqQixTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNqQzthQUNKO1lBQ0QseURBQXlEO1lBQ3pELGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUE7WUFDckYsSUFBRyxjQUFjLEVBQUM7Z0JBQ2QsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsYUFBVCxTQUFTLGNBQVQsU0FBUyxHQUFJLElBQUksQ0FBQyxDQUFDLDRCQUE0QjthQUN6RTtTQUNKO1FBQ0QsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUEsb0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksaUJBQWlELENBQUM7UUFDdEQsSUFBRyxRQUFRLElBQUkscUNBQTZCLElBQUksQ0FBQyxjQUFjLElBQUksNkNBQXFDLEtBQUksTUFBQSxXQUFXLENBQUMsY0FBYywwQ0FBRyxRQUFRLENBQUMsQ0FBQSxDQUFDLEVBQUM7WUFDaEosbUJBQW1CLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFdBQVcsQ0FBQSxFQUFDO2dCQUNwRCxlQUFlLENBQUM7b0JBQ1osbUJBQW1CLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFBLDhCQUFzQixFQUFDLEtBQUssQ0FBQyxRQUFTLENBQUMsQ0FBQztvQkFDckYsVUFBVTtvQkFDVixjQUFjO29CQUNkLGNBQWMsRUFBRSxRQUFRO29CQUN4QixLQUFLLEVBQUUsS0FBSztpQkFDZixDQUFDLENBQUE7YUFDTDtZQUNELFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUM7WUFDeEQsY0FBYyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQztZQUNoRSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUNqRSxXQUFXLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUEsb0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO1lBQzdELGlCQUFpQixHQUFHLFFBQVEsQ0FBQztZQUM3QixHQUFFO2dCQUNFLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLENBQUM7YUFDekUsUUFBTSxhQUFhLElBQUksSUFBSSxJQUFJLGNBQWMsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLElBQUksaUJBQWlCLElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLG1CQUFtQixFQUFDO1lBQzlOLElBQUcsaUJBQWlCLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLFFBQVEsRUFBQztnQkFDOUUsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2FBQzdCO1NBQ0o7UUFDRCxPQUFPLEVBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFDLENBQUM7SUFDbkYsQ0FBQztJQXZERCxnRUF1REM7SUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxPQUE4RCxFQUFFLFlBQXdCO1FBQzFILElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFIRCxzREFHQztJQUVELFNBQWdCLHFCQUFxQixDQUFDLE9BQXdELEVBQUUsWUFBd0I7UUFDcEgsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDM0M7Ozs7Ozs7Ozs7O1VBV0U7SUFDTixDQUFDO0lBZEQsc0RBY0M7SUFFRCxTQUFnQix1QkFBdUIsQ0FBQyxPQUFxRixFQUFFLFlBQXdCO1FBQ25KLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsR0FBRyxPQUFPLENBQUM7UUFDakQsMERBQTBEO1FBQzFELGtDQUFrQztJQUN0QyxDQUFDO0lBSkQsMERBSUM7SUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxPQUE0QyxFQUFFLFlBQXdCO1FBQ3ZHLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2xDLDBEQUEwRDtRQUMxRCw0QkFBNEI7SUFDaEMsQ0FBQztJQUpELG9EQUlDO0lBRUQsU0FBZ0IseUJBQXlCLENBQUMsRUFBQyxLQUFLLEVBQWdCLEVBQUUsWUFBd0I7UUFDdEYsSUFBSSxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUcsbUJBQW1CLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDM0ssZ0NBQWdDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUxELDhEQUtDO0lBRUQsU0FBZ0IsdUJBQXVCLENBQUMsRUFBQyxLQUFLLEVBQWdCLEVBQUUsWUFBd0I7UUFDcEYsSUFBSSxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUcsbUJBQW1CLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDM0ssZ0NBQWdDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUxELDBEQUtDO0lBRUQsU0FBZ0Isd0JBQXdCLENBQUMsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFrQztRQUN6RixJQUFJLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkgsSUFBSSxlQUFlLEdBQThCLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUE7UUFDcEgsSUFBSSxLQUFLLEdBQWtCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6RSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO1FBQzlDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDdEQsbUJBQW1CLEVBQUUsQ0FBQztRQUN0QixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDakUsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0Msa0NBQWtDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0Msb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQkFBMEI7SUFDakUsQ0FBQztJQWRELDREQWNDO0lBR0QsU0FBZ0IsY0FBYyxDQUMxQixHQUE0QyxFQUM1QyxPQUFTO1FBRVQsT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFMRCx3Q0FLQztJQUVELDBFQUEwRTtJQUc3RCxRQUFBLHFCQUFxQixHQUFHLDRCQUEwQyxDQUFDO0lBRW5FLFFBQUEsS0FBSyxHQUFDLEVBQUUsQ0FBQztJQUV0QixjQUFjO0lBRWQsSUFBSSxtQkFBbUIsR0FBdUI7UUFDMUMsS0FBSyxFQUFFLE9BQU87UUFDZCxJQUFJLEVBQUUsTUFBTTtRQUNaLEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLElBQUk7UUFDVixHQUFHLEVBQUUsSUFBSTtRQUNULEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsSUFBSTtRQUNYLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLElBQUk7UUFDWCxLQUFLLEVBQUUsR0FBRztRQUNWLEtBQUssRUFBRSxHQUFHO0tBQ2IsQ0FBQztJQUVGLE1BQU0saUJBQWlCLEdBQUM7UUFDcEIsU0FBUyxDQUFDLFdBQWU7WUFDckIsSUFBRyxXQUFXLElBQUUsSUFBSSxFQUFDO2dCQUNqQixPQUFPLENBQUMsQ0FBQzthQUNaO1lBQ0QsT0FBTyxXQUFXLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sQ0FBQyxTQUFnQixFQUFFLFdBQWtCLEVBQUUsRUFBUztZQUNuRCxJQUFHLFdBQVcsSUFBRSxDQUFDLEVBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUMsRUFBRSxHQUFDLHdCQUF3QixHQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsT0FBTyxTQUFTLEdBQUMsV0FBVyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEVBQUM7WUFDRCxNQUFNLENBQUMsQ0FBSztnQkFDUixPQUFPLENBQUMsS0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDdEIsQ0FBQztZQUNELEdBQUc7Z0JBQ0MsT0FBTyxtQkFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQy9CLENBQUM7WUFDRCxZQUFZLENBQUMsQ0FBUTtnQkFDakIsSUFBSSxjQUFjLEdBQUMsOERBQThELENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN6RixJQUFJLEtBQVcsQ0FBQztnQkFDaEIsSUFBSSxZQUFxQixDQUFDO2dCQUMxQixZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLGNBQWMsRUFBQztvQkFDZixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQixJQUFJO3dCQUNBLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDdEM7b0JBQUMsT0FBTSxHQUFHLEVBQUM7d0JBQ1IsWUFBWSxHQUFHLEtBQUssQ0FBQztxQkFDeEI7aUJBQ0o7Z0JBQUEsQ0FBQztnQkFDRiw0RkFBNEY7Z0JBQzVGLE9BQU8sY0FBYyxJQUFJLFlBQVksQ0FBQTtZQUN6QyxDQUFDO1lBQ0QsU0FBUyxDQUFDLENBQUs7Z0JBQ1gsT0FBTyxDQUFDLEtBQUcsU0FBUyxJQUFJLENBQUMsS0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUcsQ0FBQyxDQUFFO3VCQUN4RSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLElBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFFLENBQUE7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFLO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ2xCLENBQUM7WUFDRCxHQUFHLENBQUMsQ0FBUTtnQkFDUixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxDQUFBO1lBQ25CLENBQUM7WUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JBbUNJO1NBQ1A7S0FDSixDQUFDO0lBSUYsSUFBSSxrQkFBa0IsR0FBaUMsRUFDdEQsQ0FBQTtJQUNELElBQUksZ0JBQWdCLEdBQStCLEVBQ2xELENBQUE7SUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxnQkFBdUI7UUFDdkQsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBUyxPQUFPO1lBQzlGLElBQUksZUFBZSxHQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxJQUFHLGVBQWUsSUFBSSxtQkFBbUIsRUFBQztnQkFDdEMsT0FBTyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMvQztpQkFBSyxJQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUM7Z0JBQ3pDLE9BQU8sT0FBTyxDQUFBO2FBQ2pCO2lCQUFLLElBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBQztnQkFDbkMsT0FBTyxPQUFPLENBQUE7YUFDakI7aUJBQUssSUFBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFDO2dCQUMzQixPQUFPLE9BQU8sQ0FBQTthQUNqQjtZQUNELE9BQU8sNEJBQTRCLEdBQUMsT0FBTyxHQUFDLEdBQUcsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFoQkQsa0RBZ0JDO0lBRUQsU0FBZ0IsbUJBQW1CLENBQUksbUJBQWtFO1FBQ3JHLE9BQU8sVUFBUyw0QkFBbUM7WUFDL0MsSUFBRyxDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixDQUFDLEVBQUM7Z0JBQ2xELElBQUksTUFBTSxHQUFHLDRCQUE0QixDQUFDO2dCQUMxQyxJQUFHO29CQUNDLGtFQUFrRTtvQkFDbEUsSUFBSSxXQUFXLEdBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hFLG1CQUFtQixDQUFDLDRCQUE0QixDQUFDLEdBQUcsVUFBUyxPQUFPO3dCQUNoRSxJQUFHOzRCQUNDLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQzt5QkFDeEQ7d0JBQUEsT0FBTSxHQUFHLEVBQUM7NEJBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsRUFBQyw0QkFBNEIsQ0FBQyxDQUFBOzRCQUMvRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNyQixNQUFNLEdBQUcsQ0FBQzt5QkFDYjt3QkFDRCxPQUFPLE1BQU0sQ0FBQztvQkFDbEIsQ0FBQyxDQUFBO2lCQUNKO2dCQUFBLE9BQU0sR0FBRyxFQUFDO29CQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLEVBQUMsNEJBQTRCLENBQUMsQ0FBQTtvQkFDaEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEIsTUFBTSxHQUFHLENBQUM7aUJBQ2I7YUFDSjtZQUNELE9BQU8sbUJBQW1CLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUE7SUFDTCxDQUFDO0lBMUJELGtEQTBCQztJQUVZLFFBQUEsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM5RCxRQUFBLGlCQUFpQixHQUFLLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFHekUsSUFBSSxZQUFZLEdBQUcsSUFBQSwrQkFBZSxFQUEyQixFQUFDLG1CQUFtQixFQUFuQiwyQkFBbUIsRUFBRSxpQkFBaUIsRUFBakIseUJBQWlCLEVBQUMsQ0FBQyxDQUFBO0lBQ3RHLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxvQkFBdUMsRUFBQyxjQUE2QixFQUFFLFVBQXFCLEVBQUMsV0FBZ0IsRUFBQyxTQUFnQixFQUFDLEVBQUU7UUFDNUosSUFBSSxRQUFRLEdBQWMsSUFBSSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFDLEtBQUssQ0FBQztRQUNsQixJQUFJLE1BQU0sR0FBYSxJQUFJLENBQUM7UUFDNUIsSUFBSSxTQUFnQixDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQztRQUM3Qiw0Q0FBNEM7UUFDM0MsSUFBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxFQUFDO1lBQzdELEtBQUksSUFBSSxLQUFLLElBQUksV0FBVyxFQUFDLEVBQUUseUNBQXlDO2dCQUNwRSxJQUFJLFNBQVMsSUFBRSxRQUFRLEVBQUM7b0JBQ3BCLElBQUksRUFBQyxRQUFRLEVBQUcsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLEtBQUssQ0FBQztvQkFDdkMsTUFBTSxHQUFDLE1BQU0sQ0FBQztvQkFDZCxNQUFNLEdBQUMsS0FBSyxDQUFDO29CQUNiLFNBQVMsR0FBQyxRQUFRLENBQUM7aUJBQ3RCO3FCQUFJO29CQUNELElBQUksRUFBQyxZQUFZLEVBQUcsU0FBUyxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztvQkFDbkQsTUFBTSxHQUFDLFVBQVUsQ0FBQztvQkFDbEIsTUFBTSxHQUFDLFNBQVMsQ0FBQztvQkFDakIsU0FBUyxHQUFDLFlBQVksQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBRyxVQUFVLENBQUMsU0FBdUIsQ0FBQyxJQUFFLE1BQU0sRUFBQztvQkFDM0MsUUFBUSxHQUFFLE1BQU0sQ0FBQyxDQUFFLG9CQUFvQjtvQkFDdkMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDZixPQUFPLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBQyxDQUFBO2lCQUM1QjtxQkFBSTtvQkFDRCxRQUFRLEdBQUMsSUFBSSxDQUFDO29CQUNkLE9BQU8sR0FBQyxLQUFLLENBQUM7aUJBQ2pCO2FBQ0o7U0FDSjtRQUNELEtBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFBLGdCQUFNLEVBQUMsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUM7WUFDbEQsSUFBRyxDQUFBLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxlQUFlLEtBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsWUFBWSxLQUFLLEVBQUM7Z0JBQ3RFLEtBQUksSUFBSSxlQUFlLElBQUksVUFBVSxDQUFDLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxlQUFlLENBQUMsRUFBQztvQkFDeEQsSUFBSSxNQUFNLEdBQUUsdUJBQXVCLENBQUMsb0JBQW9CLEVBQUMsRUFBRSxFQUFDLGVBQWUsRUFBQyxXQUFXLEVBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ2xHLElBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRTt3QkFDZixRQUFRLEdBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzt3QkFDekIsT0FBTyxHQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7d0JBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFDLENBQUE7d0JBQ3pCLE1BQU07cUJBQ1Q7eUJBQUs7d0JBQ0YsUUFBUSxHQUFDLElBQUksQ0FBQzt3QkFDZCxPQUFPLEdBQUMsS0FBSyxDQUFDO3dCQUNmLDZCQUE2QjtxQkFDL0I7aUJBQ0o7YUFDSjtTQUNKO1FBQ0gsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsQ0FBQTtJQUMzQixDQUFDLENBQUE7SUFFRixtR0FBbUc7SUFDbkcsNkZBQTZGO0lBQ2xGLFFBQUEsWUFBWSxHQUFHO1FBQ3RCLG1CQUFtQjtRQUNuQixvQ0FBb0M7UUFDcEMsa0RBQWtEO1FBQ2xELGdFQUFnRTtRQUNoRSxJQUFJO1FBRUosT0FBTyxFQUFDLENBQUMsVUFBcUIsRUFBQyxFQUFFO1lBQzdCLGtCQUFrQjtZQUNsQixJQUFJLGlCQUFpQixHQUFHLENBQUMsV0FBVyxFQUFDLFNBQVMsRUFBQyxVQUFVLENBQXVCLENBQUM7WUFDakYsSUFBSSxXQUFXLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBQyxFQUFFLENBQUEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0UsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksUUFBUSxHQUFjLElBQUksQ0FBQztZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUEwQkM7WUFDSyxJQUFJLFFBQVEsR0FBRyx1QkFBdUIsQ0FBRSxpQkFBaUIsRUFBQyxXQUFZLEVBQUMsVUFBVSxFQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUcsUUFBUSxHQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDM0IsT0FBTyxHQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDekIsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0YsVUFBVSxFQUFDLENBQUMsVUFBcUIsRUFBQyxFQUFFO1lBQy9CLHdDQUF3QztZQUN6QyxJQUFJLG9CQUFvQixHQUFHLENBQUMsV0FBVyxFQUFDLGFBQWEsRUFBQyxjQUFjLENBQXVCLENBQUM7WUFDNUYsSUFBSSxXQUFXLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBQyxFQUFFLENBQUEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0UsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksV0FBVyxHQUFjLElBQUksQ0FBQztZQUNsQyxJQUFJLFFBQVEsR0FBRSx1QkFBdUIsQ0FBRSxvQkFBb0IsRUFBQyxXQUFZLEVBQUMsVUFBVSxFQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQSx3REFBd0Q7WUFDN0ssV0FBVyxHQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDOUIsVUFBVSxHQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDOUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBQ0QsV0FBVyxFQUFDLENBQUMsVUFBcUIsRUFBQyxFQUFFO1lBQ2pDLGtCQUFrQjtZQUNsQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxNQUFNLEdBQWMsSUFBSSxDQUFDO1lBQzdCLElBQUcsQ0FBQyxVQUFVLENBQUMsU0FBdUIsQ0FBQyxFQUFDO2dCQUNwQyxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFBO2FBQ3pCO2lCQUFLLElBQUcsVUFBVSxDQUFDLFNBQXVCLENBQUMsSUFBRSxDQUFDLElBQUcsVUFBVSxDQUFDLFdBQXlCLENBQUMsSUFBRSxDQUFDLElBQUUsVUFBVSxDQUFDLFNBQXVCLENBQUMsSUFBRSxDQUFDLEVBQUM7Z0JBQy9ILE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNqQjtpQkFBSTtnQkFDRCxJQUFJLEtBQUssR0FBVyxFQUFFLENBQUU7Z0JBQ3hCLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsSUFBRyxZQUFZLEVBQUM7b0JBQ1osS0FBSSxJQUFJLFdBQVcsSUFBSSxZQUFZLEVBQUM7d0JBQ2hDLElBQUksSUFBVyxDQUFDO3dCQUNoQixJQUFJLEtBQVksQ0FBQzt3QkFDakIsSUFBRyxXQUFXLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxJQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBRSxDQUFDLElBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFFLENBQUMsRUFBQzs0QkFDNUUsSUFBSSxHQUFDLENBQUMsQ0FBQzt5QkFDVjs2QkFBSTs0QkFDRCxLQUFLLEdBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUE7NEJBQ25DLElBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUN6RCxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDaEQsSUFBSSxlQUFlLEdBQUcsV0FBVyxDQUFDLFdBQXlCLENBQUUsQ0FBQztnQ0FDOUQsSUFBRyxlQUFlLElBQUUsSUFBSSxFQUFDLEVBQUUsa0NBQWtDO29DQUN6RCxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lDQUNaO3FDQUFJO29DQUNELElBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7aUNBQ2xDOzZCQUNKO2lDQUFJO2dDQUNELElBQUksR0FBRyxDQUFDLENBQUM7NkJBQ1o7eUJBQ0o7d0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDcEI7b0JBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQSxFQUFFLENBQUEsRUFBRSxJQUFFLENBQUMsQ0FBQyxFQUFDO3dCQUN2QixNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNYLEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2hCO3lCQUFLLElBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUEsRUFBRSxDQUFBLEVBQUUsSUFBRSxDQUFDLENBQUMsRUFBQzt3QkFDNUIsTUFBTSxHQUFHLENBQUMsQ0FBQzt3QkFDWCxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjt5QkFBSyxJQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFBLEVBQUUsQ0FBQSxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsSUFBRSxDQUFDLENBQUMsRUFBQzt3QkFDbkMsTUFBTSxHQUFHLENBQUMsQ0FBQzt3QkFDWCxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjt5QkFBSTt3QkFDRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNYLEtBQUssR0FBRyxLQUFLLENBQUM7cUJBQ2pCO2lCQUNKO3FCQUFLO29CQUNGLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ1gsS0FBSyxHQUFHLEtBQUssQ0FBQztpQkFDakI7YUFDSjtZQUNELE9BQU8sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLENBQUE7UUFDekIsQ0FBQztRQUNELGNBQWMsRUFBQyxDQUFDLFVBQXFCLEVBQUMsRUFBRTtZQUNwQyxtQkFBbUI7WUFDbkIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksU0FBUyxHQUFjLElBQUksQ0FBQztZQUNoQyxJQUFHLENBQUMsVUFBVSxDQUFDLGdCQUE4QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBb0IsQ0FBQyxFQUFDO2dCQUNoRixPQUFPLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxDQUFBO2FBQy9CO2lCQUFLLElBQUksVUFBVSxDQUFDLGdCQUE4QixDQUFDLElBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxnQkFBOEIsQ0FBQyxJQUFFLENBQUMsSUFBRSxVQUFVLENBQUMsTUFBb0IsQ0FBQyxJQUFFLENBQUMsSUFBRyxVQUFVLENBQUMsTUFBb0IsQ0FBQyxJQUFFLENBQUMsSUFBRSxVQUFVLENBQUMsTUFBb0IsQ0FBQyxJQUFFLENBQUMsRUFBQztnQkFDck4sU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDZCxRQUFRLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO2lCQUFJO2dCQUNELElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBRTtnQkFDeEIsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM3QyxJQUFHLFlBQVksRUFBQztvQkFDWixLQUFJLElBQUksV0FBVyxJQUFJLFlBQVksRUFBQzt3QkFDaEMsSUFBSSxJQUFXLENBQUM7d0JBQ2hCLElBQUksS0FBWSxDQUFDO3dCQUNqQixJQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLElBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFFLENBQUMsSUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUUsQ0FBQyxJQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFFLENBQUMsRUFBQzs0QkFDckgsSUFBSSxHQUFDLENBQUMsQ0FBQzt5QkFDVjs2QkFBSTs0QkFDRCxJQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUUsRUFBQztnQ0FDM0IsSUFBSSxHQUFHLENBQUMsQ0FBQzs2QkFDWDtpQ0FBSztnQ0FDSCxJQUFJLEdBQUMsQ0FBQyxDQUFDOzZCQUNUO3lCQUNKO3dCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3BCO29CQUNELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUEsRUFBRSxDQUFBLEVBQUUsSUFBRSxDQUFDLENBQUMsRUFBQzt3QkFDdkIsU0FBUyxHQUFHLENBQUMsQ0FBQzt3QkFDZCxRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUNuQjt5QkFBSyxJQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFBLEVBQUUsQ0FBQSxFQUFFLElBQUUsQ0FBQyxDQUFDLEVBQUM7d0JBQzVCLFNBQVMsR0FBRyxDQUFDLENBQUM7d0JBQ2QsUUFBUSxHQUFHLEtBQUssQ0FBQztxQkFDcEI7eUJBQUssSUFBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQSxFQUFFLENBQUEsRUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLElBQUUsQ0FBQyxDQUFDLEVBQUM7d0JBQ25DLFNBQVMsR0FBRyxDQUFDLENBQUM7d0JBQ2QsUUFBUSxHQUFHLEtBQUssQ0FBQztxQkFDcEI7eUJBQUk7d0JBQ0QsU0FBUyxHQUFHLENBQUMsQ0FBQzt3QkFDZCxRQUFRLEdBQUcsS0FBSyxDQUFDO3FCQUNwQjtpQkFDSjtxQkFBSztvQkFDRixTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUNkLFFBQVEsR0FBRyxLQUFLLENBQUM7aUJBQ3BCO2FBQ0o7WUFDRCxPQUFPLEVBQUMsU0FBUyxFQUFDLFFBQVEsRUFBQyxDQUFBO1FBQy9CLENBQUM7UUFDRCxXQUFXLEVBQUMsRUFBc0I7UUFDbEMsS0FBSyxFQUFDLEVBQW9HO1FBQzFHLE1BQU0sRUFBQyxFQUE0RTtLQUN0RixDQUFBO0lBTUQsU0FBUyxHQUFHLENBQUMsR0FBc0I7UUFDL0Isb0RBQW9EO1FBQ3BELElBQUcsS0FBSyxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQixvREFBb0Q7UUFDcEQsT0FBTyxHQUFHLEdBQUMsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLGtCQUFrQixHQUEyQixFQUFFLENBQUE7SUFFbkQsU0FBZ0IsZUFBZSxDQUFDLElBTy9COztRQUNHLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBNEIsRUFBQyxFQUFFOztZQUNuRCxJQUFJLEVBQUMsVUFBVSxFQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBQyxJQUFJLENBQUM7WUFDL0MsVUFBVSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEdBQUMsSUFBSSxDQUFDO1lBQ3pELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDbEQsTUFBQSxtQkFBbUIsQ0FBQyxnQkFBZ0IsMENBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFDLEVBQUUsQ0FBQSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFGLElBQUcsV0FBVyxJQUFJLG1CQUFtQixDQUFDLFlBQVksRUFBQztnQkFDL0MsSUFBRyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEtBQUssRUFBQztvQkFDekUsS0FBSSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUM7d0JBQ3RDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUMxRDtpQkFDSjthQUNKO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsSUFBSSxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBQyxHQUFHLElBQUksQ0FBQztRQUNwRixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUyxDQUFDO1FBQzVCLElBQUksRUFBQyxvQkFBb0IsRUFBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxzQkFBc0IsR0FBRyxJQUFBLDJCQUFtQixFQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hJLElBQUksVUFBVSxHQUFJLElBQUEsMkJBQW1CLEVBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pHLElBQUksY0FBYyxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FBQztRQUV6RCxJQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUM7WUFDdkQsSUFBSSxPQUFPLEdBQUcsTUFBQSxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQSxFQUFFLENBQUMsZUFBZSxJQUFFLGNBQWMsQ0FBQywwQ0FBRSxLQUFLLENBQUM7WUFDekcsSUFBSSxlQUFlLEdBQUcsTUFBQSxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQSxFQUFFLENBQUMsZUFBZSxJQUFFLE9BQU8sQ0FBQywwQ0FBRSxXQUFXLENBQUE7WUFDL0csSUFBRyxPQUFPLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUM7Z0JBQ3hDLGtFQUFrRTtnQkFDbEUsSUFBSSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLElBQUcsY0FBYyxJQUFJLG1CQUFtQixDQUFDLGNBQWMsRUFBQztvQkFDcEQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxHQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQywrQkFBK0I7aUJBQzFHO2dCQUNELGNBQWMsQ0FBQyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO2dCQUNuQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1NBQ0o7UUFDRCxJQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUM7WUFDbEMsSUFBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksS0FBSyxFQUFDO2dCQUMzQyxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFpQixDQUFBO2dCQUM3RCxJQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsSUFBRSxDQUFDLEVBQUM7b0JBQzdDLElBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFFLENBQUMsRUFBQzt3QkFDN0MsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxHQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO3FCQUN6RTtvQkFDRCxjQUFjLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDO2lCQUNoQztnQkFDRCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUcsYUFBYSxHQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUM7b0JBQ2pDLG9EQUFvRDtvQkFDcEQsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FDdEMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBQyxFQUFFLENBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLEdBQUMsQ0FBQyxDQUFDLENBQ2pGLENBQUM7b0JBQ0YsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQTtpQkFDNUM7Z0JBQ0QsT0FBTSxhQUFhLEdBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQztvQkFDcEMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFnQixDQUFDLENBQUE7aUJBQ3RDO2dCQUVELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxFQUFFLENBQUEsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBRXZHLElBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFFLENBQUM7b0JBQzVDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztvQkFDMUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFFLENBQUMsRUFDakQ7b0JBQ0csSUFBSSxPQUFPLEdBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxJQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUM7d0JBQ2QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUMsRUFBRSxDQUFBLEdBQUcsQ0FBQyxHQUFHLEdBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM1QyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLEtBQW1CLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7d0JBQ3hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBZSxFQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqSCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQzt3QkFDNUIsSUFBRyxtQkFBbUIsQ0FBQyxNQUFNLElBQUUsTUFBTSxFQUFDOzRCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7NEJBQ25DOzs7OztnREFLb0I7eUJBQ3ZCOzZCQUFJOzRCQUNELElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQzs0QkFDaEIsTUFBTSxRQUFRLEdBQWMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzs0QkFDdkUsS0FBSSxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUM7Z0NBQ3ZCLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQSxDQUFDLElBQUUsT0FBTyxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7Z0NBQ2pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBQyxLQUFLLENBQUM7Z0NBQ3hCLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ3REOzRCQUNELElBQUksc0JBQXNCLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbEcsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQzs0QkFDdkIsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUEsQ0FBQyxDQUFBLEtBQUssR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQzs0QkFDOUMsSUFBRyxPQUFPLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sRUFBQztnQ0FDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLDREQUE0RDs2QkFDN0c7NEJBQ0QsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBRTs0QkFDN0MsSUFBSSxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7NEJBQzFGLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFZLEVBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDOUYsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFDLGdCQUFnQixDQUFDOzRCQUMzRCxVQUFVLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsR0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUNuRSxNQUFBLG1CQUFtQixDQUFDLGdCQUFnQiwwQ0FBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUMsRUFBRSxDQUNyRCxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFXLEdBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUNsSCxDQUFBO3lCQUNKO3FCQUNKO3lCQUFJO3dCQUNELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFDLENBQUMsQ0FBQztxQkFDekQ7aUJBQ0o7Z0JBQ0QsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxHQUFFLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsd0JBQXdCO2dCQUNyRyxVQUFVLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsR0FBQyxJQUFJLENBQUM7Z0JBQy9ELElBQUcsbUJBQW1CLENBQUMsbUNBQW1DLEVBQUM7b0JBQ3ZELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxtQ0FBbUMsQ0FBQyxHQUFDLElBQUksQ0FBQztpQkFDNUU7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQXRIRCwwQ0FzSEM7SUFFRCxTQUFTLG1CQUFtQixDQUFDLGNBQThCLEVBQUUsS0FBVztRQUNwRSxJQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBQztZQUM1QixVQUFVLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVELFNBQWdCLDhCQUE4QixDQUMxQyxvQkFBZ0csRUFDaEcsV0FBaUUsRUFDakUsVUFBcUIsRUFDckIsRUFBbUIsRUFDbkIsS0FBVyxFQUNYLG9CQUErQixFQUFFLCtDQUErQztJQUNoRixlQUErQixFQUMvQixJQUF5QjtRQUV6QixvQ0FBb0M7UUFDcEMsS0FBSSxJQUFJLFVBQVUsSUFBSSxvQkFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUM7WUFDbkQsSUFBSSxPQUFPLEdBQUcsb0JBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksb0JBQW9CLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELElBQUEsZ0JBQU0sRUFBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBQyxFQUFFO2dCQUNyRSxJQUFJLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO2dCQUMvRSw4QkFBOEIsQ0FDMUIsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsVUFBVSxrQ0FDTixLQUFLLEtBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLG1EQUN4QixvQkFBb0IsR0FBSyxjQUFjLEtBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLEtBQzlELFVBQVUsRUFDVixJQUFJLENBQ1AsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFBO1NBQ0w7UUFDRCxVQUFVO1FBQ1YsS0FBSSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBQztZQUMvQixLQUFJLElBQUksVUFBVSxJQUFJLG9CQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQUUsSUFBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxvQkFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUM7b0JBQzdHLElBQUksVUFBVSxHQUFjLElBQUEsb0JBQVksa0NBQUssS0FBSyxLQUFFLFVBQVUsSUFBRSxDQUFBO29CQUNoRSxJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7b0JBQzNCLEdBQUU7d0JBQ0UsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7d0JBQzdCLG9CQUFvQixDQUFDLFVBQVUsQ0FBQzs0QkFDNUIsWUFBWSxpQkFDUCxRQUFRLEVBQUMsS0FBSyxJQUFLLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxzQkFBc0IsR0FDbEUsb0JBQW9CLEVBQ3BCLElBQUksQ0FDUCxDQUFBO3dCQUNMLElBQUksRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFDLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ2pFLElBQUksT0FBa0IsQ0FBQzt3QkFDdkIsSUFBRyxjQUFjLElBQUUsSUFBSSxFQUFDOzRCQUNwQixLQUFJLE9BQU8sSUFBSSxjQUFjLEVBQUM7Z0NBQzFCLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFVLENBQUM7Z0NBQ3RFLElBQUcsTUFBTSxFQUFDO29DQUNOLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFVLENBQUM7b0NBQ3ZELG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQVUsQ0FBQztvQ0FDakUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29DQUNoQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7aUNBQzNCOzZCQUNKO3lCQUNKO3FCQUNKLFFBQU8sZ0JBQWdCLElBQUksc0JBQXNCLEVBQUUsR0FBQyxDQUFDLEVBQUU7b0JBQ3hELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUEsRUFBRTt3QkFDL0IsOEVBQThFO29CQUNsRixDQUFDLENBQUMsQ0FBQTtvQkFDRixJQUFJLFVBQVUsR0FBRyxLQUFLLEdBQUMsVUFBd0IsQ0FBQTtvQkFDL0MsSUFBSSx3QkFBd0IsR0FBRyxJQUFBLDhCQUFzQixFQUFDLEtBQUssQ0FBQyxRQUFTLENBQUMsQ0FBQztvQkFDdkUsSUFBRyxVQUFVLENBQUMsWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFDO3dCQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCx3QkFBd0IsRUFBRSxDQUFDLENBQUE7cUJBQ25HO29CQUNELElBQUksc0JBQXNCLEdBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQzFHLElBQUksYUFBYSxHQUNiLHNCQUFzQjt3QkFDdEIsc0JBQXNCLENBQUMsbUNBQW1DO3dCQUMxRCxzQkFBc0IsQ0FBQyxtQ0FBbUMsSUFBSSxVQUFVLENBQUEsQ0FBQzt3QkFDckUsSUFBSTt3QkFDUixDQUFDLENBQUEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDOzRCQUNqQixJQUFJOzRCQUNSLENBQUMsQ0FBQSxPQUFPLENBQUE7b0JBQ1osSUFBRyxTQUFTLEVBQUM7d0JBQ1QsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztxQkFDMUM7eUJBQUssSUFBRyxlQUFlLElBQUksSUFBSSxFQUFDO3dCQUM3QixlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsYUFBYSxDQUFDO3FCQUMvQztpQkFDSjtTQUNKO0lBQ0wsQ0FBQztJQWhGRCx3RUFnRkM7SUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxjQUE0QixFQUFFLE1BQW1CO1FBQ3RGLDRFQUE0RTtRQUM1RSxJQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBQztZQUNyQixPQUFPLGNBQWMsQ0FBQztTQUN6QjtRQUNELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFDLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBTkQsNERBTUM7SUFFTSxJQUFJLHNCQUFzQixHQUFHLENBQUMsUUFBZSxFQUFjLEVBQUU7UUFDaEUsaURBQWlEO1FBQ2pELE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFBO0lBQy9ELENBQUMsQ0FBQTtJQUhVLFFBQUEsc0JBQXNCLDBCQUdoQztJQUVELFNBQWdCLDBCQUEwQjtRQUN0QyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQSxFQUFFLENBQUEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQSxFQUFFO1lBQzVFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBWSxFQUFFLEdBQU8sRUFBQyxFQUFFO2dCQUN2QyxJQUFJLG1CQUFtQixHQUFHLElBQUEsOEJBQXNCLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sbUJBQW1CLENBQUEsQ0FBQyxDQUFBLG1CQUFtQixJQUFFLENBQUMsQ0FBQyxZQUFZLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQTtZQUN6RixDQUFDLENBQUE7WUFDRCxJQUFJLG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ3hFLElBQUEsb0JBQVUsRUFBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBQyxFQUFFO2dCQUNyRSxJQUFJLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO2dCQUMvRSxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxFQUFFO29CQUN6SyxJQUFJLFNBQVMsR0FBRyxFQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQTtvQkFDekQsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUE7WUFDTixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQWZELGdFQWVDO0lBRUQsU0FBZ0Isd0JBQXdCLENBQ3BDLG9CQUFnRyxFQUNoRyxXQUFpRSxFQUNqRSxTQUFvQixFQUNwQixVQUFxQixFQUNyQixJQUF5QjtRQUV6QixJQUFJLEtBQUsscUJBQVksU0FBUyxDQUFDLENBQUM7UUFDaEMsOEJBQThCLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxvQkFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzSSxDQUFDO0lBVEQsNERBU0M7SUFFRCxTQUFTLGdCQUFnQixDQUFDLFVBQXNCLEVBQUUsU0FBbUIsRUFBRSxJQUF5QjtRQUM1RixJQUFJLGFBQTJCLENBQUM7UUFDaEMscUJBQXFCO1FBQ3JCLElBQUksVUFBVSxHQUE0RCxFQUFFLENBQUE7UUFDNUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRixXQUFXLENBQUMsb0JBQW9CLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQWEsRUFBRSxPQUFrQixFQUFDLEVBQUUsQ0FBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEwsV0FBVyxDQUFDLG9CQUFvQixtQ0FBTyxXQUFXLENBQUMsb0JBQW9CLEdBQUssVUFBVSxDQUFDLENBQUM7UUFDeEYsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVMsQ0FBQyxtQ0FDOUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVMsQ0FBQyxHQUNyRCx1QkFBdUIsQ0FDdEIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLENBQ2IsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVNLElBQUksMkJBQTJCLEdBQUcsQ0FBQyxVQUFpQixFQUFDLEVBQUU7UUFDMUQsSUFBSSxtQkFBbUIsR0FBRyxJQUFBLDhCQUFzQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksYUFBYSxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMxQyxJQUFJLHNCQUFzQixHQUFHLENBQUMsWUFBeUIsRUFBQyxFQUFFO1lBQ3RELFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUMsRUFBRTs7Z0JBQzVFLElBQUcsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUM7b0JBQ3ZCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQSxNQUFBLFNBQVMsQ0FBQyxLQUFLLDBDQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQSxDQUFDLENBQUEsU0FBUyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUEsSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQWlCLENBQUM7b0JBQzFHLElBQUcsUUFBUSxFQUFDO3dCQUNSLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzdCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUNwQztpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFBO1FBQ0Qsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM1QyxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDLENBQUE7SUFoQlUsUUFBQSwyQkFBMkIsK0JBZ0JyQztJQUVNLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxzQkFBeUQsRUFBRSxhQUFxQixFQUFFLFNBQXFCLEVBQUUsVUFBdUIsRUFBRSxDQUFZLEVBQUMsRUFBRSxDQUM1SyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7UUFDekIsc0JBQXNCLENBQUMsd0JBQXdCO1FBQy9DLHNCQUFzQixDQUFDLHdCQUF3QixJQUFJLFVBQVU7UUFDN0QsQ0FBQztZQUNHLGFBQWEsSUFBSSxJQUFBLHVCQUFRLEVBQ3JCLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMxQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQ3RDO1FBQ0wsQ0FBQztZQUNHLFNBQVMsSUFBSSxhQUFhLENBQzdCLENBQUE7SUFYTSxRQUFBLGdCQUFnQixvQkFXdEI7SUFFRSxJQUFJLGtCQUFrQixHQUFHLENBQUMsc0JBQXlELEVBQUUsYUFBcUIsRUFBRSxVQUF1QixFQUFFLENBQVksRUFBQyxFQUFFLENBQ3ZKLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUN6QixzQkFBc0IsQ0FBQyx3QkFBd0IsSUFBSSxVQUFVO1FBQzdELGFBQWEsSUFBSSxJQUFBLHVCQUFRLEVBQ3JCLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMxQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQ3RDLENBQUMsQ0FBQTtJQU5LLFFBQUEsa0JBQWtCLHNCQU12QjtJQUVDLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxzQkFBeUQsRUFBRSxVQUF1QixFQUFDLEVBQUUsQ0FDdkgsQ0FBQyxDQUFDLHNCQUFzQjtRQUN4QixzQkFBc0IsQ0FBQyx3QkFBd0IsSUFBSSxVQUFVLENBQUMsQ0FBQTtJQUZ2RCxRQUFBLHVCQUF1QiwyQkFFZ0M7SUFXbEUsU0FBZ0IsdUJBQXVCLENBQ25DLFNBQW1CLEVBQ25CLG9CQUE4RixFQUM5RixVQUFxQjtRQUVyQixJQUFJLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxHQUFHLG9CQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFELElBQUksRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLEdBQUcsb0JBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUQsSUFBSSxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsR0FBRyxvQkFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsRSxJQUFJLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBQyxHQUFHLG9CQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ25FLElBQUksYUFBYSxHQUFHLElBQUEsbUNBQTJCLEVBQUMsU0FBUyxDQUFDLFFBQVMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksNkJBQTZCLEdBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUEsOEJBQXNCLEVBQUMsU0FBUyxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUE7UUFDbkksSUFBSSxnQkFBZ0IsR0FBRyxJQUFBLGdCQUFNLEVBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLEVBQUU7WUFDeEUsSUFBSSxlQUFlLEdBQUcsNkJBQTZCLElBQUksQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsd0JBQXdCLElBQUksNkJBQTZCLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtZQUN0SyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxJQUFFLFNBQVMsQ0FBQyxRQUFRO2dCQUNuRCxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUN0RCxDQUFDLGVBQWUsQ0FBQSxDQUFDO29CQUNiLENBQUMsSUFBQSwwQkFBa0IsRUFDZiw2QkFBNkIsRUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUEsZUFBZSxDQUFDO3dCQUN0QyxRQUFRLEVBQUMsU0FBUyxDQUFDLFFBQVE7d0JBQzNCLFVBQVUsRUFBQyw2QkFBNkIsQ0FBQyxtQkFBb0I7d0JBQzdELEtBQUssRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUs7cUJBQ2xDLENBQUMsQ0FBQyxVQUFVLENBQUEsQ0FBQyxDQUFBLEVBQWdCLENBQ2pDO29CQUNMLENBQUMsQ0FBQSxJQUFJLENBQUMsQ0FBQTtRQUNkLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsSUFBSSxXQUFXLEdBQWlFO1lBQzVFLFFBQVEsRUFBQyxFQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFBQztZQUNuQyxlQUFlLEVBQUMsRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUM7WUFDMUMsWUFBWSxFQUFDLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUFDO1lBQ3ZDLE9BQU8sRUFBQyxFQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFBQztZQUNsQyxjQUFjLEVBQUMsRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUM7WUFDekMsSUFBSSxFQUFDLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUFDO1NBQ2xDLENBQUE7UUFDRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLFVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLEtBQUksSUFBSSxRQUFRLElBQUksZ0JBQWdCLEVBQUM7WUFDakMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUMvQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxHQUFDLEdBQUcsRUFBQztnQkFDbEMsR0FBRyxHQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ25DLFVBQVUsR0FBQyxPQUFPLENBQUM7YUFDdEI7U0FDSjtRQUNELElBQUcsVUFBVSxJQUFFLE9BQU8sSUFBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLFVBQVUsSUFBRSxZQUFZLEVBQUM7WUFDNUUsSUFBRyxLQUFLLENBQUMsK0NBQStDLEVBQUM7Z0JBQ3JELFVBQVUsR0FBQyxjQUFjLENBQUM7YUFDN0I7aUJBQUk7Z0JBQ0QsVUFBVSxHQUFDLFlBQVksQ0FBQzthQUMzQjtTQUNKO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQTRCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNGLElBQUksYUFBMkIsQ0FBQztRQUNoQyxJQUFJLGdCQUE4QixDQUFDO1FBQ25DLElBQUcsS0FBSyxJQUFFLE1BQU0sRUFBQztZQUNiLGdCQUFnQixHQUFHLFVBQVUsQ0FBQSxDQUFDLENBQUEsUUFBUSxDQUFBLENBQUMsQ0FBQSxVQUFVLENBQUE7WUFDakQscUVBQXFFO1lBQ3JFLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQTtTQUNuQzthQUFJO1lBQ0QsYUFBYSxHQUFHLE9BQU8sQ0FBQSxDQUFDLENBQUEsUUFBUSxDQUFBLENBQUMsQ0FBQSxVQUFVLENBQUE7U0FDOUM7UUFDRCxJQUFJLFNBQVMsR0FBb0I7WUFDN0IsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixNQUFNO1lBQ04sUUFBUTtZQUNSLFNBQVM7WUFDVCxXQUFXO1NBQ2QsQ0FBQTtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUM7SUExRUQsMERBMEVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGxpa2VBciwgYmVpbmdBcnJheSB9IGZyb20gXCJsaWtlLWFyXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRSb3dWYWxpZGF0b3IsIEZvcm1TdHJ1Y3R1cmVTdGF0ZSwgT3BjaW9uZXNSb3dWYWxpZGF0b3IsIEZlZWRiYWNrIH0gZnJvbSBcInJvdy12YWxpZGF0b3JcIjtcclxuXHJcbmltcG9ydCB7IGRhdGUsIGNvbXBhcmVGb3JPcmRlciwgY29hbGVzY2UgfSBmcm9tIFwiYmVzdC1nbG9iYWxzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgRXN0cnVjdHVyYSwgXHJcbiAgICBGb3JQaywgRm9yUGtSYWl6LFxyXG4gICAgSWRGaW4sIElkRm9ybXVsYXJpbywgSWRQcmVndW50YSwgSWRUYXJlYSwgSWRWYXJpYWJsZSwgXHJcbiAgICBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgSW5mb0Zvcm11bGFyaW8sIFxyXG4gICAgUGxhaW5Gb3JQaywgUmVzcHVlc3RhcywgUmVzcHVlc3Rhc1JhaXosIFJlc3VtZW5Fc3RhZG8sXHJcbiAgICBWYWxvciwgVmlzaXRhLCBcclxuICAgIHRvUGxhaW5Gb3JQayxcclxuICAgIFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgRm9ybXVsYXJpbyxcclxuICAgIENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMsXHJcbiAgICBJZEVuY1xyXG59IGZyb20gXCIuL3RpcG9zXCI7XHJcblxyXG52YXIgZXNwZWNpYWxlcyA9IHt9IGFzIHtcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzPzoocmVzcHVlc3Rhc1JhaXo6UmVzcHVlc3Rhc1JhaXosIGZvclBrOkZvclBrKT0+dm9pZFxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlcyhjYWxjdWxhclZhcmlhYmxlczoocmVzcHVlc3Rhc1JhaXo6UmVzcHVlc3Rhc1JhaXosZm9yUGs6Rm9yUGspPT52b2lkKXtcclxuICAgIGVzcGVjaWFsZXMuY2FsY3VsYXJWYXJpYWJsZXMgPSBjYWxjdWxhclZhcmlhYmxlc1xyXG59XHJcblxyXG50eXBlIERhdG9zQnlQYXNzID0gRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7XHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjp7ICAvLyBubyBzZSBwZXJzaXN0ZVxyXG4gICAgICAgIFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9XHJcbiAgICBkaXJ0eTpib29sZWFuXHJcbn07XHJcblxyXG52YXIgZGF0b3NCeVBhc3MgPSB7fSBhcyBEYXRvc0J5UGFzc1xyXG5cclxuLy9AdHMtaWdub3JlIGFycmFuY2EgZW4gYmxhbmNvXHJcbnZhciBlc3RydWN0dXJhOkVzdHJ1Y3R1cmEgPSBudWxsIGFzIEVzdHJ1Y3R1cmE7XHJcblxyXG5sZXQgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vOihkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzKT0+UHJvbWlzZTxhbnk+ID0gKCk9PntcclxuICAgIHRocm93IG5ldyBFcnJvcigncGVyc2lzdGlyRGF0b3NCeVBhc3MgU0lOIERFRklOSVInKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGlyRGF0b3NCeVBhc3MocGVyc2lzdGlyRGF0b3NCeVBhc3NGdW46dHlwZW9mIHBlcnNpc3RpckRhdG9zQnlQYXNzKXtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyA9IHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzKXtcclxuICAgIGF3YWl0IHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyhkYnBwKTtcclxuICAgIGRhdG9zQnlQYXNzLmRpcnR5ID0gZmFsc2VcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVuY29sYXJCYWNrdXAoXHJcbiAgICBlbmNvbGFyQmFja3VwRnVuOih0b2tlbjpzdHJpbmd8dW5kZWZpbmVkLCBmb3JQa1JhaXo6Rm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejpSZXNwdWVzdGFzKT0+dm9pZFxyXG4pe1xyXG4gICAgZW5jb2xhckJhY2t1cCA9IGVuY29sYXJCYWNrdXBGdW5cclxufVxyXG5cclxubGV0IGVuY29sYXJCYWNrdXA6KHRva2VuOnN0cmluZ3x1bmRlZmluZWQsIGZvclBrUmFpejpGb3JQa1JhaXosIHJlc3B1ZXN0YXNSYWl6OlJlc3B1ZXN0YXMpPT52b2lkID0gKCk9PntcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlNJTiBFU1BFQ0lGSUNBUiBlbmNvbGFyQmFja3VwXCIpXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgaW50ZW50YXJCYWNrdXAgPSAoZm9yUGs6Rm9yUGspPT57XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlKVxyXG4gICAgdmFyIHRva2VuID0gZGF0b3NCeVBhc3MudG9rZW47XHJcbiAgICBpZih0b2tlbil7XHJcbiAgICAgICAgZW5jb2xhckJhY2t1cCh0b2tlbiwgZm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpeilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibm8gaGF5IHRva2VuLCBubyBzZSBwdWRvIGhhY2VyIGVsIGJhY2t1cFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcjpFc3RydWN0dXJhKXtcclxuICAgIGVzdHJ1Y3R1cmEgPSBlc3RydWN0dXJhQUNhcmdhcjtcclxuICAgIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKHVhPT4hIXVhLnByaW5jaXBhbCk/LnVuaWRhZF9hbmFsaXNpcyFcclxuICAgIGRlZk9wZXJhdGl2by5kZWZGb3IgPSBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykubWFwKGY9Pih7aGVybWFubzogZi5jYXNpbGxlcm9zLmhlcm1hbm99KSkucGxhaW4oKVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZlVBID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLm1hcCgodWFEZWYsIHVhKT0+KHtcclxuICAgICAgICBwazp1YURlZi5wa19hZ3JlZ2FkYSBhcyBJZFZhcmlhYmxlLCBcclxuICAgICAgICBpbmNsdWlkYXM6IGxpa2VBcih1YURlZi5oaWphcykua2V5cygpLFxyXG4gICAgICAgIGlkc0ZvcjogbGlrZUFyKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MpLmZpbHRlcihmPT5mLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhKS5rZXlzKClcclxuICAgIH0pKS5wbGFpbigpXHJcbiAgICByZXR1cm4gZXN0cnVjdHVyYTsgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRvc0J5UGFzcyhkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzICYge2RpcnR5Pzpib29sZWFufSl7XHJcbiAgICBkYXRvc0J5UGFzcyA9IHtcclxuICAgICAgICBkaXJ0eTpmYWxzZSxcclxuICAgICAgICAuLi5kYnBwLFxyXG4gICAgICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOnt9IGFzIERhdG9zQnlQYXNzW1wiZmVlZGJhY2tSb3dWYWxpZGF0b3JcIl1cclxuICAgIH1cclxuICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0RGF0b3NCeVBhc3MgPSAoKT0+IGRhdG9zQnlQYXNzXHJcblxyXG5mdW5jdGlvbiBvYmpldG9WYWNpbyhvOm9iamVjdCl7XHJcbiAgICBmb3IodmFyIGsgaW4gbyl7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWVkYmFja1Jvd1ZhbGlkYXRvcigpe1xyXG4gICAgaWYoIWRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yIHx8IG9iamV0b1ZhY2lvKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKSl7XHJcbiAgICAgICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcnR5KCl7XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuZGlydHlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVzdHJ1Y3R1cmEoKXtcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG50eXBlIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcyA9IEhUTUxEaXZFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG50eXBlIERpcmVjdEZ1bmN0aW9uPFQsIFJlc3VsdD4gPSAocmVzcHVlc3Rhc0F1bWVudGFkYXM6UmVzcHVlc3RhcywgZmVlZGJhY2tGb3JtOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSxWYWxvcixJZEZpbj4sIGVsZW1lbnRvOlQsXHJcbiAgICBmZWVkYmFja0FsbDp7XHJcbiAgICAgICAgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsVmFsb3IsSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9LFxyXG4gICAgZXN0cnVjdHVyYTpFc3RydWN0dXJhXHJcbikgPT4gUmVzdWx0XHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7XHJcbiAgICBpZDogc3RyaW5nLCBcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgYW55PlxyXG59ICYgKHtcclxuICAgIHByb3A6a2V5b2YgVFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBUW2tleW9mIFRdPlxyXG59fHtcclxuICAgIGF0dHI6c3RyaW5nXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHN0cmluZz5cclxufXx7XHJcbiAgICBzdHlsZTprZXlvZiBDU1NTdHlsZURlY2xhcmF0aW9uXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHN0cmluZz5cclxufXx7XHJcbiAgICBkaXJlY3Q6dHJ1ZVxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCB2b2lkPlxyXG59KVxyXG5cclxudHlwZSBSZWdpc3Ryb0VsZW1lbnRvczxUIGV4dGVuZHMgRWxlbWVudG9zUmVnaXN0cmFibGVzPiA9IHsgW2lkOnN0cmluZ106IFJlZ2lzdHJvRWxlbWVudG88VD4gJiB7ZWxlbWVudG8/OlR9IH07XHJcblxyXG52YXIgcmVnaXN0cm9FbGVtZW50b3NHbG9iYWwgPSB7fSBhcyBSZWdpc3Ryb0VsZW1lbnRvczxFbGVtZW50b3NSZWdpc3RyYWJsZXM+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJhckVsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+KGRlZjpSZWdpc3Ryb0VsZW1lbnRvPFQ+KXtcclxuICAgIC8vIEB0cy1pZ25vcmUgU8OtLCBwb2Ryw61hIHNlciBxdWUgbG9zIHRpcG9zIGRlIFQgc2VhbiBkaXN0aW50b3MsIHBlcm8gdmFuIGEgc2VyIGNvaGVyZW50ZXNcclxuICAgIHZhciByZWdpc3Ryb0VsZW1lbnRvczpSZWdpc3Ryb0VsZW1lbnRvczxUPiA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgcmVnaXN0cm9FbGVtZW50b3NbZGVmLmlkXSA9IGRlZjtcclxufVxyXG5cclxudHlwZSBSZXNwdWVzdGFzRm9yUGtDb211biA9IHtyZXNwdWVzdGFzOlJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6OlJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXo6Rm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczpVbmlkYWRBbmFsaXNpc31cclxuXHJcbmZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazpGb3JQayk6UmVzcHVlc3Rhc0ZvclBrQ29tdW5cclxuZnVuY3Rpb24gcmVzcHVlc3Rhc0ZvclBrKGZvclBrOkZvclBrLCBjb25BdW1lbnRhZGFzOnRydWUsIGFncmVnYXJTaUZhbHRhPzpib29sZWFuKTpSZXNwdWVzdGFzRm9yUGtDb211biAmIHtyZXNwdWVzdGFzQXVtZW50YWRhczpSZXNwdWVzdGFzfVxyXG5mdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6Rm9yUGssIGNvbkF1bWVudGFkYXM/OmJvb2xlYW4sIGFncmVnYXJTaUZhbHRhPzpib29sZWFuKTpSZXNwdWVzdGFzRm9yUGtDb211biAmIHtyZXNwdWVzdGFzQXVtZW50YWRhcz86UmVzcHVlc3Rhc30ge1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0ge30gYXMgUmVzcHVlc3RhcztcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbG8gcXVlIHNvYnJhciBkZSByZXNwdWVzdGFzIG5vIG1lIGltcG9ydGEuLi5cclxuICAgIHZhciByZXNwdWVzdGFzID0gZGF0b3NCeVBhc3MucmVzcHVlc3RhcyBhcyBSZXNwdWVzdGFzO1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpejsgXHJcbiAgICB2YXIgZm9yUGtSYWl6OiBGb3JQazsgXHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzOklkVW5pZGFkQW5hbGlzaXN8dW5kZWZpbmVkID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpc1xyXG4gICAgdmFyIGZvclBrQXBpbGFkYSA9IGZvclBrO1xyXG4gICAgdmFyIHBpbGE6W3VuaWRhZF9hbmFsaXNpczpJZFVuaWRhZEFuYWxpc2lzLCB1YURlZjpVbmlkYWRBbmFsaXNpcywgZm9yUGs6Rm9yUGtdW10gPSBbXTtcclxuICAgIHdoaWxlKHVuaWRhZF9hbmFsaXNpcyl7XHJcbiAgICAgICAgdmFyIHVhRGVmOlVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgIHBpbGEucHVzaChbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSk7XHJcbiAgICAgICAgZm9yUGtBcGlsYWRhPXsuLi5mb3JQa0FwaWxhZGF9O1xyXG4gICAgICAgIGRlbGV0ZSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdXHJcbiAgICAgICAgdW5pZGFkX2FuYWxpc2lzPXVhRGVmLnBhZHJlXHJcbiAgICB9XHJcbiAgICB3aGlsZShwaWxhLmxlbmd0aCl7XHJcbiAgICAgICAgW3VuaWRhZF9hbmFsaXNpcywgdWFEZWYsIGZvclBrQXBpbGFkYV0gPSBwaWxhLnBvcCgpIVxyXG4gICAgICAgIHZhciB2YWxvclBrT1Bvc2ljaW9uID0gZm9yUGtBcGlsYWRhW3VhRGVmLnBrX2FncmVnYWRhXTtcclxuICAgICAgICBpZih2YWxvclBrT1Bvc2ljaW9uID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFsdGEgdW4gdmFsb3IgcGFyYSAke0pTT04uc3RyaW5naWZ5KHVhRGVmLnBrX2FncmVnYWRhKX1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihyZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc10gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzcHVlc3Rhc0FudGVyaW9yPXJlc3B1ZXN0YXM7XHJcbiAgICAgICAgbGV0IHBvc2ljaW9uID0gcmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdIGluc3RhbmNlb2YgQXJyYXk/dmFsb3JQa09Qb3NpY2lvbiAtIDE6dmFsb3JQa09Qb3NpY2lvblxyXG4gICAgICAgIHJlc3B1ZXN0YXMgPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dO1xyXG4gICAgICAgIGlmKHJlc3B1ZXN0YXMgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIGlmKGFncmVnYXJTaUZhbHRhKXtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMgPSB7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzQW50ZXJpb3JbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl0gPSByZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBleGlzdGUgZWwgZWxlbWVudG8gJyR7cG9zaWNpb259JyBlbiBsYSB1bmlkYWRfYW5hbGlzaXMgJyR7dW5pZGFkX2FuYWxpc2lzfSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JQa1JhaXogfHw9IGZvclBrQXBpbGFkYTtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFPDqSBxdWUgZXMgcmHDrXogcG9yIGPDs21vIGVzdG95IHJldm9sdmllbmRvIGxhIHBpbGFcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiB8fD0gcmVzcHVlc3RhcztcclxuICAgICAgICBpZihjb25BdW1lbnRhZGFzKXtcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMgPSB7Li4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXMsIFt1YURlZi5wa19hZ3JlZ2FkYV06dmFsb3JQa09Qb3NpY2lvbn1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFPDqSBxdWUgbGEgcGlsYSB0aWVuZSBhbCBtZW5vcyB1biBlbGVtZW50byBwb3IgbG8gdGFudG8gZXN0byBlc3TDoSBsbGVubyBzZWd1cm8uIFxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHVuaWRhZEFuYWxpc2lzOiB1YURlZlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1JhaXo6Rm9yUGtSYWl6KXtcclxuICAgIHZhciB7cmVzcHVlc3Rhc0F1bWVudGFkYXN9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrUmFpeiwgdHJ1ZSlcclxuICAgIHZhciByZWdpc3Ryb0VsZW1lbnRvcyA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgdmFyIHBsYWluRm9yUGsgPSB0b1BsYWluRm9yUGsoZm9yUGtSYWl6KVxyXG4gICAgdmFyIHJvd1ZhbGlkYXRvciA9ICBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXTtcclxuICAgIGZvcih2YXIgaWQgaW4gcmVnaXN0cm9FbGVtZW50b3Mpe1xyXG4gICAgICAgIHZhciBkZWYgPSByZWdpc3Ryb0VsZW1lbnRvc1tpZF07XHJcbiAgICAgICAgaWYoZGVmLmVsZW1lbnRvKXtcclxuICAgICAgICAgICAgaWYoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZGVmLmVsZW1lbnRvKSl7XHJcbiAgICAgICAgICAgICAgICBkZWYuZWxlbWVudG8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIWRlZi5lbGVtZW50byl7XHJcbiAgICAgICAgICAgIGRlZi5lbGVtZW50byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlZi5pZCkgYXMgRWxlbWVudG9zUmVnaXN0cmFibGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighZGVmLmVsZW1lbnRvKXtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0JVU0NBTkRPIGVsIGVsZW1lbnRvIHJlZ2lzdHJhZG8gJyxpZCwnbm8gZXN0w6EgZW4gZWwgRE9NJylcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IGRlZi5mdW4ocmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJvd1ZhbGlkYXRvciwgZGVmLmVsZW1lbnRvLCBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYSk7XHJcbiAgICAgICAgaWYoJ3Byb3AnIGluIGRlZil7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYucHJvcCwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCdhdHRyJyBpbiBkZWYpe1xyXG4gICAgICAgICAgICBzZXRBdHRyRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYuYXR0ciwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCdzdHlsZScgaW4gZGVmKXtcclxuICAgICAgICAgICAgc2V0VmFsb3JEaXN0aW50byhkZWYuZWxlbWVudG8uc3R5bGUsIGRlZi5zdHlsZSwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYocm93VmFsaWRhdG9yLmFjdHVhbCl7XHJcbiAgICAgICAgdmFyIHt0b3AsIGJvdHRvbX0gPSBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8ocm93VmFsaWRhdG9yLmFjdHVhbCk7XHJcbiAgICAgICAgaWYodG9wICE9IG51bGwgJiYgYm90dG9tICE9bnVsbCl7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhYi1hY3Rpdm8tYXJyaWJhJykuZWxUb3BWaXNpYmlsaXphciA9IHRvcDtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hYmFqbycpLmVsQm90dG9tVmlzaWJpbGl6YXIgPSBib3R0b207XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJFbGVtZW50b0VuZm9jYWRvKGlkVmFyaWFibGU6SWRWYXJpYWJsZXxJZEZpbil7XHJcbiAgICB2YXIgZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRWYXJpYWJsZT09J2Zpbic/YGJvdG9uLXZvbHZlci0yYDpgdmFyLSR7aWRWYXJpYWJsZX1gKVxyXG4gICAgICAgIHx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNlY2Npb24tYm90b24tZm9ybXVsYXJpby0ke2lkVmFyaWFibGV9YCk7XHJcbiAgICB2YXIgZWxlbWVudG8gPSBlbGVtZW50b1ZhcmlhYmxlQUVuZm9jYXI7XHJcbiAgICB2YXIgTUFSR0VOX1NDUk9MTCA9IDY0O1xyXG4gICAgdmFyIGFsdG9QYW50YWxsYSA9IHdpbmRvdy5pbm5lckhlaWdodCowLjcgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgdmFyIGVsZW1lbnRvRW50ZXJvOkhUTUxFbGVtZW50fG51bGwgPSBlbGVtZW50bzsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgZW50YXIgZW50ZXJvIGVuIHBhbnRhbGxhLCBkZWZpbmUgZWwgYm90dG9tXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvRW50ZXJvOlJldHVyblR5cGU8dHlwZW9mIG15T3duLmdldFJlY3Q+fG51bGwgPSBudWxsO1xyXG4gICAgdmFyIGVsZW1lbnRvU3VwZXJpb3I6SFRNTEVsZW1lbnR8bnVsbCA9IG51bGw7IC8vIGVzIGVsIGVsZW1lbnRvIHF1ZSB2YSBhIG1vc3RyYXJzZSBkZXNkZSBhcnJpYmEgYXVucXVlIG5vIGVudHJlIGVudGVybywgZGVmaW5lIGVsIHRvcFxyXG4gICAgdmFyIHJlY3RFbGVtZW50b1N1cGVyaW9yOlJldHVyblR5cGU8dHlwZW9mIG15T3duLmdldFJlY3Q+fG51bGwgPSBudWxsO1xyXG4gICAgd2hpbGUoZWxlbWVudG8gIT0gbnVsbCl7XHJcbiAgICAgICAgaWYoZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCd2YXJpYWJsZScpIFxyXG4gICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnbXVsdGlwbGUnKSBcclxuICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ByZWd1bnRhJykgXHJcbiAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb25qdW50b3ByZWd1bnRhcycpIFxyXG4gICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnc2VjY2lvbi1ib3Rvbi1mb3JtdWxhcmlvJykgXHJcbiAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3RvbmZvcm11bGFyaW8nKSBcclxuICAgICAgICApe1xyXG4gICAgICAgICAgICBpZihlbGVtZW50b1N1cGVyaW9yID09IG51bGwgJiYgZWxlbWVudG8uY2xpZW50SGVpZ2h0IDwgYWx0b1BhbnRhbGxhKXtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50b0VudGVyb1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IG15T3duLmdldFJlY3QoZWxlbWVudG9FbnRlcm8hKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdEVsZW1lbnRvRW50ZXJvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBteU93bi5nZXRSZWN0KGVsZW1lbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmKHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0IC0gcmVjdC50b3AgPCBhbHRvUGFudGFsbGEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3Q7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50byA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudG8gPSBlbGVtZW50bz8ucGFyZW50RWxlbWVudCA/PyBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYoZWxlbWVudG9TdXBlcmlvciA9PSBudWxsKXtcclxuICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm87XHJcbiAgICB9XHJcbiAgICB2YXIgcmVzdWx0OntcclxuICAgICAgICBlbGVtZW50b0lucHV0VmFyaWFibGU/OkhUTUxFbGVtZW50fG51bGxcclxuICAgICAgICB0b3A/Om51bWJlcnxudWxsXHJcbiAgICAgICAgYm90dG9tPzpudW1iZXJ8bnVsbFxyXG4gICAgICAgIGVuZm9jYWRvPzpib29sZWFufG51bGxcclxuICAgICAgICBkZXNlbmZvcXVlPzpzdHJpbmd8bnVsbFxyXG4gICAgfSA9IHt9O1xyXG4gICAgaWYoZWxlbWVudG9FbnRlcm8gIT0gbnVsbCl7XHJcbiAgICAgICAgaWYocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpe1xyXG4gICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBteU93bi5nZXRSZWN0KGVsZW1lbnRvRW50ZXJvKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZWxlbWVudG9JbnB1dFZhcmlhYmxlID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgICAgIHZhciB0b3AgPSAocmVjdEVsZW1lbnRvU3VwZXJpb3I/P3JlY3RFbGVtZW50b0VudGVybykudG9wIC0gTUFSR0VOX1NDUk9MTDtcclxuICAgICAgICByZXN1bHQudG9wID0gdG9wO1xyXG4gICAgICAgIHJlc3VsdC5ib3R0b20gPSByZWN0RWxlbWVudG9FbnRlcm8udG9wK3JlY3RFbGVtZW50b0VudGVyby5oZWlnaHQ7XHJcbiAgICAgICAgaWYodG9wPGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3Ape1xyXG4gICAgICAgICAgICByZXN1bHQuZGVzZW5mb3F1ZT0nYXJyaWJhJztcclxuICAgICAgICB9ZWxzZSBpZihyZWN0RWxlbWVudG9FbnRlcm8udG9wK3JlY3RFbGVtZW50b0VudGVyby5oZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICsgYWx0b1BhbnRhbGxhKXtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWU9J2FiYWpvJztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmVzdWx0LmVuZm9jYWRvPXRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0ckRpc3RpbnRvPE4gZXh0ZW5kcyBzdHJpbmc+KFxyXG4gICAgb2JqZXRvOntzZXRBdHRyaWJ1dGU6KG5hbWU6TiwgdmFsb3I6c3RyaW5nKT0+dm9pZCwgZ2V0QXR0cmlidXRlOihuYW1lOk4pPT5zdHJpbmd8bnVsbH0sXHJcbiAgICBuYW1lOk4sXHJcbiAgICB2YWxvcjpzdHJpbmdcclxuKXtcclxuICAgIGlmKG9iamV0byAmJiBvYmpldG8uZ2V0QXR0cmlidXRlKG5hbWUpICE9IHZhbG9yKXtcclxuICAgICAgICBvYmpldG8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbG9yKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbG9yRGlzdGludG88VCBleHRlbmRzIHt9LCBOIGV4dGVuZHMga2V5b2YgVD4oXHJcbiAgICBvYmpldG86VCxcclxuICAgIG5hbWU6TixcclxuICAgIHZhbG9yOlRbTl1cclxuKXtcclxuICAgIGlmKG9iamV0b1tuYW1lXSAhPSB2YWxvcil7XHJcbiAgICAgICAgb2JqZXRvW25hbWVdID0gdmFsb3I7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKF9mb3JQazpGb3JQayl7XHJcbiAgICBcclxufTtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2lkX3ByZWd1bnRhKF9wYXlsb2FkOntwcmVndW50YTogSWRQcmVndW50YSwgZm9yUGs6IEZvclBrfSwgX2RhdG9zQnlQYXNzOkRhdG9zQnlQYXNzKXtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID0gU3ltYm9sKCdOT19DQU1CSUFSX1NPTE9fVFJBRVJfU1RBVFVTJylcclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gPSBTeW1ib2woJ05PX0NBTUJJQVJfVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTycpXHJcblxyXG5mdW5jdGlvbiByZWZyZXNjYXJNYXJjYURpcnR5KCl7XHJcbiAgICB2YXIgYm90b25HcmFiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhdmUtYnV0dG9uXCIpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xyXG4gICAgaWYoYm90b25HcmFiYXIpe1xyXG4gICAgICAgIGlmKGJvdG9uR3JhYmFyLmRpc2FibGVkICE9PSAhZGF0b3NCeVBhc3MuZGlydHkpe1xyXG4gICAgICAgICAgICBib3RvbkdyYWJhci5kaXNhYmxlZCA9ICFkYXRvc0J5UGFzcy5kaXJ0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YShwYXlsb2FkOntcclxuICAgIGZvclBrOkZvclBrLCBcclxuICAgIHZhcmlhYmxlOklkVmFyaWFibGV8dHlwZW9mIE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTLCBcclxuICAgIHJlc3B1ZXN0YTpWYWxvcnx0eXBlb2YgTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJT1xyXG59LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgbGV0IHRva2VuID0gJ0FWRVJJR1VBUiBUT0RPJ1xyXG4gICAgbGV0IHsgZm9yUGssIHJlc3B1ZXN0YSwgdmFyaWFibGUgfSA9IHBheWxvYWQ7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ICA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgdmFyIHZhbG9yQW50ZXJpb3IgPSB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA/IHJlc3B1ZXN0YXNbdmFyaWFibGVdIDogbnVsbDtcclxuICAgIGlmKHJlc3B1ZXN0YSAhPT0gTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyl7XHJcbiAgICAgICAgaWYocmVzcHVlc3RhID09PSAnJyl7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YSA9IG51bGw7XHJcbiAgICAgICAgfWVsc2UgaWYoZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5lc3RydWN0dXJhUm93VmFsaWRhdG9yLnZhcmlhYmxlc1t2YXJpYWJsZV0udGlwbz09J251bWVybycpe1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGEgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGEgPSBOdW1iZXIocmVzcHVlc3RhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzaSBlcyB1biBmYWxzeSAoMCA9PSBmYWxzZSkgdGVuZ28gcXVlIGNvbXBhcmFyIGNvbiAhPT1cclxuICAgICAgICByZWNlbnRNb2RpZmllZCA9IHJlc3B1ZXN0YSA/IHZhbG9yQW50ZXJpb3IgIT0gcmVzcHVlc3RhIDogdmFsb3JBbnRlcmlvciAhPT0gcmVzcHVlc3RhXHJcbiAgICAgICAgaWYocmVjZW50TW9kaWZpZWQpe1xyXG4gICAgICAgICAgICByZXNwdWVzdGFzW3ZhcmlhYmxlXSA9IHJlc3B1ZXN0YSA/PyBudWxsOyAvLyBjYW1iaW8gdW5kZWZpbmVkIHBvciBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICB2YXIgc2lndWllbnRlVmFyaWFibGU6SWRWYXJpYWJsZXxJZEZpbnxudWxsfHVuZGVmaW5lZDtcclxuICAgIGlmKHZhcmlhYmxlICE9IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTICYmIChyZWNlbnRNb2RpZmllZCB8fCBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPICYmIGZlZWRiYWNrUm93LmF1dG9JbmdyZXNhZGFzPy5bdmFyaWFibGVdKSl7XHJcbiAgICAgICAgdmFyaWFibGVzQ2FsY3VsYWRhcyhyZXNwdWVzdGFzUmFpeiwgZm9yUGspO1xyXG4gICAgICAgIGlmKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpe1xyXG4gICAgICAgICAgICB2ZXJpZmljYXJTb3J0ZW8oe1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlbzogZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQay52aXZpZW5kYSEpXSwgXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1JhaXosXHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUFjdHVhbDogdmFyaWFibGUsIFxyXG4gICAgICAgICAgICAgICAgZm9yUGs6IGZvclBrXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdG9zQnlQYXNzLmRpcnR5ID0gZGF0b3NCeVBhc3MuZGlydHkgfHwgcmVjZW50TW9kaWZpZWQ7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHthdXRvSW5ncmVzbzogdHJ1ZX0pO1xyXG4gICAgICAgIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICAgICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGspO1xyXG4gICAgICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxuICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IHZhcmlhYmxlO1xyXG4gICAgICAgIGRve1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3NpZ3VpZW50ZVZhcmlhYmxlXS5zaWd1aWVudGU7XHJcbiAgICAgICAgfXdoaWxlKHZhbG9yQW50ZXJpb3IgPT0gbnVsbCAmJiByZWNlbnRNb2RpZmllZCAmJiBzaWd1aWVudGVWYXJpYWJsZSAhPSBudWxsICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9ICdmaW4nICYmIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbc2lndWllbnRlVmFyaWFibGVdLmZ1bmNpb25BdXRvSW5ncmVzYXIpXHJcbiAgICAgICAgaWYoc2lndWllbnRlVmFyaWFibGUgPT0gbnVsbCAmJiBmZWVkYmFja1Jvdy5mZWVkYmFja1t2YXJpYWJsZV0uZXN0YWRvID09ICd2YWxpZGEnKXtcclxuICAgICAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSAnZmluJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge3JlY2VudE1vZGlmaWVkLCBzaWd1aWVudGVWYXJpYWJsZSwgdmFyaWFibGVBY3R1YWw6IGZlZWRiYWNrUm93LmFjdHVhbH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX25vdGEocGF5bG9hZDp7Zm9yUGtSYWl6OkZvclBrUmFpeiwgdGFyZWE6SWRUYXJlYSwgbm90YTpzdHJpbmd8bnVsbH0sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIHRhcmVhLCBub3RhIH0gPSBwYXlsb2FkO1xyXG4gICAgY29uc29sZS5sb2coXCJGQUxUQSAvLyBUT0RPXCIpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYWdyZWdhcl92aXNpdGEocGF5bG9hZDp7Zm9yUGtSYWl6OkZvclBrUmFpeiwgb2JzZXJ2YWNpb25lczpzdHJpbmd8bnVsbH0sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIG9ic2VydmFjaW9uZXMgfSA9IHBheWxvYWQ7XHJcbiAgICAvKlxyXG4gICAgaWYoIWRhdG9zQnlQYXNzLmhvamFEZVJ1dGFbdml2aWVuZGFdLnZpc2l0YXMpe1xyXG4gICAgICAgIGRhdG9zQnlQYXNzLmhvamFEZVJ1dGFbdml2aWVuZGFdLnZpc2l0YXMgPSBbXTtcclxuICAgIH1cclxuICAgIHZhciB2aXNpdGFzID0gZGF0b3NCeVBhc3MuaG9qYURlUnV0YVt2aXZpZW5kYV0udmlzaXRhcztcclxuICAgIHZpc2l0YXMucHVzaCh7XHJcbiAgICAgICAgZmVjaGE6IGRhdGV0aW1lLm5vdygpLnRvWW1kKCksXHJcbiAgICAgICAgaG9yYTogZGF0ZXRpbWUubm93KCkudG9IbSgpLFxyXG4gICAgICAgIGlkcGVyOiBudWxsLCAvLyBUT0RPOiBWRVIgREUgRE9OREUgU0UgU0FDQSBFTCBJRFBFUiBzdGF0ZS5kYXRvcy5pZHBlcixcclxuICAgICAgICBvYnNlcnZhY2lvbmVzOm9ic2VydmFjaW9uZXNcclxuICAgIH0pXHJcbiAgICAqL1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX21vZGlmaWNhcl92aXNpdGEocGF5bG9hZDoge2ZvclBrUmFpejpGb3JQa1JhaXosIGluZGV4Om51bWJlciwgb3BjaW9uOmtleW9mIFZpc2l0YSAsIHZhbG9yOnN0cmluZ3xudWxsfSwgX2RhdG9zQnlQYXNzOkRhdG9zQnlQYXNzKXtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXgsIG9wY2lvbiwgdmFsb3J9ID0gcGF5bG9hZDtcclxuICAgIC8vIHZhciB2aXNpdGFzID0gZGF0b3NCeVBhc3MuaG9qYURlUnV0YVt2aXZpZW5kYV0udmlzaXRhcztcclxuICAgIC8vIHZpc2l0YXNbaW5kZXhdW29wY2lvbl0gPSB2YWxvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9ib3JyYXJfdmlzaXRhKHBheWxvYWQ6IHtmb3JQa1JhaXo6Rm9yUGtSYWl6LCBpbmRleDpudW1iZXJ9LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCBpbmRleH0gPSBwYXlsb2FkO1xyXG4gICAgLy8gdmFyIHZpc2l0YXMgPSBkYXRvc0J5UGFzcy5ob2phRGVSdXRhW3ZpdmllbmRhXS52aXNpdGFzO1xyXG4gICAgLy8gdmlzaXRhcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyh7Zm9yUGt9OiB7Zm9yUGs6Rm9yUGt9LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgdmFyIHtyZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6fSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB2YXJpYWJsZXNDYWxjdWxhZGFzKHJlc3B1ZXN0YXNSYWl6LCBmb3JQayk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcywgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBudWxsLCB7fSlcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hYnJpcl9mb3JtdWxhcmlvKHtmb3JQa306IHtmb3JQazpGb3JQa30sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzQXVtZW50YWRhcywgcmVzcHVlc3Rhc1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhcmlhYmxlc0NhbGN1bGFkYXMocmVzcHVlc3Rhc1JhaXosIGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl9mb3JtdWxhcmlvKHtmb3JQaywgZm9yUGtQYWRyZX06IHtmb3JQazpGb3JQaywgZm9yUGtQYWRyZTpGb3JQa30pe1xyXG4gICAgdmFyIHtyZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6SWRVbmlkYWRBbmFsaXNpc3x1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgdWFEZWY6VW5pZGFkQW5hbGlzaXMgPSBlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW3VuaWRhZF9hbmFsaXNpc107XHJcbiAgICB2YXIgaW5kZXggPSBmb3JQa1t1YURlZi5wa19hZ3JlZ2FkYV07XHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhc1t1bmlkYWRfYW5hbGlzaXNdLnBvcCgpO1xyXG4gICAgdmFyaWFibGVzQ2FsY3VsYWRhcyhyZXNwdWVzdGFzUmFpeiwgZm9yUGtQYWRyZSk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHRydWU7XHJcbiAgICByZXNwdWVzdGFzUmFpei4kZGlydHkgPSByZXNwdWVzdGFzUmFpei4kZGlydHkgfHwgdHJ1ZTtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwge2F1dG9JbmdyZXNvOiB0cnVlfSk7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQa1BhZHJlKTtcclxuICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtQYWRyZSk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hCeVBhc3M8VCwgUj4oXHJcbiAgICBmdW46KHBheWxvYWQ6VCwgZGF0b3M6dHlwZW9mIGRhdG9zQnlQYXNzKT0+UixcclxuICAgIHBheWxvYWQ6VFxyXG4pe1xyXG4gICAgcmV0dXJuIGZ1bihwYXlsb2FkLCBkYXRvc0J5UGFzcyk7XHJcbn1cclxuXHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHVsdGltYVZhcmlibGVWaXZpZW5kYSA9ICdOT19FU1RBX0RFRklOSURBX0FVTi8vVE9ETycgYXMgSWRWYXJpYWJsZTtcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhDUD0yMDtcclxuXHJcbi8qIFJFRFVDRVJTICovXHJcblxyXG52YXIgcmVlbXBsYXpvc0hhYmlsaXRhcjp7W2tleTpzdHJpbmddOnN0cmluZ309e1xyXG4gICAgZmFsc2U6ICdmYWxzZScsXHJcbiAgICB0cnVlOiAndHJ1ZScsXHJcbiAgICBcIj1cIjogJz09JyxcclxuICAgIFwiPD5cIjogJyE9JyxcclxuICAgIFwiJlwiOiAnJiYnLFxyXG4gICAgXCJ8XCI6ICd8fCcsXHJcbiAgICBcIk9SXCI6ICd8fCcsXHJcbiAgICBcIkFORFwiOiAnJiYnLFxyXG4gICAgXCJvclwiOiAnfHwnLFxyXG4gICAgXCJhbmRcIjogJyYmJyxcclxuICAgIFwibm90XCI6ICchJyxcclxuICAgIFwiTk9UXCI6ICchJyxcclxufTtcclxuXHJcbmNvbnN0IGhlbHBlcnNDYXNpbGxlcm9zPXtcclxuICAgIG51bGwyemVybyhwb3NpYmxlTnVsbDphbnkpe1xyXG4gICAgICAgIGlmKHBvc2libGVOdWxsPT1udWxsKXtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwb3NpYmxlTnVsbDtcclxuICAgIH0sXHJcbiAgICBkaXYwZXJyKG51bWVyYWRvcjpudW1iZXIsIGRlbm9taW5hZG9yOm51bWJlciwgcGs6c3RyaW5nKXtcclxuICAgICAgICBpZihkZW5vbWluYWRvcj09MCl7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGVuIFwiK3BrK1wiIGRpdmlzaW9uIHBvciBjZXJvIGRlIFwiK251bWVyYWRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1lcmFkb3IvZGVub21pbmFkb3I7XHJcbiAgICB9LFxyXG4gICAgZnVuczp7XHJcbiAgICAgICAgYmxhbmNvKHg6YW55KXtcclxuICAgICAgICAgICAgcmV0dXJuIHghPT0wICYmICF4XHJcbiAgICAgICAgfSxcclxuICAgICAgICBob3koKXtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9kYXkoKS50b0RteSgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmZWNoYV92YWxpZGEoeDpzdHJpbmcpe1xyXG4gICAgICAgICAgICB2YXIgZm9ybWF0b192YWxpZG89L14oWzEtOV18MFsxLTldfFsxMl1cXGR8M1swMV0pXFwvKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvMjBcXGRcXGQkLy50ZXN0KHgpXHJcbiAgICAgICAgICAgIHZhciB4RGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnNpb25PazogYm9vbGVhbjtcclxuICAgICAgICAgICAgY29udmVyc2lvbk9rID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm1hdG9fdmFsaWRvKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtkLCBtLCB5XSA9IHguc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeERhdGUgPSBuZXcgRGF0ZShgJHt5fS8ke219LyR7ZH1gKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uT2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy9mYWx0YXJpYSB2YWxpZGFyIHF1ZSBubyBzZWEgdW5hIGZlY2hhIGZ1dHVyYSB5IHF1ZSBzZWEgdW5hIGZlY2hhIGVuIGVsIHJhbmdvIGRlbCBvcGVyYXRpdm9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvICYmIGNvbnZlcnNpb25Pa1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW5mb3JtYWRvKHg6YW55KXtcclxuICAgICAgICAgICAgcmV0dXJuIHghPT11bmRlZmluZWQgJiYgeCE9PW51bGwgJiYgKCEoeCBpbnN0YW5jZW9mIEFycmF5KXx8IHgubGVuZ3RoIT09MCApXHJcbiAgICAgICAgICAgICYmICghKHggaW5zdGFuY2VvZiBPYmplY3QpfHwgT2JqZWN0LmtleXMoeCkubGVuZ3RoICE9PSAwIClcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5zbmMoeDphbnkpe1xyXG4gICAgICAgICAgICByZXR1cm4geCA9PSAtOVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcGFyKHg6bnVtYmVyKXtcclxuICAgICAgICAgICAgcmV0dXJuIHggJSAyPT0wXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKlxyXG4gICAgICAgIGRibzp7XHJcbiAgICAgICAgICAgIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsIGRhdG86c3RyaW5nKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgaW5mb3JtYWRvKHhwZXJzb25hcykgJiYgcGVyPD0geHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTEgJiYgISF4cGVyc29uYXNbcGVyLTFdW2RhdG9dPyB4cGVyc29uYXNbcGVyLTFdW2RhdG9dOm51bGxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRhZGZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsJ2VkYWQnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleGlzdGVpbmRpdmlkdWFsKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEhcGVyc29uYXMgJiYgcGVyPD0gcGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXBlcnNvbmFzW3Blci0xXVsnZW50cmVhaW5kJ11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXhpc3RlbWllbWJybyhlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiAhIXBlcnNvbmFzICYmIHBlcjw9IHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbnJvY29ueXVnZXMoZW5jdTpzdHJpbmcsaG9nOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geHBlcnNvbmFzLmZpbHRlciggcGVyLT5wZXIucDQ9PTIpLmxlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBucm9qZWZlcyhlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcnNvbmFzLmZpbHRlciggcGVyLT5wZXIucDQ9PTEpLmxlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwYXJlbnRlc2NvZmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyLCdwNCcpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNleG9mYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiAhIXhwZXJzb25hcyAmJiBwZXI8PSB4cGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXhwZXJzb25hc1twZXItMV0uc2V4bz8geHBlcnNvbmFzW3Blci0xXVsnc2V4byddOm51bGxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l0Y29ueWplZmUoZW5jdTpzdHJpbmcsaG9nOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIsMSwncDUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSAqLyAgICAgICBcclxuICAgIH1cclxufTtcclxuXHJcbnR5cGUgRnVuY2lvbkhhYmlsaXRhciA9ICh2YWxvcmVzOntba2V5OnN0cmluZ106YW55fSk9PmJvb2xlYW47XHJcbnR5cGUgRnVuY2lvblZhbG9yYXIgPSAodmFsb3Jlczp7W2tleTpzdHJpbmddOmFueX0pPT5hbnk7XHJcbnZhciBmdW5jaW9uZXNIYWJpbGl0YXI6e1trZXk6c3RyaW5nXTpGdW5jaW9uSGFiaWxpdGFyfT17XHJcbn1cclxudmFyIGZ1bmNpb25lc1ZhbG9yYXI6e1trZXk6c3RyaW5nXTpGdW5jaW9uVmFsb3Jhcn09e1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWluaUNvbXBpbGFkb3JTUWxKcyhleHByZXNpb25DYXNpU1FMOnN0cmluZyl7XHJcbiAgICB2YXIgZXhwcmVzaW9uID0gZXhwcmVzaW9uQ2FzaVNRTC5yZXBsYWNlKC9cXHUwMEEwL2csJyAnKTtcclxuICAgIHZhciBjdWVycG8gPSBleHByZXNpb24ucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwnIT0nKS5yZXBsYWNlKC9cXGIuKz9cXGIvZywgZnVuY3Rpb24oZWxUb2tlbil7XHJcbiAgICAgICAgdmFyIGVsVG9rZW5UcmltZWFkbz1lbFRva2VuLnRyaW0oKTtcclxuICAgICAgICBpZihlbFRva2VuVHJpbWVhZG8gaW4gcmVlbXBsYXpvc0hhYmlsaXRhcil7XHJcbiAgICAgICAgICAgIHJldHVybiByZWVtcGxhem9zSGFiaWxpdGFyW2VsVG9rZW5UcmltZWFkb107XHJcbiAgICAgICAgfWVsc2UgaWYoL15cXGQrXFwuP1xcZCokLy50ZXN0KGVsVG9rZW5UcmltZWFkbykpe1xyXG4gICAgICAgICAgICByZXR1cm4gZWxUb2tlblxyXG4gICAgICAgIH1lbHNlIGlmKC9eXFxXKyQvLnRlc3QoZWxUb2tlblRyaW1lYWRvKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfWVsc2UgaWYoL15cXHMrJC8udGVzdChlbFRva2VuKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4nK2VsVG9rZW4rJyknO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3VlcnBvO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY2lvbkNvbXBpbGFkYTxUPihjb25qdW50b0RlRnVuY2lvbmVzOntba2V5OnN0cmluZ106KHZhbG9yZXM6e1trZXk6c3RyaW5nXTphbnl9KT0+VH0pe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnM6c3RyaW5nKXtcclxuICAgICAgICBpZighY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSl7XHJcbiAgICAgICAgICAgIHZhciBjdWVycG8gPSBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgY3VlcnBvID0gbWluaUNvbXBpbGFkb3JTUWxKcyhub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzKTtcclxuICAgICAgICAgICAgICAgIHZhciBpbnRlcm5hbEZ1biA9ICBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJytjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSA9IGZ1bmN0aW9uKHZhbG9yZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGludGVybmFsRnVuKHZhbG9yZXMsIGhlbHBlcnNDYXNpbGxlcm9zKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SIEVKRUNVQ0NJT04gRVhQUkVTSU9OIEVYVEVSTkEgJyxub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWxvcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUiBDT01QSUxBQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnMpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RnVuY2lvbkhhYmlsaXRhciA9IGdldEZ1bmNpb25Db21waWxhZGEoZnVuY2lvbmVzSGFiaWxpdGFyKTtcclxuZXhwb3J0IGNvbnN0IGdldEZ1bmNpb25WYWxvcmFyICAgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc1ZhbG9yYXIpO1xyXG5cclxuXHJcbnZhciByb3dWYWxpZGF0b3IgPSBnZXRSb3dWYWxpZGF0b3I8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPih7Z2V0RnVuY2lvbkhhYmlsaXRhciwgZ2V0RnVuY2lvblZhbG9yYXJ9KVxyXG52YXIgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMgPSAodW5pZGFkZXNBUmVjb3JyZXJQcm06SWRVbmlkYWRBbmFsaXNpc1tdLHVuaWRhZEFuYWxpc2lzOlVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzOlJlc3B1ZXN0YXMsbm9SZWFzVGFyZWE6e31bXSxub21iTm9SZWE6c3RyaW5nKT0+e1xyXG4gICAgdmFyIG5yY29kaWdvOnN0cmluZ3xudWxsPSBudWxsO1xyXG4gICAgdmFyIGVzdmFsb3I9ZmFsc2U7XHJcbiAgICB2YXIgcnZhbG9yOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICB2YXIgcnZhcmlhYmxlOnN0cmluZztcclxuICAgIHZhciBybm9yZWE6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgLy8gdmFyIHJlc3VsdD17bnJjb2Q6U3RyaW5nLCBlc3ZhbDpCb29sZWFufTtcclxuICAgIGlmKHVuaWRhZGVzQVJlY29ycmVyUHJtLmluY2x1ZGVzKHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcykpe1xyXG4gICAgICAgIGZvcihsZXQgbm9SZWEgb2Ygbm9SZWFzVGFyZWEpeyAvL2VzdHJ1Y3R1cmEubm9SZWFzLCBlc3RydWN0dXJhLm5vUmVhc1N1cFxyXG4gICAgICAgICAgICBpZiAobm9tYk5vUmVhPT0nbm9fcmVhJyl7XHJcbiAgICAgICAgICAgICAgICB2YXIge3ZhcmlhYmxlICwgdmFsb3IsIG5vX3JlYX0gPSBub1JlYTtcclxuICAgICAgICAgICAgICAgIHJub3JlYT1ub19yZWE7XHJcbiAgICAgICAgICAgICAgICBydmFsb3I9dmFsb3I7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGU9dmFyaWFibGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdmFyIHt2YXJpYWJsZV9zdXAgLCB2YWxvcl9zdXAsIG5vX3JlYV9zdXB9ID0gbm9SZWE7XHJcbiAgICAgICAgICAgICAgICBybm9yZWE9bm9fcmVhX3N1cDtcclxuICAgICAgICAgICAgICAgIHJ2YWxvcj12YWxvcl9zdXA7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGU9dmFyaWFibGVfc3VwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbcnZhcmlhYmxlIGFzIElkVmFyaWFibGVdPT1ydmFsb3Ipe1xyXG4gICAgICAgICAgICAgICAgbnJjb2RpZ28gPXJub3JlYTsgIC8vbm9fcmVhLCBub19yZWFfc3VwXHJcbiAgICAgICAgICAgICAgICBlc3ZhbG9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7bnJjb2RpZ28sZXN2YWxvcn1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBucmNvZGlnbz1udWxsO1xyXG4gICAgICAgICAgICAgICAgZXN2YWxvcj1mYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvcihsZXQgdWEgb2YgKGxpa2VBcih1bmlkYWRBbmFsaXNpcz8uaGlqYXMpLmFycmF5KCkpKXtcclxuICAgICAgICBpZih1YT8udW5pZGFkX2FuYWxpc2lzICYmIHJlc3B1ZXN0YXNbdWEudW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSGlqYXMgb2YgcmVzcHVlc3Rhc1t1YT8udW5pZGFkX2FuYWxpc2lzXSl7XHJcbiAgICAgICAgICAgICAgIGxldCByZXN1bHQ9IGJ1c2Nhck5vUmVhRW5SZXNwdWVzdGFzKHVuaWRhZGVzQVJlY29ycmVyUHJtLHVhLHJlc3B1ZXN0YXNIaWphcyxub1JlYXNUYXJlYSxub21iTm9SZWEpO1xyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0LmVzdmFsb3IgKXtcclxuICAgICAgICAgICAgICAgICAgICBucmNvZGlnbz1yZXN1bHQubnJjb2RpZ287XHJcbiAgICAgICAgICAgICAgICAgICAgZXN2YWxvcj1yZXN1bHQuZXN2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge25yY29kaWdvLGVzdmFsb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnJjb2RpZ289bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBlc3ZhbG9yPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHtucmNvZGlnbywgZXN2YWxvcn1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICByZXR1cm4ge25yY29kaWdvLCBlc3ZhbG9yfVxyXG4gfVxyXG5cclxuLy8vLy8vIFRPRE9TIExPUyBOT01CUkVTIERFIHZhcmlhYmxlcyBvIGZvcm11bGFyaW9zIG8gY2FzaWxsZXJvcyBkZWJlbiBlc3RhciBlbiBlbCBvYmpldG8gb3BlcmF0aXZvXHJcbi8vLy8gUVVJVEFSTE8gWSBSRUVNUExBWkFSTE8gcG9yIGJ1c2NhciBlbiBlc3RydWN0dXJhLnVuaWRhZF9hbmFsaXNpcyB5IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb1xyXG5leHBvcnQgdmFyIGRlZk9wZXJhdGl2byA9IHtcclxuICAgIC8vVE9ETzogR0VORVJBTElaQVJcclxuICAgIC8vZXNOb3JlYToocmVzcHVlc3RhczpSZXNwdWVzdGFzKT0+e1xyXG4gICAgLy8gICAgY29uc3QgTk9fUkVBX1ZBUiA9ICdlbnRyZWF2JyBhcyBJZFZhcmlhYmxlOyBcclxuICAgIC8vICAgIHJldHVybiByZXNwdWVzdGFzW05PX1JFQV9WQVJdICYmIHJlc3B1ZXN0YXNbTk9fUkVBX1ZBUl0hPTFcclxuICAgIC8vfSxcclxuICAgIFxyXG4gICAgZXNOb3JlYToocmVzcHVlc3RhczpSZXNwdWVzdGFzKT0+e1xyXG4gICAgICAgIC8vVE9ETyBHRU5FUkFMSVpBUlxyXG4gICAgICAgIHZhciB1bmlkYWRlc0FSZWNvcnJlciA9IFsndml2aWVuZGFzJywnaG9nYXJlcycsJ3BlcnNvbmFzJ10gYXMgSWRVbmlkYWRBbmFsaXNpc1tdO1xyXG4gICAgICAgIHZhciB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PiF1YS5wYWRyZSk7XHJcbiAgICAgICAgdmFyIGVzTm9SZWEgPSBmYWxzZTtcclxuICAgICAgICB2YXIgY29kTm9SZWE6c3RyaW5nfG51bGw9IG51bGw7XHJcbiAgLypcclxuICAgICAgICB2YXIgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMgPSAodW5pZGFkQW5hbGlzaXM6VW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXM6UmVzcHVlc3Rhcyk9PntcclxuICAgICAgICAgICAgaWYodW5pZGFkZXNBUmVjb3JyZXIuaW5jbHVkZXModW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzKSl7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vUmVhIG9mIGVzdHJ1Y3R1cmEubm9SZWFzKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIge3ZhcmlhYmxlLCB2YWxvciwgbm9fcmVhfSA9IG5vUmVhO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbdmFyaWFibGUgYXMgSWRWYXJpYWJsZV09PXZhbG9yKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kTm9SZWEgPSBub19yZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzTm9SZWEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IobGV0IHVhIG9mIChsaWtlQXIodW5pZGFkQW5hbGlzaXM/LmhpamFzKS5hcnJheSgpKSl7XHJcbiAgICAgICAgICAgICAgICBpZih1YT8udW5pZGFkX2FuYWxpc2lzICYmIHJlc3B1ZXN0YXNbdWEudW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHJlc3B1ZXN0YXNIaWphcyBvZiByZXNwdWVzdGFzW3VhPy51bmlkYWRfYW5hbGlzaXNdKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGJ1c2Nhck5vUmVhRW5SZXNwdWVzdGFzKHVhLHJlc3B1ZXN0YXNIaWphcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXModWFQcmluY2lwYWwhLHJlc3B1ZXN0YXMpO1xyXG4gICAgICAgIHJldHVybiB7Y29kTm9SZWEsZXNOb1JlYX1cclxuICovXHJcbiAgICAgICAgbGV0IHJlc25vcmVhID0gYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMoIHVuaWRhZGVzQVJlY29ycmVyLHVhUHJpbmNpcGFsISxyZXNwdWVzdGFzLGVzdHJ1Y3R1cmEubm9SZWFzLCdub19yZWEnKTtcclxuICAgICAgICBjb2ROb1JlYT1yZXNub3JlYS5ucmNvZGlnbztcclxuICAgICAgICBlc05vUmVhPXJlc25vcmVhLmVzdmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIHtjb2ROb1JlYSwgZXNOb1JlYX07XHJcbiAgICB9LFxyXG4gICBlc05vcmVhU3VwOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSIGJ1c2Nhck5vcmVhUmVzcHVlc3Rhc1xyXG4gICAgICAgdmFyIHVuaWRhZGVzQVJlY29ycmVyU3VwID0gWyd2aXZpZW5kYXMnLCdob2dhcmVzX3N1cCcsJ3BlcnNvbmFzX3N1cCddIGFzIElkVW5pZGFkQW5hbGlzaXNbXTtcclxuICAgICAgIHZhciB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PiF1YS5wYWRyZSk7XHJcbiAgICAgICB2YXIgZXNOb1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgdmFyIGNvZE5vUmVhU3VwOnN0cmluZ3xudWxsPSBudWxsO1xyXG4gICAgICAgbGV0IHJlc25vcmVhID1idXNjYXJOb1JlYUVuUmVzcHVlc3RhcyggdW5pZGFkZXNBUmVjb3JyZXJTdXAsdWFQcmluY2lwYWwhLHJlc3B1ZXN0YXMsZXN0cnVjdHVyYS5ub1JlYXNTdXAsJ25vX3JlYV9zdXAnKTsvL2NvbiBsb3MgcGFyYW1ldHJvcyBxdWUgbmVjZXNpdGFyaWFtb3MgcGFyYSBnZW5lcmFsaXphclxyXG4gICAgICAgICBjb2ROb1JlYVN1cD1yZXNub3JlYS5ucmNvZGlnbztcclxuICAgICAgICAgZXNOb1JlYVN1cD1yZXNub3JlYS5lc3ZhbG9yO1xyXG4gICAgICAgcmV0dXJuIHtjb2ROb1JlYVN1cCxlc05vUmVhU3VwfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSXHJcbiAgICAgICAgdmFyIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGNvZFJlYTpudW1iZXJ8bnVsbD0gbnVsbDtcclxuICAgICAgICBpZighcmVzcHVlc3Rhc1snaWRlbnRpZicgYXMgSWRWYXJpYWJsZV0pe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NvZFJlYSwgZXNSZWF9XHJcbiAgICAgICAgfWVsc2UgaWYocmVzcHVlc3Rhc1snaWRlbnRpZicgYXMgSWRWYXJpYWJsZV09PTIgfHxyZXNwdWVzdGFzWydyZXNpZF9ob2cnIGFzIElkVmFyaWFibGVdPT0yfHxyZXNwdWVzdGFzWydjb250YWN0JyBhcyBJZFZhcmlhYmxlXT09Mil7XHJcbiAgICAgICAgICAgIGNvZFJlYSA9IDI7XHJcbiAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHZhciByZWFoczogbnVtYmVyW109W10gO1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc0hzID0gcmVzcHVlc3Rhc1snaG9nYXJlcyddO1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSCBvZiByZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFoOm51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWM6bnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydlbnRyZWEnIF0gIT0gMXx8cmVzcHVlc3Rhc0hbJ3ByZWp1ZTEnXT09Mnx8cmVzcHVlc3Rhc0hbJ3RwJ109PTApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFoPTI7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjPXJlc3B1ZXN0YXNIWydjcl9udW1fbWllbWJybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydwZXJzb25hcyddICYmIHJlc3B1ZXN0YXNILnBlcnNvbmFzW3NlbGVjLTFdICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc1AgPSByZXNwdWVzdGFzSC5wZXJzb25hc1tzZWxlYy0xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwX2VudHJlYV9pbmQgPSByZXNwdWVzdGFzUFsnZW50cmVhaW5kJyBhcyBJZFZhcmlhYmxlIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwX2VudHJlYV9pbmQ9PW51bGwpeyAvL3F1ZXJlbW9zIGNvbnRlbXBsYXIgZWwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhaCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoID0gTnVtYmVyKHJlc3BfZW50cmVhX2luZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhaCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhaHMucHVzaChyZWFoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZWFocy5ldmVyeShyaD0+cmg9PTEpKXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlYWhzLmV2ZXJ5KHJoPT5yaD09Mikpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYSA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlYWhzLmV2ZXJ5KHJoPT5yaD09MXx8cmg9PTMpKXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvZFJlYSA9IDM7XHJcbiAgICAgICAgICAgICAgICBlc1JlYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7Y29kUmVhLGVzUmVhfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhU3VwOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSIFxyXG4gICAgICAgIHZhciBlc1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjb2RSZWFTdXA6bnVtYmVyfG51bGw9IG51bGw7XHJcbiAgICAgICAgaWYoIXJlc3B1ZXN0YXNbJ2NvbmZpcl90ZWxfc3VwJyBhcyBJZFZhcmlhYmxlXSAmJiAhcmVzcHVlc3Rhc1snc3AxYScgYXMgSWRWYXJpYWJsZV0pe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NvZFJlYVN1cCwgZXNSZWFTdXB9XHJcbiAgICAgICAgfWVsc2UgaWYoIHJlc3B1ZXN0YXNbJ2NvbmZpcl90ZWxfc3VwJyBhcyBJZFZhcmlhYmxlXT09MiB8fCByZXNwdWVzdGFzWydjb25maXJfZG9tX3N1cCcgYXMgSWRWYXJpYWJsZV09PTJ8fHJlc3B1ZXN0YXNbJ3NwMWEnIGFzIElkVmFyaWFibGVdPT0yIHx8cmVzcHVlc3Rhc1snc3AxYicgYXMgSWRWYXJpYWJsZV09PTJ8fHJlc3B1ZXN0YXNbJ3NwMWMnIGFzIElkVmFyaWFibGVdPT0yKXtcclxuICAgICAgICAgICAgY29kUmVhU3VwID0gMjtcclxuICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdmFyIHJlYWhzOiBudW1iZXJbXT1bXSA7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGFzSHMgPSByZXNwdWVzdGFzWydob2dhcmVzX3N1cCddO1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSCBvZiByZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFoOm51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWM6bnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydlbnRyZWFfc3VwJyBdID09IDJ8fHJlc3B1ZXN0YXNIWydzcHIxX3N1cCddPT0yfHxyZXNwdWVzdGFzSFsnc3A0J109PTN8fHJlc3B1ZXN0YXNIWyd0b3RhbF9yYW5nb19zdXAnXT09MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWg9MjtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcHVlc3Rhc0hbJ2VudHJlYV9zdXAnIF0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoPTM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZWFocy5wdXNoKHJlYWgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWhzLmV2ZXJ5KHJoPT5yaD09MSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYocmVhaHMuZXZlcnkocmg9PnJoPT0yKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kUmVhU3VwID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBlc1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYocmVhaHMuZXZlcnkocmg9PnJoPT0xfHxyaD09Mykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICAgICAgY29kUmVhU3VwID0gMztcclxuICAgICAgICAgICAgICAgIGVzUmVhU3VwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtjb2RSZWFTdXAsZXNSZWFTdXB9XHJcbiAgICB9LFxyXG4gICAgVUFwcmluY2lwYWw6JycgYXMgSWRVbmlkYWRBbmFsaXNpcyxcclxuICAgIGRlZlVBOnt9IGFzIHtbaSBpbiBJZFVuaWRhZEFuYWxpc2lzXTp7cGs6SWRWYXJpYWJsZSwgaW5jbHVpZGFzOklkVW5pZGFkQW5hbGlzaXNbXSwgaWRzRm9yOklkRm9ybXVsYXJpb1tdfX0sXHJcbiAgICBkZWZGb3I6e30gYXMge1tmIGluIElkRm9ybXVsYXJpb106ey8qYXJib2xVQTpJZFVuaWRhZEFuYWxpc2lzW10sICovIGhlcm1hbm8/OnRydWV9fVxyXG59XHJcbi8vLy8vIEFCQUpPIGRlIGVzdGEgbMOtbmVhIG5vIHB1ZWRlIGhhYmVyIG90cm9zIG5vbWJyZXMgZGUgdmFyaWFibGVzIG8gZm9ybXVsYXJpb3MgbyBjYXNpbGxlcm9zIGVuIGdlbmVyYWxcclxuXHJcbi8vIFRPRE86IEdFTkVSQUxJWkFSXHJcbnR5cGUgUGVyc29uYT17cDE6c3RyaW5nLCBwMjpudW1iZXIsIHAzOm51bWJlciwgcDQ6bnVtYmVyfG51bGwsIHA1OjF8bnVsbCwgcDY6MXxudWxsfVxyXG5cclxuZnVuY3Rpb24gbnVtKG51bTpudW1iZXJ8c3RyaW5nfG51bGwpOm51bWJlcntcclxuICAgIC8vQHRzLWlnbm9yZSBsYSBncmFjaWEgZXMgbWV0ZXIgbnVtIGN1YW5kbyBlcyBzdHJpbmdcclxuICAgIGlmKGlzTmFOKG51bS0wKSkgcmV0dXJuIDA7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICByZXR1cm4gbnVtLTA7XHJcbn1cclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6e1trIGluIHN0cmluZ106Ym9vbGVhbn0gPSB7fVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmaWNhclNvcnRlbyhvcHRzOntcclxuICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sIFxyXG4gICAgcmVzcHVlc3RhczpSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6XHJcbiAgICBmb3JQazpGb3JQayxcclxuICAgIHZhcmlhYmxlQWN0dWFsOklkVmFyaWFibGVcclxuXHJcbn0pe1xyXG4gICAgY29uc3QgcmVzZXRlYXJTb3J0ZW8gPSAob3B0czp7cmVzcHVlc3RhczpSZXNwdWVzdGFzfSk9PntcclxuICAgICAgICB2YXIge3Jlc3B1ZXN0YXN9ID0gb3B0cztcclxuICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8ucmVzdWx0YWRvXT1udWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF9zb3J0ZWFibGVzXT1udWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9IG51bGw7XHJcbiAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKT0+cmVzcHVlc3Rhc1ttb3N0cmFyLnRhcmdldF09bnVsbCk7XHJcbiAgICAgICAgaWYoJ3Zhcl9sZXRyYScgaW4gY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8pe1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSAmJiByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgICAgIGZvcih2YXIgcGVyIG9mIHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdKXtcclxuICAgICAgICAgICAgICAgICAgICBwZXJbY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udmFyX2xldHJhXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHtjb25maWd1cmFjaW9uU29ydGVvLCB2YXJpYWJsZUFjdHVhbCwgcmVzcHVlc3RhcywgZm9yUGssIHJlc3B1ZXN0YXNSYWl6fSA9IG9wdHM7XHJcbiAgICB2YXIgaWRFbmMgPSBmb3JQay52aXZpZW5kYSE7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXNBdW1lbnRhZGFzfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSk7XHJcbiAgICB2YXIgZXhwcl9pbmNvbXBsZXRpdHVkX2Z1biA9IGdldEZ1bmNpb25IYWJpbGl0YXIoY29uZmlndXJhY2lvblNvcnRlby5leHByX2luY29tcGxldGl0dWRfanNbcmVzcHVlc3Rhc0F1bWVudGFkYXMudmRvbWluaW9dLmV4cHIpO1xyXG4gICAgdmFyIGZpbHRyb19mdW4gPSAgZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmZpbHRyb19qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pb10uZXhwcik7XHJcbiAgICB2YXIgdW5pZGFkQW5hbGlzaXMgPSBjb25maWd1cmFjaW9uU29ydGVvLnVuaWRhZF9hbmFsaXNpcztcclxuXHJcbiAgICBpZihjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtZXRyb3MuaW5jbHVkZXModmFyaWFibGVBY3R1YWwpKXtcclxuICAgICAgICB2YXIgdWFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PnVhLnVuaWRhZF9hbmFsaXNpcz09dW5pZGFkQW5hbGlzaXMpPy5wYWRyZTtcclxuICAgICAgICB2YXIgcGtBZ3JlZ2FkYVBhZHJlID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKT0+dWEudW5pZGFkX2FuYWxpc2lzPT11YVBhZHJlKT8ucGtfYWdyZWdhZGFcclxuICAgICAgICBpZih1YVBhZHJlICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdKXtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIHBrQWdyZWdhZGFQYWRyZSBleGlzdGUgZSBpbmRpY2EgbGEgcG9zaWNpb24gZGVsIHBhZHJlXHJcbiAgICAgICAgICAgIHZhciBwYWRyZSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdW051bWJlcihyZXNwdWVzdGFzQXVtZW50YWRhc1twa0FncmVnYWRhUGFkcmVdKS0xXTtcclxuICAgICAgICAgICAgaWYodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCl7XHJcbiAgICAgICAgICAgICAgICBwYWRyZVtjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXT1wYWRyZVt1bmlkYWRBbmFsaXNpc10ubGVuZ3RoOyAvL3NpIGFncmVnYSBkZXNkZSBib3RvbiBhZ3JlZ2FyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzZXRlYXJTb3J0ZW8oe3Jlc3B1ZXN0YXM6cGFkcmV9KTtcclxuICAgICAgICAgICAgcmVzcHVlc3RhcyA9IHBhZHJlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdICE9IG51bGwpe1xyXG4gICAgICAgIGlmKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdIGluc3RhbmNlb2YgQXJyYXkpe1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gYXMgUmVzcHVlc3Rhc1tdXHJcbiAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSE9MSl7XHJcbiAgICAgICAgICAgICAgICBpZihyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl09PTIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF09cmVzcHVlc3Rhc1VBLmxlbmd0aCArIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHtyZXNwdWVzdGFzfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkVG90YWwgPSBOdW1iZXIocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSk7XHJcbiAgICAgICAgICAgIGlmKGNhbnRpZGFkVG90YWw8cmVzcHVlc3Rhc1VBLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2JsZSBhc2lnbmFjacOzbiBwYXJhIHF1ZSBsbyBjYXJndWUgZW4gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1VBLmZpbHRlcigocCxpKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbWV0cm9zLnNvbWUoKHBhcmFtKT0+cFtwYXJhbV0gfHwgaSA8PSBjYW50aWRhZFRvdGFsLTEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gPSByZXNwdWVzdGFzVUFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZShjYW50aWRhZFRvdGFsPnJlc3B1ZXN0YXNVQS5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLnB1c2goe30gYXMgUmVzcHVlc3RhcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmluY29tcGxldGFzXSA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocD0+ZXhwcl9pbmNvbXBsZXRpdHVkX2Z1bihwKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdPT0xICYmXHJcbiAgICAgICAgICAgICAgICAhcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gJiZcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc109PTBcclxuICAgICAgICAgICAgKXtcclxuICAgICAgICAgICAgICAgIHZhciBzb3J0ZWFyPXJlc3B1ZXN0YXNVQS5maWx0ZXIocD0+ZmlsdHJvX2Z1bihwKSk7XHJcbiAgICAgICAgICAgICAgICBpZihzb3J0ZWFyLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLmZvckVhY2goKHBlciwgaSk9PnBlci4kcDA9aSsxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLm9yZGVuLnB1c2goe3ZhcmlhYmxlOlwiJHAwXCIgYXMgSWRWYXJpYWJsZSwgb3JkZW46MX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlYXIuc29ydChjb21wYXJlRm9yT3JkZXIoY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5tYXAoZWxlbSA9PiAoe2NvbHVtbjplbGVtLnZhcmlhYmxlLCBvcmRlcjplbGVtLm9yZGVufSkpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2ljaW9uU29ydGVhZGEgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZ3VyYWNpb25Tb3J0ZW8ubWV0b2RvPT0naGFzaCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05PIElNUExFTUVOVEFETycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKnBvc2ljaW9uU29ydGVhZGE9KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udmFyX2NvZWYucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3VtLCBwYWlyKT0+c3VtICsgZGF0b3NWaXZpZW5kYS50ZW1bcGFpci52YXJdICogcGFpci5jb2VmKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICUgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8uZGl2aXNvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICApICUgc29ydGVhci5sZW5ndGgqL1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmEgPSAnQSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhckxldHJhOklkVmFyaWFibGUgPSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfbGV0cmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgcGVyc29uYSBvZiBzb3J0ZWFyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5maW5kKChfcGVyLGkpPT5pPT1wZXJzb25hLiRwMC0xKSFbdmFyTGV0cmFdID0gbGV0cmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hW3ZhckxldHJhXT1sZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHJhID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXRyYS5jaGFyQ29kZUF0KDApKzEpOyAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsYUFsZWF0b3JpYU1pZW1icm9zID0gY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udGFibGEubWFwKChsaXN0YSk9Pmxpc3RhLnNwbGl0KCcnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0byA9IGlkRW5jICUgMTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5hVGFibGFBbGVhdG9yaWEgPSByZXN0bz9yZXN0byAtIDE6OTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc29ydGVhci5sZW5ndGggPiB0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWFyLnNwbGljZSh0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkgLy9kZXNjYXJ0byBjYW5kaWRhdG9zIHNpIHNvbiBtw6FzIHF1ZSBsbyBxdWUgcGVybWl0ZSBsYSB0YWJsYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxhVGFibGFBbGVhdG9yaWEgPSBzb3J0ZWFyLmxlbmd0aCAtIDEgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmFTZWxlY2Npb25hZGEgPSB0YWJsYUFsZWF0b3JpYU1pZW1icm9zW2ZpbGFUYWJsYUFsZWF0b3JpYV1bY29sdW1uYVRhYmxhQWxlYXRvcmlhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaWNpb25Tb3J0ZWFkYSA9IHJlc3B1ZXN0YXNVQS5maW5kSW5kZXgoKHA6UmVzcHVlc3Rhcyk9PnBbdmFyTGV0cmFdPT1sZXRyYVNlbGVjY2lvbmFkYSkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8ucmVzdWx0YWRvXT1wb3NpY2lvblNvcnRlYWRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc109c29ydGVhci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8uc29ydGVhZG9fbW9zdHJhcj8uZm9yRWFjaCgobW9zdHJhcik9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1ttb3N0cmFyLnRhcmdldF09cmVzcHVlc3Rhc1VBW3Jlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dIGFzIG51bWJlciAtMV1bbW9zdHJhci5zb3VyY2VdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc109MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdPSByZXNwdWVzdGFzVUEubGVuZ3RoIHx8IG51bGw7IC8vbm8gcXVlcmVtb3MgZWwgdmFsb3IgMFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQV09J29rJztcclxuICAgICAgICAgICAgaWYoY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWxdPSdvayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhcmlhYmxlc0NhbGN1bGFkYXMocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazpGb3JQayl7XHJcbiAgICBpZihlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKXtcclxuICAgICAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKHJlc3B1ZXN0YXNSYWl6LCBmb3JQayk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjp7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICBmb3JtdWxhcmlvczp7IFtub21icmVGb3JtdWxhcmlvIGluIElkRm9ybXVsYXJpb106SW5mb0Zvcm11bGFyaW8gfSwgXHJcbiAgICByZXNwdWVzdGFzOlJlc3B1ZXN0YXMsIFxyXG4gICAgVUE6SWRVbmlkYWRBbmFsaXNpcywgXHJcbiAgICBmb3JQazpGb3JQayxcclxuICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzOlJlc3B1ZXN0YXMsIC8vIGluY2x1eWVuIGxhIGRlIHRvZG9zIGxvcyBwYWRyZXMgeSBhbnNlc3Ryb3MsXHJcbiAgICByZXNwdWVzdGFzUGFkcmU6UmVzcHVlc3Rhc3xudWxsLCBcclxuICAgIG9wdHM6T3BjaW9uZXNSb3dWYWxpZGF0b3IsXHJcbil7XHJcbiAgICAvLyByZWNvcnJpZW5kIFVBIHBlcnNvbmFzIHkgbWFzY290YXNcclxuICAgIGZvcih2YXIgVUFpbmNsdWlkYSBvZiBkZWZPcGVyYXRpdm8uZGVmVUFbVUFdLmluY2x1aWRhcyl7XHJcbiAgICAgICAgdmFyIHBrTnVldmEgPSBkZWZPcGVyYXRpdm8uZGVmVUFbVUFpbmNsdWlkYV0ucGs7XHJcbiAgICAgICAgdmFyIGNvbmp1bnRvUmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1tVQWluY2x1aWRhXTtcclxuICAgICAgICBsaWtlQXIoY29uanVudG9SZXNwdWVzdGFzVUEpLmZvckVhY2goKHJlc3B1ZXN0YXNIaWpvLCB2YWxvclBrT1Bvc2ljaW9uKT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhcclxuICAgICAgICAgICAgICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yLCBcclxuICAgICAgICAgICAgICAgIGZvcm11bGFyaW9zLCBcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNIaWpvLCBcclxuICAgICAgICAgICAgICAgIFVBaW5jbHVpZGEsIFxyXG4gICAgICAgICAgICAgICAgey4uLmZvclBrLCBbcGtOdWV2YV06dmFsb3JQa30sXHJcbiAgICAgICAgICAgICAgICB7Li4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXNIaWpvLCBbcGtOdWV2YV06dmFsb3JQa30sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyBTMSAsIEExXHJcbiAgICBmb3IodmFyIGVzSGVybWFubyBvZiBbdHJ1ZSwgZmFsc2VdKXtcclxuICAgICAgICBmb3IodmFyIGZvcm11bGFyaW8gb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pZHNGb3IpIGlmKCEhZXNIZXJtYW5vID09ICEhZGVmT3BlcmF0aXZvLmRlZkZvcltmb3JtdWxhcmlvXS5oZXJtYW5vKXtcclxuICAgICAgICAgICAgdmFyIHBsYWluRm9yUGs6UGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayh7Li4uZm9yUGssIGZvcm11bGFyaW99KVxyXG4gICAgICAgICAgICB2YXIgbWF4UGFzb3NBdXRvaW5ncmVzYWRhcyA9IDEwO1xyXG4gICAgICAgICAgICB2YXIgdmFyQXV0b0luZ3Jlc2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZG97XHJcbiAgICAgICAgICAgICAgICB2YXIgaHVib0F1dG9pbmdyZXNvcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa109XHJcbiAgICAgICAgICAgICAgICAgICAgcm93VmFsaWRhdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWFyY2FGaW46J2ZpbicsIC4uLmZvcm11bGFyaW9zW2Zvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3J9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB2YXIge3Jlc3VtZW4sIGF1dG9JbmdyZXNhZGFzfSA9IGZlZWRiYWNrUm93VmFsaWRhdG9yW3BsYWluRm9yUGtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhck5hbWU6SWRWYXJpYWJsZTtcclxuICAgICAgICAgICAgICAgIGlmKGF1dG9JbmdyZXNhZGFzIT1udWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IodmFyTmFtZSBpbiBhdXRvSW5ncmVzYWRhcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1iaW8gPSByZXNwdWVzdGFzW3Zhck5hbWVdICE9PSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FtYmlvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbdmFyTmFtZV0gPSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3Zhck5hbWVdID0gYXV0b0luZ3Jlc2FkYXNbdmFyTmFtZV0gYXMgVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJBdXRvSW5ncmVzYWRhcy5wdXNoKHZhck5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVib0F1dG9pbmdyZXNvcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUoaHVib0F1dG9pbmdyZXNvcyAmJiBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzLS0+MCk7XHJcbiAgICAgICAgICAgIHZhckF1dG9JbmdyZXNhZGFzLmZvckVhY2godmFybmFtZT0+e1xyXG4gICAgICAgICAgICAgICAgLy8gZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa10uZXN0YWRvc1t2YXJuYW1lIGFzIElkVmFyaWFibGVdID0gJ2FjdHVhbCc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBCRl92YXJuYW1lID0gJyRCLicrZm9ybXVsYXJpbyBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIHZhciBmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGEgPSBnZXRNYWluRm9ybUZvclZpdmllbmRhKGZvclBrLnZpdmllbmRhISk7XHJcbiAgICAgICAgICAgIGlmKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gaGF5IGNvbmZpZ3VyYWNpb24gZGUgc29ydGVvIHBhcmEgZWwgZm9ybXVsYXJpbyAke2Zvcm1QcmluY2lwYWxGb3JWaXZpZW5kYX1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5jb25maWdTb3J0ZW8gJiYgZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZm9ybVByaW5jaXBhbEZvclZpdmllbmRhXTtcclxuICAgICAgICAgICAgdmFyIHJlc3VtZW5Pck51bGwgPSBcclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiZcclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWwgJiYgXHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsID09IEJGX3Zhcm5hbWU/XHJcbiAgICAgICAgICAgICAgICAgICAgJ29rJ1xyXG4gICAgICAgICAgICAgICAgOnJlc3VtZW4gPT0gJ3ZhY2lvJyA/IFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGxcclxuICAgICAgICAgICAgICAgIDpyZXN1bWVuXHJcbiAgICAgICAgICAgIGlmKGVzSGVybWFubyl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbDtcclxuICAgICAgICAgICAgfWVsc2UgaWYocmVzcHVlc3Rhc1BhZHJlICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1BhZHJlW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlck9yU3RyaW5nSW5jSWZBcnJheShudW1iZXJPclN0cmluZzpudW1iZXJ8c3RyaW5nLCBvYmplY3Q6b2JqZWN0fGFueVtdKToobnVtYmVyfHN0cmluZyl7XHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGVzdG95IHVzYW5kbyBpc05hTiBwYXJhIHZlciBzaSBlcyBvIG5vIHVuIG7Dum1lcm8gc3VtYWJsZVxyXG4gICAgaWYoaXNOYU4obnVtYmVyT3JTdHJpbmcpKXtcclxuICAgICAgICByZXR1cm4gbnVtYmVyT3JTdHJpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKG51bWJlck9yU3RyaW5nKSsob2JqZWN0IGluc3RhbmNlb2YgQXJyYXk/MTowKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBnZXRNYWluRm9ybUZvclZpdmllbmRhID0gKHZpdmllbmRhOm51bWJlcik6SWRGb3JtdWxhcmlvPT57XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgdml2aWVuZGEgZXMgZWwgcGFyYW1ldHJvIGNvcnJlY3RvXHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhLm1haW5fZm9ybVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKXtcclxuICAgIGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maWx0ZXIodWFEZWY9PiF1YURlZi5wYWRyZSkuZm9yRWFjaCh1YURlZj0+e1xyXG4gICAgICAgIHZhciBlc1ByaW5jaXBhbCA9IChmOkZvcm11bGFyaW8sIGVuYzphbnkpPT4ge1xyXG4gICAgICAgICAgICBsZXQgZm9ybXVsYXJpb1ByaW5jaXBhbCA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZW5jKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm11bGFyaW9QcmluY2lwYWw/Zm9ybXVsYXJpb1ByaW5jaXBhbD09Zi5pZF9jYXNpbGxlcm86Zi5mb3JtdWxhcmlvX3ByaW5jaXBhbFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29uanVudG9SZXNwdWVzdGFzVUEgPSBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW3VhRGVmLnVuaWRhZF9hbmFsaXNpc11cclxuICAgICAgICBiZWluZ0FycmF5KGNvbmp1bnRvUmVzcHVlc3Rhc1VBKS5mb3JFYWNoKChyZXNwdWVzdGFzLCB2YWxvclBrT1Bvc2ljaW9uKT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoZj0+Zi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YURlZi51bmlkYWRfYW5hbGlzaXMgJiYgZXNQcmluY2lwYWwoZi5jYXNpbGxlcm9zLCB2YWxvclBrIGFzIG51bWJlcikpLmZvckVhY2goKF9kZWZGLCBmb3JtdWxhcmlvKT0+e1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvclBrUmFpeiA9IHtmb3JtdWxhcmlvLCBbdWFEZWYucGtfYWdyZWdhZGFdOnZhbG9yUGt9XHJcbiAgICAgICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXMsIGZvclBrUmFpeiwge30pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOnsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIGZvcm11bGFyaW9zOnsgW25vbWJyZUZvcm11bGFyaW8gaW4gSWRGb3JtdWxhcmlvXTpJbmZvRm9ybXVsYXJpbyB9LCBcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LCBcclxuICAgIHJlc3B1ZXN0YXM6UmVzcHVlc3RhcywgXHJcbiAgICBvcHRzOk9wY2lvbmVzUm93VmFsaWRhdG9yXHJcbil7XHJcbiAgICB2YXIgZm9yUGs6Rm9yUGsgPXsuLi5mb3JQa1JhaXp9O1xyXG4gICAgY2FsY3VsYXJGZWVkYmFja1VuaWRhZEFuYWxpc2lzKGZlZWRiYWNrUm93VmFsaWRhdG9yLCBmb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgZGVmT3BlcmF0aXZvLlVBcHJpbmNpcGFsLCBmb3JQaywgcmVzcHVlc3RhcywgbnVsbCwgb3B0cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3RhczogUmVzcHVlc3RhcywgZm9yUGtSYWl6OkZvclBrUmFpeiwgb3B0czpPcGNpb25lc1Jvd1ZhbGlkYXRvcil7XHJcbiAgICB2YXIgcmVzdW1lbkVzdGFkbzpSZXN1bWVuRXN0YWRvO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBQYXJ0aWFsXHJcbiAgICB2YXIgbnVldm9zUm93cyA6IHtbeCBpbiBQbGFpbkZvclBrXTpGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSxJZEZpbj59PXt9XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrRW5jdWVzdGEobnVldm9zUm93cywgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgZm9yUGtSYWl6LCByZXNwdWVzdGFzLCBvcHRzKTtcclxuICAgIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yID0gbGlrZUFyKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKS5maWx0ZXIoKF9mZWVkYmFjazphbnksIHBsYWluUGs6UGxhaW5Gb3JQayk9PkpTT04ucGFyc2UocGxhaW5Qaykudml2aWVuZGEgIT0gZm9yUGtSYWl6LnZpdmllbmRhKS5wbGFpbigpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSB7Li4uZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIC4uLm51ZXZvc1Jvd3N9O1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhcy52aXZpZW5kYXNbZm9yUGtSYWl6LnZpdmllbmRhIV0gPSB7XHJcbiAgICAgICAgLi4uZGF0b3NCeVBhc3MucmVzcHVlc3Rhcy52aXZpZW5kYXNbZm9yUGtSYWl6LnZpdmllbmRhIV0sXHJcbiAgICAgICAgLi4uY2FsY3VsYXJSZXN1bWVuVml2aWVuZGEoXHJcbiAgICAgICAgICAgIGZvclBrUmFpeiwgXHJcbiAgICAgICAgICAgIG51ZXZvc1Jvd3MsXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNcclxuICAgICAgICApXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldEZvcm11bGFyaW9zRm9ySWRWaXZpZW5kYSA9IChpZFZpdmllbmRhOm51bWJlcik9PntcclxuICAgIHZhciBtYWluRm9ybUZvclZpdmllbmRhID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShpZFZpdmllbmRhKTtcclxuICAgIHZhciBmb3Jtc0ZlZWRiYWNrID0gW21haW5Gb3JtRm9yVml2aWVuZGFdO1xyXG4gICAgdmFyIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MgPSAoaWRGb3JtdWxhcmlvOklkRm9ybXVsYXJpbyk9PntcclxuICAgICAgICBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2lkRm9ybXVsYXJpb10uY2FzaWxsZXJvcy5jYXNpbGxlcm9zLmZvckVhY2goKGNhc2lsbGVybyk9PntcclxuICAgICAgICAgICAgaWYoY2FzaWxsZXJvLnRpcG9jID09ICdCRicpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1IaWpvID0gKGNhc2lsbGVyby5zYWx0bz8uc3RhcnRzV2l0aCgnRjonKT9jYXNpbGxlcm8uc2FsdG86J0Y6JyArIGNhc2lsbGVyby5zYWx0bykgYXMgSWRGb3JtdWxhcmlvO1xyXG4gICAgICAgICAgICAgICAgaWYoZm9ybUhpam8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1zRmVlZGJhY2sucHVzaChmb3JtSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhmb3JtSGlqbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhtYWluRm9ybUZvclZpdmllbmRhKTtcclxuICAgIHJldHVybiBmb3Jtc0ZlZWRiYWNrO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyQWN0dWFsQkYgPSAoY29uZmlnU29ydGVvRm9ybXVsYXJpbzpDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpb3xudWxsLCBudW1FbGVtZW50b1VBOiBudW1iZXIsIG51bUFjdHVhbDpudW1iZXJ8bnVsbCwgZm9ybXVsYXJpbzpJZEZvcm11bGFyaW8sIHI6UmVzcHVlc3Rhcyk9PlxyXG4gICAgISEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJiBcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsICYmXHJcbiAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvXHJcbiAgICA/IFxyXG4gICAgICAgIG51bUVsZW1lbnRvVUEgPT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgIHJbY29uZmlnU29ydGVvRm9ybXVsYXJpby5yZXN1bHRhZG9fbWFudWFsXSxcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICApXHJcbiAgICA6XHJcbiAgICAgICAgbnVtQWN0dWFsID09IG51bUVsZW1lbnRvVUFcclxuICAgIClcclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJEaXNhYmxlZEJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW98bnVsbCwgbnVtRWxlbWVudG9VQTogbnVtYmVyLCBmb3JtdWxhcmlvOklkRm9ybXVsYXJpbywgcjpSZXNwdWVzdGFzKT0+XHJcbiAgICAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmIFxyXG4gICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbyAmJlxyXG4gICAgbnVtRWxlbWVudG9VQSAhPSBjb2FsZXNjZShcclxuICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvX21hbnVhbF0sXHJcbiAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICkpXHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyUGVybWl0ZUJvcnJhckJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW98bnVsbCwgZm9ybXVsYXJpbzpJZEZvcm11bGFyaW8pPT5cclxuICAgICEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJiBcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW8pXHJcblxyXG50eXBlIFJlc3VsdGFkb1Jlc3VtZW4gPSB7XHJcbiAgICByZXN1bWVuRXN0YWRvOlJlc3VtZW5Fc3RhZG8sXHJcbiAgICByZXN1bWVuRXN0YWRvU3VwOlJlc3VtZW5Fc3RhZG8sXHJcbiAgICBjb2RSZWE6bnVtYmVyfG51bGwsXHJcbiAgICBjb2ROb1JlYTpzdHJpbmd8bnVsbCxcclxuICAgIGNvZFJlYVN1cDpudW1iZXJ8bnVsbFxyXG4gICAgY29kTm9SZWFTdXA6c3RyaW5nfG51bGwsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgIGZvclBrUmFpejpGb3JQa1JhaXosIFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6e1tmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+fSwgXHJcbiAgICByZXNwdWVzdGFzOlJlc3B1ZXN0YXNcclxuKTpSZXN1bHRhZG9SZXN1bWVue1xyXG4gICAgdmFyIHtjb2RSZWEsIGVzUmVhfSA9IGRlZk9wZXJhdGl2by5lc1JlYWxpemFkYShyZXNwdWVzdGFzKVxyXG4gICAgdmFyIHtjb2ROb1JlYSwgZXNOb1JlYX0gPSBkZWZPcGVyYXRpdm8uZXNOb3JlYShyZXNwdWVzdGFzKVxyXG4gICAgdmFyIHtjb2RSZWFTdXAsZXNSZWFTdXB9ID0gZGVmT3BlcmF0aXZvLmVzUmVhbGl6YWRhU3VwKHJlc3B1ZXN0YXMpXHJcbiAgICB2YXIge2NvZE5vUmVhU3VwLCBlc05vUmVhU3VwfSA9IGRlZk9wZXJhdGl2by5lc05vcmVhU3VwKHJlc3B1ZXN0YXMpXHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IGdldEZvcm11bGFyaW9zRm9ySWRWaXZpZW5kYShmb3JQa1JhaXoudml2aWVuZGEhKTtcclxuICAgIHZhciBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmIGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvW2dldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtSYWl6LnZpdmllbmRhISldXHJcbiAgICB2YXIgZmVlZEJhY2tWaXZpZW5kYSA9IGxpa2VBcihmZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfcm93LCBwbGFpblBrKT0+e1xyXG4gICAgICAgIHZhciB0aWVuZUluZGl2aWR1YWwgPSBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyAmJiAhIShjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgJiYgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSlcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwbGFpblBrKS52aXZpZW5kYT09Zm9yUGtSYWl6LnZpdmllbmRhICYmIFxyXG4gICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLmluY2x1ZGVzKEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbykgJiZcclxuICAgICAgICAgICAgKHRpZW5lSW5kaXZpZHVhbD9cclxuICAgICAgICAgICAgICAgICFjYWxjdWxhckRpc2FibGVkQkYoXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sIFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykucGVyc29uYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLCBcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLmhvZ2FyP3Jlc3B1ZXN0YXNGb3JQayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpdmllbmRhOmZvclBrUmFpei52aXZpZW5kYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFyaW86Y29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyOkpTT04ucGFyc2UocGxhaW5QaykuaG9nYXIgXHJcbiAgICAgICAgICAgICAgICAgICAgfSkucmVzcHVlc3Rhczp7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDp0cnVlKVxyXG4gICAgfSkuYXJyYXkoKTtcclxuICAgIHZhciBwcmlvcmlkYWRlczp7W2tleSBpbiBSZXN1bWVuRXN0YWRvXToge3ByaW9yaWRhZDpudW1iZXIsIGNhbnRpZGFkOm51bWJlcn19ID0ge1xyXG4gICAgICAgICdubyByZWEnOntwcmlvcmlkYWQ6IDEsIGNhbnRpZGFkOjB9LFxyXG4gICAgICAgICdjb24gcHJvYmxlbWFzJzp7cHJpb3JpZGFkOiAyLCBjYW50aWRhZDowfSxcclxuICAgICAgICAnaW5jb21wbGV0byc6e3ByaW9yaWRhZDogMywgY2FudGlkYWQ6MH0sXHJcbiAgICAgICAgJ3ZhY2lvJzp7cHJpb3JpZGFkOiA0LCBjYW50aWRhZDowfSxcclxuICAgICAgICAnY2l0YSBwYWN0YWRhJzp7cHJpb3JpZGFkOiA1LCBjYW50aWRhZDowfSxcclxuICAgICAgICAnb2snOntwcmlvcmlkYWQ6IDYsIGNhbnRpZGFkOjB9XHJcbiAgICB9XHJcbiAgICB2YXIgbWluID0gNjtcclxuICAgIHZhciBtaW5SZXN1bWVuOiBSZXN1bWVuRXN0YWRvID0gJ29rJztcclxuICAgIGZvcih2YXIgZmVlZGJhY2sgb2YgZmVlZEJhY2tWaXZpZW5kYSl7XHJcbiAgICAgICAgdmFyIHJlc3VtZW4gPSBmZWVkYmFjay5yZXN1bWVuO1xyXG4gICAgICAgIHByaW9yaWRhZGVzW3Jlc3VtZW5dLmNhbnRpZGFkKys7XHJcbiAgICAgICAgaWYocHJpb3JpZGFkZXNbcmVzdW1lbl0ucHJpb3JpZGFkPG1pbil7XHJcbiAgICAgICAgICAgIG1pbj1wcmlvcmlkYWRlc1tyZXN1bWVuXS5wcmlvcmlkYWQ7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49cmVzdW1lbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihtaW5SZXN1bWVuPT0ndmFjaW8nJiYgcHJpb3JpZGFkZXNbJ29rJ10uY2FudGlkYWQgfHwgbWluUmVzdW1lbj09J2luY29tcGxldG8nKXtcclxuICAgICAgICBpZihmYWxzZSAvKnJlc3B1ZXN0YXNbc3AxXT09MiAmJiByZXNwdWVzdGFzW3NwNl09PW51bGwqLyl7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49J2NpdGEgcGFjdGFkYSc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49J2luY29tcGxldG8nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9UT0RPIEFSUkVHTEFSIEVTVEUgSE9SUk9SLCBHRU5FUkFMSVpBUlxyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6LnZpdmllbmRhIGFzIHVua25vd24gYXMgSWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG86UmVzdW1lbkVzdGFkbztcclxuICAgIHZhciByZXN1bWVuRXN0YWRvU3VwOlJlc3VtZW5Fc3RhZG87XHJcbiAgICBpZih0YXJlYT09J3N1cGUnKXtcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwID0gZXNOb1JlYVN1cD8nbm8gcmVhJzptaW5SZXN1bWVuXHJcbiAgICAgICAgLy9wYXJhIHF1ZSBjb2xvcmVlIGJpZW4gZW4gbGEgaGRyIGRlbCBETSAobHVlZ28gZW4gYmJkZCBubyBzZSBndWFyZGEpXHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyA9IHJlc3VtZW5Fc3RhZG9TdXBcclxuICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSBlc05vUmVhPydubyByZWEnOm1pblJlc3VtZW5cclxuICAgIH1cclxuICAgIHZhciByZXN1bHRhZG86UmVzdWx0YWRvUmVzdW1lbiA9IHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG9TdXAsXHJcbiAgICAgICAgY29kUmVhLFxyXG4gICAgICAgIGNvZE5vUmVhLFxyXG4gICAgICAgIGNvZFJlYVN1cCxcclxuICAgICAgICBjb2ROb1JlYVN1cFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdGFkb1xyXG59XHJcbiJdfQ==