dmencu 0.3.34 → 0.3.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/client/client.d.ts +1 -1
- package/dist/client/client/client.js +540 -539
- package/dist/client/client/menu.js +2 -2
- package/dist/client/unlogged/abrir-formulario.d.ts +12 -12
- package/dist/client/unlogged/abrir-formulario.js +102 -102
- package/dist/client/unlogged/bypass-formulario.d.ts +200 -200
- package/dist/client/unlogged/bypass-formulario.js +1041 -1041
- package/dist/client/unlogged/redux-formulario.d.ts +349 -349
- package/dist/client/unlogged/redux-formulario.js +317 -317
- package/dist/client/unlogged/tipos.d.ts +469 -469
- package/dist/client/unlogged/tipos.js +21 -21
- package/dist/server/server/app-dmencu.d.ts +1511 -1511
- package/dist/server/server/app-dmencu.js +649 -649
- package/dist/server/server/def-config.d.ts +1 -1
- package/dist/server/server/def-config.js +14 -14
- package/dist/server/server/procedures-dmencu.d.ts +6 -6
- package/dist/server/server/procedures-dmencu.js +854 -854
- package/dist/server/server/server-dmencu.d.ts +1 -1
- package/dist/server/server/server-dmencu.js +20 -20
- package/dist/server/server/table-acciones.d.ts +3 -3
- package/dist/server/server/table-acciones.js +53 -53
- package/dist/server/server/table-areas.d.ts +3 -3
- package/dist/server/server/table-areas.js +88 -88
- package/dist/server/server/table-comunas.d.ts +3 -3
- package/dist/server/server/table-comunas.js +28 -28
- package/dist/server/server/table-control_campo.d.ts +11 -11
- package/dist/server/server/table-control_campo.js +71 -71
- package/dist/server/server/table-control_resumen.d.ts +3 -3
- package/dist/server/server/table-control_resumen.js +18 -18
- package/dist/server/server/table-encuestadores.d.ts +3 -3
- package/dist/server/server/table-encuestadores.js +18 -18
- package/dist/server/server/table-estados.d.ts +3 -3
- package/dist/server/server/table-estados.js +60 -60
- package/dist/server/server/table-estados_acciones.d.ts +3 -3
- package/dist/server/server/table-estados_acciones.js +38 -38
- package/dist/server/server/table-hogares.d.ts +3 -3
- package/dist/server/server/table-hogares.js +156 -156
- package/dist/server/server/table-hogares_sup.d.ts +3 -3
- package/dist/server/server/table-hogares_sup.js +191 -191
- package/dist/server/server/table-lotes.d.ts +3 -3
- package/dist/server/server/table-lotes.js +35 -35
- package/dist/server/server/table-mis_encuestadores.d.ts +3 -3
- package/dist/server/server/table-mis_encuestadores.js +56 -56
- package/dist/server/server/table-mis_tareas.d.ts +3 -3
- package/dist/server/server/table-mis_tareas.js +18 -18
- package/dist/server/server/table-mis_tareas_areas.d.ts +3 -3
- package/dist/server/server/table-mis_tareas_areas.js +20 -20
- package/dist/server/server/table-no_rea.d.ts +3 -3
- package/dist/server/server/table-no_rea.js +32 -32
- package/dist/server/server/table-no_rea_sup.d.ts +3 -3
- package/dist/server/server/table-no_rea_sup.js +32 -32
- package/dist/server/server/table-operaciones.d.ts +3 -3
- package/dist/server/server/table-operaciones.js +30 -30
- package/dist/server/server/table-parametros.d.ts +3 -3
- package/dist/server/server/table-parametros.js +39 -39
- package/dist/server/server/table-permisos.d.ts +3 -3
- package/dist/server/server/table-permisos.js +31 -31
- package/dist/server/server/table-personal.d.ts +6 -6
- package/dist/server/server/table-personal.js +56 -56
- package/dist/server/server/table-personal_rol.d.ts +3 -3
- package/dist/server/server/table-personal_rol.js +36 -36
- package/dist/server/server/table-personas.d.ts +3 -3
- package/dist/server/server/table-personas.js +448 -448
- package/dist/server/server/table-personas_sup.d.ts +3 -3
- package/dist/server/server/table-personas_sup.js +93 -93
- package/dist/server/server/table-recepcionistas.d.ts +3 -3
- package/dist/server/server/table-recepcionistas.js +18 -18
- package/dist/server/server/table-recuperadores.d.ts +3 -3
- package/dist/server/server/table-recuperadores.js +18 -18
- package/dist/server/server/table-resultados_tarea.d.ts +3 -3
- package/dist/server/server/table-resultados_tarea.js +28 -28
- package/dist/server/server/table-roles.d.ts +3 -3
- package/dist/server/server/table-roles.js +32 -32
- package/dist/server/server/table-roles_permisos.d.ts +3 -3
- package/dist/server/server/table-roles_permisos.js +35 -35
- package/dist/server/server/table-roles_subordinados.d.ts +3 -3
- package/dist/server/server/table-roles_subordinados.js +32 -32
- package/dist/server/server/table-semanas.d.ts +3 -3
- package/dist/server/server/table-semanas.js +34 -34
- package/dist/server/server/table-sincronizaciones.d.ts +3 -3
- package/dist/server/server/table-sincronizaciones.js +30 -30
- package/dist/server/server/table-supervisores.d.ts +3 -3
- package/dist/server/server/table-supervisores.js +18 -18
- package/dist/server/server/table-tareas.d.ts +3 -3
- package/dist/server/server/table-tareas.js +46 -46
- package/dist/server/server/table-tareas_areas.d.ts +3 -3
- package/dist/server/server/table-tareas_areas.js +55 -55
- package/dist/server/server/table-tareas_tem.d.ts +3 -3
- package/dist/server/server/table-tareas_tem.js +104 -105
- package/dist/server/server/table-tareas_tem_asignables.d.ts +1 -1
- package/dist/server/server/table-tareas_tem_asignables.js +5 -5
- package/dist/server/server/table-tareas_tem_recepcion.d.ts +3 -5
- package/dist/server/server/table-tareas_tem_recepcion.js +33 -43
- package/dist/server/server/table-tem.d.ts +3 -3
- package/dist/server/server/table-tem.js +192 -192
- package/dist/server/server/table-tem_asignacion.d.ts +3 -0
- package/dist/server/server/table-tem_asignacion.js +51 -0
- package/dist/server/server/table-tem_recepcion.d.ts +3 -3
- package/dist/server/server/table-tem_recepcion.js +18 -18
- package/dist/server/server/table-usuarios.d.ts +3 -3
- package/dist/server/server/table-usuarios.js +58 -58
- package/dist/server/server/table-visitas.d.ts +3 -3
- package/dist/server/server/table-visitas.js +91 -91
- package/dist/server/server/table-visitas_sup.d.ts +3 -3
- package/dist/server/server/table-visitas_sup.js +91 -91
- package/dist/server/server/table-viviendas.d.ts +3 -3
- package/dist/server/server/table-viviendas.js +299 -299
- package/dist/server/server/types-dmencu.d.ts +24 -24
- package/dist/server/server/types-dmencu.js +32 -32
- package/dist/server/unlogged/tipos.d.ts +469 -469
- package/dist/server/unlogged/tipos.js +21 -21
- package/dist/unlogged/unlogged/abrir-formulario.d.ts +12 -12
- package/dist/unlogged/unlogged/abrir-formulario.js +102 -102
- package/dist/unlogged/unlogged/adapt.js +7 -7
- package/dist/unlogged/unlogged/bypass-formulario.d.ts +200 -200
- package/dist/unlogged/unlogged/bypass-formulario.js +1041 -1041
- package/dist/unlogged/unlogged/redux-formulario.d.ts +349 -349
- package/dist/unlogged/unlogged/redux-formulario.js +317 -317
- package/dist/unlogged/unlogged/render-formulario.d.ts +54 -54
- package/dist/unlogged/unlogged/render-formulario.js +1485 -1485
- package/dist/unlogged/unlogged/render-general.d.ts +126 -126
- package/dist/unlogged/unlogged/render-general.js +184 -184
- package/dist/unlogged/unlogged/tipos.d.ts +469 -469
- package/dist/unlogged/unlogged/tipos.js +21 -21
- package/dist/unlogged/unlogged/unlogged.d.ts +1 -1
- package/dist/unlogged/unlogged/unlogged.js +162 -162
- package/package.json +1 -1
|
@@ -1,1486 +1,1486 @@
|
|
|
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
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
11
|
-
var t = {};
|
|
12
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
13
|
-
t[p] = s[p];
|
|
14
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
15
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
16
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
17
|
-
t[p[i]] = s[p[i]];
|
|
18
|
-
}
|
|
19
|
-
return t;
|
|
20
|
-
};
|
|
21
|
-
(function (factory) {
|
|
22
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
23
|
-
var v = factory(require, exports);
|
|
24
|
-
if (v !== undefined) module.exports = v;
|
|
25
|
-
}
|
|
26
|
-
else if (typeof define === "function" && define.amd) {
|
|
27
|
-
define(["require", "exports", "react", "react-dom", "./render-general", "./tipos", "./bypass-formulario", "./redux-formulario", "react", "react-redux", "like-ar", "best-globals", "cast-error", "@material-ui/core", "./bypass-formulario", "js-to-html"], factory);
|
|
28
|
-
}
|
|
29
|
-
})(function (require, exports) {
|
|
30
|
-
"use strict";
|
|
31
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.setLibreDespliegue = exports.desplegarFormularioActual = exports.dmPantallaInicialSinCarga = exports.PantallaInicial = exports.AppDmEncu = exports.OpenedTabs = exports.BienvenidaDespliegue = exports.ListaTextos = exports.HojaDeRutaDespliegue = exports.DesplegarTem = exports.DesplegarCitaPactadaYSeleccionadoAnteriorTem = exports.DesplegarCitaPactada = exports.DesplegarCarga = exports.DesplegarLineaResumenUAPrincipal = exports.Atributo = void 0;
|
|
33
|
-
const React = require("react");
|
|
34
|
-
const ReactDOM = require("react-dom");
|
|
35
|
-
const render_general_1 = require("./render-general");
|
|
36
|
-
const tipos_1 = require("./tipos");
|
|
37
|
-
const bypass_formulario_1 = require("./bypass-formulario");
|
|
38
|
-
const redux_formulario_1 = require("./redux-formulario");
|
|
39
|
-
const react_1 = require("react");
|
|
40
|
-
const react_redux_1 = require("react-redux");
|
|
41
|
-
const like_ar_1 = require("like-ar");
|
|
42
|
-
const best_globals_1 = require("best-globals");
|
|
43
|
-
const cast_error_1 = require("cast-error");
|
|
44
|
-
const core_1 = require("@material-ui/core");
|
|
45
|
-
const bypass_formulario_2 = require("./bypass-formulario");
|
|
46
|
-
const js_to_html_1 = require("js-to-html");
|
|
47
|
-
function breakeableText(text, diccionario) {
|
|
48
|
-
if (typeof text != "string")
|
|
49
|
-
return undefined;
|
|
50
|
-
text = text.replace(/\//g, "/\u2063").replace(/\/\u2063(\w)\b/g, '/$1');
|
|
51
|
-
text = text.replace(/___*/g, (todo) => `[${todo}]`).replace(/\@\w+\@/g, (todo) => `[${todo}]`);
|
|
52
|
-
if (!diccionario || true)
|
|
53
|
-
return text;
|
|
54
|
-
/*
|
|
55
|
-
return <span>{partes.map((parte:string, i:number) => <span style={i%2==1?{textDecoration:"underline"}:{}}> {parte+" "} </span>)}</span>
|
|
56
|
-
*/
|
|
57
|
-
}
|
|
58
|
-
const VER_DOMINIO = false; // el encuestador no necesita ver el dominio en cada encuesta porque el dominio depende del área y se deduce del primer dígito del número de encuesta
|
|
59
|
-
// no poner VER_DOMINIO en true, cambiar por una variable que se fije si el DM está en modo prueba o en modo "diseño conceptual"
|
|
60
|
-
var debeSaltar = false;
|
|
61
|
-
window.addEventListener('load', () => {
|
|
62
|
-
/*
|
|
63
|
-
window.addEventListener('keydown', (ev:KeyboardEvent)=>{
|
|
64
|
-
debeSaltar = ev.key == 'Enter' || ev.keyCode == 13;
|
|
65
|
-
})
|
|
66
|
-
*/
|
|
67
|
-
window.addEventListener('click', () => {
|
|
68
|
-
debeSaltar = false;
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
var LibreDespliegue;
|
|
72
|
-
const Button = (_a) => {
|
|
73
|
-
var { variant, onClick, disabled, children, className, color, size, disableElevation, disableFocusRipple, disableRipple } = _a, other = __rest(_a, ["variant", "onClick", "disabled", "children", "className", "color", "size", "disableElevation", "disableFocusRipple", "disableRipple"]);
|
|
74
|
-
return React.createElement("button", Object.assign({}, other, { className: `btn btn${variant == 'contained' ? '' : '-' + (variant == 'outlined' ? 'outline' : variant)}-${(color == 'default' || color == 'inherit' ? 'secondary' : color == 'secondary' ? 'danger' : color) || 'secondary'} ${className || ''} ${size == 'small' ? 'btn-sm' : ''}`, disabled: disabled, onClick: onClick }), children);
|
|
75
|
-
};
|
|
76
|
-
const Button2 = (_a) => {
|
|
77
|
-
var { variant, onClick, disabled, children, className, color, size } = _a, other = __rest(_a, ["variant", "onClick", "disabled", "children", "className", "color", "size"]);
|
|
78
|
-
return js_to_html_1.html.button(Object.assign(Object.assign({}, other), { class: `btn btn${variant == 'contained' ? '' : '-' + (variant == 'outlined' ? 'outline' : variant)}-${(color == 'default' || color == 'inherit' ? 'secondary' : color == 'secondary' ? 'danger' : color) || 'secondary'} ${className || ''} ${size == 'small' ? 'btn-sm' : ''}`, disabled, $on: { click: onClick } }), children);
|
|
79
|
-
};
|
|
80
|
-
const TextField = (props) => React.createElement("input", { id: props.id, disabled: props.disabled, className: props.className, autoFocus: props.autoFocus, value: props.value, type: props.type, onChange: props.onChange, onFocus: props.onFocus, onBlur: (evt) => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, evt, evt.target.value); }, onKeyDown: props.onKeyDown, placeholder: props.label });
|
|
81
|
-
const Typography = (_a) => {
|
|
82
|
-
var { children } = _a, others = __rest(_a, ["children"]);
|
|
83
|
-
return React.createElement(others.variant || others.component || 'div', others, children);
|
|
84
|
-
};
|
|
85
|
-
function Grid(props) {
|
|
86
|
-
var { container, item, wrap, direction, alignItems, children, className, xs, sm, spacing } = props, other = __rest(props, ["container", "item", "wrap", "direction", "alignItems", "children", "className", "xs", "sm", "spacing"]);
|
|
87
|
-
return React.createElement("div", Object.assign({}, other, { className: `${className || ''} ${xs != null ? 'grid-xs-' + xs : ''} ${sm != null ? 'grid-sm-' + sm : ''}`, style: container ? {
|
|
88
|
-
display: 'flex',
|
|
89
|
-
flexWrap: wrap,
|
|
90
|
-
flexDirection: direction,
|
|
91
|
-
alignItems: alignItems,
|
|
92
|
-
margin: spacing != null ? spacing * 8 + 'px' : undefined
|
|
93
|
-
} : {} }), children);
|
|
94
|
-
}
|
|
95
|
-
var p12 = 'p12';
|
|
96
|
-
var sp2 = 'sp2';
|
|
97
|
-
var sp3 = 'sp3';
|
|
98
|
-
var sp4 = 'sp4';
|
|
99
|
-
var sp5 = 'sp5';
|
|
100
|
-
var diccionario = {};
|
|
101
|
-
/*
|
|
102
|
-
// const takeElementOrDefault<K, T extends [K in], D>()
|
|
103
|
-
function isIn<V, T>(k:keyof T, object:T): object[k] is V{
|
|
104
|
-
return true
|
|
105
|
-
}
|
|
106
|
-
*/
|
|
107
|
-
function takeElementOrDefault(k, object, defaultValue) {
|
|
108
|
-
return k in object ?
|
|
109
|
-
// @ts-expect-error por alguna razón TS no quiere entender que si k está en object, object[k] existe
|
|
110
|
-
object[k]
|
|
111
|
-
: defaultValue;
|
|
112
|
-
}
|
|
113
|
-
function DespliegueEncabezado(props) {
|
|
114
|
-
const forPkNull = {};
|
|
115
|
-
return React.createElement(EncabezadoDespliegue, { casillero: props.casillero, leer: props.leer, forPk: forPkNull });
|
|
116
|
-
}
|
|
117
|
-
function subirHasta(elemento, fun) {
|
|
118
|
-
if (elemento == null)
|
|
119
|
-
return null;
|
|
120
|
-
if (fun(elemento))
|
|
121
|
-
return elemento;
|
|
122
|
-
return subirHasta(elemento.parentElement, fun);
|
|
123
|
-
}
|
|
124
|
-
var elementoConSennialBorrar = null;
|
|
125
|
-
function BotonBorrar({ id, variable, forPk, valorOpcion }) {
|
|
126
|
-
var handleClickBorrar = () => {
|
|
127
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: variable, forPk: forPk });
|
|
128
|
-
};
|
|
129
|
-
return React.createElement("div", { className: "boton-borrar" },
|
|
130
|
-
React.createElement(Button, { id: id, "mi-variable": variable, "valor-opcion": valorOpcion, variant: "outlined", className: "boton-opcion boton-opcion-borrar", onClick: handleClickBorrar },
|
|
131
|
-
React.createElement(render_general_1.ICON.DeleteForever, null)));
|
|
132
|
-
}
|
|
133
|
-
function SaltoDespliegue({ casillero, prefijo }) {
|
|
134
|
-
return casillero.salto ?
|
|
135
|
-
React.createElement("div", { className: "pase" },
|
|
136
|
-
prefijo ? React.createElement("span", { className: "prefijo" },
|
|
137
|
-
prefijo,
|
|
138
|
-
" ") : null,
|
|
139
|
-
React.createElement(render_general_1.ICON.TrendingFlat, null),
|
|
140
|
-
React.createElement("span", null, casillero.salto))
|
|
141
|
-
: null;
|
|
142
|
-
}
|
|
143
|
-
function OpcionDespliegue(props) {
|
|
144
|
-
const { casillero } = props;
|
|
145
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
146
|
-
var saltoAutomatico = (0, react_redux_1.useSelector)((state) => state.opciones.saltoAutomatico);
|
|
147
|
-
var handleClick = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
148
|
-
var _a;
|
|
149
|
-
var container = subirHasta(event.target, elemento => elemento.classList.contains('pregunta') || elemento.classList.contains('multiple')) || document.getElementById('main_layout');
|
|
150
|
-
var tiene = container.getAttribute('estoy-borrando');
|
|
151
|
-
container.setAttribute('estoy-borrando', 'NO');
|
|
152
|
-
if (elementoConSennialBorrar) {
|
|
153
|
-
elementoConSennialBorrar.setAttribute('estoy-borrando', 'NO');
|
|
154
|
-
elementoConSennialBorrar = null;
|
|
155
|
-
}
|
|
156
|
-
var { recentModified, siguienteVariable } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: props.valorOpcion, variable: props.variable, forPk: props.forPk });
|
|
157
|
-
if (!recentModified) {
|
|
158
|
-
container.setAttribute('estoy-borrando', tiene == 'SI' ? 'NO' : 'SI');
|
|
159
|
-
if (tiene != 'SI') {
|
|
160
|
-
elementoConSennialBorrar = container;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
if (siguienteVariable && saltoAutomatico) {
|
|
165
|
-
var botonStyle = (_a = event.target) === null || _a === void 0 ? void 0 : _a.style;
|
|
166
|
-
if (botonStyle)
|
|
167
|
-
botonStyle.color = 'green';
|
|
168
|
-
yield (0, best_globals_1.sleep)(100);
|
|
169
|
-
if (botonStyle)
|
|
170
|
-
botonStyle.color = 'blue';
|
|
171
|
-
yield (0, best_globals_1.sleep)(100);
|
|
172
|
-
if (botonStyle)
|
|
173
|
-
botonStyle.color = 'green';
|
|
174
|
-
yield (0, best_globals_1.sleep)(100);
|
|
175
|
-
if (botonStyle)
|
|
176
|
-
botonStyle.color = '';
|
|
177
|
-
enfocarElementoDeVariable(siguienteVariable);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return React.createElement(Grid, { className: "opcion" },
|
|
182
|
-
props.conBotonBorrar ? React.createElement(BotonBorrar, { id: `opcion-var-${props.variable}-${props.valorOpcion}-borrar`, forPk: props.forPk, variable: props.variable, valorOpcion: props.valorOpcion }) : null,
|
|
183
|
-
React.createElement(Button, { id: `opcion-var-${props.variable}-${props.valorOpcion}`, "mi-variable": props.variable, "valor-opcion": props.valorOpcion, variant: "outlined", className: "boton-opcion boton-opcion-seleccion", onClick: handleClick, tabIndex: -1 },
|
|
184
|
-
React.createElement(Grid, { container: true, wrap: "nowrap" },
|
|
185
|
-
React.createElement(Grid, { className: "id" }, casillero.ver_id || casillero.casillero),
|
|
186
|
-
React.createElement(Grid, { className: "opcion-texto" },
|
|
187
|
-
React.createElement(Typography, { "debe-leer": casillero.leer ? 'SI' : casillero.leer === false ? 'NO' : props.leer ? 'SI' : 'NO' }, breakeableText(casillero.nombre)),
|
|
188
|
-
casillero.aclaracion ?
|
|
189
|
-
React.createElement(Typography, { className: 'aclaracion' }, breakeableText(casillero.aclaracion))
|
|
190
|
-
: null))),
|
|
191
|
-
React.createElement(SaltoDespliegue, { casillero: casillero }));
|
|
192
|
-
}
|
|
193
|
-
function SiNoDespliegue(props) {
|
|
194
|
-
return React.createElement(OpcionesDespliegue, { casilleroConOpciones: props.casilleroConOpciones, forPk: props.forPk, leer: false, despliegueContenido: props.despliegueContenido });
|
|
195
|
-
}
|
|
196
|
-
function registradorDeVariable(pregunta) {
|
|
197
|
-
return (respuestas, feedbackForm, elemento) => {
|
|
198
|
-
var _a;
|
|
199
|
-
var valorActual = pregunta.var_name == null ? null : respuestas[pregunta.var_name];
|
|
200
|
-
var feedbackRow = feedbackForm.feedback;
|
|
201
|
-
var feedbackVar = pregunta.var_name == null ? null : feedbackRow[pregunta.var_name];
|
|
202
|
-
var tieneValor = valorActual != null && feedbackVar != null ? (feedbackVar.conProblema ? 'invalido' : 'valido') : 'NO';
|
|
203
|
-
var estado;
|
|
204
|
-
if (pregunta.tipovar) {
|
|
205
|
-
estado = feedbackVar === null || feedbackVar === void 0 ? void 0 : feedbackVar.estado;
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
var feedbackMulti = pregunta.casilleros.filter(c => c.var_name != null).reduce((pv, om) => {
|
|
209
|
-
var fb = feedbackRow === null || feedbackRow === void 0 ? void 0 : feedbackRow[om.var_name];
|
|
210
|
-
return {
|
|
211
|
-
tieneActual: pv.tieneActual || fb.estado == 'actual',
|
|
212
|
-
estaSalteada: pv.estaSalteada && (fb.estado == 'salteada' || fb.estado == 'fuera_de_flujo_por_salto')
|
|
213
|
-
};
|
|
214
|
-
}, { tieneActual: false, estaSalteada: true });
|
|
215
|
-
estado = feedbackMulti.tieneActual ? 'actual' : feedbackMulti.estaSalteada ? 'salteada' : 'todavia_no';
|
|
216
|
-
}
|
|
217
|
-
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'nuestro-validator', estado);
|
|
218
|
-
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'tiene-valor', tieneValor);
|
|
219
|
-
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'esta-inhabilitada', (feedbackVar === null || feedbackVar === void 0 ? void 0 : feedbackVar.inhabilitada) ? 'SI' : 'NO');
|
|
220
|
-
if (pregunta.var_name) {
|
|
221
|
-
var opciones = Array.prototype.slice.call(elemento.querySelectorAll(`.boton-opcion[mi-variable="${pregunta.var_name}"]`), 0);
|
|
222
|
-
var elementoOpcion;
|
|
223
|
-
for (elementoOpcion of opciones) {
|
|
224
|
-
var valorOpcion = elementoOpcion.getAttribute('valor-opcion');
|
|
225
|
-
(0, bypass_formulario_2.setAttrDistinto)(elementoOpcion, 'opcion-seleccionada', valorOpcion == valorActual ? "SI" : "NO");
|
|
226
|
-
}
|
|
227
|
-
var elementosInput = Array.prototype.slice.call(elemento.querySelectorAll('.variable'));
|
|
228
|
-
var elementoInput;
|
|
229
|
-
for (elementoInput of elementosInput) {
|
|
230
|
-
(0, bypass_formulario_2.setValorDistinto)(elementoInput, 'value', valorActual == null ? '' : valorActual.toString());
|
|
231
|
-
}
|
|
232
|
-
var botonNsNc = document.getElementById("nsnc-pregunta-" + pregunta.var_name);
|
|
233
|
-
(0, bypass_formulario_2.setAttrDistinto)(botonNsNc, 'opcion-seleccionada', valorActual == ((_a = pregunta.valor_ns_nc) !== null && _a !== void 0 ? _a : -9) ? "SI" : "NO");
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
function OpcionMultipleDespliegue(props) {
|
|
238
|
-
var _a;
|
|
239
|
-
const { opcionM } = props;
|
|
240
|
-
var id = `opcionM-${opcionM.id_casillero}`;
|
|
241
|
-
(0, bypass_formulario_2.registrarElemento)({
|
|
242
|
-
id,
|
|
243
|
-
direct: true,
|
|
244
|
-
fun: registradorDeVariable(opcionM)
|
|
245
|
-
});
|
|
246
|
-
return React.createElement(DesplegarCasillero, { id: id, casillero: opcionM, despliegueEncabezado: 'lateral' },
|
|
247
|
-
React.createElement(EncabezadoDespliegue, { casillero: opcionM, verIdGuion: true, leer: opcionM.leer !== false, forPk: props.forPk }),
|
|
248
|
-
React.createElement(SiNoDespliegue, { casilleroConOpciones: opcionM, forPk: props.forPk, despliegueContenido: (_a = props.opcionM.despliegueContenido) !== null && _a !== void 0 ? _a : 'horizontal' }));
|
|
249
|
-
}
|
|
250
|
-
function EncabezadoDespliegue(props) {
|
|
251
|
-
var _a, _b, _c, _d;
|
|
252
|
-
var { casillero, forPk } = props;
|
|
253
|
-
var conCampoOpciones = (0, react_redux_1.useSelector)((state) => state.opciones.conCampoOpciones);
|
|
254
|
-
var handleClickBorrar = () => {
|
|
255
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: casillero.var_name, forPk: forPk });
|
|
256
|
-
};
|
|
257
|
-
var ver_id = (_a = casillero.ver_id) !== null && _a !== void 0 ? _a : casillero.casillero;
|
|
258
|
-
// @ts-ignore no está en todos los casilleros pero acá para el despliegue de metadatos no importa
|
|
259
|
-
var calculada = casillero.calculada;
|
|
260
|
-
var id = `id-div-${casillero.var_name || casillero.casillero}`;
|
|
261
|
-
var idAcciones = "acciones-" + id;
|
|
262
|
-
return React.createElement("div", { className: "encabezado", "debe-leer": props.leer ? 'SI' : 'NO' },
|
|
263
|
-
React.createElement("div", { id: id, className: "id-div", title: `${casillero.casillero} - ${casillero.var_name}`, onClick: () => {
|
|
264
|
-
var div = document.getElementById(idAcciones);
|
|
265
|
-
div.setAttribute("accion-visible", (1 - Number(div.getAttribute("accion-visible"))).toString());
|
|
266
|
-
// TODO. Ver qué hacemos cuando se toca el ID de la pregutna
|
|
267
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_id_pregunta, { pregunta: casillero.casillero, forPk });
|
|
268
|
-
} },
|
|
269
|
-
React.createElement("div", { className: "id" }, ver_id),
|
|
270
|
-
(casillero.tipovar == "si_no" || casillero.tipovar == "opciones") ? React.createElement(Campo, { disabled: false, pregunta: casillero, forPk: forPk, mini: true, hidden: !conCampoOpciones && 'quitar' }) : null,
|
|
271
|
-
React.createElement("div", { className: "acciones-pregunta", id: idAcciones, "accion-visible": "0" },
|
|
272
|
-
casillero.var_name ? React.createElement("div", null,
|
|
273
|
-
React.createElement(Button, { id: "borrar-pregunta-" + casillero.var_name, "mi-variable": casillero.var_name, variant: "outlined", className: "boton-pregunta-borrar", onClick: handleClickBorrar },
|
|
274
|
-
React.createElement(render_general_1.ICON.DeleteForever, null))) : null,
|
|
275
|
-
casillero.var_name ? (ns_nc => React.createElement("div", null,
|
|
276
|
-
React.createElement(Button, { id: "nsnc-pregunta-" + casillero.var_name, "mi-variable": casillero.var_name, variant: "outlined", className: "boton-pregunta-nsnc", onClick: () => {
|
|
277
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: ns_nc, variable: casillero.var_name, forPk: forPk });
|
|
278
|
-
} }, "NS/NC")))((_b = casillero.valor_ns_nc) !== null && _b !== void 0 ? _b : -9) : null)),
|
|
279
|
-
React.createElement("div", { className: "nombre-div" },
|
|
280
|
-
React.createElement("div", { className: "nombre" }, breakeableText(casillero.nombre)),
|
|
281
|
-
casillero.aclaracion ?
|
|
282
|
-
React.createElement("div", { className: "aclaracion" }, casillero.salto && casillero.tipoc == 'FILTRO' ?
|
|
283
|
-
React.createElement(SaltoDespliegue, { casillero: casillero, prefijo: breakeableText(casillero.aclaracion) })
|
|
284
|
-
:
|
|
285
|
-
breakeableText(casillero.aclaracion))
|
|
286
|
-
: null,
|
|
287
|
-
React.createElement("div", { "los-metadatos": "si" },
|
|
288
|
-
React.createElement("span", { "el-metadato": "variable" }, casillero.var_name),
|
|
289
|
-
casillero.tipovar && casillero.tipovar != 'opciones' && casillero.tipovar != 'si_no' ?
|
|
290
|
-
React.createElement("span", { "el-metadato": "tipovar" }, casillero.tipovar)
|
|
291
|
-
: null,
|
|
292
|
-
casillero.optativo ? React.createElement("span", { "el-metadato": "optativa" }, "optativa") : null,
|
|
293
|
-
calculada ? React.createElement("span", { "el-metadato": "calculada" }, "calculada") : null,
|
|
294
|
-
casillero.despliegueOculta ? React.createElement("span", { "el-metadato": "oculta" }, "oculta") : null,
|
|
295
|
-
casillero.expresion_habilitar ? React.createElement("span", { "el-metadato": "expresion_habilitar" },
|
|
296
|
-
"habilita: ",
|
|
297
|
-
casillero.expresion_habilitar) : null,
|
|
298
|
-
((_c = casillero.especial) === null || _c === void 0 ? void 0 : _c.autoing) ? React.createElement("span", { "el-metadato": "expresion_autoing" },
|
|
299
|
-
"autoing: ", (_d = casillero.especial) === null || _d === void 0 ? void 0 :
|
|
300
|
-
_d.autoing) : null)));
|
|
301
|
-
}
|
|
302
|
-
function DesplegarConfirmarBorrarRespuesta(props) {
|
|
303
|
-
var [open, setOpen] = (0, react_1.useState)(!!props.variableBorrar);
|
|
304
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
305
|
-
const handleClose = () => {
|
|
306
|
-
dispatch(redux_formulario_1.dispatchers.CONFIRMAR_BORRAR_RESPUESTA({ forPk: props.forPk, variable: null }));
|
|
307
|
-
setOpen(false);
|
|
308
|
-
};
|
|
309
|
-
return React.createElement(core_1.Popover, { id: "popover-confirmar", open: open, onClose: handleClose, anchorOrigin: {
|
|
310
|
-
vertical: 'bottom',
|
|
311
|
-
horizontal: 'center',
|
|
312
|
-
}, transformOrigin: {
|
|
313
|
-
vertical: 'top',
|
|
314
|
-
horizontal: 'left',
|
|
315
|
-
} },
|
|
316
|
-
React.createElement(Typography, null, "La pregunta tiene registrada una respuesta que no fue detectada como err\u00F3nea"),
|
|
317
|
-
React.createElement("div", { className: "confirma-botones" },
|
|
318
|
-
React.createElement(Button, { color: "secondary", variant: "outlined", onClick: () => {
|
|
319
|
-
if (props.variableBorrar) {
|
|
320
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: props.forPk, variable: props.variableBorrar, respuesta: null });
|
|
321
|
-
}
|
|
322
|
-
handleClose();
|
|
323
|
-
} }, "borrar respuesta"),
|
|
324
|
-
React.createElement(Button, { color: "primary", variant: "outlined", onClick: handleClose }, "volver sin borrar")));
|
|
325
|
-
}
|
|
326
|
-
function calcularNuestraLongitud(longitud) {
|
|
327
|
-
return longitud;
|
|
328
|
-
}
|
|
329
|
-
function enfocarElementoDeVariable(siguienteVariable) {
|
|
330
|
-
debeSaltar = false;
|
|
331
|
-
var { top, enfocado, elementoInputVariable } = (0, bypass_formulario_2.calcularElementoEnfocado)(siguienteVariable);
|
|
332
|
-
if (top != null && top > 0 && !enfocado) {
|
|
333
|
-
window.scrollTo({ top, left: 0, behavior: 'smooth' });
|
|
334
|
-
}
|
|
335
|
-
elementoInputVariable === null || elementoInputVariable === void 0 ? void 0 : elementoInputVariable.focus();
|
|
336
|
-
}
|
|
337
|
-
function Campo(props) {
|
|
338
|
-
var _a;
|
|
339
|
-
var { pregunta, disabled, mini } = props;
|
|
340
|
-
var { saltoAutomatico, conCampoOpciones } = (0, react_redux_1.useSelector)((state) => state.opciones);
|
|
341
|
-
const longitud = mini ? pregunta.casilleros.reduce((acum, o) => Math.max(o.casillero.toString().length, acum), 0) :
|
|
342
|
-
// @ts-ignore mini es para los otros
|
|
343
|
-
pregunta.longitud;
|
|
344
|
-
// var [valor, setValor] = useState(props.valor);
|
|
345
|
-
var [editando, setEditando] = (0, react_1.useState)(false);
|
|
346
|
-
// useEffect(() => {
|
|
347
|
-
// setValor(props.valor)
|
|
348
|
-
// }, [props.valor]);
|
|
349
|
-
const inputProps = {
|
|
350
|
-
maxLength: longitud,
|
|
351
|
-
};
|
|
352
|
-
const onChange = (nuevoValor) => {
|
|
353
|
-
var { siguienteVariable } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: props.forPk, variable: pregunta.var_name, respuesta: nuevoValor });
|
|
354
|
-
if (siguienteVariable && debeSaltar) {
|
|
355
|
-
enfocarElementoDeVariable(siguienteVariable);
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
var nuestraLongitud = calcularNuestraLongitud(longitud);
|
|
359
|
-
return React.createElement("div", { className: "campo", "nuestra-longitud": nuestraLongitud, style: props.hidden == 'quitar' ? { display: 'none' } : props.hidden ? { visibility: 'hidden' } : undefined },
|
|
360
|
-
mini ? null : React.createElement(BotonBorrar, { id: `borrar-abierta-${pregunta.var_name}`, variable: pregunta.var_name, forPk: props.forPk }),
|
|
361
|
-
React.createElement("div", { className: "input-campo" },
|
|
362
|
-
React.createElement(TextField, { id: `var-${pregunta.var_name}`, disabled: disabled, className: "variable",
|
|
363
|
-
//var-length={pregunta.longitud}
|
|
364
|
-
fullWidth: true, inputProps: inputProps, type: (_a = pregunta.despliegueTipoInput) !== null && _a !== void 0 ? _a : (0, render_general_1.adaptarTipoVarCasillero)(pregunta.tipovar), onKeyDown: (event) => {
|
|
365
|
-
var esEnter = (event.key == 'Enter' || event.keyCode == 13);
|
|
366
|
-
debeSaltar = esEnter && (saltoAutomatico || conCampoOpciones);
|
|
367
|
-
if (esEnter) {
|
|
368
|
-
if (event.target instanceof HTMLElement) {
|
|
369
|
-
event.target.blur();
|
|
370
|
-
}
|
|
371
|
-
event.preventDefault();
|
|
372
|
-
}
|
|
373
|
-
}, onFocus: (_event) => setEditando(true), onBlur: (event, valor) => {
|
|
374
|
-
var _a;
|
|
375
|
-
if ((_a = event === null || event === void 0 ? void 0 : event.relatedTarget) === null || _a === void 0 ? void 0 : _a.getAttribute('boton-confirmar')) {
|
|
376
|
-
debeSaltar = true;
|
|
377
|
-
}
|
|
378
|
-
onChange(valor);
|
|
379
|
-
setEditando(false);
|
|
380
|
-
} })),
|
|
381
|
-
disabled || mini ? null :
|
|
382
|
-
React.createElement("div", { className: "boton-confirmar-campo" },
|
|
383
|
-
React.createElement(Button, { variant: editando ? "contained" : 'outlined', size: "small", color: editando ? 'primary' : 'default', "boton-confirmar": pregunta.var_name, tabIndex: -1, onClick: () => {
|
|
384
|
-
onChange(bypass_formulario_2.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO);
|
|
385
|
-
setEditando(false);
|
|
386
|
-
} },
|
|
387
|
-
React.createElement(render_general_1.ICON.Check, null))));
|
|
388
|
-
}
|
|
389
|
-
function OpcionesDespliegue({ casilleroConOpciones, forPk, leer, despliegueContenido }) {
|
|
390
|
-
const desplegarOtros = (opcion, soloParaDespliegue) => opcion.casilleros.map((subPregunta) => (soloParaDespliegue == null || soloParaDespliegue == subPregunta.despliegueContenido ?
|
|
391
|
-
React.createElement("div", { className: "otros-especificar", key: subPregunta.id_casillero },
|
|
392
|
-
React.createElement(PreguntaDespliegue, { pregunta: subPregunta, forPk: forPk, despliegueEncabezado: 'superior' })) : null));
|
|
393
|
-
return React.createElement("div", { className: "contenido" },
|
|
394
|
-
React.createElement("div", { className: "opciones", "despliegue-contenido": despliegueContenido !== null && despliegueContenido !== void 0 ? despliegueContenido : 'vertical' }, casilleroConOpciones.casilleros.map((opcion, i) => React.createElement(Grid, { key: opcion.id_casillero, item: true, "ocultar-salteada": opcion.despliegueOculta ? (opcion.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO' },
|
|
395
|
-
React.createElement(OpcionDespliegue, { casillero: opcion, variable: casilleroConOpciones.var_name, valorOpcion: opcion.casillero, forPk: forPk, leer: leer, conBotonBorrar: i == 0 || despliegueContenido != 'horizontal' }),
|
|
396
|
-
despliegueContenido == 'horizontal' ? null : desplegarOtros(opcion, null)))),
|
|
397
|
-
despliegueContenido == 'horizontal' ? casilleroConOpciones.casilleros.map((opcion) => desplegarOtros(opcion, null)) : null);
|
|
398
|
-
}
|
|
399
|
-
const nombreCasillero = {
|
|
400
|
-
F: 'formulario',
|
|
401
|
-
B: 'bloque',
|
|
402
|
-
P: 'pregunta',
|
|
403
|
-
CP: 'conjuntopreguntas',
|
|
404
|
-
O: 'opcion',
|
|
405
|
-
OM: 'multiple',
|
|
406
|
-
FILTRO: 'filtro',
|
|
407
|
-
CONS: 'consistencia',
|
|
408
|
-
BF: 'botonformulario',
|
|
409
|
-
TEXTO: 'aclaracionsuperior',
|
|
410
|
-
};
|
|
411
|
-
function DesplegarCasillero(props) {
|
|
412
|
-
var _a, _b;
|
|
413
|
-
return React.createElement("div", { key: `${props.casillero.tipoc}-${props.id || props.casillero.id_casillero}`, className: `casillero ${nombreCasillero[props.casillero.tipoc]}`, id: props.id, style: props.style, "despliegue-encabezado": (_b = (_a = props.casillero.despliegueEncabezado) !== null && _a !== void 0 ? _a : props.despliegueEncabezado) !== null && _b !== void 0 ? _b : 'superior', "ocultar-salteada": props["ocultar-salteada"] }, props.children);
|
|
414
|
-
}
|
|
415
|
-
function PreguntaDespliegue(props) {
|
|
416
|
-
var _a, _b;
|
|
417
|
-
var { pregunta } = props;
|
|
418
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
419
|
-
var estado;
|
|
420
|
-
var id = `pregunta-${pregunta.id_casillero}`;
|
|
421
|
-
(0, bypass_formulario_2.registrarElemento)({
|
|
422
|
-
id,
|
|
423
|
-
direct: true,
|
|
424
|
-
fun: registradorDeVariable(pregunta)
|
|
425
|
-
});
|
|
426
|
-
return React.createElement(DesplegarCasillero, { id: id, casillero: pregunta, "nuestro-tipovar": pregunta.tipovar || "multiple", "ocultar-salteada": pregunta.despliegueOculta ? (pregunta.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO', despliegueEncabezado: props.despliegueEncabezado },
|
|
427
|
-
React.createElement(EncabezadoDespliegue, { casillero: pregunta, leer: pregunta.leer !== false, forPk: props.forPk }),
|
|
428
|
-
React.createElement("div", { className: "contenido" }, pregunta.tipovar == "si_no" ? React.createElement(Grid, { container: true },
|
|
429
|
-
React.createElement(SiNoDespliegue, { casilleroConOpciones: pregunta, forPk: props.forPk, despliegueContenido: (_a = props.pregunta.despliegueContenido) !== null && _a !== void 0 ? _a : 'vertical' })) :
|
|
430
|
-
pregunta.tipovar == "opciones" ?
|
|
431
|
-
React.createElement(OpcionesDespliegue, { casilleroConOpciones: pregunta, forPk: props.forPk, leer: !!pregunta.leer, despliegueContenido: (_b = pregunta.despliegueContenido) !== null && _b !== void 0 ? _b : 'vertical' }) :
|
|
432
|
-
pregunta.tipovar == null ?
|
|
433
|
-
pregunta.casilleros.map((opcionMultiple) => opcionMultiple.tipoc == 'OM' ?
|
|
434
|
-
React.createElement(OpcionMultipleDespliegue, { key: opcionMultiple.id_casillero, opcionM: opcionMultiple, forPk: props.forPk })
|
|
435
|
-
: //las consistencias pueden ser hermanas de OM
|
|
436
|
-
React.createElement(ConsistenciaDespliegue, { key: opcionMultiple.id_casillero, casillero: opcionMultiple, forPk: props.forPk }))
|
|
437
|
-
:
|
|
438
|
-
((preguntaSimple) => React.createElement(Campo, { disabled: preguntaSimple.calculada ? true : false, pregunta: preguntaSimple, forPk: props.forPk }))(pregunta)),
|
|
439
|
-
React.createElement("div", { className: "pie-pregunta" },
|
|
440
|
-
React.createElement(SaltoDespliegue, { casillero: pregunta, prefijo: pregunta.tipovar == "opciones" ? (pregunta.casilleros.some(opcion => opcion.salto) ? "resto de las opciones" : "todas las opciones") : "" })));
|
|
441
|
-
}
|
|
442
|
-
var calcularDisabledBFAgregarListo = (configSorteoFormulario, formulario) => !!(configSorteoFormulario && configSorteoFormulario.id_formulario_individual == formulario);
|
|
443
|
-
function botonesDelFormulario(r, unidad_analisis, estructura, forPkPadre, feedbackAll) {
|
|
444
|
-
var formsVivienda = (0, bypass_formulario_1.getFormulariosForIdVivienda)(forPkPadre.vivienda);
|
|
445
|
-
var uaDef = estructura.unidades_analisis[unidad_analisis];
|
|
446
|
-
var arrayEstructuraFormularios = ((0, like_ar_1.strict)(estructura.formularios)).array();
|
|
447
|
-
var x = (0, like_ar_1.strict)(uaDef.hijas).filter(uaHija => {
|
|
448
|
-
var _a;
|
|
449
|
-
return formsVivienda.includes((_a = arrayEstructuraFormularios.find((infoFormulario) => infoFormulario.casilleros.unidad_analisis == (uaHija === null || uaHija === void 0 ? void 0 : uaHija.unidad_analisis))) === null || _a === void 0 ? void 0 : _a.casilleros.id_casillero);
|
|
450
|
-
}).map(uaHija => (uaHija == null ? null :
|
|
451
|
-
js_to_html_1.html.div({ class: 'ua-hijas' }, [
|
|
452
|
-
js_to_html_1.html.div(uaHija.unidad_analisis),
|
|
453
|
-
js_to_html_1.html.div((0, like_ar_1.strict)(r[uaHija.unidad_analisis] || []).map((respuestasHija, i) => {
|
|
454
|
-
var num = Number(i) + 1;
|
|
455
|
-
var forPkHijaParcial = Object.assign(Object.assign({}, forPkPadre), { [uaHija.pk_agregada]: num });
|
|
456
|
-
var configSorteoFormulario = estructura.configSorteo ? estructura.configSorteo[(0, bypass_formulario_1.getMainFormForVivienda)(forPkPadre.vivienda)] : null;
|
|
457
|
-
return js_to_html_1.html.div({ class: 'numerador-ua' }, [
|
|
458
|
-
js_to_html_1.html.div({ class: 'botones-ua' }, [
|
|
459
|
-
js_to_html_1.html.div({ class: 'numero-ua' }, num.toString()),
|
|
460
|
-
...(0, like_ar_1.strict)(estructura.formularios)
|
|
461
|
-
.filter(formDef => formDef.casilleros.unidad_analisis == uaHija.unidad_analisis)
|
|
462
|
-
.map((_formDef, formulario) => {
|
|
463
|
-
var forPk = Object.assign(Object.assign({}, forPkHijaParcial), { formulario });
|
|
464
|
-
var feedbackForm = feedbackAll[(0, tipos_1.toPlainForPk)(forPk)];
|
|
465
|
-
return feedbackForm ? js_to_html_1.html.div({}, [
|
|
466
|
-
// html.button((uaHija!).pk_agregada+" ok: "+(Number(i)+1)),
|
|
467
|
-
botonFormularioConResumen({
|
|
468
|
-
forPk,
|
|
469
|
-
num,
|
|
470
|
-
actual: true || (0, bypass_formulario_1.calcularActualBF)(configSorteoFormulario, num, null, formulario, r),
|
|
471
|
-
previo: false,
|
|
472
|
-
disabled: (0, bypass_formulario_1.calcularDisabledBF)(configSorteoFormulario, num, formulario, r)
|
|
473
|
-
}, feedbackForm, r, { despliegueOculta: false, expresion_habilitar_js: '', nombre: formulario, aclaracion: null, salto: formulario }, forPkPadre, "boton-ir-resumen-formulario", estructura.formularios[formulario].casilleros)
|
|
474
|
-
]) : null;
|
|
475
|
-
}).array().map(x => x == null ? null : x),
|
|
476
|
-
]),
|
|
477
|
-
botonesDelFormulario(respuestasHija, uaHija.unidad_analisis, estructura, forPkHijaParcial, feedbackAll)
|
|
478
|
-
]);
|
|
479
|
-
}).array().map(x => x == null ? null : x))
|
|
480
|
-
]))).array().map(x => x == null ? null : x);
|
|
481
|
-
return js_to_html_1.html.div(/*{style:'display:flex; flex-direction:row'},*/ x);
|
|
482
|
-
}
|
|
483
|
-
function TextoDespliegue(props) {
|
|
484
|
-
var { casillero, forPk } = props;
|
|
485
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
486
|
-
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
487
|
-
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
488
|
-
var id = `texto-${casillero.id_casillero}`;
|
|
489
|
-
(0, bypass_formulario_2.registrarElemento)({ id, style: 'display', fun: (r) => habilitador(r) || modoDespliegue == 'metadatos' ? 'block' : 'none' });
|
|
490
|
-
var esResumenFormulario = casillero.casillero == 'ResFor'; // TODO: Cambia esto que está jarcodeado.
|
|
491
|
-
if (esResumenFormulario) {
|
|
492
|
-
(0, bypass_formulario_2.registrarElemento)({ id, direct: true,
|
|
493
|
-
fun: (r, _feedbackForm, elemento, feedbackAll, estructura) => {
|
|
494
|
-
elemento.style.display = '';
|
|
495
|
-
//@ts-ignore las respuestas son respuestasRaiz porque ResFor está en el form ppal
|
|
496
|
-
if (r['resumenEstado'] == 'vacio') {
|
|
497
|
-
elemento.textContent = "relevamiento sin empezar";
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
elemento.textContent = "relevamiento empezado";
|
|
501
|
-
var { unidad_analisis } = estructura.formularios[forPk.formulario].casilleros;
|
|
502
|
-
elemento.innerHTML = "";
|
|
503
|
-
elemento.appendChild(botonesDelFormulario(r, unidad_analisis, estructura, forPk, feedbackAll).create());
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
var ir = (defBoton) => {
|
|
509
|
-
// var nuevaForPk={...forPk, formulario:idFormularioDestino};
|
|
510
|
-
// nuevaForPk[nuevoCampoPk] = defBoton.num
|
|
511
|
-
dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk: defBoton.forPk, apilarVuelta: true }));
|
|
512
|
-
};
|
|
513
|
-
return React.createElement(DesplegarCasillero, { id: `${id}-externo`, casillero: casillero },
|
|
514
|
-
React.createElement(EncabezadoDespliegue, { casillero: casillero, leer: false, forPk: forPk }),
|
|
515
|
-
React.createElement("div", { id: id, style: { display: 'none' } }),
|
|
516
|
-
esResumenFormulario ?
|
|
517
|
-
React.createElement(Button, { className: "special-button", id: "boton-ir-resumen-formulario", style: { display: 'none' }, onClick: (event) => {
|
|
518
|
-
ir(JSON.parse(event.target.getAttribute('def-button')));
|
|
519
|
-
} }, "ir (interno)")
|
|
520
|
-
: null);
|
|
521
|
-
}
|
|
522
|
-
function FiltroDespliegue(props) {
|
|
523
|
-
var { filtro } = props;
|
|
524
|
-
return React.createElement(DesplegarCasillero, { casillero: filtro },
|
|
525
|
-
React.createElement(DespliegueEncabezado, { casillero: filtro }));
|
|
526
|
-
}
|
|
527
|
-
function ConsistenciaDespliegue(props) {
|
|
528
|
-
var { casillero, forPk } = props;
|
|
529
|
-
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
530
|
-
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
531
|
-
var id = `consistencia-${casillero.id_casillero}`;
|
|
532
|
-
(0, bypass_formulario_2.registrarElemento)({ id, style: 'display', fun: (r) => habilitador(r) || modoDespliegue == 'metadatos' ? 'block' : 'none' });
|
|
533
|
-
return React.createElement(DesplegarCasillero, { id: id, casillero: casillero, style: { display: 'none' } },
|
|
534
|
-
React.createElement(EncabezadoDespliegue, { casillero: casillero, leer: false, forPk: forPk }));
|
|
535
|
-
}
|
|
536
|
-
var botonFormularioConResumen = (defBoton, feedbackForm, respuestasAumentadas, casillero, forPkPadre, idButton, formularioAAbrir) => {
|
|
537
|
-
var _a, _b, _c;
|
|
538
|
-
var forPk = defBoton.forPk;
|
|
539
|
-
var sufijoIdElemento = (0, tipos_1.toPlainForPk)(forPk) + (defBoton.esConfirmar ? '-listo' : '');
|
|
540
|
-
var id = `div-boton-formulario-${sufijoIdElemento}`;
|
|
541
|
-
var estado = feedbackForm.resumen;
|
|
542
|
-
return js_to_html_1.html.div({
|
|
543
|
-
id,
|
|
544
|
-
class: "seccion-boton-formulario",
|
|
545
|
-
$attrs: {
|
|
546
|
-
"nuestro-validator": defBoton.actual ? 'actual' : defBoton.previo ? 'valida' : 'todavia_no',
|
|
547
|
-
"ocultar-salteada": casillero.despliegueOculta ? (casillero.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO',
|
|
548
|
-
"tiene-valor": "NO",
|
|
549
|
-
"def-button": JSON.stringify(defBoton)
|
|
550
|
-
}
|
|
551
|
-
}, [
|
|
552
|
-
casillero.aclaracion || js_to_html_1.html.div({ class: "aclaracion" }, [(_a = breakeableText(casillero.aclaracion)) !== null && _a !== void 0 ? _a : null]),
|
|
553
|
-
js_to_html_1.html.div([
|
|
554
|
-
Button2({
|
|
555
|
-
// id:`var-${idVariable}`,
|
|
556
|
-
id: `boton-formulario-${sufijoIdElemento}`,
|
|
557
|
-
variant: "outlined",
|
|
558
|
-
disabled: defBoton.disabled,
|
|
559
|
-
color: "inherit",
|
|
560
|
-
onClick: () => {
|
|
561
|
-
if (defBoton.esConfirmar) {
|
|
562
|
-
if (defBoton.num != null) {
|
|
563
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: forPkPadre, variable: casillero.expresion_habilitar, respuesta: defBoton.num });
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
var button = document.getElementById(idButton);
|
|
568
|
-
button.setAttribute('def-button', JSON.stringify(defBoton));
|
|
569
|
-
button.click();
|
|
570
|
-
}
|
|
571
|
-
},
|
|
572
|
-
$attrs: {
|
|
573
|
-
"resumen-estado": estado != 'vacio' ? estado : defBoton.actual ? 'actual' : defBoton.previo ? estado : 'todavia_no',
|
|
574
|
-
},
|
|
575
|
-
children: [
|
|
576
|
-
(defBoton.esAgregar ? 'agregar' : defBoton.esConfirmar ? 'Listo' : casillero.nombre + ' ' + (defBoton.num || '')),
|
|
577
|
-
js_to_html_1.html.svg({ class: "MuiSvgIcon-root", focusable: false, viewbox: "0 0 24 24", "aria-hidden": "true" }, [
|
|
578
|
-
js_to_html_1.html.path({ d: (defBoton.esAgregar ? render_general_1.materialIoIconsSvgPath.Add : defBoton.esConfirmar ? render_general_1.materialIoIconsSvgPath.Check : casillero.salto ? render_general_1.materialIoIconsSvgPath.Forward : render_general_1.materialIoIconsSvgPath.ExitToApp) })
|
|
579
|
-
])
|
|
580
|
-
]
|
|
581
|
-
}),
|
|
582
|
-
(defBoton.permiteBorrar ?
|
|
583
|
-
Button2({
|
|
584
|
-
className: "boton-borrar-ua-vacia",
|
|
585
|
-
color: "default",
|
|
586
|
-
variant: "outlined",
|
|
587
|
-
children: js_to_html_1.html.svg({ class: "MuiSvgIcon-root", focusable: false, viewbox: "0 0 24 24", "aria-hidden": "true" }, [
|
|
588
|
-
js_to_html_1.html.path({ d: render_general_1.materialIoIconsSvgPath.DeleteForever })
|
|
589
|
-
]),
|
|
590
|
-
onClick: () => (0, bypass_formulario_1.accion_borrar_formulario)({ forPk, forPkPadre })
|
|
591
|
-
})
|
|
592
|
-
: null),
|
|
593
|
-
(defBoton.num !== false && !defBoton.esAgregar && !defBoton.esConfirmar ?
|
|
594
|
-
js_to_html_1.html.span(((_c = (_b = casillero.especial) === null || _b === void 0 ? void 0 : _b.camposResumen) !== null && _c !== void 0 ? _c : [defBoton.num.toString()]).map((campo) => respuestasAumentadas[formularioAAbrir.unidad_analisis][defBoton.num - 1][campo]).join(', '))
|
|
595
|
-
: null)
|
|
596
|
-
// html.div({class:'inline-dialog', $attrs:{"inline-dialog-open": confirmarForzarIr == defBoton.num?'visible':'hidden'}},[ ])
|
|
597
|
-
])
|
|
598
|
-
/*
|
|
599
|
-
{defBoton.esAgregar?<> <span> </span> <Button
|
|
600
|
-
variant="outlined"
|
|
601
|
-
color="inherit"
|
|
602
|
-
onClick={()=>{
|
|
603
|
-
}}
|
|
604
|
-
><ICON.Check/></Button></>:null}
|
|
605
|
-
</div>
|
|
606
|
-
*/
|
|
607
|
-
]).create();
|
|
608
|
-
};
|
|
609
|
-
function BotonFormularioDespliegue(props) {
|
|
610
|
-
var _a;
|
|
611
|
-
var { casillero, forPk } = props;
|
|
612
|
-
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
613
|
-
var { opciones } = useSelectorVivienda(forPk);
|
|
614
|
-
//var idFormularioDestino = 'F:'+casillero.salto! as IdFormulario; //original
|
|
615
|
-
var armoNomSalto = ((_a = casillero.salto) === null || _a === void 0 ? void 0 : _a.substring(0, 2)) == 'F:' ? casillero.salto.slice(2) : casillero.salto;
|
|
616
|
-
//console.log('BotonFormularioDespliegue armoNomSalto ' +armoNomSalto);
|
|
617
|
-
var idFormularioDestino = 'F:' + armoNomSalto;
|
|
618
|
-
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
619
|
-
var { formularioAAbrir } = (0, react_redux_1.useSelector)((_state) => ({
|
|
620
|
-
formularioAAbrir: estructura.formularios[idFormularioDestino].casilleros,
|
|
621
|
-
}));
|
|
622
|
-
var sufijoIdElemento = (0, tipos_1.toPlainForPk)(forPk);
|
|
623
|
-
/*
|
|
624
|
-
registrarElemento({
|
|
625
|
-
id:`div-boton-formulario-${sufijoIdElemento}`,
|
|
626
|
-
attr:'esta-inhabilitada',
|
|
627
|
-
// fun: (r:Respuestas)=>habilitador(r)?'SI':'NO'
|
|
628
|
-
fun: (_r:Respuestas)=>'NO'
|
|
629
|
-
});
|
|
630
|
-
registrarElemento<HTMLButtonElement>({
|
|
631
|
-
id:`boton-formulario-${sufijoIdElemento}`,
|
|
632
|
-
prop:'disabled',
|
|
633
|
-
// fun: (r:Respuestas)=>!habilitador(r)
|
|
634
|
-
fun: (_r:Respuestas)=>false
|
|
635
|
-
});
|
|
636
|
-
*/
|
|
637
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
638
|
-
var [confirmarForzarIr, setConfirmarForzarIr] = (0, react_1.useState)(null);
|
|
639
|
-
var multipleFormularios = formularioAAbrir.unidad_analisis != props.formulario.unidad_analisis;
|
|
640
|
-
var nuevoCampoPk = bypass_formulario_2.defOperativo.defUA[formularioAAbrir.unidad_analisis].pk;
|
|
641
|
-
// var var_name='$B.'+casillero.salto; //original
|
|
642
|
-
var var_name = '$B.F:' + armoNomSalto;
|
|
643
|
-
var idSeccion = `seccion-boton-formulario-${var_name}`;
|
|
644
|
-
var idButton = `special-button-${idSeccion}`;
|
|
645
|
-
(0, bypass_formulario_2.registrarElemento)({
|
|
646
|
-
id: idSeccion,
|
|
647
|
-
direct: true,
|
|
648
|
-
fun: (respuestasAumentadas, feedbackRow, div, feedbackAll) => {
|
|
649
|
-
try {
|
|
650
|
-
var listaDeBotonesAbrir = [];
|
|
651
|
-
// var esVarActual = feedbackRow.actual == '$B.F:'+casillero.salto; //original
|
|
652
|
-
var esVarActual = feedbackRow.actual == '$B.F:' + armoNomSalto;
|
|
653
|
-
// console.log('BotonFormularioDespliegue esVarActual ' +esVarActual );
|
|
654
|
-
if (multipleFormularios && casillero.salto != null) {
|
|
655
|
-
// let defFormulario:InfoFormulario = estructura.formularios['F:'+casillero.salto as IdFormulario]; //original
|
|
656
|
-
let defFormulario = estructura.formularios['F:' + armoNomSalto];
|
|
657
|
-
let defUA = estructura.unidades_analisis[defFormulario.casilleros.unidad_analisis];
|
|
658
|
-
let conjunto = respuestasAumentadas[defFormulario.casilleros.unidad_analisis];
|
|
659
|
-
let cantidadEsperada = respuestasAumentadas[casillero.expresion_habilitar];
|
|
660
|
-
var numActual = null;
|
|
661
|
-
// var estadoDelBoton = feedbackRow.feedback['$B.F:'+casillero.salto as IdVariable].estado //original
|
|
662
|
-
var estadoDelBoton = feedbackRow.feedback['$B.F:' + armoNomSalto].estado;
|
|
663
|
-
// console.log('BotonFormularioDespliegue estadoDelBoton ' +estadoDelBoton );
|
|
664
|
-
var configSorteoFormulario = estructura.configSorteo ? estructura.configSorteo[(0, bypass_formulario_1.getMainFormForVivienda)(forPk.vivienda)] : null;
|
|
665
|
-
listaDeBotonesAbrir = (0, like_ar_1.strict)(conjunto).map((_, i) => {
|
|
666
|
-
let num = (0, bypass_formulario_2.numberOrStringIncIfArray)(i, conjunto);
|
|
667
|
-
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino, [nuevoCampoPk]: num });
|
|
668
|
-
var feedback = feedbackAll[(0, tipos_1.toPlainForPk)(forPk)];
|
|
669
|
-
if (numActual == null && feedback.resumen == "vacio" && estadoDelBoton == 'valida') {
|
|
670
|
-
numActual = num;
|
|
671
|
-
}
|
|
672
|
-
return {
|
|
673
|
-
forPk,
|
|
674
|
-
resumen: null,
|
|
675
|
-
num,
|
|
676
|
-
actual: (0, bypass_formulario_1.calcularActualBF)(configSorteoFormulario, num, numActual, idFormularioDestino, respuestasAumentadas),
|
|
677
|
-
previo: numActual == null,
|
|
678
|
-
permiteBorrar: (0, like_ar_1.strict)(conjunto).array().length == Number(i) + 1 &&
|
|
679
|
-
feedback.resumen == 'vacio' &&
|
|
680
|
-
(0, bypass_formulario_1.calcularPermiteBorrarBF)(configSorteoFormulario, idFormularioDestino),
|
|
681
|
-
disabled: (0, bypass_formulario_1.calcularDisabledBF)(configSorteoFormulario, num, idFormularioDestino, respuestasAumentadas)
|
|
682
|
-
};
|
|
683
|
-
}).array();
|
|
684
|
-
if ("puede agregar //TODO VER ESTO" && (conjunto instanceof Array || conjunto == null)) {
|
|
685
|
-
let nuevoValorPk = (conjunto == null ? 0 : conjunto.length) + 1;
|
|
686
|
-
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino, [nuevoCampoPk]: nuevoValorPk });
|
|
687
|
-
let debeAgregarOlisto = numActual == null && (cantidadEsperada == null || cantidadEsperada != (conjunto != null && conjunto.length))
|
|
688
|
-
&& (estadoDelBoton == 'valida' || esVarActual);
|
|
689
|
-
listaDeBotonesAbrir.push({
|
|
690
|
-
forPk,
|
|
691
|
-
num: nuevoValorPk,
|
|
692
|
-
esAgregar: true,
|
|
693
|
-
actual: debeAgregarOlisto,
|
|
694
|
-
previo: false,
|
|
695
|
-
disabled: calcularDisabledBFAgregarListo(configSorteoFormulario, idFormularioDestino)
|
|
696
|
-
});
|
|
697
|
-
listaDeBotonesAbrir.push({
|
|
698
|
-
forPk,
|
|
699
|
-
num: nuevoValorPk - 1,
|
|
700
|
-
esConfirmar: true,
|
|
701
|
-
actual: debeAgregarOlisto && (!casillero.longitud || nuevoValorPk > Number(casillero.longitud)),
|
|
702
|
-
previo: false,
|
|
703
|
-
disabled: calcularDisabledBFAgregarListo(configSorteoFormulario, idFormularioDestino)
|
|
704
|
-
});
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
else {
|
|
708
|
-
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino });
|
|
709
|
-
listaDeBotonesAbrir = [{ forPk, num: false, unico: true, actual: esVarActual, previo: true }];
|
|
710
|
-
}
|
|
711
|
-
var todosLosBotones = listaDeBotonesAbrir.map(defBoton => {
|
|
712
|
-
var _a;
|
|
713
|
-
return botonFormularioConResumen(defBoton, (_a = feedbackAll[(0, tipos_1.toPlainForPk)(defBoton.forPk)]) !== null && _a !== void 0 ? _a : { resumen: 'vacio' }, respuestasAumentadas, casillero, props.forPk, idButton, formularioAAbrir);
|
|
714
|
-
});
|
|
715
|
-
var htmlSeccion = document.getElementById(idSeccion);
|
|
716
|
-
htmlSeccion.innerHTML = "";
|
|
717
|
-
htmlSeccion.appendChild(js_to_html_1.html.div(todosLosBotones).create());
|
|
718
|
-
//arrange(document.getElementById(idSeccion)!, todosLosBotones);
|
|
719
|
-
}
|
|
720
|
-
catch (err) {
|
|
721
|
-
var error = (0, cast_error_1.unexpected)(err);
|
|
722
|
-
console.log("entra al catch");
|
|
723
|
-
div.textContent = 'esto, FALLÉ ' + error.message;
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
});
|
|
727
|
-
const ir = (defBoton) => {
|
|
728
|
-
if (!casillero.salto) {
|
|
729
|
-
opciones.modoDirecto ?
|
|
730
|
-
null
|
|
731
|
-
:
|
|
732
|
-
dispatch(redux_formulario_1.dispatchers.VOLVER_HDR({}));
|
|
733
|
-
}
|
|
734
|
-
else {
|
|
735
|
-
var nuevaForPk = Object.assign(Object.assign({}, forPk), { formulario: idFormularioDestino });
|
|
736
|
-
if (multipleFormularios) {
|
|
737
|
-
// @ts-ignore forPk y sus componentes
|
|
738
|
-
nuevaForPk[nuevoCampoPk] = defBoton.num;
|
|
739
|
-
if (defBoton.esAgregar) {
|
|
740
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_agregar_formulario, { forPk: nuevaForPk });
|
|
741
|
-
}
|
|
742
|
-
else {
|
|
743
|
-
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_1.accion_abrir_formulario, { forPk: nuevaForPk });
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk: nuevaForPk, apilarVuelta: true }));
|
|
747
|
-
}
|
|
748
|
-
if (confirmarForzarIr) {
|
|
749
|
-
setConfirmarForzarIr(false);
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
return React.createElement(DesplegarCasillero, { casillero: casillero },
|
|
753
|
-
React.createElement("div", { id: idSeccion }),
|
|
754
|
-
React.createElement(Button, { className: "special-button", id: idButton, onClick: (event) => {
|
|
755
|
-
ir(JSON.parse(event.target.getAttribute('def-button')));
|
|
756
|
-
} }, "ir (interno)"),
|
|
757
|
-
React.createElement(core_1.Dialog, { className: "nuestro-dialogo", open: !!confirmarForzarIr, onClose: () => setConfirmarForzarIr(null) },
|
|
758
|
-
React.createElement("div", { className: "nuestro-dialogo" },
|
|
759
|
-
React.createElement(Typography, null, "No se puede avanzar al siguiente formulario."),
|
|
760
|
-
React.createElement(Typography, null, "Quiz\u00E1s no termin\u00F3 de contestar las preguntas correspondientes"),
|
|
761
|
-
React.createElement(Typography, null, "Quiz\u00E1s no corresponde en base a las respuestas obtenidas")),
|
|
762
|
-
React.createElement(Button, { color: "secondary", onClick: () => confirmarForzarIr && ir(confirmarForzarIr) }, "forzar"),
|
|
763
|
-
React.createElement(Button, { color: "primary", variant: "contained", onClick: () => setConfirmarForzarIr(null) }, "Entendido")));
|
|
764
|
-
}
|
|
765
|
-
function CasilleroDesconocido(props) {
|
|
766
|
-
return React.createElement(DesplegarCasillero, { id: `casillerodesconocido-${props.casillero.id_casillero}`, casillero: props.casillero, style: { display: 'none' } },
|
|
767
|
-
React.createElement(Typography, null,
|
|
768
|
-
"Tipo de casillero no implementado: \"",
|
|
769
|
-
props.casillero.tipoc,
|
|
770
|
-
"\" para \"",
|
|
771
|
-
props.casillero.casillero,
|
|
772
|
-
"\""),
|
|
773
|
-
React.createElement(EncabezadoDespliegue, { casillero: props.casillero, leer: false, forPk: props.forPk }));
|
|
774
|
-
}
|
|
775
|
-
function useSelectorVivienda(forPk) {
|
|
776
|
-
return (0, react_redux_1.useSelector)((state) => {
|
|
777
|
-
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
778
|
-
return {
|
|
779
|
-
formulario: estructura.formularios[forPk.formulario].casilleros,
|
|
780
|
-
modoDespliegue: true || state.modo.demo ? state.opciones.modoDespliegue : 'relevamiento',
|
|
781
|
-
modo: state.modo,
|
|
782
|
-
opciones: state.opciones,
|
|
783
|
-
};
|
|
784
|
-
});
|
|
785
|
-
}
|
|
786
|
-
function ConjuntoPreguntasDespliegue(props) {
|
|
787
|
-
let { casillero, forPk } = props;
|
|
788
|
-
var id = `conjunto-preguntas-${casillero.id_casillero}`;
|
|
789
|
-
(0, bypass_formulario_2.registrarElemento)({
|
|
790
|
-
id,
|
|
791
|
-
direct: true,
|
|
792
|
-
fun: registradorDeVariable(casillero)
|
|
793
|
-
});
|
|
794
|
-
let modoDespliegue = "normal";
|
|
795
|
-
let habilitado = true;
|
|
796
|
-
return habilitado || modoDespliegue == 'metadatos' ? React.createElement(DesplegarCasillero, { id: id, casillero: casillero },
|
|
797
|
-
React.createElement(EncabezadoDespliegue, { casillero: casillero, forPk: forPk, leer: casillero.leer !== false }),
|
|
798
|
-
React.createElement(DesplegarContenidoInternoBloqueOFormulario, { bloqueOFormulario: casillero, formulario: props.formulario, forPk: forPk, multiple: false })) : null;
|
|
799
|
-
}
|
|
800
|
-
function DesplegarContenidoInternoBloqueOFormulario(props) {
|
|
801
|
-
var parcializable = props.bloqueOFormulario.tipoc == 'F';
|
|
802
|
-
const [verTodo, setVerTodo] = (0, react_1.useState)(!parcializable);
|
|
803
|
-
const [forPkActual, setForPkActual] = (0, react_1.useState)(null);
|
|
804
|
-
if (parcializable) {
|
|
805
|
-
if (forPkActual != props.bloqueOFormulario.casillero) {
|
|
806
|
-
setVerTodo(false);
|
|
807
|
-
setForPkActual(props.bloqueOFormulario.casillero);
|
|
808
|
-
}
|
|
809
|
-
(0, react_1.useEffect)(() => {
|
|
810
|
-
var timer = setTimeout(() => {
|
|
811
|
-
setVerTodo(true);
|
|
812
|
-
}, 250);
|
|
813
|
-
return () => {
|
|
814
|
-
if (timer) {
|
|
815
|
-
clearTimeout(timer);
|
|
816
|
-
}
|
|
817
|
-
};
|
|
818
|
-
});
|
|
819
|
-
}
|
|
820
|
-
const limiteNoVerTodo = 3;
|
|
821
|
-
(0, react_1.useEffect)(() => {
|
|
822
|
-
if (props.bloqueOFormulario.tipoc == 'F') {
|
|
823
|
-
(0, bypass_formulario_2.volcadoInicialElementosRegistrados)(props.forPk);
|
|
824
|
-
}
|
|
825
|
-
}, [(0, tipos_1.toPlainForPk)(props.forPk), verTodo]);
|
|
826
|
-
(0, react_1.useLayoutEffect)(() => {
|
|
827
|
-
if (props.bloqueOFormulario.tipoc == 'F' && verTodo) {
|
|
828
|
-
var { siguienteVariable, variableActual } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: bypass_formulario_2.NO_CAMBIAR__SOLO_TRAER_STATUS, forPk: props.forPk });
|
|
829
|
-
if (variableActual || siguienteVariable) {
|
|
830
|
-
enfocarElementoDeVariable((0, best_globals_1.coalesce)(variableActual, siguienteVariable));
|
|
831
|
-
}
|
|
832
|
-
else {
|
|
833
|
-
var feedbackRowValidator = (0, bypass_formulario_2.getFeedbackRowValidator)();
|
|
834
|
-
if (feedbackRowValidator[(0, tipos_1.toPlainForPk)(props.forPk)].resumen == 'ok') {
|
|
835
|
-
(0, render_general_1.scrollToTop)();
|
|
836
|
-
}
|
|
837
|
-
else {
|
|
838
|
-
(0, render_general_1.scrollToTop)();
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
});
|
|
843
|
-
return React.createElement("div", { className: "contenido" },
|
|
844
|
-
verTodo ? null : React.createElement("div", { style: { height: "500px", textAlign: 'center', verticalAlign: 'middle', width: '100%', position: "fixed", backgroundColor: 'rgba(100,100,100,0.3)', fontSize: '200%' } }, "cargando..."),
|
|
845
|
-
props.bloqueOFormulario.casilleros.map((casillero, i) => {
|
|
846
|
-
var _a;
|
|
847
|
-
var key = casillero.tipoc + '-' + casillero.id_casillero + '-' + i;
|
|
848
|
-
return (verTodo || i < limiteNoVerTodo ?
|
|
849
|
-
(casillero.tipoc == "P" ? React.createElement(PreguntaDespliegue, { key: key, pregunta: casillero, forPk: props.forPk, despliegueEncabezado: (_a = casillero.despliegueEncabezado) !== null && _a !== void 0 ? _a : (props.bloqueOFormulario.tipoc == 'CP' ? 'lateral' : 'superior') }) :
|
|
850
|
-
casillero.tipoc == "B" ? React.createElement(BloqueDespliegue, { key: key, bloque: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
851
|
-
casillero.tipoc == "FILTRO" ? React.createElement(FiltroDespliegue, { key: key, filtro: casillero, forPk: props.forPk }) :
|
|
852
|
-
casillero.tipoc == "BF" ? React.createElement(BotonFormularioDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
853
|
-
casillero.tipoc == "CONS" ? React.createElement(ConsistenciaDespliegue, { key: key, casillero: casillero, forPk: props.forPk }) :
|
|
854
|
-
casillero.tipoc == "CP" ? React.createElement(ConjuntoPreguntasDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
855
|
-
casillero.tipoc == "TEXTO" ? React.createElement(TextoDespliegue, { key: key, casillero: casillero, forPk: props.forPk }) :
|
|
856
|
-
casillero.tipoc == "LIBRE" ? React.createElement(LibreDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
857
|
-
React.createElement(CasilleroDesconocido, { key: key, casillero: casillero, forPk: props.forPk }))
|
|
858
|
-
: i == limiteNoVerTodo ?
|
|
859
|
-
React.createElement("div", { key: '$spinner', className: "spinner-border", role: "status" },
|
|
860
|
-
React.createElement("span", null, "cargando bloque..."))
|
|
861
|
-
: null);
|
|
862
|
-
}));
|
|
863
|
-
}
|
|
864
|
-
function BloqueDespliegue(props) {
|
|
865
|
-
var { bloque, forPk } = props;
|
|
866
|
-
var key = bloque.ver_id != '-' && bloque.ver_id || bloque.casillero;
|
|
867
|
-
var activeStep = 0;
|
|
868
|
-
var multiple = !!bloque.unidad_analisis;
|
|
869
|
-
var lista = [{ forPk, key: 0, multiple: false }];
|
|
870
|
-
var habilitador = bloque.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(bloque.expresion_habilitar_js) : () => true;
|
|
871
|
-
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
872
|
-
if (multiple) {
|
|
873
|
-
// TODO: GENERALIZAR
|
|
874
|
-
// @ts-ignore
|
|
875
|
-
// lista=respuestas.personas.map((_persona, i)=>(
|
|
876
|
-
// {forPk:{...forPk, persona:i+1}, key:i+1, multiple:true}
|
|
877
|
-
// ))
|
|
878
|
-
}
|
|
879
|
-
var id = `bloque-${bloque.id_casillero}`;
|
|
880
|
-
(0, bypass_formulario_2.registrarElemento)({
|
|
881
|
-
id,
|
|
882
|
-
style: 'display',
|
|
883
|
-
fun: (respuestas) => habilitador(respuestas) || modoDespliegue == 'metadatos' ? 'unset' : 'none'
|
|
884
|
-
});
|
|
885
|
-
return React.createElement(DesplegarCasillero, { casillero: bloque, "nuestro-bloque": bloque.id_casillero, "es-multiple": multiple ? 'SI' : 'NO', id: id },
|
|
886
|
-
React.createElement(EncabezadoDespliegue, { casillero: bloque, forPk: forPk }),
|
|
887
|
-
lista.map(({ key, forPk, multiple }) => React.createElement(DesplegarContenidoInternoBloqueOFormulario, { key: key, bloqueOFormulario: bloque, formulario: props.formulario, forPk: forPk, multiple: multiple })));
|
|
888
|
-
}
|
|
889
|
-
const FormularioEncabezado = DespliegueEncabezado;
|
|
890
|
-
function MenuLetra(props) {
|
|
891
|
-
const cambiarLetra = (tamannio) => {
|
|
892
|
-
var root = document.documentElement;
|
|
893
|
-
root.style.fontSize = tamannio + "px";
|
|
894
|
-
};
|
|
895
|
-
return React.createElement(core_1.MenuItem, { onClick: () => cambiarLetra(props.tamannio), style: { fontSize: props.tamannio + 'px' } },
|
|
896
|
-
"letra ",
|
|
897
|
-
props.denominacion);
|
|
898
|
-
}
|
|
899
|
-
function FastSettup() {
|
|
900
|
-
const [anchorEl, setAnchorEl] = React.useState(null);
|
|
901
|
-
const [open, setOpen] = React.useState(false);
|
|
902
|
-
const handleClick = (event) => {
|
|
903
|
-
setAnchorEl(event.currentTarget);
|
|
904
|
-
setOpen((prev) => !prev);
|
|
905
|
-
};
|
|
906
|
-
const dispatch = (0, react_redux_1.useDispatch)();
|
|
907
|
-
const cambiar = (modoDespliegue) => {
|
|
908
|
-
dispatch(redux_formulario_1.dispatchers.MODO_DESPLIEGUE({ modoDespliegue }));
|
|
909
|
-
setOpen(false);
|
|
910
|
-
};
|
|
911
|
-
const opciones = (0, react_redux_1.useSelector)((state) => state.opciones);
|
|
912
|
-
return React.createElement(React.Fragment, null,
|
|
913
|
-
React.createElement(Button, { onClick: handleClick },
|
|
914
|
-
React.createElement(render_general_1.ICON.Settings, null)),
|
|
915
|
-
React.createElement(core_1.Menu, { open: open, anchorEl: anchorEl, onClose: () => setOpen(false) },
|
|
916
|
-
React.createElement(core_1.MenuItem, { onClick: () => cambiar("relevamiento") }, "normal"),
|
|
917
|
-
React.createElement(core_1.MenuItem, { onClick: () => cambiar("PDF") }, "PDF para relevamiento"),
|
|
918
|
-
React.createElement(core_1.MenuItem, { onClick: () => cambiar("metadatos") }, "revisar metadatos"),
|
|
919
|
-
React.createElement(core_1.Divider, null),
|
|
920
|
-
React.createElement(MenuLetra, { tamannio: 12, denominacion: "muy chica" }),
|
|
921
|
-
React.createElement(MenuLetra, { tamannio: 14, denominacion: "chica" }),
|
|
922
|
-
React.createElement(MenuLetra, { tamannio: 16, denominacion: "normal" }),
|
|
923
|
-
React.createElement(MenuLetra, { tamannio: 19, denominacion: "grande" }),
|
|
924
|
-
React.createElement(MenuLetra, { tamannio: 22, denominacion: "enorme" }),
|
|
925
|
-
React.createElement(core_1.Divider, null),
|
|
926
|
-
React.createElement(core_1.MenuItem, null,
|
|
927
|
-
React.createElement("label", null,
|
|
928
|
-
React.createElement(core_1.Checkbox, { checked: opciones.conCampoOpciones, onChange: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'conCampoOpciones', valor: !opciones.conCampoOpciones })), inputProps: { 'aria-label': 'primary checkbox' } }),
|
|
929
|
-
"campo opciones")),
|
|
930
|
-
React.createElement(core_1.MenuItem, null,
|
|
931
|
-
React.createElement("label", null,
|
|
932
|
-
React.createElement(core_1.Checkbox, { checked: opciones.saltoAutomatico, onChange: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'saltoAutomatico', valor: !opciones.saltoAutomatico })), inputProps: { 'aria-label': 'primary checkbox' } }),
|
|
933
|
-
"salto autom\u00E1tico"))));
|
|
934
|
-
}
|
|
935
|
-
function BarraDeNavegacion(props) {
|
|
936
|
-
const dispatch = (0, react_redux_1.useDispatch)();
|
|
937
|
-
const forPk = props.forPk;
|
|
938
|
-
const { opciones } = useSelectorVivienda(forPk);
|
|
939
|
-
const [confirmaCerrar, setConfirmaCerrar] = (0, react_1.useState)(false);
|
|
940
|
-
var dominio = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tem.dominio;
|
|
941
|
-
var cerrarDirecto = function () {
|
|
942
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
943
|
-
removeCSSById(BOOTSTRAP_5_1_3_SRC);
|
|
944
|
-
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
945
|
-
(0, redux_formulario_1.gotoConsistir)(estructura.operativo, (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tarea.tarea, forPk.vivienda);
|
|
946
|
-
//var hash=new URLSearchParams(location.hash?.replace(/^\#/,'').split('&autoproced')[0]);
|
|
947
|
-
////hash.delete('autoproced')
|
|
948
|
-
//close();
|
|
949
|
-
//location.hash=hash.toString();
|
|
950
|
-
});
|
|
951
|
-
};
|
|
952
|
-
var botonesFormulario = [];
|
|
953
|
-
if (!opciones.modoDirecto) {
|
|
954
|
-
botonesFormulario.push({ que: 'hdr', abr: 'HdR', label: 'hoja de ruta', retroceso: 0 });
|
|
955
|
-
}
|
|
956
|
-
opciones.pilaForPk.forEach((forPk, i) => botonesFormulario.push({ que: 'volver', abr: forPk.formulario.replace(/^F:/, ''), label: forPk.formulario, retroceso: opciones.pilaForPk.length - i }));
|
|
957
|
-
botonesFormulario.push({ que: '', abr: forPk.formulario.replace(/^F:/, ''), label: forPk.formulario, retroceso: 0 });
|
|
958
|
-
return React.createElement(React.Fragment, null,
|
|
959
|
-
React.createElement(core_1.ButtonGroup, { key: "formularios", className: "barra-navegacion", "solo-lectura": props.soloLectura ? 'si' : 'no' }, botonesFormulario.map((b, i) => React.createElement(Button, { color: b.que == forPk.formulario ? "primary" : "inherit", variant: "outlined", key: `${i}-${b.que}-${b.retroceso}`, disabled: !b.que, onClick: () => dispatch(b.que == 'hdr' ? redux_formulario_1.dispatchers.VOLVER_HDR({}) :
|
|
960
|
-
redux_formulario_1.dispatchers.VOLVER_DE_FORMULARIO({ magnitudRetroceso: b.retroceso })) },
|
|
961
|
-
React.createElement("span", { className: "abr" }, b.abr),
|
|
962
|
-
React.createElement("span", { className: "label" }, b.label)))),
|
|
963
|
-
props.soloLectura ? React.createElement(Typography, { component: "span", style: { margin: '0 10px' } }, " (Solo Lectura) ") : null,
|
|
964
|
-
props.modoDirecto ?
|
|
965
|
-
React.createElement(React.Fragment, null,
|
|
966
|
-
React.createElement(core_1.ButtonGroup, { key: "volver_y_grabar", style: { margin: '0 0 0 30px' } },
|
|
967
|
-
React.createElement(Button, { color: "inherit", variant: "outlined", onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
968
|
-
if (props.soloLectura || !(0, bypass_formulario_2.getDirty)()) {
|
|
969
|
-
cerrarDirecto();
|
|
970
|
-
}
|
|
971
|
-
else {
|
|
972
|
-
setConfirmaCerrar(true);
|
|
973
|
-
}
|
|
974
|
-
}) },
|
|
975
|
-
React.createElement(render_general_1.ICON.ExitToApp, null)),
|
|
976
|
-
React.createElement(core_1.Dialog, { open: !!confirmaCerrar,
|
|
977
|
-
//hace que no se cierre el mensaje
|
|
978
|
-
onClose: () => setConfirmaCerrar(false), "aria-labelledby": "alert-dialog-title", "aria-describedby": "alert-dialog-description" },
|
|
979
|
-
React.createElement(core_1.DialogTitle, { id: "alert-dialog-title" }, "Confirme cierre de encuesta"),
|
|
980
|
-
React.createElement(core_1.DialogContent, null,
|
|
981
|
-
React.createElement(core_1.DialogContentText, { id: "alert-dialog-description" }, "Est\u00E1 por salir de la encuesta, se perder\u00E1n los cambios no guardados.")),
|
|
982
|
-
React.createElement(core_1.DialogActions, null,
|
|
983
|
-
React.createElement(Button, { onClick: () => {
|
|
984
|
-
cerrarDirecto();
|
|
985
|
-
}, color: "secondary", variant: "outlined" }, "descartar cambios y cerrar"),
|
|
986
|
-
React.createElement(Button, { onClick: () => {
|
|
987
|
-
setConfirmaCerrar(false);
|
|
988
|
-
}, color: "primary", variant: "contained" }, "continuar editando encuesta"))),
|
|
989
|
-
props.soloLectura ? null :
|
|
990
|
-
React.createElement(Button, { id: "save-button", color: "inherit", variant: "outlined", disabled: true, onClick: () => __awaiter(this, void 0, void 0, function* () { return true; }) },
|
|
991
|
-
React.createElement(render_general_1.ICON.Save, null))))
|
|
992
|
-
: null,
|
|
993
|
-
React.createElement(Typography, { className: "mostrar-forPk", component: "span", style: { margin: '0 10px' } },
|
|
994
|
-
VER_DOMINIO ? React.createElement("div", { key: dominio },
|
|
995
|
-
React.createElement("span", null, "dominio"),
|
|
996
|
-
React.createElement("span", null, dominio)) : '',
|
|
997
|
-
(0, like_ar_1.strict)(props.forPk).filter((_, k) => k != 'formulario').map((v, k) => React.createElement("div", { key: k },
|
|
998
|
-
React.createElement("span", null, k),
|
|
999
|
-
React.createElement("span", null, v))).array()),
|
|
1000
|
-
React.createElement(FastSettup, null));
|
|
1001
|
-
}
|
|
1002
|
-
function BotonVolverEnDiv({ id }) {
|
|
1003
|
-
var { opciones } = (0, react_redux_1.useSelector)((state) => ({ opciones: state.opciones }));
|
|
1004
|
-
const dispatch = (0, react_redux_1.useDispatch)();
|
|
1005
|
-
return React.createElement("div", { className: "div-boton-volver" }, opciones.pilaForPk.length > 0 ?
|
|
1006
|
-
React.createElement(Button, { id: id, className: "boton-volver", onClick: () => dispatch(redux_formulario_1.dispatchers.VOLVER_DE_FORMULARIO({ magnitudRetroceso: 1 })) },
|
|
1007
|
-
" ",
|
|
1008
|
-
React.createElement(render_general_1.ICON.ChevronLeft, null),
|
|
1009
|
-
" Volver")
|
|
1010
|
-
: null);
|
|
1011
|
-
}
|
|
1012
|
-
function FormularioDespliegue(props) {
|
|
1013
|
-
var _a;
|
|
1014
|
-
var forPk = props.forPk;
|
|
1015
|
-
var { formulario, modoDespliegue, modo, opciones } = useSelectorVivienda(props.forPk);
|
|
1016
|
-
var soloLectura = (0, bypass_formulario_1.getDatosByPass)().soloLectura;
|
|
1017
|
-
const dispatch = (0, react_redux_1.useDispatch)();
|
|
1018
|
-
(0, react_1.useEffect)(() => {
|
|
1019
|
-
var controlScroll = () => {
|
|
1020
|
-
var arriba = document.getElementById('fab-activo-arriba');
|
|
1021
|
-
if (arriba) {
|
|
1022
|
-
(0, bypass_formulario_2.setValorDistinto)(arriba.style, 'visibility',
|
|
1023
|
-
// @ts-ignore
|
|
1024
|
-
arriba.elTopVisibilizar != null && arriba.elTopVisibilizar + 10
|
|
1025
|
-
< document.documentElement.scrollTop ? 'visible' : 'hidden');
|
|
1026
|
-
}
|
|
1027
|
-
var abajo = document.getElementById('fab-activo-abajo');
|
|
1028
|
-
if (abajo) {
|
|
1029
|
-
(0, bypass_formulario_2.setValorDistinto)(abajo.style, 'visibility',
|
|
1030
|
-
// @ts-ignore
|
|
1031
|
-
abajo.elBottomVisibilizar != null && abajo.elBottomVisibilizar - 20
|
|
1032
|
-
> document.documentElement.scrollTop + window.innerHeight * 0.7 ? 'visible' : 'hidden');
|
|
1033
|
-
}
|
|
1034
|
-
};
|
|
1035
|
-
window.addEventListener('scroll', controlScroll);
|
|
1036
|
-
controlScroll();
|
|
1037
|
-
return () => {
|
|
1038
|
-
window.removeEventListener('scroll', controlScroll);
|
|
1039
|
-
};
|
|
1040
|
-
});
|
|
1041
|
-
// TODO Volver a poner el movimiento a la actual
|
|
1042
|
-
var actual;
|
|
1043
|
-
var completo;
|
|
1044
|
-
var onClickSaltarActual = () => {
|
|
1045
|
-
var { variableActual } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: bypass_formulario_2.NO_CAMBIAR__SOLO_TRAER_STATUS, forPk: props.forPk });
|
|
1046
|
-
if (variableActual) {
|
|
1047
|
-
enfocarElementoDeVariable(variableActual);
|
|
1048
|
-
}
|
|
1049
|
-
};
|
|
1050
|
-
var listaModos = ['metadatos', 'relevamiento', 'PDF'];
|
|
1051
|
-
['boton-volver-1', 'boton-volver-2'].forEach(id => {
|
|
1052
|
-
(0, bypass_formulario_2.registrarElemento)({ id, attr: 'resumen-estado', fun: (_, feedbackForm) => (feedbackForm.resumen) });
|
|
1053
|
-
});
|
|
1054
|
-
// @ts-expect-error especial hay que leerlo en el parser de casilleros si esto termina quedando así
|
|
1055
|
-
var pantallaCompleta = (_a = formulario.especial) === null || _a === void 0 ? void 0 : _a.pantallaCompleta;
|
|
1056
|
-
return (React.createElement(React.Fragment, null,
|
|
1057
|
-
React.createElement(core_1.AppBar, { position: "fixed", color: soloLectura ? 'secondary' : 'primary' },
|
|
1058
|
-
React.createElement(core_1.Toolbar, null,
|
|
1059
|
-
React.createElement(BarraDeNavegacion, { forPk: forPk, soloLectura: soloLectura || false, modoDirecto: opciones.modoDirecto })),
|
|
1060
|
-
React.createElement("div", { id: "mini-console" })),
|
|
1061
|
-
React.createElement("main", null,
|
|
1062
|
-
React.createElement(core_1.Paper, { className: "formulario", "modo-despliegue": modoDespliegue, "ver-num-opciones": opciones.conCampoOpciones ? 'SI' : 'NO' },
|
|
1063
|
-
modo.demo ? React.createElement("div", null,
|
|
1064
|
-
React.createElement(Typography, { component: "span" }, "Modo de despliegue:"),
|
|
1065
|
-
React.createElement(core_1.ButtonGroup, null, listaModos.map(modo => React.createElement(Button, { key: modo, variant: modo == modoDespliegue ? "contained" : "outlined", onClick: () => dispatch(redux_formulario_1.dispatchers.MODO_DESPLIEGUE({ modoDespliegue: modo })) }, modo)))) : null,
|
|
1066
|
-
pantallaCompleta ? null : React.createElement(BotonVolverEnDiv, { id: "boton-volver-1" }),
|
|
1067
|
-
pantallaCompleta ? null : React.createElement(FormularioEncabezado, { casillero: formulario }),
|
|
1068
|
-
React.createElement(DesplegarContenidoInternoBloqueOFormulario, { bloqueOFormulario: formulario, formulario: formulario, forPk: forPk, multiple: false }),
|
|
1069
|
-
pantallaCompleta ? null : React.createElement(BotonVolverEnDiv, { id: "boton-volver-2" })),
|
|
1070
|
-
React.createElement(core_1.Fab, { id: 'fab-activo-arriba', color: "primary", "aria-label": "add", onClick: onClickSaltarActual },
|
|
1071
|
-
React.createElement(render_general_1.ICON.KeyboardArrowUp, null)),
|
|
1072
|
-
React.createElement(core_1.Fab, { id: 'fab-activo-abajo', color: "primary", "aria-label": "add", onClick: onClickSaltarActual },
|
|
1073
|
-
React.createElement(render_general_1.ICON.KeyboardArrowDown, null)),
|
|
1074
|
-
React.createElement(core_1.Fab, { id: 'fab-error-arriba', variant: "extended", color: "secondary", "aria-label": "edit" },
|
|
1075
|
-
React.createElement(render_general_1.ICON.Navigation, null),
|
|
1076
|
-
"Error"),
|
|
1077
|
-
React.createElement(core_1.Fab, { id: 'fab-error-abajo', variant: "extended", color: "secondary", "aria-label": "edit" },
|
|
1078
|
-
React.createElement(render_general_1.ICON.NavigationDown, null),
|
|
1079
|
-
"Error"),
|
|
1080
|
-
React.createElement("div", { className: 'espacio-final-formulario' }),
|
|
1081
|
-
opciones.modoBorrarRespuesta && opciones.forPk ? React.createElement(DesplegarConfirmarBorrarRespuesta, { forPk: opciones.forPk, variableBorrar: opciones.modoBorrarRespuesta }) : null)));
|
|
1082
|
-
}
|
|
1083
|
-
function Atributo(props) {
|
|
1084
|
-
return props.valor != null && props.valor != '' ? React.createElement("span", { className: "atributo-par" },
|
|
1085
|
-
props.nombre ? React.createElement("span", { className: "atributo-nombre" }, props.nombre) : null,
|
|
1086
|
-
React.createElement("span", { className: "atributo-valor" }, props.valor.toString())) : null;
|
|
1087
|
-
}
|
|
1088
|
-
exports.Atributo = Atributo;
|
|
1089
|
-
const listaEstadosCarga = ['resumen', 'relevamiento', 'recibo'];
|
|
1090
|
-
var resumidores = [
|
|
1091
|
-
{ nombre: 'REA', f: (rr) => rr.resumenEstado == "ok" },
|
|
1092
|
-
{ nombre: 'Cita pactada', f: (rr) => rr.resumenEstado == "cita pactada" },
|
|
1093
|
-
{ nombre: 'Pendientes', f: (rr) => rr.resumenEstado == "vacio" },
|
|
1094
|
-
];
|
|
1095
|
-
resumidores.push({ nombre: 'Otros', f: resumidores.reduce((g, r) => (rr => !r.f(rr) && g(rr)), (_) => true) });
|
|
1096
|
-
function DesplegarLineaResumenUAPrincipal(props) {
|
|
1097
|
-
const { numVivienda, respuestas, formPrincipal, tarea } = props;
|
|
1098
|
-
const id = 'viv-' + numVivienda;
|
|
1099
|
-
const forPk = { formulario: formPrincipal, vivienda: Number(numVivienda) }; //no quitar el casteo porque viene como texto y necesito que sea número
|
|
1100
|
-
var tem = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[numVivienda].tem;
|
|
1101
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1102
|
-
(0, react_1.useEffect)(() => {
|
|
1103
|
-
(0, bypass_formulario_2.volcadoInicialElementosRegistrados)(forPk);
|
|
1104
|
-
(0, bypass_formulario_1.intentarBackup)(forPk);
|
|
1105
|
-
});
|
|
1106
|
-
(0, bypass_formulario_2.registrarElemento)({ id, direct: true,
|
|
1107
|
-
fun: (r, _feedbackForm, elemento, feedbackAll, _estructura) => {
|
|
1108
|
-
//pregunto si es la misma vivienda porque la funcion se dispara
|
|
1109
|
-
//con todas las combinaciones de respuestas para cada forPk
|
|
1110
|
-
//@ts-ignore vivienda existe
|
|
1111
|
-
if (r.vivienda == forPk.vivienda) {
|
|
1112
|
-
elemento.setAttribute('resumen-estado', (0, bypass_formulario_1.calcularResumenVivienda)(forPk, feedbackAll, r).resumenEstado);
|
|
1113
|
-
}
|
|
1114
|
-
}
|
|
1115
|
-
});
|
|
1116
|
-
return React.createElement(core_1.TableRow, { key: numVivienda },
|
|
1117
|
-
React.createElement(core_1.TableCell, null, tem ?
|
|
1118
|
-
React.createElement(React.Fragment, null,
|
|
1119
|
-
React.createElement(DesplegarTem, { tem: tem }),
|
|
1120
|
-
respuestas['resumenEstado'] == "cita pactada" ?
|
|
1121
|
-
React.createElement(DesplegarCitaPactada, { respuestas: respuestas })
|
|
1122
|
-
:
|
|
1123
|
-
React.createElement(DesplegarCitaPactadaYSeleccionadoAnteriorTem, { tem: tem }))
|
|
1124
|
-
: null),
|
|
1125
|
-
React.createElement(core_1.TableCell, null, tarea),
|
|
1126
|
-
React.createElement(core_1.TableCell, null,
|
|
1127
|
-
React.createElement(Button, { id: id, onClick: () => dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk, apilarVuelta: false })) }, numVivienda.toString())));
|
|
1128
|
-
}
|
|
1129
|
-
exports.DesplegarLineaResumenUAPrincipal = DesplegarLineaResumenUAPrincipal;
|
|
1130
|
-
function DesplegarCarga(props) {
|
|
1131
|
-
const { carga, idCarga, informacionHdr, respuestas } = props;
|
|
1132
|
-
return React.createElement(core_1.Paper, { className: "carga" },
|
|
1133
|
-
React.createElement("div", { className: "informacion-carga" },
|
|
1134
|
-
React.createElement("div", { className: "carga" },
|
|
1135
|
-
"\u00C1rea: ",
|
|
1136
|
-
idCarga),
|
|
1137
|
-
React.createElement("div", { className: "observaciones" }, carga.observaciones)),
|
|
1138
|
-
React.createElement("div", { className: "informacion-carga" },
|
|
1139
|
-
React.createElement("div", { className: "fecha" }, carga.fecha)),
|
|
1140
|
-
carga.estado_carga == null && !props.posicion || carga.estado_carga == 'relevamiento' ?
|
|
1141
|
-
React.createElement(core_1.Table, { className: "tabla-carga-hoja-de-ruta" },
|
|
1142
|
-
React.createElement("colgroup", null,
|
|
1143
|
-
React.createElement("col", { style: { width: "75%" } }),
|
|
1144
|
-
React.createElement("col", { style: { width: "10%" } }),
|
|
1145
|
-
React.createElement("col", { style: { width: "15%" } })),
|
|
1146
|
-
React.createElement(core_1.TableHead, { style: { fontSize: "1.2rem" } },
|
|
1147
|
-
React.createElement(core_1.TableRow, { className: "tr-carga" },
|
|
1148
|
-
React.createElement(core_1.TableCell, null, "domicilio"),
|
|
1149
|
-
React.createElement(core_1.TableCell, null, "tarea"),
|
|
1150
|
-
React.createElement(core_1.TableCell, null, "enc"))),
|
|
1151
|
-
React.createElement(core_1.TableBody, null, (0, like_ar_1.strict)(informacionHdr).filter((informacion) => informacion.tem.carga == idCarga).map((informacion, numVivienda) => React.createElement(DesplegarLineaResumenUAPrincipal, { key: numVivienda, numVivienda: numVivienda, tarea: informacion.tarea.tarea, formPrincipal: informacion.tarea.main_form, respuestas: respuestas.viviendas[numVivienda] })).array())) :
|
|
1152
|
-
React.createElement(core_1.Table, null,
|
|
1153
|
-
React.createElement(core_1.TableHead, { style: { fontSize: "1.2rem" } },
|
|
1154
|
-
React.createElement(core_1.TableRow, { className: "tr-carga" }, resumidores.map((resumidor, i) => React.createElement(core_1.TableCell, { key: i }, resumidor.nombre))))));
|
|
1155
|
-
}
|
|
1156
|
-
exports.DesplegarCarga = DesplegarCarga;
|
|
1157
|
-
function DesplegarCitaPactada(props) {
|
|
1158
|
-
const { respuestas } = props;
|
|
1159
|
-
return React.createElement("div", { className: "cita-pactada" },
|
|
1160
|
-
React.createElement("div", null,
|
|
1161
|
-
React.createElement(Atributo, { nombre: "Cita pactada con ", valor: respuestas[p12] })),
|
|
1162
|
-
React.createElement("div", null,
|
|
1163
|
-
React.createElement(Atributo, { nombre: "Cel.:", valor: respuestas[sp2] })),
|
|
1164
|
-
React.createElement("div", null,
|
|
1165
|
-
React.createElement(Atributo, { nombre: "Tel.:", valor: respuestas[sp3] })),
|
|
1166
|
-
React.createElement("div", null,
|
|
1167
|
-
React.createElement(Atributo, { nombre: "Fecha:", valor: respuestas[sp4] })),
|
|
1168
|
-
React.createElement("div", null,
|
|
1169
|
-
React.createElement(Atributo, { nombre: "Hora:", valor: respuestas[sp5] })));
|
|
1170
|
-
}
|
|
1171
|
-
exports.DesplegarCitaPactada = DesplegarCitaPactada;
|
|
1172
|
-
function DesplegarCitaPactadaYSeleccionadoAnteriorTem(props) {
|
|
1173
|
-
const { tem } = props;
|
|
1174
|
-
return React.createElement("div", null,
|
|
1175
|
-
React.createElement("div", { className: "tem-cita" },
|
|
1176
|
-
React.createElement(Atributo, { nombre: "Cita:", valor: tem.cita })));
|
|
1177
|
-
}
|
|
1178
|
-
exports.DesplegarCitaPactadaYSeleccionadoAnteriorTem = DesplegarCitaPactadaYSeleccionadoAnteriorTem;
|
|
1179
|
-
function DesplegarTem(props) {
|
|
1180
|
-
const { tem } = props;
|
|
1181
|
-
return React.createElement("div", null,
|
|
1182
|
-
React.createElement("div", { className: "tem-domicilio" },
|
|
1183
|
-
tem.nomcalle,
|
|
1184
|
-
" ",
|
|
1185
|
-
tem.nrocatastral,
|
|
1186
|
-
" ",
|
|
1187
|
-
React.createElement(Atributo, { nombre: "piso", valor: tem.piso }),
|
|
1188
|
-
" ",
|
|
1189
|
-
React.createElement(Atributo, { nombre: "dpto", valor: tem.departamento }),
|
|
1190
|
-
" "),
|
|
1191
|
-
React.createElement("div", null,
|
|
1192
|
-
React.createElement(Atributo, { nombre: "sector", valor: tem.sector }),
|
|
1193
|
-
React.createElement(Atributo, { nombre: "edificio", valor: tem.edificio }),
|
|
1194
|
-
React.createElement(Atributo, { nombre: "casa", valor: tem.casa }),
|
|
1195
|
-
React.createElement(Atributo, { nombre: "entrada", valor: tem.entrada }),
|
|
1196
|
-
React.createElement(Atributo, { nombre: "habitacion", valor: tem.habitacion })),
|
|
1197
|
-
React.createElement("div", { className: "tem-observaciones" }, tem.observaciones));
|
|
1198
|
-
}
|
|
1199
|
-
exports.DesplegarTem = DesplegarTem;
|
|
1200
|
-
function HojaDeRutaDespliegue() {
|
|
1201
|
-
var { cargas, num_sincro, informacionHdr, respuestas } = (0, bypass_formulario_1.getDatosByPass)();
|
|
1202
|
-
var { modo } = (0, react_redux_1.useSelector)((state) => ({ modo: state.modo }));
|
|
1203
|
-
var feedbackRowValidator = (0, bypass_formulario_2.getFeedbackRowValidator)();
|
|
1204
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1205
|
-
const updateOnlineStatus = function () {
|
|
1206
|
-
setOnline(window.navigator.onLine);
|
|
1207
|
-
};
|
|
1208
|
-
const appVersion = (0, redux_formulario_1.getCacheVersion)();
|
|
1209
|
-
const [online, setOnline] = (0, react_1.useState)(window.navigator.onLine);
|
|
1210
|
-
window.addEventListener('online', updateOnlineStatus);
|
|
1211
|
-
window.addEventListener('offline', updateOnlineStatus);
|
|
1212
|
-
return (React.createElement(React.Fragment, null,
|
|
1213
|
-
React.createElement(core_1.AppBar, { position: "fixed" },
|
|
1214
|
-
React.createElement(core_1.Toolbar, null,
|
|
1215
|
-
React.createElement(Typography, { variant: "h6" }, "Hoja de ruta"),
|
|
1216
|
-
online ?
|
|
1217
|
-
React.createElement(React.Fragment, null,
|
|
1218
|
-
React.createElement(core_1.IconButton, { color: "inherit", onClick: () => {
|
|
1219
|
-
(0, redux_formulario_1.gotoSincronizar)();
|
|
1220
|
-
} },
|
|
1221
|
-
React.createElement(render_general_1.ICON.SyncAlt, null)))
|
|
1222
|
-
: null)),
|
|
1223
|
-
React.createElement("div", { className: "hoja-de-ruta" },
|
|
1224
|
-
modo.demo ? React.createElement("div", null,
|
|
1225
|
-
React.createElement(Typography, null, "Modo demo "),
|
|
1226
|
-
React.createElement(Button, { variant: "outlined", color: "secondary", onClick: () => dispatch(redux_formulario_1.dispatchers.REINICIAR_DEMO({})) }, "reiniciar")) : null,
|
|
1227
|
-
React.createElement("div", { className: "nombre-version" },
|
|
1228
|
-
React.createElement("div", null, "Direcci\u00F3n General de Estad\u00EDstica y Censos - C.A.B.A."),
|
|
1229
|
-
React.createElement("div", null,
|
|
1230
|
-
my.getLocalVar('app-version'),
|
|
1231
|
-
" sincro ",
|
|
1232
|
-
num_sincro,
|
|
1233
|
-
" - versi\u00F3n ",
|
|
1234
|
-
appVersion)),
|
|
1235
|
-
(0, like_ar_1.strict)(cargas).map((carga, idCarga, _, posicion) => React.createElement(DesplegarCarga, { key: idCarga, carga: carga, idCarga: idCarga, posicion: posicion, informacionHdr: informacionHdr, feedbackRowValidator: feedbackRowValidator, respuestas: respuestas })).array())));
|
|
1236
|
-
}
|
|
1237
|
-
exports.HojaDeRutaDespliegue = HojaDeRutaDespliegue;
|
|
1238
|
-
function ListaTextos(props) {
|
|
1239
|
-
return React.createElement("ul", null, props.textos.map(t => React.createElement("li", null,
|
|
1240
|
-
React.createElement(Typography, null, t))));
|
|
1241
|
-
}
|
|
1242
|
-
exports.ListaTextos = ListaTextos;
|
|
1243
|
-
function BienvenidaDespliegue(props) {
|
|
1244
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1245
|
-
return React.createElement(core_1.Paper, { className: "bienvenida" },
|
|
1246
|
-
props.modo.demo ?
|
|
1247
|
-
React.createElement(React.Fragment, null,
|
|
1248
|
-
React.createElement(Typography, null, "DEMO del sistema de relevamiento de DMENCU"),
|
|
1249
|
-
React.createElement(Typography, null, "En esta demo:"),
|
|
1250
|
-
React.createElement(ListaTextos, { textos: [
|
|
1251
|
-
"Algunas viviendas aparecen relevadas (el botón está de color) sirven de ejemplo",
|
|
1252
|
-
"Lo que se carguen se guardan localmente pero no se trasmiten a la base de datos",
|
|
1253
|
-
"Se puede volver a la versión inicial (o sea borrar lo que se guardó localmente) desde la hoja de ruta boton [reiniciar demo]",
|
|
1254
|
-
"Todavía hay cosas que faltan o pueden cambiar",
|
|
1255
|
-
] }))
|
|
1256
|
-
: React.createElement(React.Fragment, null,
|
|
1257
|
-
React.createElement(Typography, null, "Encuesta de Seroprevalencia de COVID-19")),
|
|
1258
|
-
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => { (0, redux_formulario_1.gotoSincronizar)(); } },
|
|
1259
|
-
React.createElement("span", null, "Sincronizar "),
|
|
1260
|
-
" ",
|
|
1261
|
-
React.createElement(render_general_1.ICON.SyncAlt, null)),
|
|
1262
|
-
React.createElement(Button, { variant: "contained", color: "primary", onClick: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'bienvenido', valor: true })) },
|
|
1263
|
-
React.createElement("span", null, "Continuar "),
|
|
1264
|
-
" ",
|
|
1265
|
-
React.createElement(render_general_1.ICON.Send, null)));
|
|
1266
|
-
}
|
|
1267
|
-
exports.BienvenidaDespliegue = BienvenidaDespliegue;
|
|
1268
|
-
//CONTROL DE PESTAÑAS
|
|
1269
|
-
var allOpenedTabs = {};
|
|
1270
|
-
var infoOpenedTabs = {
|
|
1271
|
-
allOpenedTabs,
|
|
1272
|
-
myId: 'calculando...',
|
|
1273
|
-
otherTabsNames: ''
|
|
1274
|
-
};
|
|
1275
|
-
function OpenedTabs() {
|
|
1276
|
-
const [tabs, setTabs] = (0, react_1.useState)(infoOpenedTabs.otherTabsNames);
|
|
1277
|
-
var { modoDirecto } = (0, react_redux_1.useSelector)((state) => ({ modoDirecto: state.opciones.modoDirecto }));
|
|
1278
|
-
const updateTabsStatus = function () {
|
|
1279
|
-
setTabs(infoOpenedTabs.otherTabsNames);
|
|
1280
|
-
};
|
|
1281
|
-
(0, react_1.useEffect)(() => {
|
|
1282
|
-
window.addEventListener('my-tabs', updateTabsStatus);
|
|
1283
|
-
return () => window.removeEventListener('my-tabs', updateTabsStatus);
|
|
1284
|
-
}, []);
|
|
1285
|
-
return modoDirecto ? null : (tabs) ?
|
|
1286
|
-
React.createElement("div", { className: "tab-counter tab-error" },
|
|
1287
|
-
"\u00A1ATENCI\u00D3N! Hay m\u00E1s de una ventana abierta. Se pueden perder datos: ",
|
|
1288
|
-
tabs)
|
|
1289
|
-
:
|
|
1290
|
-
React.createElement("div", { className: "tab-counter" }, "\u2714");
|
|
1291
|
-
}
|
|
1292
|
-
exports.OpenedTabs = OpenedTabs;
|
|
1293
|
-
function AppDmEncu() {
|
|
1294
|
-
var { forPk, bienvenido, modo } = (0, react_redux_1.useSelector)((state) => (Object.assign(Object.assign(Object.assign({}, state.opciones), state.modo), state)));
|
|
1295
|
-
if (!bienvenido) {
|
|
1296
|
-
return React.createElement(BienvenidaDespliegue, { modo: modo });
|
|
1297
|
-
}
|
|
1298
|
-
else if (forPk == null) {
|
|
1299
|
-
return React.createElement(HojaDeRutaDespliegue, null);
|
|
1300
|
-
}
|
|
1301
|
-
else {
|
|
1302
|
-
return React.createElement(FormularioDespliegue, { forPk: forPk });
|
|
1303
|
-
}
|
|
1304
|
-
}
|
|
1305
|
-
exports.AppDmEncu = AppDmEncu;
|
|
1306
|
-
function PantallaInicialSinCarga(_props) {
|
|
1307
|
-
const updateOnlineStatus = function () {
|
|
1308
|
-
setOnline(window.navigator.onLine);
|
|
1309
|
-
};
|
|
1310
|
-
const [online, setOnline] = (0, react_1.useState)(window.navigator.onLine);
|
|
1311
|
-
window.addEventListener('online', updateOnlineStatus);
|
|
1312
|
-
window.addEventListener('offline', updateOnlineStatus);
|
|
1313
|
-
const paragraphStyles = { fontSize: "1.2rem", fontWeight: 600, padding: "5px 10px" };
|
|
1314
|
-
return (React.createElement(React.Fragment, null,
|
|
1315
|
-
React.createElement(core_1.AppBar, { position: "fixed" },
|
|
1316
|
-
React.createElement(Typography, { variant: "h6", style: { margin: 25 } }, "Dispositivo sin carga")),
|
|
1317
|
-
React.createElement("main", null,
|
|
1318
|
-
React.createElement(core_1.Paper, { style: { height: '600px', padding: "15px", marginTop: 75 } },
|
|
1319
|
-
React.createElement("div", null, online ?
|
|
1320
|
-
React.createElement(React.Fragment, null,
|
|
1321
|
-
React.createElement(Typography, { component: "p", style: paragraphStyles },
|
|
1322
|
-
"Sincronizar dispositivo",
|
|
1323
|
-
React.createElement("span", { style: { padding: '5px' } },
|
|
1324
|
-
React.createElement(Button, { color: "primary", variant: "contained", onClick: () => {
|
|
1325
|
-
(0, redux_formulario_1.gotoSincronizar)();
|
|
1326
|
-
} },
|
|
1327
|
-
React.createElement(render_general_1.ICON.SyncAlt, null)))))
|
|
1328
|
-
:
|
|
1329
|
-
React.createElement(Typography, { component: "p", style: paragraphStyles }, "No hay conexi\u00F3n a internet, por favor con\u00E9cte el dispositivo a una red para sincronizar una hoja de ruta."))))));
|
|
1330
|
-
}
|
|
1331
|
-
function PantallaInicial() {
|
|
1332
|
-
var { forPk, bienvenido, modo } = (0, react_redux_1.useSelector)((state) => (Object.assign(Object.assign(Object.assign({}, state.opciones), state.modo), state)));
|
|
1333
|
-
if (!bienvenido) {
|
|
1334
|
-
return React.createElement(BienvenidaDespliegue, { modo: modo });
|
|
1335
|
-
}
|
|
1336
|
-
else if (forPk == null) {
|
|
1337
|
-
return React.createElement(HojaDeRutaDespliegue, null);
|
|
1338
|
-
}
|
|
1339
|
-
else {
|
|
1340
|
-
return React.createElement(FormularioDespliegue, { forPk: forPk });
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
exports.PantallaInicial = PantallaInicial;
|
|
1344
|
-
function dmPantallaInicialSinCarga() {
|
|
1345
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1346
|
-
try {
|
|
1347
|
-
yield loadCSS(BOOTSTRAP_5_1_3_SRC);
|
|
1348
|
-
}
|
|
1349
|
-
catch (err) {
|
|
1350
|
-
throw (err);
|
|
1351
|
-
}
|
|
1352
|
-
ReactDOM.render(React.createElement(PantallaInicialSinCarga, null), document.getElementById('main_layout'));
|
|
1353
|
-
});
|
|
1354
|
-
}
|
|
1355
|
-
exports.dmPantallaInicialSinCarga = dmPantallaInicialSinCarga;
|
|
1356
|
-
function desplegarFormularioActual(opts) {
|
|
1357
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1358
|
-
// traer los metadatos en una "estructura"
|
|
1359
|
-
// traer los datos de localStorage
|
|
1360
|
-
// verificar el main Layout
|
|
1361
|
-
const store = yield (0, redux_formulario_1.dmTraerDatosFormulario)(opts);
|
|
1362
|
-
try {
|
|
1363
|
-
yield loadCSS(BOOTSTRAP_5_1_3_SRC);
|
|
1364
|
-
}
|
|
1365
|
-
catch (err) {
|
|
1366
|
-
throw (err);
|
|
1367
|
-
}
|
|
1368
|
-
ReactDOM.render(React.createElement(render_general_1.RenderPrincipal, { store: store, dispatchers: redux_formulario_1.dispatchers, mensajeRetorno: opts.forPkRaiz ? "Volver al formulario" : "Volver a la hoja de ruta" },
|
|
1369
|
-
React.createElement(OpenedTabs, null),
|
|
1370
|
-
React.createElement(AppDmEncu, null)), document.getElementById('main_layout'));
|
|
1371
|
-
});
|
|
1372
|
-
}
|
|
1373
|
-
exports.desplegarFormularioActual = desplegarFormularioActual;
|
|
1374
|
-
if (typeof window !== 'undefined') {
|
|
1375
|
-
// @ts-ignore para hacerlo
|
|
1376
|
-
window.desplegarFormularioActual = desplegarFormularioActual;
|
|
1377
|
-
// @ts-ignore para hacerlo
|
|
1378
|
-
window.dmPantallaInicialSinCarga = dmPantallaInicialSinCarga;
|
|
1379
|
-
}
|
|
1380
|
-
function loadInstance() {
|
|
1381
|
-
if (typeof BroadcastChannel === 'undefined') {
|
|
1382
|
-
return;
|
|
1383
|
-
}
|
|
1384
|
-
var bc = new BroadcastChannel('contador');
|
|
1385
|
-
var myId = String.fromCodePoint(100 + Math.floor(Math.random() * 1000)) + Math.floor(Math.random() * 100); //+'-'+new Date().getTime();
|
|
1386
|
-
allOpenedTabs[myId] = 1;
|
|
1387
|
-
infoOpenedTabs.myId = myId;
|
|
1388
|
-
var event = new Event('my-tabs');
|
|
1389
|
-
bc.onmessage = function (ev) {
|
|
1390
|
-
if (ev.data.que == 'soy') {
|
|
1391
|
-
if (!allOpenedTabs[ev.data.id]) {
|
|
1392
|
-
allOpenedTabs[ev.data.id] = 0;
|
|
1393
|
-
}
|
|
1394
|
-
allOpenedTabs[ev.data.id]++;
|
|
1395
|
-
}
|
|
1396
|
-
if (ev.data.que == 'unload') {
|
|
1397
|
-
delete allOpenedTabs[ev.data.id];
|
|
1398
|
-
}
|
|
1399
|
-
if (ev.data.que == 'load') {
|
|
1400
|
-
allOpenedTabs[ev.data.id] = 1;
|
|
1401
|
-
bc.postMessage({ que: 'soy', id: myId });
|
|
1402
|
-
}
|
|
1403
|
-
infoOpenedTabs.otherTabsNames = (0, like_ar_1.strict)(allOpenedTabs).filter((_, id) => id != myId).join(',');
|
|
1404
|
-
window.dispatchEvent(event);
|
|
1405
|
-
};
|
|
1406
|
-
bc.postMessage({ que: 'load', id: myId });
|
|
1407
|
-
window.dispatchEvent(event);
|
|
1408
|
-
window.addEventListener('unload', function () {
|
|
1409
|
-
bc.postMessage({ que: 'unload', id: myId });
|
|
1410
|
-
window.dispatchEvent(event);
|
|
1411
|
-
});
|
|
1412
|
-
//mostrarQuienesSomos();
|
|
1413
|
-
}
|
|
1414
|
-
const setLibreDespliegue = (libre) => LibreDespliegue = libre;
|
|
1415
|
-
exports.setLibreDespliegue = setLibreDespliegue;
|
|
1416
|
-
(0, exports.setLibreDespliegue)((props) => React.createElement("div", { key: props.key, id: props.casillero.id_casillero }, "este casillero debe redefinirse en la APP final y su uso es exclusivo del \u00E1rea inform\u00E1tica"));
|
|
1417
|
-
(0, bypass_formulario_1.setCalcularVariables)((respuestasRaiz, forPk) => {
|
|
1418
|
-
//TODO GENERALIZAR
|
|
1419
|
-
var uasIterar = {
|
|
1420
|
-
hogares: {
|
|
1421
|
-
uaPersonas: 'personas',
|
|
1422
|
-
varSexoPersona: 'sexo',
|
|
1423
|
-
varNombrePersona: 'nombre',
|
|
1424
|
-
varLosNombres: "los_nombres"
|
|
1425
|
-
},
|
|
1426
|
-
["hogares_sup"]: {
|
|
1427
|
-
uaPersonas: 'personas_sup',
|
|
1428
|
-
varSexoPersona: 'sexo_sup',
|
|
1429
|
-
varNombrePersona: 'nombre_sup',
|
|
1430
|
-
varLosNombres: "nombres_componentes_sup"
|
|
1431
|
-
}
|
|
1432
|
-
};
|
|
1433
|
-
(0, like_ar_1.strict)(uasIterar).forEach((configHogares, uaHogares) => {
|
|
1434
|
-
var _a;
|
|
1435
|
-
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
1436
|
-
if (estructura.unidades_analisis[uaHogares]) {
|
|
1437
|
-
for (var respuestasHogar of (0, tipos_1.iterator)((_a = respuestasRaiz[uaHogares]) !== null && _a !== void 0 ? _a : [])) {
|
|
1438
|
-
if (!respuestasHogar[configHogares.uaPersonas] || (0, tipos_1.empty)(respuestasHogar[configHogares.uaPersonas]) || respuestasHogar[configHogares.uaPersonas][0][configHogares.varSexoPersona] == null) {
|
|
1439
|
-
var losNombres = respuestasHogar[configHogares.varLosNombres];
|
|
1440
|
-
if (losNombres != null) {
|
|
1441
|
-
if (!respuestasHogar[configHogares.uaPersonas]) {
|
|
1442
|
-
respuestasHogar[configHogares.uaPersonas] = [];
|
|
1443
|
-
}
|
|
1444
|
-
losNombres
|
|
1445
|
-
.split(',')
|
|
1446
|
-
.filter((nombre) => nombre.trim().length > 0)
|
|
1447
|
-
.forEach((nombre, i) => {
|
|
1448
|
-
respuestasHogar[configHogares.uaPersonas][i] = respuestasHogar[configHogares.uaPersonas][i] || {};
|
|
1449
|
-
respuestasHogar[configHogares.uaPersonas][i][configHogares.varNombrePersona] = nombre.trim();
|
|
1450
|
-
});
|
|
1451
|
-
}
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
});
|
|
1456
|
-
respuestasRaiz.vdominio = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tem.dominio;
|
|
1457
|
-
});
|
|
1458
|
-
window.addEventListener('load', function () {
|
|
1459
|
-
loadInstance();
|
|
1460
|
-
});
|
|
1461
|
-
//FIN CONTROL PESTAÑAS
|
|
1462
|
-
function loadCSS(cssURL, id) {
|
|
1463
|
-
return new Promise((resolve, reject) => {
|
|
1464
|
-
var link = document.createElement('link');
|
|
1465
|
-
link.rel = 'stylesheet';
|
|
1466
|
-
link.href = cssURL;
|
|
1467
|
-
link.id = id || cssURL;
|
|
1468
|
-
document.head.appendChild(link);
|
|
1469
|
-
link.onload = () => {
|
|
1470
|
-
resolve();
|
|
1471
|
-
console.log(`trae ${cssURL}`);
|
|
1472
|
-
};
|
|
1473
|
-
link.onerror = (err) => {
|
|
1474
|
-
console.log('error cargando el estilo', err);
|
|
1475
|
-
reject(new Error(`problema cargando estilo ${cssURL}`));
|
|
1476
|
-
};
|
|
1477
|
-
});
|
|
1478
|
-
}
|
|
1479
|
-
function removeCSSById(id) {
|
|
1480
|
-
var _a;
|
|
1481
|
-
var linkNode = document.getElementById(id);
|
|
1482
|
-
(_a = linkNode === null || linkNode === void 0 ? void 0 : linkNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(linkNode);
|
|
1483
|
-
}
|
|
1484
|
-
const BOOTSTRAP_5_1_3_SRC = 'css/bootstrap.min.css';
|
|
1485
|
-
});
|
|
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
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
11
|
+
var t = {};
|
|
12
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
13
|
+
t[p] = s[p];
|
|
14
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
15
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
16
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
17
|
+
t[p[i]] = s[p[i]];
|
|
18
|
+
}
|
|
19
|
+
return t;
|
|
20
|
+
};
|
|
21
|
+
(function (factory) {
|
|
22
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
23
|
+
var v = factory(require, exports);
|
|
24
|
+
if (v !== undefined) module.exports = v;
|
|
25
|
+
}
|
|
26
|
+
else if (typeof define === "function" && define.amd) {
|
|
27
|
+
define(["require", "exports", "react", "react-dom", "./render-general", "./tipos", "./bypass-formulario", "./redux-formulario", "react", "react-redux", "like-ar", "best-globals", "cast-error", "@material-ui/core", "./bypass-formulario", "js-to-html"], factory);
|
|
28
|
+
}
|
|
29
|
+
})(function (require, exports) {
|
|
30
|
+
"use strict";
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.setLibreDespliegue = exports.desplegarFormularioActual = exports.dmPantallaInicialSinCarga = exports.PantallaInicial = exports.AppDmEncu = exports.OpenedTabs = exports.BienvenidaDespliegue = exports.ListaTextos = exports.HojaDeRutaDespliegue = exports.DesplegarTem = exports.DesplegarCitaPactadaYSeleccionadoAnteriorTem = exports.DesplegarCitaPactada = exports.DesplegarCarga = exports.DesplegarLineaResumenUAPrincipal = exports.Atributo = void 0;
|
|
33
|
+
const React = require("react");
|
|
34
|
+
const ReactDOM = require("react-dom");
|
|
35
|
+
const render_general_1 = require("./render-general");
|
|
36
|
+
const tipos_1 = require("./tipos");
|
|
37
|
+
const bypass_formulario_1 = require("./bypass-formulario");
|
|
38
|
+
const redux_formulario_1 = require("./redux-formulario");
|
|
39
|
+
const react_1 = require("react");
|
|
40
|
+
const react_redux_1 = require("react-redux");
|
|
41
|
+
const like_ar_1 = require("like-ar");
|
|
42
|
+
const best_globals_1 = require("best-globals");
|
|
43
|
+
const cast_error_1 = require("cast-error");
|
|
44
|
+
const core_1 = require("@material-ui/core");
|
|
45
|
+
const bypass_formulario_2 = require("./bypass-formulario");
|
|
46
|
+
const js_to_html_1 = require("js-to-html");
|
|
47
|
+
function breakeableText(text, diccionario) {
|
|
48
|
+
if (typeof text != "string")
|
|
49
|
+
return undefined;
|
|
50
|
+
text = text.replace(/\//g, "/\u2063").replace(/\/\u2063(\w)\b/g, '/$1');
|
|
51
|
+
text = text.replace(/___*/g, (todo) => `[${todo}]`).replace(/\@\w+\@/g, (todo) => `[${todo}]`);
|
|
52
|
+
if (!diccionario || true)
|
|
53
|
+
return text;
|
|
54
|
+
/*
|
|
55
|
+
return <span>{partes.map((parte:string, i:number) => <span style={i%2==1?{textDecoration:"underline"}:{}}> {parte+" "} </span>)}</span>
|
|
56
|
+
*/
|
|
57
|
+
}
|
|
58
|
+
const VER_DOMINIO = false; // el encuestador no necesita ver el dominio en cada encuesta porque el dominio depende del área y se deduce del primer dígito del número de encuesta
|
|
59
|
+
// no poner VER_DOMINIO en true, cambiar por una variable que se fije si el DM está en modo prueba o en modo "diseño conceptual"
|
|
60
|
+
var debeSaltar = false;
|
|
61
|
+
window.addEventListener('load', () => {
|
|
62
|
+
/*
|
|
63
|
+
window.addEventListener('keydown', (ev:KeyboardEvent)=>{
|
|
64
|
+
debeSaltar = ev.key == 'Enter' || ev.keyCode == 13;
|
|
65
|
+
})
|
|
66
|
+
*/
|
|
67
|
+
window.addEventListener('click', () => {
|
|
68
|
+
debeSaltar = false;
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
var LibreDespliegue;
|
|
72
|
+
const Button = (_a) => {
|
|
73
|
+
var { variant, onClick, disabled, children, className, color, size, disableElevation, disableFocusRipple, disableRipple } = _a, other = __rest(_a, ["variant", "onClick", "disabled", "children", "className", "color", "size", "disableElevation", "disableFocusRipple", "disableRipple"]);
|
|
74
|
+
return React.createElement("button", Object.assign({}, other, { className: `btn btn${variant == 'contained' ? '' : '-' + (variant == 'outlined' ? 'outline' : variant)}-${(color == 'default' || color == 'inherit' ? 'secondary' : color == 'secondary' ? 'danger' : color) || 'secondary'} ${className || ''} ${size == 'small' ? 'btn-sm' : ''}`, disabled: disabled, onClick: onClick }), children);
|
|
75
|
+
};
|
|
76
|
+
const Button2 = (_a) => {
|
|
77
|
+
var { variant, onClick, disabled, children, className, color, size } = _a, other = __rest(_a, ["variant", "onClick", "disabled", "children", "className", "color", "size"]);
|
|
78
|
+
return js_to_html_1.html.button(Object.assign(Object.assign({}, other), { class: `btn btn${variant == 'contained' ? '' : '-' + (variant == 'outlined' ? 'outline' : variant)}-${(color == 'default' || color == 'inherit' ? 'secondary' : color == 'secondary' ? 'danger' : color) || 'secondary'} ${className || ''} ${size == 'small' ? 'btn-sm' : ''}`, disabled, $on: { click: onClick } }), children);
|
|
79
|
+
};
|
|
80
|
+
const TextField = (props) => React.createElement("input", { id: props.id, disabled: props.disabled, className: props.className, autoFocus: props.autoFocus, value: props.value, type: props.type, onChange: props.onChange, onFocus: props.onFocus, onBlur: (evt) => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, evt, evt.target.value); }, onKeyDown: props.onKeyDown, placeholder: props.label });
|
|
81
|
+
const Typography = (_a) => {
|
|
82
|
+
var { children } = _a, others = __rest(_a, ["children"]);
|
|
83
|
+
return React.createElement(others.variant || others.component || 'div', others, children);
|
|
84
|
+
};
|
|
85
|
+
function Grid(props) {
|
|
86
|
+
var { container, item, wrap, direction, alignItems, children, className, xs, sm, spacing } = props, other = __rest(props, ["container", "item", "wrap", "direction", "alignItems", "children", "className", "xs", "sm", "spacing"]);
|
|
87
|
+
return React.createElement("div", Object.assign({}, other, { className: `${className || ''} ${xs != null ? 'grid-xs-' + xs : ''} ${sm != null ? 'grid-sm-' + sm : ''}`, style: container ? {
|
|
88
|
+
display: 'flex',
|
|
89
|
+
flexWrap: wrap,
|
|
90
|
+
flexDirection: direction,
|
|
91
|
+
alignItems: alignItems,
|
|
92
|
+
margin: spacing != null ? spacing * 8 + 'px' : undefined
|
|
93
|
+
} : {} }), children);
|
|
94
|
+
}
|
|
95
|
+
var p12 = 'p12';
|
|
96
|
+
var sp2 = 'sp2';
|
|
97
|
+
var sp3 = 'sp3';
|
|
98
|
+
var sp4 = 'sp4';
|
|
99
|
+
var sp5 = 'sp5';
|
|
100
|
+
var diccionario = {};
|
|
101
|
+
/*
|
|
102
|
+
// const takeElementOrDefault<K, T extends [K in], D>()
|
|
103
|
+
function isIn<V, T>(k:keyof T, object:T): object[k] is V{
|
|
104
|
+
return true
|
|
105
|
+
}
|
|
106
|
+
*/
|
|
107
|
+
function takeElementOrDefault(k, object, defaultValue) {
|
|
108
|
+
return k in object ?
|
|
109
|
+
// @ts-expect-error por alguna razón TS no quiere entender que si k está en object, object[k] existe
|
|
110
|
+
object[k]
|
|
111
|
+
: defaultValue;
|
|
112
|
+
}
|
|
113
|
+
function DespliegueEncabezado(props) {
|
|
114
|
+
const forPkNull = {};
|
|
115
|
+
return React.createElement(EncabezadoDespliegue, { casillero: props.casillero, leer: props.leer, forPk: forPkNull });
|
|
116
|
+
}
|
|
117
|
+
function subirHasta(elemento, fun) {
|
|
118
|
+
if (elemento == null)
|
|
119
|
+
return null;
|
|
120
|
+
if (fun(elemento))
|
|
121
|
+
return elemento;
|
|
122
|
+
return subirHasta(elemento.parentElement, fun);
|
|
123
|
+
}
|
|
124
|
+
var elementoConSennialBorrar = null;
|
|
125
|
+
function BotonBorrar({ id, variable, forPk, valorOpcion }) {
|
|
126
|
+
var handleClickBorrar = () => {
|
|
127
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: variable, forPk: forPk });
|
|
128
|
+
};
|
|
129
|
+
return React.createElement("div", { className: "boton-borrar" },
|
|
130
|
+
React.createElement(Button, { id: id, "mi-variable": variable, "valor-opcion": valorOpcion, variant: "outlined", className: "boton-opcion boton-opcion-borrar", onClick: handleClickBorrar },
|
|
131
|
+
React.createElement(render_general_1.ICON.DeleteForever, null)));
|
|
132
|
+
}
|
|
133
|
+
function SaltoDespliegue({ casillero, prefijo }) {
|
|
134
|
+
return casillero.salto ?
|
|
135
|
+
React.createElement("div", { className: "pase" },
|
|
136
|
+
prefijo ? React.createElement("span", { className: "prefijo" },
|
|
137
|
+
prefijo,
|
|
138
|
+
" ") : null,
|
|
139
|
+
React.createElement(render_general_1.ICON.TrendingFlat, null),
|
|
140
|
+
React.createElement("span", null, casillero.salto))
|
|
141
|
+
: null;
|
|
142
|
+
}
|
|
143
|
+
function OpcionDespliegue(props) {
|
|
144
|
+
const { casillero } = props;
|
|
145
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
146
|
+
var saltoAutomatico = (0, react_redux_1.useSelector)((state) => state.opciones.saltoAutomatico);
|
|
147
|
+
var handleClick = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
148
|
+
var _a;
|
|
149
|
+
var container = subirHasta(event.target, elemento => elemento.classList.contains('pregunta') || elemento.classList.contains('multiple')) || document.getElementById('main_layout');
|
|
150
|
+
var tiene = container.getAttribute('estoy-borrando');
|
|
151
|
+
container.setAttribute('estoy-borrando', 'NO');
|
|
152
|
+
if (elementoConSennialBorrar) {
|
|
153
|
+
elementoConSennialBorrar.setAttribute('estoy-borrando', 'NO');
|
|
154
|
+
elementoConSennialBorrar = null;
|
|
155
|
+
}
|
|
156
|
+
var { recentModified, siguienteVariable } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: props.valorOpcion, variable: props.variable, forPk: props.forPk });
|
|
157
|
+
if (!recentModified) {
|
|
158
|
+
container.setAttribute('estoy-borrando', tiene == 'SI' ? 'NO' : 'SI');
|
|
159
|
+
if (tiene != 'SI') {
|
|
160
|
+
elementoConSennialBorrar = container;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
if (siguienteVariable && saltoAutomatico) {
|
|
165
|
+
var botonStyle = (_a = event.target) === null || _a === void 0 ? void 0 : _a.style;
|
|
166
|
+
if (botonStyle)
|
|
167
|
+
botonStyle.color = 'green';
|
|
168
|
+
yield (0, best_globals_1.sleep)(100);
|
|
169
|
+
if (botonStyle)
|
|
170
|
+
botonStyle.color = 'blue';
|
|
171
|
+
yield (0, best_globals_1.sleep)(100);
|
|
172
|
+
if (botonStyle)
|
|
173
|
+
botonStyle.color = 'green';
|
|
174
|
+
yield (0, best_globals_1.sleep)(100);
|
|
175
|
+
if (botonStyle)
|
|
176
|
+
botonStyle.color = '';
|
|
177
|
+
enfocarElementoDeVariable(siguienteVariable);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return React.createElement(Grid, { className: "opcion" },
|
|
182
|
+
props.conBotonBorrar ? React.createElement(BotonBorrar, { id: `opcion-var-${props.variable}-${props.valorOpcion}-borrar`, forPk: props.forPk, variable: props.variable, valorOpcion: props.valorOpcion }) : null,
|
|
183
|
+
React.createElement(Button, { id: `opcion-var-${props.variable}-${props.valorOpcion}`, "mi-variable": props.variable, "valor-opcion": props.valorOpcion, variant: "outlined", className: "boton-opcion boton-opcion-seleccion", onClick: handleClick, tabIndex: -1 },
|
|
184
|
+
React.createElement(Grid, { container: true, wrap: "nowrap" },
|
|
185
|
+
React.createElement(Grid, { className: "id" }, casillero.ver_id || casillero.casillero),
|
|
186
|
+
React.createElement(Grid, { className: "opcion-texto" },
|
|
187
|
+
React.createElement(Typography, { "debe-leer": casillero.leer ? 'SI' : casillero.leer === false ? 'NO' : props.leer ? 'SI' : 'NO' }, breakeableText(casillero.nombre)),
|
|
188
|
+
casillero.aclaracion ?
|
|
189
|
+
React.createElement(Typography, { className: 'aclaracion' }, breakeableText(casillero.aclaracion))
|
|
190
|
+
: null))),
|
|
191
|
+
React.createElement(SaltoDespliegue, { casillero: casillero }));
|
|
192
|
+
}
|
|
193
|
+
function SiNoDespliegue(props) {
|
|
194
|
+
return React.createElement(OpcionesDespliegue, { casilleroConOpciones: props.casilleroConOpciones, forPk: props.forPk, leer: false, despliegueContenido: props.despliegueContenido });
|
|
195
|
+
}
|
|
196
|
+
function registradorDeVariable(pregunta) {
|
|
197
|
+
return (respuestas, feedbackForm, elemento) => {
|
|
198
|
+
var _a;
|
|
199
|
+
var valorActual = pregunta.var_name == null ? null : respuestas[pregunta.var_name];
|
|
200
|
+
var feedbackRow = feedbackForm.feedback;
|
|
201
|
+
var feedbackVar = pregunta.var_name == null ? null : feedbackRow[pregunta.var_name];
|
|
202
|
+
var tieneValor = valorActual != null && feedbackVar != null ? (feedbackVar.conProblema ? 'invalido' : 'valido') : 'NO';
|
|
203
|
+
var estado;
|
|
204
|
+
if (pregunta.tipovar) {
|
|
205
|
+
estado = feedbackVar === null || feedbackVar === void 0 ? void 0 : feedbackVar.estado;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
var feedbackMulti = pregunta.casilleros.filter(c => c.var_name != null).reduce((pv, om) => {
|
|
209
|
+
var fb = feedbackRow === null || feedbackRow === void 0 ? void 0 : feedbackRow[om.var_name];
|
|
210
|
+
return {
|
|
211
|
+
tieneActual: pv.tieneActual || fb.estado == 'actual',
|
|
212
|
+
estaSalteada: pv.estaSalteada && (fb.estado == 'salteada' || fb.estado == 'fuera_de_flujo_por_salto')
|
|
213
|
+
};
|
|
214
|
+
}, { tieneActual: false, estaSalteada: true });
|
|
215
|
+
estado = feedbackMulti.tieneActual ? 'actual' : feedbackMulti.estaSalteada ? 'salteada' : 'todavia_no';
|
|
216
|
+
}
|
|
217
|
+
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'nuestro-validator', estado);
|
|
218
|
+
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'tiene-valor', tieneValor);
|
|
219
|
+
(0, bypass_formulario_2.setAttrDistinto)(elemento, 'esta-inhabilitada', (feedbackVar === null || feedbackVar === void 0 ? void 0 : feedbackVar.inhabilitada) ? 'SI' : 'NO');
|
|
220
|
+
if (pregunta.var_name) {
|
|
221
|
+
var opciones = Array.prototype.slice.call(elemento.querySelectorAll(`.boton-opcion[mi-variable="${pregunta.var_name}"]`), 0);
|
|
222
|
+
var elementoOpcion;
|
|
223
|
+
for (elementoOpcion of opciones) {
|
|
224
|
+
var valorOpcion = elementoOpcion.getAttribute('valor-opcion');
|
|
225
|
+
(0, bypass_formulario_2.setAttrDistinto)(elementoOpcion, 'opcion-seleccionada', valorOpcion == valorActual ? "SI" : "NO");
|
|
226
|
+
}
|
|
227
|
+
var elementosInput = Array.prototype.slice.call(elemento.querySelectorAll('.variable'));
|
|
228
|
+
var elementoInput;
|
|
229
|
+
for (elementoInput of elementosInput) {
|
|
230
|
+
(0, bypass_formulario_2.setValorDistinto)(elementoInput, 'value', valorActual == null ? '' : valorActual.toString());
|
|
231
|
+
}
|
|
232
|
+
var botonNsNc = document.getElementById("nsnc-pregunta-" + pregunta.var_name);
|
|
233
|
+
(0, bypass_formulario_2.setAttrDistinto)(botonNsNc, 'opcion-seleccionada', valorActual == ((_a = pregunta.valor_ns_nc) !== null && _a !== void 0 ? _a : -9) ? "SI" : "NO");
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function OpcionMultipleDespliegue(props) {
|
|
238
|
+
var _a;
|
|
239
|
+
const { opcionM } = props;
|
|
240
|
+
var id = `opcionM-${opcionM.id_casillero}`;
|
|
241
|
+
(0, bypass_formulario_2.registrarElemento)({
|
|
242
|
+
id,
|
|
243
|
+
direct: true,
|
|
244
|
+
fun: registradorDeVariable(opcionM)
|
|
245
|
+
});
|
|
246
|
+
return React.createElement(DesplegarCasillero, { id: id, casillero: opcionM, despliegueEncabezado: 'lateral' },
|
|
247
|
+
React.createElement(EncabezadoDespliegue, { casillero: opcionM, verIdGuion: true, leer: opcionM.leer !== false, forPk: props.forPk }),
|
|
248
|
+
React.createElement(SiNoDespliegue, { casilleroConOpciones: opcionM, forPk: props.forPk, despliegueContenido: (_a = props.opcionM.despliegueContenido) !== null && _a !== void 0 ? _a : 'horizontal' }));
|
|
249
|
+
}
|
|
250
|
+
function EncabezadoDespliegue(props) {
|
|
251
|
+
var _a, _b, _c, _d;
|
|
252
|
+
var { casillero, forPk } = props;
|
|
253
|
+
var conCampoOpciones = (0, react_redux_1.useSelector)((state) => state.opciones.conCampoOpciones);
|
|
254
|
+
var handleClickBorrar = () => {
|
|
255
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: casillero.var_name, forPk: forPk });
|
|
256
|
+
};
|
|
257
|
+
var ver_id = (_a = casillero.ver_id) !== null && _a !== void 0 ? _a : casillero.casillero;
|
|
258
|
+
// @ts-ignore no está en todos los casilleros pero acá para el despliegue de metadatos no importa
|
|
259
|
+
var calculada = casillero.calculada;
|
|
260
|
+
var id = `id-div-${casillero.var_name || casillero.casillero}`;
|
|
261
|
+
var idAcciones = "acciones-" + id;
|
|
262
|
+
return React.createElement("div", { className: "encabezado", "debe-leer": props.leer ? 'SI' : 'NO' },
|
|
263
|
+
React.createElement("div", { id: id, className: "id-div", title: `${casillero.casillero} - ${casillero.var_name}`, onClick: () => {
|
|
264
|
+
var div = document.getElementById(idAcciones);
|
|
265
|
+
div.setAttribute("accion-visible", (1 - Number(div.getAttribute("accion-visible"))).toString());
|
|
266
|
+
// TODO. Ver qué hacemos cuando se toca el ID de la pregutna
|
|
267
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_id_pregunta, { pregunta: casillero.casillero, forPk });
|
|
268
|
+
} },
|
|
269
|
+
React.createElement("div", { className: "id" }, ver_id),
|
|
270
|
+
(casillero.tipovar == "si_no" || casillero.tipovar == "opciones") ? React.createElement(Campo, { disabled: false, pregunta: casillero, forPk: forPk, mini: true, hidden: !conCampoOpciones && 'quitar' }) : null,
|
|
271
|
+
React.createElement("div", { className: "acciones-pregunta", id: idAcciones, "accion-visible": "0" },
|
|
272
|
+
casillero.var_name ? React.createElement("div", null,
|
|
273
|
+
React.createElement(Button, { id: "borrar-pregunta-" + casillero.var_name, "mi-variable": casillero.var_name, variant: "outlined", className: "boton-pregunta-borrar", onClick: handleClickBorrar },
|
|
274
|
+
React.createElement(render_general_1.ICON.DeleteForever, null))) : null,
|
|
275
|
+
casillero.var_name ? (ns_nc => React.createElement("div", null,
|
|
276
|
+
React.createElement(Button, { id: "nsnc-pregunta-" + casillero.var_name, "mi-variable": casillero.var_name, variant: "outlined", className: "boton-pregunta-nsnc", onClick: () => {
|
|
277
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: ns_nc, variable: casillero.var_name, forPk: forPk });
|
|
278
|
+
} }, "NS/NC")))((_b = casillero.valor_ns_nc) !== null && _b !== void 0 ? _b : -9) : null)),
|
|
279
|
+
React.createElement("div", { className: "nombre-div" },
|
|
280
|
+
React.createElement("div", { className: "nombre" }, breakeableText(casillero.nombre)),
|
|
281
|
+
casillero.aclaracion ?
|
|
282
|
+
React.createElement("div", { className: "aclaracion" }, casillero.salto && casillero.tipoc == 'FILTRO' ?
|
|
283
|
+
React.createElement(SaltoDespliegue, { casillero: casillero, prefijo: breakeableText(casillero.aclaracion) })
|
|
284
|
+
:
|
|
285
|
+
breakeableText(casillero.aclaracion))
|
|
286
|
+
: null,
|
|
287
|
+
React.createElement("div", { "los-metadatos": "si" },
|
|
288
|
+
React.createElement("span", { "el-metadato": "variable" }, casillero.var_name),
|
|
289
|
+
casillero.tipovar && casillero.tipovar != 'opciones' && casillero.tipovar != 'si_no' ?
|
|
290
|
+
React.createElement("span", { "el-metadato": "tipovar" }, casillero.tipovar)
|
|
291
|
+
: null,
|
|
292
|
+
casillero.optativo ? React.createElement("span", { "el-metadato": "optativa" }, "optativa") : null,
|
|
293
|
+
calculada ? React.createElement("span", { "el-metadato": "calculada" }, "calculada") : null,
|
|
294
|
+
casillero.despliegueOculta ? React.createElement("span", { "el-metadato": "oculta" }, "oculta") : null,
|
|
295
|
+
casillero.expresion_habilitar ? React.createElement("span", { "el-metadato": "expresion_habilitar" },
|
|
296
|
+
"habilita: ",
|
|
297
|
+
casillero.expresion_habilitar) : null,
|
|
298
|
+
((_c = casillero.especial) === null || _c === void 0 ? void 0 : _c.autoing) ? React.createElement("span", { "el-metadato": "expresion_autoing" },
|
|
299
|
+
"autoing: ", (_d = casillero.especial) === null || _d === void 0 ? void 0 :
|
|
300
|
+
_d.autoing) : null)));
|
|
301
|
+
}
|
|
302
|
+
function DesplegarConfirmarBorrarRespuesta(props) {
|
|
303
|
+
var [open, setOpen] = (0, react_1.useState)(!!props.variableBorrar);
|
|
304
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
305
|
+
const handleClose = () => {
|
|
306
|
+
dispatch(redux_formulario_1.dispatchers.CONFIRMAR_BORRAR_RESPUESTA({ forPk: props.forPk, variable: null }));
|
|
307
|
+
setOpen(false);
|
|
308
|
+
};
|
|
309
|
+
return React.createElement(core_1.Popover, { id: "popover-confirmar", open: open, onClose: handleClose, anchorOrigin: {
|
|
310
|
+
vertical: 'bottom',
|
|
311
|
+
horizontal: 'center',
|
|
312
|
+
}, transformOrigin: {
|
|
313
|
+
vertical: 'top',
|
|
314
|
+
horizontal: 'left',
|
|
315
|
+
} },
|
|
316
|
+
React.createElement(Typography, null, "La pregunta tiene registrada una respuesta que no fue detectada como err\u00F3nea"),
|
|
317
|
+
React.createElement("div", { className: "confirma-botones" },
|
|
318
|
+
React.createElement(Button, { color: "secondary", variant: "outlined", onClick: () => {
|
|
319
|
+
if (props.variableBorrar) {
|
|
320
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: props.forPk, variable: props.variableBorrar, respuesta: null });
|
|
321
|
+
}
|
|
322
|
+
handleClose();
|
|
323
|
+
} }, "borrar respuesta"),
|
|
324
|
+
React.createElement(Button, { color: "primary", variant: "outlined", onClick: handleClose }, "volver sin borrar")));
|
|
325
|
+
}
|
|
326
|
+
function calcularNuestraLongitud(longitud) {
|
|
327
|
+
return longitud;
|
|
328
|
+
}
|
|
329
|
+
function enfocarElementoDeVariable(siguienteVariable) {
|
|
330
|
+
debeSaltar = false;
|
|
331
|
+
var { top, enfocado, elementoInputVariable } = (0, bypass_formulario_2.calcularElementoEnfocado)(siguienteVariable);
|
|
332
|
+
if (top != null && top > 0 && !enfocado) {
|
|
333
|
+
window.scrollTo({ top, left: 0, behavior: 'smooth' });
|
|
334
|
+
}
|
|
335
|
+
elementoInputVariable === null || elementoInputVariable === void 0 ? void 0 : elementoInputVariable.focus();
|
|
336
|
+
}
|
|
337
|
+
function Campo(props) {
|
|
338
|
+
var _a;
|
|
339
|
+
var { pregunta, disabled, mini } = props;
|
|
340
|
+
var { saltoAutomatico, conCampoOpciones } = (0, react_redux_1.useSelector)((state) => state.opciones);
|
|
341
|
+
const longitud = mini ? pregunta.casilleros.reduce((acum, o) => Math.max(o.casillero.toString().length, acum), 0) :
|
|
342
|
+
// @ts-ignore mini es para los otros
|
|
343
|
+
pregunta.longitud;
|
|
344
|
+
// var [valor, setValor] = useState(props.valor);
|
|
345
|
+
var [editando, setEditando] = (0, react_1.useState)(false);
|
|
346
|
+
// useEffect(() => {
|
|
347
|
+
// setValor(props.valor)
|
|
348
|
+
// }, [props.valor]);
|
|
349
|
+
const inputProps = {
|
|
350
|
+
maxLength: longitud,
|
|
351
|
+
};
|
|
352
|
+
const onChange = (nuevoValor) => {
|
|
353
|
+
var { siguienteVariable } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: props.forPk, variable: pregunta.var_name, respuesta: nuevoValor });
|
|
354
|
+
if (siguienteVariable && debeSaltar) {
|
|
355
|
+
enfocarElementoDeVariable(siguienteVariable);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
var nuestraLongitud = calcularNuestraLongitud(longitud);
|
|
359
|
+
return React.createElement("div", { className: "campo", "nuestra-longitud": nuestraLongitud, style: props.hidden == 'quitar' ? { display: 'none' } : props.hidden ? { visibility: 'hidden' } : undefined },
|
|
360
|
+
mini ? null : React.createElement(BotonBorrar, { id: `borrar-abierta-${pregunta.var_name}`, variable: pregunta.var_name, forPk: props.forPk }),
|
|
361
|
+
React.createElement("div", { className: "input-campo" },
|
|
362
|
+
React.createElement(TextField, { id: `var-${pregunta.var_name}`, disabled: disabled, className: "variable",
|
|
363
|
+
//var-length={pregunta.longitud}
|
|
364
|
+
fullWidth: true, inputProps: inputProps, type: (_a = pregunta.despliegueTipoInput) !== null && _a !== void 0 ? _a : (0, render_general_1.adaptarTipoVarCasillero)(pregunta.tipovar), onKeyDown: (event) => {
|
|
365
|
+
var esEnter = (event.key == 'Enter' || event.keyCode == 13);
|
|
366
|
+
debeSaltar = esEnter && (saltoAutomatico || conCampoOpciones);
|
|
367
|
+
if (esEnter) {
|
|
368
|
+
if (event.target instanceof HTMLElement) {
|
|
369
|
+
event.target.blur();
|
|
370
|
+
}
|
|
371
|
+
event.preventDefault();
|
|
372
|
+
}
|
|
373
|
+
}, onFocus: (_event) => setEditando(true), onBlur: (event, valor) => {
|
|
374
|
+
var _a;
|
|
375
|
+
if ((_a = event === null || event === void 0 ? void 0 : event.relatedTarget) === null || _a === void 0 ? void 0 : _a.getAttribute('boton-confirmar')) {
|
|
376
|
+
debeSaltar = true;
|
|
377
|
+
}
|
|
378
|
+
onChange(valor);
|
|
379
|
+
setEditando(false);
|
|
380
|
+
} })),
|
|
381
|
+
disabled || mini ? null :
|
|
382
|
+
React.createElement("div", { className: "boton-confirmar-campo" },
|
|
383
|
+
React.createElement(Button, { variant: editando ? "contained" : 'outlined', size: "small", color: editando ? 'primary' : 'default', "boton-confirmar": pregunta.var_name, tabIndex: -1, onClick: () => {
|
|
384
|
+
onChange(bypass_formulario_2.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO);
|
|
385
|
+
setEditando(false);
|
|
386
|
+
} },
|
|
387
|
+
React.createElement(render_general_1.ICON.Check, null))));
|
|
388
|
+
}
|
|
389
|
+
function OpcionesDespliegue({ casilleroConOpciones, forPk, leer, despliegueContenido }) {
|
|
390
|
+
const desplegarOtros = (opcion, soloParaDespliegue) => opcion.casilleros.map((subPregunta) => (soloParaDespliegue == null || soloParaDespliegue == subPregunta.despliegueContenido ?
|
|
391
|
+
React.createElement("div", { className: "otros-especificar", key: subPregunta.id_casillero },
|
|
392
|
+
React.createElement(PreguntaDespliegue, { pregunta: subPregunta, forPk: forPk, despliegueEncabezado: 'superior' })) : null));
|
|
393
|
+
return React.createElement("div", { className: "contenido" },
|
|
394
|
+
React.createElement("div", { className: "opciones", "despliegue-contenido": despliegueContenido !== null && despliegueContenido !== void 0 ? despliegueContenido : 'vertical' }, casilleroConOpciones.casilleros.map((opcion, i) => React.createElement(Grid, { key: opcion.id_casillero, item: true, "ocultar-salteada": opcion.despliegueOculta ? (opcion.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO' },
|
|
395
|
+
React.createElement(OpcionDespliegue, { casillero: opcion, variable: casilleroConOpciones.var_name, valorOpcion: opcion.casillero, forPk: forPk, leer: leer, conBotonBorrar: i == 0 || despliegueContenido != 'horizontal' }),
|
|
396
|
+
despliegueContenido == 'horizontal' ? null : desplegarOtros(opcion, null)))),
|
|
397
|
+
despliegueContenido == 'horizontal' ? casilleroConOpciones.casilleros.map((opcion) => desplegarOtros(opcion, null)) : null);
|
|
398
|
+
}
|
|
399
|
+
const nombreCasillero = {
|
|
400
|
+
F: 'formulario',
|
|
401
|
+
B: 'bloque',
|
|
402
|
+
P: 'pregunta',
|
|
403
|
+
CP: 'conjuntopreguntas',
|
|
404
|
+
O: 'opcion',
|
|
405
|
+
OM: 'multiple',
|
|
406
|
+
FILTRO: 'filtro',
|
|
407
|
+
CONS: 'consistencia',
|
|
408
|
+
BF: 'botonformulario',
|
|
409
|
+
TEXTO: 'aclaracionsuperior',
|
|
410
|
+
};
|
|
411
|
+
function DesplegarCasillero(props) {
|
|
412
|
+
var _a, _b;
|
|
413
|
+
return React.createElement("div", { key: `${props.casillero.tipoc}-${props.id || props.casillero.id_casillero}`, className: `casillero ${nombreCasillero[props.casillero.tipoc]}`, id: props.id, style: props.style, "despliegue-encabezado": (_b = (_a = props.casillero.despliegueEncabezado) !== null && _a !== void 0 ? _a : props.despliegueEncabezado) !== null && _b !== void 0 ? _b : 'superior', "ocultar-salteada": props["ocultar-salteada"] }, props.children);
|
|
414
|
+
}
|
|
415
|
+
function PreguntaDespliegue(props) {
|
|
416
|
+
var _a, _b;
|
|
417
|
+
var { pregunta } = props;
|
|
418
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
419
|
+
var estado;
|
|
420
|
+
var id = `pregunta-${pregunta.id_casillero}`;
|
|
421
|
+
(0, bypass_formulario_2.registrarElemento)({
|
|
422
|
+
id,
|
|
423
|
+
direct: true,
|
|
424
|
+
fun: registradorDeVariable(pregunta)
|
|
425
|
+
});
|
|
426
|
+
return React.createElement(DesplegarCasillero, { id: id, casillero: pregunta, "nuestro-tipovar": pregunta.tipovar || "multiple", "ocultar-salteada": pregunta.despliegueOculta ? (pregunta.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO', despliegueEncabezado: props.despliegueEncabezado },
|
|
427
|
+
React.createElement(EncabezadoDespliegue, { casillero: pregunta, leer: pregunta.leer !== false, forPk: props.forPk }),
|
|
428
|
+
React.createElement("div", { className: "contenido" }, pregunta.tipovar == "si_no" ? React.createElement(Grid, { container: true },
|
|
429
|
+
React.createElement(SiNoDespliegue, { casilleroConOpciones: pregunta, forPk: props.forPk, despliegueContenido: (_a = props.pregunta.despliegueContenido) !== null && _a !== void 0 ? _a : 'vertical' })) :
|
|
430
|
+
pregunta.tipovar == "opciones" ?
|
|
431
|
+
React.createElement(OpcionesDespliegue, { casilleroConOpciones: pregunta, forPk: props.forPk, leer: !!pregunta.leer, despliegueContenido: (_b = pregunta.despliegueContenido) !== null && _b !== void 0 ? _b : 'vertical' }) :
|
|
432
|
+
pregunta.tipovar == null ?
|
|
433
|
+
pregunta.casilleros.map((opcionMultiple) => opcionMultiple.tipoc == 'OM' ?
|
|
434
|
+
React.createElement(OpcionMultipleDespliegue, { key: opcionMultiple.id_casillero, opcionM: opcionMultiple, forPk: props.forPk })
|
|
435
|
+
: //las consistencias pueden ser hermanas de OM
|
|
436
|
+
React.createElement(ConsistenciaDespliegue, { key: opcionMultiple.id_casillero, casillero: opcionMultiple, forPk: props.forPk }))
|
|
437
|
+
:
|
|
438
|
+
((preguntaSimple) => React.createElement(Campo, { disabled: preguntaSimple.calculada ? true : false, pregunta: preguntaSimple, forPk: props.forPk }))(pregunta)),
|
|
439
|
+
React.createElement("div", { className: "pie-pregunta" },
|
|
440
|
+
React.createElement(SaltoDespliegue, { casillero: pregunta, prefijo: pregunta.tipovar == "opciones" ? (pregunta.casilleros.some(opcion => opcion.salto) ? "resto de las opciones" : "todas las opciones") : "" })));
|
|
441
|
+
}
|
|
442
|
+
var calcularDisabledBFAgregarListo = (configSorteoFormulario, formulario) => !!(configSorteoFormulario && configSorteoFormulario.id_formulario_individual == formulario);
|
|
443
|
+
function botonesDelFormulario(r, unidad_analisis, estructura, forPkPadre, feedbackAll) {
|
|
444
|
+
var formsVivienda = (0, bypass_formulario_1.getFormulariosForIdVivienda)(forPkPadre.vivienda);
|
|
445
|
+
var uaDef = estructura.unidades_analisis[unidad_analisis];
|
|
446
|
+
var arrayEstructuraFormularios = ((0, like_ar_1.strict)(estructura.formularios)).array();
|
|
447
|
+
var x = (0, like_ar_1.strict)(uaDef.hijas).filter(uaHija => {
|
|
448
|
+
var _a;
|
|
449
|
+
return formsVivienda.includes((_a = arrayEstructuraFormularios.find((infoFormulario) => infoFormulario.casilleros.unidad_analisis == (uaHija === null || uaHija === void 0 ? void 0 : uaHija.unidad_analisis))) === null || _a === void 0 ? void 0 : _a.casilleros.id_casillero);
|
|
450
|
+
}).map(uaHija => (uaHija == null ? null :
|
|
451
|
+
js_to_html_1.html.div({ class: 'ua-hijas' }, [
|
|
452
|
+
js_to_html_1.html.div(uaHija.unidad_analisis),
|
|
453
|
+
js_to_html_1.html.div((0, like_ar_1.strict)(r[uaHija.unidad_analisis] || []).map((respuestasHija, i) => {
|
|
454
|
+
var num = Number(i) + 1;
|
|
455
|
+
var forPkHijaParcial = Object.assign(Object.assign({}, forPkPadre), { [uaHija.pk_agregada]: num });
|
|
456
|
+
var configSorteoFormulario = estructura.configSorteo ? estructura.configSorteo[(0, bypass_formulario_1.getMainFormForVivienda)(forPkPadre.vivienda)] : null;
|
|
457
|
+
return js_to_html_1.html.div({ class: 'numerador-ua' }, [
|
|
458
|
+
js_to_html_1.html.div({ class: 'botones-ua' }, [
|
|
459
|
+
js_to_html_1.html.div({ class: 'numero-ua' }, num.toString()),
|
|
460
|
+
...(0, like_ar_1.strict)(estructura.formularios)
|
|
461
|
+
.filter(formDef => formDef.casilleros.unidad_analisis == uaHija.unidad_analisis)
|
|
462
|
+
.map((_formDef, formulario) => {
|
|
463
|
+
var forPk = Object.assign(Object.assign({}, forPkHijaParcial), { formulario });
|
|
464
|
+
var feedbackForm = feedbackAll[(0, tipos_1.toPlainForPk)(forPk)];
|
|
465
|
+
return feedbackForm ? js_to_html_1.html.div({}, [
|
|
466
|
+
// html.button((uaHija!).pk_agregada+" ok: "+(Number(i)+1)),
|
|
467
|
+
botonFormularioConResumen({
|
|
468
|
+
forPk,
|
|
469
|
+
num,
|
|
470
|
+
actual: true || (0, bypass_formulario_1.calcularActualBF)(configSorteoFormulario, num, null, formulario, r),
|
|
471
|
+
previo: false,
|
|
472
|
+
disabled: (0, bypass_formulario_1.calcularDisabledBF)(configSorteoFormulario, num, formulario, r)
|
|
473
|
+
}, feedbackForm, r, { despliegueOculta: false, expresion_habilitar_js: '', nombre: formulario, aclaracion: null, salto: formulario }, forPkPadre, "boton-ir-resumen-formulario", estructura.formularios[formulario].casilleros)
|
|
474
|
+
]) : null;
|
|
475
|
+
}).array().map(x => x == null ? null : x),
|
|
476
|
+
]),
|
|
477
|
+
botonesDelFormulario(respuestasHija, uaHija.unidad_analisis, estructura, forPkHijaParcial, feedbackAll)
|
|
478
|
+
]);
|
|
479
|
+
}).array().map(x => x == null ? null : x))
|
|
480
|
+
]))).array().map(x => x == null ? null : x);
|
|
481
|
+
return js_to_html_1.html.div(/*{style:'display:flex; flex-direction:row'},*/ x);
|
|
482
|
+
}
|
|
483
|
+
function TextoDespliegue(props) {
|
|
484
|
+
var { casillero, forPk } = props;
|
|
485
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
486
|
+
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
487
|
+
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
488
|
+
var id = `texto-${casillero.id_casillero}`;
|
|
489
|
+
(0, bypass_formulario_2.registrarElemento)({ id, style: 'display', fun: (r) => habilitador(r) || modoDespliegue == 'metadatos' ? 'block' : 'none' });
|
|
490
|
+
var esResumenFormulario = casillero.casillero == 'ResFor'; // TODO: Cambia esto que está jarcodeado.
|
|
491
|
+
if (esResumenFormulario) {
|
|
492
|
+
(0, bypass_formulario_2.registrarElemento)({ id, direct: true,
|
|
493
|
+
fun: (r, _feedbackForm, elemento, feedbackAll, estructura) => {
|
|
494
|
+
elemento.style.display = '';
|
|
495
|
+
//@ts-ignore las respuestas son respuestasRaiz porque ResFor está en el form ppal
|
|
496
|
+
if (r['resumenEstado'] == 'vacio') {
|
|
497
|
+
elemento.textContent = "relevamiento sin empezar";
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
elemento.textContent = "relevamiento empezado";
|
|
501
|
+
var { unidad_analisis } = estructura.formularios[forPk.formulario].casilleros;
|
|
502
|
+
elemento.innerHTML = "";
|
|
503
|
+
elemento.appendChild(botonesDelFormulario(r, unidad_analisis, estructura, forPk, feedbackAll).create());
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
var ir = (defBoton) => {
|
|
509
|
+
// var nuevaForPk={...forPk, formulario:idFormularioDestino};
|
|
510
|
+
// nuevaForPk[nuevoCampoPk] = defBoton.num
|
|
511
|
+
dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk: defBoton.forPk, apilarVuelta: true }));
|
|
512
|
+
};
|
|
513
|
+
return React.createElement(DesplegarCasillero, { id: `${id}-externo`, casillero: casillero },
|
|
514
|
+
React.createElement(EncabezadoDespliegue, { casillero: casillero, leer: false, forPk: forPk }),
|
|
515
|
+
React.createElement("div", { id: id, style: { display: 'none' } }),
|
|
516
|
+
esResumenFormulario ?
|
|
517
|
+
React.createElement(Button, { className: "special-button", id: "boton-ir-resumen-formulario", style: { display: 'none' }, onClick: (event) => {
|
|
518
|
+
ir(JSON.parse(event.target.getAttribute('def-button')));
|
|
519
|
+
} }, "ir (interno)")
|
|
520
|
+
: null);
|
|
521
|
+
}
|
|
522
|
+
function FiltroDespliegue(props) {
|
|
523
|
+
var { filtro } = props;
|
|
524
|
+
return React.createElement(DesplegarCasillero, { casillero: filtro },
|
|
525
|
+
React.createElement(DespliegueEncabezado, { casillero: filtro }));
|
|
526
|
+
}
|
|
527
|
+
function ConsistenciaDespliegue(props) {
|
|
528
|
+
var { casillero, forPk } = props;
|
|
529
|
+
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
530
|
+
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
531
|
+
var id = `consistencia-${casillero.id_casillero}`;
|
|
532
|
+
(0, bypass_formulario_2.registrarElemento)({ id, style: 'display', fun: (r) => habilitador(r) || modoDespliegue == 'metadatos' ? 'block' : 'none' });
|
|
533
|
+
return React.createElement(DesplegarCasillero, { id: id, casillero: casillero, style: { display: 'none' } },
|
|
534
|
+
React.createElement(EncabezadoDespliegue, { casillero: casillero, leer: false, forPk: forPk }));
|
|
535
|
+
}
|
|
536
|
+
var botonFormularioConResumen = (defBoton, feedbackForm, respuestasAumentadas, casillero, forPkPadre, idButton, formularioAAbrir) => {
|
|
537
|
+
var _a, _b, _c;
|
|
538
|
+
var forPk = defBoton.forPk;
|
|
539
|
+
var sufijoIdElemento = (0, tipos_1.toPlainForPk)(forPk) + (defBoton.esConfirmar ? '-listo' : '');
|
|
540
|
+
var id = `div-boton-formulario-${sufijoIdElemento}`;
|
|
541
|
+
var estado = feedbackForm.resumen;
|
|
542
|
+
return js_to_html_1.html.div({
|
|
543
|
+
id,
|
|
544
|
+
class: "seccion-boton-formulario",
|
|
545
|
+
$attrs: {
|
|
546
|
+
"nuestro-validator": defBoton.actual ? 'actual' : defBoton.previo ? 'valida' : 'todavia_no',
|
|
547
|
+
"ocultar-salteada": casillero.despliegueOculta ? (casillero.expresion_habilitar_js ? 'INHABILITAR' : 'SI') : 'NO',
|
|
548
|
+
"tiene-valor": "NO",
|
|
549
|
+
"def-button": JSON.stringify(defBoton)
|
|
550
|
+
}
|
|
551
|
+
}, [
|
|
552
|
+
casillero.aclaracion || js_to_html_1.html.div({ class: "aclaracion" }, [(_a = breakeableText(casillero.aclaracion)) !== null && _a !== void 0 ? _a : null]),
|
|
553
|
+
js_to_html_1.html.div([
|
|
554
|
+
Button2({
|
|
555
|
+
// id:`var-${idVariable}`,
|
|
556
|
+
id: `boton-formulario-${sufijoIdElemento}`,
|
|
557
|
+
variant: "outlined",
|
|
558
|
+
disabled: defBoton.disabled,
|
|
559
|
+
color: "inherit",
|
|
560
|
+
onClick: () => {
|
|
561
|
+
if (defBoton.esConfirmar) {
|
|
562
|
+
if (defBoton.num != null) {
|
|
563
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { forPk: forPkPadre, variable: casillero.expresion_habilitar, respuesta: defBoton.num });
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
var button = document.getElementById(idButton);
|
|
568
|
+
button.setAttribute('def-button', JSON.stringify(defBoton));
|
|
569
|
+
button.click();
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
$attrs: {
|
|
573
|
+
"resumen-estado": estado != 'vacio' ? estado : defBoton.actual ? 'actual' : defBoton.previo ? estado : 'todavia_no',
|
|
574
|
+
},
|
|
575
|
+
children: [
|
|
576
|
+
(defBoton.esAgregar ? 'agregar' : defBoton.esConfirmar ? 'Listo' : casillero.nombre + ' ' + (defBoton.num || '')),
|
|
577
|
+
js_to_html_1.html.svg({ class: "MuiSvgIcon-root", focusable: false, viewbox: "0 0 24 24", "aria-hidden": "true" }, [
|
|
578
|
+
js_to_html_1.html.path({ d: (defBoton.esAgregar ? render_general_1.materialIoIconsSvgPath.Add : defBoton.esConfirmar ? render_general_1.materialIoIconsSvgPath.Check : casillero.salto ? render_general_1.materialIoIconsSvgPath.Forward : render_general_1.materialIoIconsSvgPath.ExitToApp) })
|
|
579
|
+
])
|
|
580
|
+
]
|
|
581
|
+
}),
|
|
582
|
+
(defBoton.permiteBorrar ?
|
|
583
|
+
Button2({
|
|
584
|
+
className: "boton-borrar-ua-vacia",
|
|
585
|
+
color: "default",
|
|
586
|
+
variant: "outlined",
|
|
587
|
+
children: js_to_html_1.html.svg({ class: "MuiSvgIcon-root", focusable: false, viewbox: "0 0 24 24", "aria-hidden": "true" }, [
|
|
588
|
+
js_to_html_1.html.path({ d: render_general_1.materialIoIconsSvgPath.DeleteForever })
|
|
589
|
+
]),
|
|
590
|
+
onClick: () => (0, bypass_formulario_1.accion_borrar_formulario)({ forPk, forPkPadre })
|
|
591
|
+
})
|
|
592
|
+
: null),
|
|
593
|
+
(defBoton.num !== false && !defBoton.esAgregar && !defBoton.esConfirmar ?
|
|
594
|
+
js_to_html_1.html.span(((_c = (_b = casillero.especial) === null || _b === void 0 ? void 0 : _b.camposResumen) !== null && _c !== void 0 ? _c : [defBoton.num.toString()]).map((campo) => respuestasAumentadas[formularioAAbrir.unidad_analisis][defBoton.num - 1][campo]).join(', '))
|
|
595
|
+
: null)
|
|
596
|
+
// html.div({class:'inline-dialog', $attrs:{"inline-dialog-open": confirmarForzarIr == defBoton.num?'visible':'hidden'}},[ ])
|
|
597
|
+
])
|
|
598
|
+
/*
|
|
599
|
+
{defBoton.esAgregar?<> <span> </span> <Button
|
|
600
|
+
variant="outlined"
|
|
601
|
+
color="inherit"
|
|
602
|
+
onClick={()=>{
|
|
603
|
+
}}
|
|
604
|
+
><ICON.Check/></Button></>:null}
|
|
605
|
+
</div>
|
|
606
|
+
*/
|
|
607
|
+
]).create();
|
|
608
|
+
};
|
|
609
|
+
function BotonFormularioDespliegue(props) {
|
|
610
|
+
var _a;
|
|
611
|
+
var { casillero, forPk } = props;
|
|
612
|
+
var habilitador = casillero.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(casillero.expresion_habilitar_js) : () => true;
|
|
613
|
+
var { opciones } = useSelectorVivienda(forPk);
|
|
614
|
+
//var idFormularioDestino = 'F:'+casillero.salto! as IdFormulario; //original
|
|
615
|
+
var armoNomSalto = ((_a = casillero.salto) === null || _a === void 0 ? void 0 : _a.substring(0, 2)) == 'F:' ? casillero.salto.slice(2) : casillero.salto;
|
|
616
|
+
//console.log('BotonFormularioDespliegue armoNomSalto ' +armoNomSalto);
|
|
617
|
+
var idFormularioDestino = 'F:' + armoNomSalto;
|
|
618
|
+
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
619
|
+
var { formularioAAbrir } = (0, react_redux_1.useSelector)((_state) => ({
|
|
620
|
+
formularioAAbrir: estructura.formularios[idFormularioDestino].casilleros,
|
|
621
|
+
}));
|
|
622
|
+
var sufijoIdElemento = (0, tipos_1.toPlainForPk)(forPk);
|
|
623
|
+
/*
|
|
624
|
+
registrarElemento({
|
|
625
|
+
id:`div-boton-formulario-${sufijoIdElemento}`,
|
|
626
|
+
attr:'esta-inhabilitada',
|
|
627
|
+
// fun: (r:Respuestas)=>habilitador(r)?'SI':'NO'
|
|
628
|
+
fun: (_r:Respuestas)=>'NO'
|
|
629
|
+
});
|
|
630
|
+
registrarElemento<HTMLButtonElement>({
|
|
631
|
+
id:`boton-formulario-${sufijoIdElemento}`,
|
|
632
|
+
prop:'disabled',
|
|
633
|
+
// fun: (r:Respuestas)=>!habilitador(r)
|
|
634
|
+
fun: (_r:Respuestas)=>false
|
|
635
|
+
});
|
|
636
|
+
*/
|
|
637
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
638
|
+
var [confirmarForzarIr, setConfirmarForzarIr] = (0, react_1.useState)(null);
|
|
639
|
+
var multipleFormularios = formularioAAbrir.unidad_analisis != props.formulario.unidad_analisis;
|
|
640
|
+
var nuevoCampoPk = bypass_formulario_2.defOperativo.defUA[formularioAAbrir.unidad_analisis].pk;
|
|
641
|
+
// var var_name='$B.'+casillero.salto; //original
|
|
642
|
+
var var_name = '$B.F:' + armoNomSalto;
|
|
643
|
+
var idSeccion = `seccion-boton-formulario-${var_name}`;
|
|
644
|
+
var idButton = `special-button-${idSeccion}`;
|
|
645
|
+
(0, bypass_formulario_2.registrarElemento)({
|
|
646
|
+
id: idSeccion,
|
|
647
|
+
direct: true,
|
|
648
|
+
fun: (respuestasAumentadas, feedbackRow, div, feedbackAll) => {
|
|
649
|
+
try {
|
|
650
|
+
var listaDeBotonesAbrir = [];
|
|
651
|
+
// var esVarActual = feedbackRow.actual == '$B.F:'+casillero.salto; //original
|
|
652
|
+
var esVarActual = feedbackRow.actual == '$B.F:' + armoNomSalto;
|
|
653
|
+
// console.log('BotonFormularioDespliegue esVarActual ' +esVarActual );
|
|
654
|
+
if (multipleFormularios && casillero.salto != null) {
|
|
655
|
+
// let defFormulario:InfoFormulario = estructura.formularios['F:'+casillero.salto as IdFormulario]; //original
|
|
656
|
+
let defFormulario = estructura.formularios['F:' + armoNomSalto];
|
|
657
|
+
let defUA = estructura.unidades_analisis[defFormulario.casilleros.unidad_analisis];
|
|
658
|
+
let conjunto = respuestasAumentadas[defFormulario.casilleros.unidad_analisis];
|
|
659
|
+
let cantidadEsperada = respuestasAumentadas[casillero.expresion_habilitar];
|
|
660
|
+
var numActual = null;
|
|
661
|
+
// var estadoDelBoton = feedbackRow.feedback['$B.F:'+casillero.salto as IdVariable].estado //original
|
|
662
|
+
var estadoDelBoton = feedbackRow.feedback['$B.F:' + armoNomSalto].estado;
|
|
663
|
+
// console.log('BotonFormularioDespliegue estadoDelBoton ' +estadoDelBoton );
|
|
664
|
+
var configSorteoFormulario = estructura.configSorteo ? estructura.configSorteo[(0, bypass_formulario_1.getMainFormForVivienda)(forPk.vivienda)] : null;
|
|
665
|
+
listaDeBotonesAbrir = (0, like_ar_1.strict)(conjunto).map((_, i) => {
|
|
666
|
+
let num = (0, bypass_formulario_2.numberOrStringIncIfArray)(i, conjunto);
|
|
667
|
+
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino, [nuevoCampoPk]: num });
|
|
668
|
+
var feedback = feedbackAll[(0, tipos_1.toPlainForPk)(forPk)];
|
|
669
|
+
if (numActual == null && feedback.resumen == "vacio" && estadoDelBoton == 'valida') {
|
|
670
|
+
numActual = num;
|
|
671
|
+
}
|
|
672
|
+
return {
|
|
673
|
+
forPk,
|
|
674
|
+
resumen: null,
|
|
675
|
+
num,
|
|
676
|
+
actual: (0, bypass_formulario_1.calcularActualBF)(configSorteoFormulario, num, numActual, idFormularioDestino, respuestasAumentadas),
|
|
677
|
+
previo: numActual == null,
|
|
678
|
+
permiteBorrar: (0, like_ar_1.strict)(conjunto).array().length == Number(i) + 1 &&
|
|
679
|
+
feedback.resumen == 'vacio' &&
|
|
680
|
+
(0, bypass_formulario_1.calcularPermiteBorrarBF)(configSorteoFormulario, idFormularioDestino),
|
|
681
|
+
disabled: (0, bypass_formulario_1.calcularDisabledBF)(configSorteoFormulario, num, idFormularioDestino, respuestasAumentadas)
|
|
682
|
+
};
|
|
683
|
+
}).array();
|
|
684
|
+
if ("puede agregar //TODO VER ESTO" && (conjunto instanceof Array || conjunto == null)) {
|
|
685
|
+
let nuevoValorPk = (conjunto == null ? 0 : conjunto.length) + 1;
|
|
686
|
+
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino, [nuevoCampoPk]: nuevoValorPk });
|
|
687
|
+
let debeAgregarOlisto = numActual == null && (cantidadEsperada == null || cantidadEsperada != (conjunto != null && conjunto.length))
|
|
688
|
+
&& (estadoDelBoton == 'valida' || esVarActual);
|
|
689
|
+
listaDeBotonesAbrir.push({
|
|
690
|
+
forPk,
|
|
691
|
+
num: nuevoValorPk,
|
|
692
|
+
esAgregar: true,
|
|
693
|
+
actual: debeAgregarOlisto,
|
|
694
|
+
previo: false,
|
|
695
|
+
disabled: calcularDisabledBFAgregarListo(configSorteoFormulario, idFormularioDestino)
|
|
696
|
+
});
|
|
697
|
+
listaDeBotonesAbrir.push({
|
|
698
|
+
forPk,
|
|
699
|
+
num: nuevoValorPk - 1,
|
|
700
|
+
esConfirmar: true,
|
|
701
|
+
actual: debeAgregarOlisto && (!casillero.longitud || nuevoValorPk > Number(casillero.longitud)),
|
|
702
|
+
previo: false,
|
|
703
|
+
disabled: calcularDisabledBFAgregarListo(configSorteoFormulario, idFormularioDestino)
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
else {
|
|
708
|
+
let forPk = Object.assign(Object.assign({}, props.forPk), { formulario: idFormularioDestino });
|
|
709
|
+
listaDeBotonesAbrir = [{ forPk, num: false, unico: true, actual: esVarActual, previo: true }];
|
|
710
|
+
}
|
|
711
|
+
var todosLosBotones = listaDeBotonesAbrir.map(defBoton => {
|
|
712
|
+
var _a;
|
|
713
|
+
return botonFormularioConResumen(defBoton, (_a = feedbackAll[(0, tipos_1.toPlainForPk)(defBoton.forPk)]) !== null && _a !== void 0 ? _a : { resumen: 'vacio' }, respuestasAumentadas, casillero, props.forPk, idButton, formularioAAbrir);
|
|
714
|
+
});
|
|
715
|
+
var htmlSeccion = document.getElementById(idSeccion);
|
|
716
|
+
htmlSeccion.innerHTML = "";
|
|
717
|
+
htmlSeccion.appendChild(js_to_html_1.html.div(todosLosBotones).create());
|
|
718
|
+
//arrange(document.getElementById(idSeccion)!, todosLosBotones);
|
|
719
|
+
}
|
|
720
|
+
catch (err) {
|
|
721
|
+
var error = (0, cast_error_1.unexpected)(err);
|
|
722
|
+
console.log("entra al catch");
|
|
723
|
+
div.textContent = 'esto, FALLÉ ' + error.message;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
});
|
|
727
|
+
const ir = (defBoton) => {
|
|
728
|
+
if (!casillero.salto) {
|
|
729
|
+
opciones.modoDirecto ?
|
|
730
|
+
null
|
|
731
|
+
:
|
|
732
|
+
dispatch(redux_formulario_1.dispatchers.VOLVER_HDR({}));
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
var nuevaForPk = Object.assign(Object.assign({}, forPk), { formulario: idFormularioDestino });
|
|
736
|
+
if (multipleFormularios) {
|
|
737
|
+
// @ts-ignore forPk y sus componentes
|
|
738
|
+
nuevaForPk[nuevoCampoPk] = defBoton.num;
|
|
739
|
+
if (defBoton.esAgregar) {
|
|
740
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_agregar_formulario, { forPk: nuevaForPk });
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
(0, bypass_formulario_2.dispatchByPass)(bypass_formulario_1.accion_abrir_formulario, { forPk: nuevaForPk });
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk: nuevaForPk, apilarVuelta: true }));
|
|
747
|
+
}
|
|
748
|
+
if (confirmarForzarIr) {
|
|
749
|
+
setConfirmarForzarIr(false);
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
return React.createElement(DesplegarCasillero, { casillero: casillero },
|
|
753
|
+
React.createElement("div", { id: idSeccion }),
|
|
754
|
+
React.createElement(Button, { className: "special-button", id: idButton, onClick: (event) => {
|
|
755
|
+
ir(JSON.parse(event.target.getAttribute('def-button')));
|
|
756
|
+
} }, "ir (interno)"),
|
|
757
|
+
React.createElement(core_1.Dialog, { className: "nuestro-dialogo", open: !!confirmarForzarIr, onClose: () => setConfirmarForzarIr(null) },
|
|
758
|
+
React.createElement("div", { className: "nuestro-dialogo" },
|
|
759
|
+
React.createElement(Typography, null, "No se puede avanzar al siguiente formulario."),
|
|
760
|
+
React.createElement(Typography, null, "Quiz\u00E1s no termin\u00F3 de contestar las preguntas correspondientes"),
|
|
761
|
+
React.createElement(Typography, null, "Quiz\u00E1s no corresponde en base a las respuestas obtenidas")),
|
|
762
|
+
React.createElement(Button, { color: "secondary", onClick: () => confirmarForzarIr && ir(confirmarForzarIr) }, "forzar"),
|
|
763
|
+
React.createElement(Button, { color: "primary", variant: "contained", onClick: () => setConfirmarForzarIr(null) }, "Entendido")));
|
|
764
|
+
}
|
|
765
|
+
function CasilleroDesconocido(props) {
|
|
766
|
+
return React.createElement(DesplegarCasillero, { id: `casillerodesconocido-${props.casillero.id_casillero}`, casillero: props.casillero, style: { display: 'none' } },
|
|
767
|
+
React.createElement(Typography, null,
|
|
768
|
+
"Tipo de casillero no implementado: \"",
|
|
769
|
+
props.casillero.tipoc,
|
|
770
|
+
"\" para \"",
|
|
771
|
+
props.casillero.casillero,
|
|
772
|
+
"\""),
|
|
773
|
+
React.createElement(EncabezadoDespliegue, { casillero: props.casillero, leer: false, forPk: props.forPk }));
|
|
774
|
+
}
|
|
775
|
+
function useSelectorVivienda(forPk) {
|
|
776
|
+
return (0, react_redux_1.useSelector)((state) => {
|
|
777
|
+
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
778
|
+
return {
|
|
779
|
+
formulario: estructura.formularios[forPk.formulario].casilleros,
|
|
780
|
+
modoDespliegue: true || state.modo.demo ? state.opciones.modoDespliegue : 'relevamiento',
|
|
781
|
+
modo: state.modo,
|
|
782
|
+
opciones: state.opciones,
|
|
783
|
+
};
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
function ConjuntoPreguntasDespliegue(props) {
|
|
787
|
+
let { casillero, forPk } = props;
|
|
788
|
+
var id = `conjunto-preguntas-${casillero.id_casillero}`;
|
|
789
|
+
(0, bypass_formulario_2.registrarElemento)({
|
|
790
|
+
id,
|
|
791
|
+
direct: true,
|
|
792
|
+
fun: registradorDeVariable(casillero)
|
|
793
|
+
});
|
|
794
|
+
let modoDespliegue = "normal";
|
|
795
|
+
let habilitado = true;
|
|
796
|
+
return habilitado || modoDespliegue == 'metadatos' ? React.createElement(DesplegarCasillero, { id: id, casillero: casillero },
|
|
797
|
+
React.createElement(EncabezadoDespliegue, { casillero: casillero, forPk: forPk, leer: casillero.leer !== false }),
|
|
798
|
+
React.createElement(DesplegarContenidoInternoBloqueOFormulario, { bloqueOFormulario: casillero, formulario: props.formulario, forPk: forPk, multiple: false })) : null;
|
|
799
|
+
}
|
|
800
|
+
function DesplegarContenidoInternoBloqueOFormulario(props) {
|
|
801
|
+
var parcializable = props.bloqueOFormulario.tipoc == 'F';
|
|
802
|
+
const [verTodo, setVerTodo] = (0, react_1.useState)(!parcializable);
|
|
803
|
+
const [forPkActual, setForPkActual] = (0, react_1.useState)(null);
|
|
804
|
+
if (parcializable) {
|
|
805
|
+
if (forPkActual != props.bloqueOFormulario.casillero) {
|
|
806
|
+
setVerTodo(false);
|
|
807
|
+
setForPkActual(props.bloqueOFormulario.casillero);
|
|
808
|
+
}
|
|
809
|
+
(0, react_1.useEffect)(() => {
|
|
810
|
+
var timer = setTimeout(() => {
|
|
811
|
+
setVerTodo(true);
|
|
812
|
+
}, 250);
|
|
813
|
+
return () => {
|
|
814
|
+
if (timer) {
|
|
815
|
+
clearTimeout(timer);
|
|
816
|
+
}
|
|
817
|
+
};
|
|
818
|
+
});
|
|
819
|
+
}
|
|
820
|
+
const limiteNoVerTodo = 3;
|
|
821
|
+
(0, react_1.useEffect)(() => {
|
|
822
|
+
if (props.bloqueOFormulario.tipoc == 'F') {
|
|
823
|
+
(0, bypass_formulario_2.volcadoInicialElementosRegistrados)(props.forPk);
|
|
824
|
+
}
|
|
825
|
+
}, [(0, tipos_1.toPlainForPk)(props.forPk), verTodo]);
|
|
826
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
827
|
+
if (props.bloqueOFormulario.tipoc == 'F' && verTodo) {
|
|
828
|
+
var { siguienteVariable, variableActual } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: bypass_formulario_2.NO_CAMBIAR__SOLO_TRAER_STATUS, forPk: props.forPk });
|
|
829
|
+
if (variableActual || siguienteVariable) {
|
|
830
|
+
enfocarElementoDeVariable((0, best_globals_1.coalesce)(variableActual, siguienteVariable));
|
|
831
|
+
}
|
|
832
|
+
else {
|
|
833
|
+
var feedbackRowValidator = (0, bypass_formulario_2.getFeedbackRowValidator)();
|
|
834
|
+
if (feedbackRowValidator[(0, tipos_1.toPlainForPk)(props.forPk)].resumen == 'ok') {
|
|
835
|
+
(0, render_general_1.scrollToTop)();
|
|
836
|
+
}
|
|
837
|
+
else {
|
|
838
|
+
(0, render_general_1.scrollToTop)();
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
});
|
|
843
|
+
return React.createElement("div", { className: "contenido" },
|
|
844
|
+
verTodo ? null : React.createElement("div", { style: { height: "500px", textAlign: 'center', verticalAlign: 'middle', width: '100%', position: "fixed", backgroundColor: 'rgba(100,100,100,0.3)', fontSize: '200%' } }, "cargando..."),
|
|
845
|
+
props.bloqueOFormulario.casilleros.map((casillero, i) => {
|
|
846
|
+
var _a;
|
|
847
|
+
var key = casillero.tipoc + '-' + casillero.id_casillero + '-' + i;
|
|
848
|
+
return (verTodo || i < limiteNoVerTodo ?
|
|
849
|
+
(casillero.tipoc == "P" ? React.createElement(PreguntaDespliegue, { key: key, pregunta: casillero, forPk: props.forPk, despliegueEncabezado: (_a = casillero.despliegueEncabezado) !== null && _a !== void 0 ? _a : (props.bloqueOFormulario.tipoc == 'CP' ? 'lateral' : 'superior') }) :
|
|
850
|
+
casillero.tipoc == "B" ? React.createElement(BloqueDespliegue, { key: key, bloque: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
851
|
+
casillero.tipoc == "FILTRO" ? React.createElement(FiltroDespliegue, { key: key, filtro: casillero, forPk: props.forPk }) :
|
|
852
|
+
casillero.tipoc == "BF" ? React.createElement(BotonFormularioDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
853
|
+
casillero.tipoc == "CONS" ? React.createElement(ConsistenciaDespliegue, { key: key, casillero: casillero, forPk: props.forPk }) :
|
|
854
|
+
casillero.tipoc == "CP" ? React.createElement(ConjuntoPreguntasDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
855
|
+
casillero.tipoc == "TEXTO" ? React.createElement(TextoDespliegue, { key: key, casillero: casillero, forPk: props.forPk }) :
|
|
856
|
+
casillero.tipoc == "LIBRE" ? React.createElement(LibreDespliegue, { key: key, casillero: casillero, formulario: props.formulario, forPk: props.forPk }) :
|
|
857
|
+
React.createElement(CasilleroDesconocido, { key: key, casillero: casillero, forPk: props.forPk }))
|
|
858
|
+
: i == limiteNoVerTodo ?
|
|
859
|
+
React.createElement("div", { key: '$spinner', className: "spinner-border", role: "status" },
|
|
860
|
+
React.createElement("span", null, "cargando bloque..."))
|
|
861
|
+
: null);
|
|
862
|
+
}));
|
|
863
|
+
}
|
|
864
|
+
function BloqueDespliegue(props) {
|
|
865
|
+
var { bloque, forPk } = props;
|
|
866
|
+
var key = bloque.ver_id != '-' && bloque.ver_id || bloque.casillero;
|
|
867
|
+
var activeStep = 0;
|
|
868
|
+
var multiple = !!bloque.unidad_analisis;
|
|
869
|
+
var lista = [{ forPk, key: 0, multiple: false }];
|
|
870
|
+
var habilitador = bloque.expresion_habilitar_js ? (0, bypass_formulario_2.getFuncionHabilitar)(bloque.expresion_habilitar_js) : () => true;
|
|
871
|
+
var { modoDespliegue } = useSelectorVivienda(forPk);
|
|
872
|
+
if (multiple) {
|
|
873
|
+
// TODO: GENERALIZAR
|
|
874
|
+
// @ts-ignore
|
|
875
|
+
// lista=respuestas.personas.map((_persona, i)=>(
|
|
876
|
+
// {forPk:{...forPk, persona:i+1}, key:i+1, multiple:true}
|
|
877
|
+
// ))
|
|
878
|
+
}
|
|
879
|
+
var id = `bloque-${bloque.id_casillero}`;
|
|
880
|
+
(0, bypass_formulario_2.registrarElemento)({
|
|
881
|
+
id,
|
|
882
|
+
style: 'display',
|
|
883
|
+
fun: (respuestas) => habilitador(respuestas) || modoDespliegue == 'metadatos' ? 'unset' : 'none'
|
|
884
|
+
});
|
|
885
|
+
return React.createElement(DesplegarCasillero, { casillero: bloque, "nuestro-bloque": bloque.id_casillero, "es-multiple": multiple ? 'SI' : 'NO', id: id },
|
|
886
|
+
React.createElement(EncabezadoDespliegue, { casillero: bloque, forPk: forPk }),
|
|
887
|
+
lista.map(({ key, forPk, multiple }) => React.createElement(DesplegarContenidoInternoBloqueOFormulario, { key: key, bloqueOFormulario: bloque, formulario: props.formulario, forPk: forPk, multiple: multiple })));
|
|
888
|
+
}
|
|
889
|
+
const FormularioEncabezado = DespliegueEncabezado;
|
|
890
|
+
function MenuLetra(props) {
|
|
891
|
+
const cambiarLetra = (tamannio) => {
|
|
892
|
+
var root = document.documentElement;
|
|
893
|
+
root.style.fontSize = tamannio + "px";
|
|
894
|
+
};
|
|
895
|
+
return React.createElement(core_1.MenuItem, { onClick: () => cambiarLetra(props.tamannio), style: { fontSize: props.tamannio + 'px' } },
|
|
896
|
+
"letra ",
|
|
897
|
+
props.denominacion);
|
|
898
|
+
}
|
|
899
|
+
function FastSettup() {
|
|
900
|
+
const [anchorEl, setAnchorEl] = React.useState(null);
|
|
901
|
+
const [open, setOpen] = React.useState(false);
|
|
902
|
+
const handleClick = (event) => {
|
|
903
|
+
setAnchorEl(event.currentTarget);
|
|
904
|
+
setOpen((prev) => !prev);
|
|
905
|
+
};
|
|
906
|
+
const dispatch = (0, react_redux_1.useDispatch)();
|
|
907
|
+
const cambiar = (modoDespliegue) => {
|
|
908
|
+
dispatch(redux_formulario_1.dispatchers.MODO_DESPLIEGUE({ modoDespliegue }));
|
|
909
|
+
setOpen(false);
|
|
910
|
+
};
|
|
911
|
+
const opciones = (0, react_redux_1.useSelector)((state) => state.opciones);
|
|
912
|
+
return React.createElement(React.Fragment, null,
|
|
913
|
+
React.createElement(Button, { onClick: handleClick },
|
|
914
|
+
React.createElement(render_general_1.ICON.Settings, null)),
|
|
915
|
+
React.createElement(core_1.Menu, { open: open, anchorEl: anchorEl, onClose: () => setOpen(false) },
|
|
916
|
+
React.createElement(core_1.MenuItem, { onClick: () => cambiar("relevamiento") }, "normal"),
|
|
917
|
+
React.createElement(core_1.MenuItem, { onClick: () => cambiar("PDF") }, "PDF para relevamiento"),
|
|
918
|
+
React.createElement(core_1.MenuItem, { onClick: () => cambiar("metadatos") }, "revisar metadatos"),
|
|
919
|
+
React.createElement(core_1.Divider, null),
|
|
920
|
+
React.createElement(MenuLetra, { tamannio: 12, denominacion: "muy chica" }),
|
|
921
|
+
React.createElement(MenuLetra, { tamannio: 14, denominacion: "chica" }),
|
|
922
|
+
React.createElement(MenuLetra, { tamannio: 16, denominacion: "normal" }),
|
|
923
|
+
React.createElement(MenuLetra, { tamannio: 19, denominacion: "grande" }),
|
|
924
|
+
React.createElement(MenuLetra, { tamannio: 22, denominacion: "enorme" }),
|
|
925
|
+
React.createElement(core_1.Divider, null),
|
|
926
|
+
React.createElement(core_1.MenuItem, null,
|
|
927
|
+
React.createElement("label", null,
|
|
928
|
+
React.createElement(core_1.Checkbox, { checked: opciones.conCampoOpciones, onChange: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'conCampoOpciones', valor: !opciones.conCampoOpciones })), inputProps: { 'aria-label': 'primary checkbox' } }),
|
|
929
|
+
"campo opciones")),
|
|
930
|
+
React.createElement(core_1.MenuItem, null,
|
|
931
|
+
React.createElement("label", null,
|
|
932
|
+
React.createElement(core_1.Checkbox, { checked: opciones.saltoAutomatico, onChange: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'saltoAutomatico', valor: !opciones.saltoAutomatico })), inputProps: { 'aria-label': 'primary checkbox' } }),
|
|
933
|
+
"salto autom\u00E1tico"))));
|
|
934
|
+
}
|
|
935
|
+
function BarraDeNavegacion(props) {
|
|
936
|
+
const dispatch = (0, react_redux_1.useDispatch)();
|
|
937
|
+
const forPk = props.forPk;
|
|
938
|
+
const { opciones } = useSelectorVivienda(forPk);
|
|
939
|
+
const [confirmaCerrar, setConfirmaCerrar] = (0, react_1.useState)(false);
|
|
940
|
+
var dominio = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tem.dominio;
|
|
941
|
+
var cerrarDirecto = function () {
|
|
942
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
943
|
+
removeCSSById(BOOTSTRAP_5_1_3_SRC);
|
|
944
|
+
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
945
|
+
(0, redux_formulario_1.gotoConsistir)(estructura.operativo, (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tarea.tarea, forPk.vivienda);
|
|
946
|
+
//var hash=new URLSearchParams(location.hash?.replace(/^\#/,'').split('&autoproced')[0]);
|
|
947
|
+
////hash.delete('autoproced')
|
|
948
|
+
//close();
|
|
949
|
+
//location.hash=hash.toString();
|
|
950
|
+
});
|
|
951
|
+
};
|
|
952
|
+
var botonesFormulario = [];
|
|
953
|
+
if (!opciones.modoDirecto) {
|
|
954
|
+
botonesFormulario.push({ que: 'hdr', abr: 'HdR', label: 'hoja de ruta', retroceso: 0 });
|
|
955
|
+
}
|
|
956
|
+
opciones.pilaForPk.forEach((forPk, i) => botonesFormulario.push({ que: 'volver', abr: forPk.formulario.replace(/^F:/, ''), label: forPk.formulario, retroceso: opciones.pilaForPk.length - i }));
|
|
957
|
+
botonesFormulario.push({ que: '', abr: forPk.formulario.replace(/^F:/, ''), label: forPk.formulario, retroceso: 0 });
|
|
958
|
+
return React.createElement(React.Fragment, null,
|
|
959
|
+
React.createElement(core_1.ButtonGroup, { key: "formularios", className: "barra-navegacion", "solo-lectura": props.soloLectura ? 'si' : 'no' }, botonesFormulario.map((b, i) => React.createElement(Button, { color: b.que == forPk.formulario ? "primary" : "inherit", variant: "outlined", key: `${i}-${b.que}-${b.retroceso}`, disabled: !b.que, onClick: () => dispatch(b.que == 'hdr' ? redux_formulario_1.dispatchers.VOLVER_HDR({}) :
|
|
960
|
+
redux_formulario_1.dispatchers.VOLVER_DE_FORMULARIO({ magnitudRetroceso: b.retroceso })) },
|
|
961
|
+
React.createElement("span", { className: "abr" }, b.abr),
|
|
962
|
+
React.createElement("span", { className: "label" }, b.label)))),
|
|
963
|
+
props.soloLectura ? React.createElement(Typography, { component: "span", style: { margin: '0 10px' } }, " (Solo Lectura) ") : null,
|
|
964
|
+
props.modoDirecto ?
|
|
965
|
+
React.createElement(React.Fragment, null,
|
|
966
|
+
React.createElement(core_1.ButtonGroup, { key: "volver_y_grabar", style: { margin: '0 0 0 30px' } },
|
|
967
|
+
React.createElement(Button, { color: "inherit", variant: "outlined", onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
968
|
+
if (props.soloLectura || !(0, bypass_formulario_2.getDirty)()) {
|
|
969
|
+
cerrarDirecto();
|
|
970
|
+
}
|
|
971
|
+
else {
|
|
972
|
+
setConfirmaCerrar(true);
|
|
973
|
+
}
|
|
974
|
+
}) },
|
|
975
|
+
React.createElement(render_general_1.ICON.ExitToApp, null)),
|
|
976
|
+
React.createElement(core_1.Dialog, { open: !!confirmaCerrar,
|
|
977
|
+
//hace que no se cierre el mensaje
|
|
978
|
+
onClose: () => setConfirmaCerrar(false), "aria-labelledby": "alert-dialog-title", "aria-describedby": "alert-dialog-description" },
|
|
979
|
+
React.createElement(core_1.DialogTitle, { id: "alert-dialog-title" }, "Confirme cierre de encuesta"),
|
|
980
|
+
React.createElement(core_1.DialogContent, null,
|
|
981
|
+
React.createElement(core_1.DialogContentText, { id: "alert-dialog-description" }, "Est\u00E1 por salir de la encuesta, se perder\u00E1n los cambios no guardados.")),
|
|
982
|
+
React.createElement(core_1.DialogActions, null,
|
|
983
|
+
React.createElement(Button, { onClick: () => {
|
|
984
|
+
cerrarDirecto();
|
|
985
|
+
}, color: "secondary", variant: "outlined" }, "descartar cambios y cerrar"),
|
|
986
|
+
React.createElement(Button, { onClick: () => {
|
|
987
|
+
setConfirmaCerrar(false);
|
|
988
|
+
}, color: "primary", variant: "contained" }, "continuar editando encuesta"))),
|
|
989
|
+
props.soloLectura ? null :
|
|
990
|
+
React.createElement(Button, { id: "save-button", color: "inherit", variant: "outlined", disabled: true, onClick: () => __awaiter(this, void 0, void 0, function* () { return true; }) },
|
|
991
|
+
React.createElement(render_general_1.ICON.Save, null))))
|
|
992
|
+
: null,
|
|
993
|
+
React.createElement(Typography, { className: "mostrar-forPk", component: "span", style: { margin: '0 10px' } },
|
|
994
|
+
VER_DOMINIO ? React.createElement("div", { key: dominio },
|
|
995
|
+
React.createElement("span", null, "dominio"),
|
|
996
|
+
React.createElement("span", null, dominio)) : '',
|
|
997
|
+
(0, like_ar_1.strict)(props.forPk).filter((_, k) => k != 'formulario').map((v, k) => React.createElement("div", { key: k },
|
|
998
|
+
React.createElement("span", null, k),
|
|
999
|
+
React.createElement("span", null, v))).array()),
|
|
1000
|
+
React.createElement(FastSettup, null));
|
|
1001
|
+
}
|
|
1002
|
+
function BotonVolverEnDiv({ id }) {
|
|
1003
|
+
var { opciones } = (0, react_redux_1.useSelector)((state) => ({ opciones: state.opciones }));
|
|
1004
|
+
const dispatch = (0, react_redux_1.useDispatch)();
|
|
1005
|
+
return React.createElement("div", { className: "div-boton-volver" }, opciones.pilaForPk.length > 0 ?
|
|
1006
|
+
React.createElement(Button, { id: id, className: "boton-volver", onClick: () => dispatch(redux_formulario_1.dispatchers.VOLVER_DE_FORMULARIO({ magnitudRetroceso: 1 })) },
|
|
1007
|
+
" ",
|
|
1008
|
+
React.createElement(render_general_1.ICON.ChevronLeft, null),
|
|
1009
|
+
" Volver")
|
|
1010
|
+
: null);
|
|
1011
|
+
}
|
|
1012
|
+
function FormularioDespliegue(props) {
|
|
1013
|
+
var _a;
|
|
1014
|
+
var forPk = props.forPk;
|
|
1015
|
+
var { formulario, modoDespliegue, modo, opciones } = useSelectorVivienda(props.forPk);
|
|
1016
|
+
var soloLectura = (0, bypass_formulario_1.getDatosByPass)().soloLectura;
|
|
1017
|
+
const dispatch = (0, react_redux_1.useDispatch)();
|
|
1018
|
+
(0, react_1.useEffect)(() => {
|
|
1019
|
+
var controlScroll = () => {
|
|
1020
|
+
var arriba = document.getElementById('fab-activo-arriba');
|
|
1021
|
+
if (arriba) {
|
|
1022
|
+
(0, bypass_formulario_2.setValorDistinto)(arriba.style, 'visibility',
|
|
1023
|
+
// @ts-ignore
|
|
1024
|
+
arriba.elTopVisibilizar != null && arriba.elTopVisibilizar + 10
|
|
1025
|
+
< document.documentElement.scrollTop ? 'visible' : 'hidden');
|
|
1026
|
+
}
|
|
1027
|
+
var abajo = document.getElementById('fab-activo-abajo');
|
|
1028
|
+
if (abajo) {
|
|
1029
|
+
(0, bypass_formulario_2.setValorDistinto)(abajo.style, 'visibility',
|
|
1030
|
+
// @ts-ignore
|
|
1031
|
+
abajo.elBottomVisibilizar != null && abajo.elBottomVisibilizar - 20
|
|
1032
|
+
> document.documentElement.scrollTop + window.innerHeight * 0.7 ? 'visible' : 'hidden');
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
window.addEventListener('scroll', controlScroll);
|
|
1036
|
+
controlScroll();
|
|
1037
|
+
return () => {
|
|
1038
|
+
window.removeEventListener('scroll', controlScroll);
|
|
1039
|
+
};
|
|
1040
|
+
});
|
|
1041
|
+
// TODO Volver a poner el movimiento a la actual
|
|
1042
|
+
var actual;
|
|
1043
|
+
var completo;
|
|
1044
|
+
var onClickSaltarActual = () => {
|
|
1045
|
+
var { variableActual } = (0, bypass_formulario_2.dispatchByPass)(bypass_formulario_2.accion_registrar_respuesta, { respuesta: null, variable: bypass_formulario_2.NO_CAMBIAR__SOLO_TRAER_STATUS, forPk: props.forPk });
|
|
1046
|
+
if (variableActual) {
|
|
1047
|
+
enfocarElementoDeVariable(variableActual);
|
|
1048
|
+
}
|
|
1049
|
+
};
|
|
1050
|
+
var listaModos = ['metadatos', 'relevamiento', 'PDF'];
|
|
1051
|
+
['boton-volver-1', 'boton-volver-2'].forEach(id => {
|
|
1052
|
+
(0, bypass_formulario_2.registrarElemento)({ id, attr: 'resumen-estado', fun: (_, feedbackForm) => (feedbackForm.resumen) });
|
|
1053
|
+
});
|
|
1054
|
+
// @ts-expect-error especial hay que leerlo en el parser de casilleros si esto termina quedando así
|
|
1055
|
+
var pantallaCompleta = (_a = formulario.especial) === null || _a === void 0 ? void 0 : _a.pantallaCompleta;
|
|
1056
|
+
return (React.createElement(React.Fragment, null,
|
|
1057
|
+
React.createElement(core_1.AppBar, { position: "fixed", color: soloLectura ? 'secondary' : 'primary' },
|
|
1058
|
+
React.createElement(core_1.Toolbar, null,
|
|
1059
|
+
React.createElement(BarraDeNavegacion, { forPk: forPk, soloLectura: soloLectura || false, modoDirecto: opciones.modoDirecto })),
|
|
1060
|
+
React.createElement("div", { id: "mini-console" })),
|
|
1061
|
+
React.createElement("main", null,
|
|
1062
|
+
React.createElement(core_1.Paper, { className: "formulario", "modo-despliegue": modoDespliegue, "ver-num-opciones": opciones.conCampoOpciones ? 'SI' : 'NO' },
|
|
1063
|
+
modo.demo ? React.createElement("div", null,
|
|
1064
|
+
React.createElement(Typography, { component: "span" }, "Modo de despliegue:"),
|
|
1065
|
+
React.createElement(core_1.ButtonGroup, null, listaModos.map(modo => React.createElement(Button, { key: modo, variant: modo == modoDespliegue ? "contained" : "outlined", onClick: () => dispatch(redux_formulario_1.dispatchers.MODO_DESPLIEGUE({ modoDespliegue: modo })) }, modo)))) : null,
|
|
1066
|
+
pantallaCompleta ? null : React.createElement(BotonVolverEnDiv, { id: "boton-volver-1" }),
|
|
1067
|
+
pantallaCompleta ? null : React.createElement(FormularioEncabezado, { casillero: formulario }),
|
|
1068
|
+
React.createElement(DesplegarContenidoInternoBloqueOFormulario, { bloqueOFormulario: formulario, formulario: formulario, forPk: forPk, multiple: false }),
|
|
1069
|
+
pantallaCompleta ? null : React.createElement(BotonVolverEnDiv, { id: "boton-volver-2" })),
|
|
1070
|
+
React.createElement(core_1.Fab, { id: 'fab-activo-arriba', color: "primary", "aria-label": "add", onClick: onClickSaltarActual },
|
|
1071
|
+
React.createElement(render_general_1.ICON.KeyboardArrowUp, null)),
|
|
1072
|
+
React.createElement(core_1.Fab, { id: 'fab-activo-abajo', color: "primary", "aria-label": "add", onClick: onClickSaltarActual },
|
|
1073
|
+
React.createElement(render_general_1.ICON.KeyboardArrowDown, null)),
|
|
1074
|
+
React.createElement(core_1.Fab, { id: 'fab-error-arriba', variant: "extended", color: "secondary", "aria-label": "edit" },
|
|
1075
|
+
React.createElement(render_general_1.ICON.Navigation, null),
|
|
1076
|
+
"Error"),
|
|
1077
|
+
React.createElement(core_1.Fab, { id: 'fab-error-abajo', variant: "extended", color: "secondary", "aria-label": "edit" },
|
|
1078
|
+
React.createElement(render_general_1.ICON.NavigationDown, null),
|
|
1079
|
+
"Error"),
|
|
1080
|
+
React.createElement("div", { className: 'espacio-final-formulario' }),
|
|
1081
|
+
opciones.modoBorrarRespuesta && opciones.forPk ? React.createElement(DesplegarConfirmarBorrarRespuesta, { forPk: opciones.forPk, variableBorrar: opciones.modoBorrarRespuesta }) : null)));
|
|
1082
|
+
}
|
|
1083
|
+
function Atributo(props) {
|
|
1084
|
+
return props.valor != null && props.valor != '' ? React.createElement("span", { className: "atributo-par" },
|
|
1085
|
+
props.nombre ? React.createElement("span", { className: "atributo-nombre" }, props.nombre) : null,
|
|
1086
|
+
React.createElement("span", { className: "atributo-valor" }, props.valor.toString())) : null;
|
|
1087
|
+
}
|
|
1088
|
+
exports.Atributo = Atributo;
|
|
1089
|
+
const listaEstadosCarga = ['resumen', 'relevamiento', 'recibo'];
|
|
1090
|
+
var resumidores = [
|
|
1091
|
+
{ nombre: 'REA', f: (rr) => rr.resumenEstado == "ok" },
|
|
1092
|
+
{ nombre: 'Cita pactada', f: (rr) => rr.resumenEstado == "cita pactada" },
|
|
1093
|
+
{ nombre: 'Pendientes', f: (rr) => rr.resumenEstado == "vacio" },
|
|
1094
|
+
];
|
|
1095
|
+
resumidores.push({ nombre: 'Otros', f: resumidores.reduce((g, r) => (rr => !r.f(rr) && g(rr)), (_) => true) });
|
|
1096
|
+
function DesplegarLineaResumenUAPrincipal(props) {
|
|
1097
|
+
const { numVivienda, respuestas, formPrincipal, tarea } = props;
|
|
1098
|
+
const id = 'viv-' + numVivienda;
|
|
1099
|
+
const forPk = { formulario: formPrincipal, vivienda: Number(numVivienda) }; //no quitar el casteo porque viene como texto y necesito que sea número
|
|
1100
|
+
var tem = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[numVivienda].tem;
|
|
1101
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1102
|
+
(0, react_1.useEffect)(() => {
|
|
1103
|
+
(0, bypass_formulario_2.volcadoInicialElementosRegistrados)(forPk);
|
|
1104
|
+
(0, bypass_formulario_1.intentarBackup)(forPk);
|
|
1105
|
+
});
|
|
1106
|
+
(0, bypass_formulario_2.registrarElemento)({ id, direct: true,
|
|
1107
|
+
fun: (r, _feedbackForm, elemento, feedbackAll, _estructura) => {
|
|
1108
|
+
//pregunto si es la misma vivienda porque la funcion se dispara
|
|
1109
|
+
//con todas las combinaciones de respuestas para cada forPk
|
|
1110
|
+
//@ts-ignore vivienda existe
|
|
1111
|
+
if (r.vivienda == forPk.vivienda) {
|
|
1112
|
+
elemento.setAttribute('resumen-estado', (0, bypass_formulario_1.calcularResumenVivienda)(forPk, feedbackAll, r).resumenEstado);
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
});
|
|
1116
|
+
return React.createElement(core_1.TableRow, { key: numVivienda },
|
|
1117
|
+
React.createElement(core_1.TableCell, null, tem ?
|
|
1118
|
+
React.createElement(React.Fragment, null,
|
|
1119
|
+
React.createElement(DesplegarTem, { tem: tem }),
|
|
1120
|
+
respuestas['resumenEstado'] == "cita pactada" ?
|
|
1121
|
+
React.createElement(DesplegarCitaPactada, { respuestas: respuestas })
|
|
1122
|
+
:
|
|
1123
|
+
React.createElement(DesplegarCitaPactadaYSeleccionadoAnteriorTem, { tem: tem }))
|
|
1124
|
+
: null),
|
|
1125
|
+
React.createElement(core_1.TableCell, null, tarea),
|
|
1126
|
+
React.createElement(core_1.TableCell, null,
|
|
1127
|
+
React.createElement(Button, { id: id, onClick: () => dispatch(redux_formulario_1.dispatchers.CAMBIAR_FORMULARIO({ forPk, apilarVuelta: false })) }, numVivienda.toString())));
|
|
1128
|
+
}
|
|
1129
|
+
exports.DesplegarLineaResumenUAPrincipal = DesplegarLineaResumenUAPrincipal;
|
|
1130
|
+
function DesplegarCarga(props) {
|
|
1131
|
+
const { carga, idCarga, informacionHdr, respuestas } = props;
|
|
1132
|
+
return React.createElement(core_1.Paper, { className: "carga" },
|
|
1133
|
+
React.createElement("div", { className: "informacion-carga" },
|
|
1134
|
+
React.createElement("div", { className: "carga" },
|
|
1135
|
+
"\u00C1rea: ",
|
|
1136
|
+
idCarga),
|
|
1137
|
+
React.createElement("div", { className: "observaciones" }, carga.observaciones)),
|
|
1138
|
+
React.createElement("div", { className: "informacion-carga" },
|
|
1139
|
+
React.createElement("div", { className: "fecha" }, carga.fecha)),
|
|
1140
|
+
carga.estado_carga == null && !props.posicion || carga.estado_carga == 'relevamiento' ?
|
|
1141
|
+
React.createElement(core_1.Table, { className: "tabla-carga-hoja-de-ruta" },
|
|
1142
|
+
React.createElement("colgroup", null,
|
|
1143
|
+
React.createElement("col", { style: { width: "75%" } }),
|
|
1144
|
+
React.createElement("col", { style: { width: "10%" } }),
|
|
1145
|
+
React.createElement("col", { style: { width: "15%" } })),
|
|
1146
|
+
React.createElement(core_1.TableHead, { style: { fontSize: "1.2rem" } },
|
|
1147
|
+
React.createElement(core_1.TableRow, { className: "tr-carga" },
|
|
1148
|
+
React.createElement(core_1.TableCell, null, "domicilio"),
|
|
1149
|
+
React.createElement(core_1.TableCell, null, "tarea"),
|
|
1150
|
+
React.createElement(core_1.TableCell, null, "enc"))),
|
|
1151
|
+
React.createElement(core_1.TableBody, null, (0, like_ar_1.strict)(informacionHdr).filter((informacion) => informacion.tem.carga == idCarga).map((informacion, numVivienda) => React.createElement(DesplegarLineaResumenUAPrincipal, { key: numVivienda, numVivienda: numVivienda, tarea: informacion.tarea.tarea, formPrincipal: informacion.tarea.main_form, respuestas: respuestas.viviendas[numVivienda] })).array())) :
|
|
1152
|
+
React.createElement(core_1.Table, null,
|
|
1153
|
+
React.createElement(core_1.TableHead, { style: { fontSize: "1.2rem" } },
|
|
1154
|
+
React.createElement(core_1.TableRow, { className: "tr-carga" }, resumidores.map((resumidor, i) => React.createElement(core_1.TableCell, { key: i }, resumidor.nombre))))));
|
|
1155
|
+
}
|
|
1156
|
+
exports.DesplegarCarga = DesplegarCarga;
|
|
1157
|
+
function DesplegarCitaPactada(props) {
|
|
1158
|
+
const { respuestas } = props;
|
|
1159
|
+
return React.createElement("div", { className: "cita-pactada" },
|
|
1160
|
+
React.createElement("div", null,
|
|
1161
|
+
React.createElement(Atributo, { nombre: "Cita pactada con ", valor: respuestas[p12] })),
|
|
1162
|
+
React.createElement("div", null,
|
|
1163
|
+
React.createElement(Atributo, { nombre: "Cel.:", valor: respuestas[sp2] })),
|
|
1164
|
+
React.createElement("div", null,
|
|
1165
|
+
React.createElement(Atributo, { nombre: "Tel.:", valor: respuestas[sp3] })),
|
|
1166
|
+
React.createElement("div", null,
|
|
1167
|
+
React.createElement(Atributo, { nombre: "Fecha:", valor: respuestas[sp4] })),
|
|
1168
|
+
React.createElement("div", null,
|
|
1169
|
+
React.createElement(Atributo, { nombre: "Hora:", valor: respuestas[sp5] })));
|
|
1170
|
+
}
|
|
1171
|
+
exports.DesplegarCitaPactada = DesplegarCitaPactada;
|
|
1172
|
+
function DesplegarCitaPactadaYSeleccionadoAnteriorTem(props) {
|
|
1173
|
+
const { tem } = props;
|
|
1174
|
+
return React.createElement("div", null,
|
|
1175
|
+
React.createElement("div", { className: "tem-cita" },
|
|
1176
|
+
React.createElement(Atributo, { nombre: "Cita:", valor: tem.cita })));
|
|
1177
|
+
}
|
|
1178
|
+
exports.DesplegarCitaPactadaYSeleccionadoAnteriorTem = DesplegarCitaPactadaYSeleccionadoAnteriorTem;
|
|
1179
|
+
function DesplegarTem(props) {
|
|
1180
|
+
const { tem } = props;
|
|
1181
|
+
return React.createElement("div", null,
|
|
1182
|
+
React.createElement("div", { className: "tem-domicilio" },
|
|
1183
|
+
tem.nomcalle,
|
|
1184
|
+
" ",
|
|
1185
|
+
tem.nrocatastral,
|
|
1186
|
+
" ",
|
|
1187
|
+
React.createElement(Atributo, { nombre: "piso", valor: tem.piso }),
|
|
1188
|
+
" ",
|
|
1189
|
+
React.createElement(Atributo, { nombre: "dpto", valor: tem.departamento }),
|
|
1190
|
+
" "),
|
|
1191
|
+
React.createElement("div", null,
|
|
1192
|
+
React.createElement(Atributo, { nombre: "sector", valor: tem.sector }),
|
|
1193
|
+
React.createElement(Atributo, { nombre: "edificio", valor: tem.edificio }),
|
|
1194
|
+
React.createElement(Atributo, { nombre: "casa", valor: tem.casa }),
|
|
1195
|
+
React.createElement(Atributo, { nombre: "entrada", valor: tem.entrada }),
|
|
1196
|
+
React.createElement(Atributo, { nombre: "habitacion", valor: tem.habitacion })),
|
|
1197
|
+
React.createElement("div", { className: "tem-observaciones" }, tem.observaciones));
|
|
1198
|
+
}
|
|
1199
|
+
exports.DesplegarTem = DesplegarTem;
|
|
1200
|
+
function HojaDeRutaDespliegue() {
|
|
1201
|
+
var { cargas, num_sincro, informacionHdr, respuestas } = (0, bypass_formulario_1.getDatosByPass)();
|
|
1202
|
+
var { modo } = (0, react_redux_1.useSelector)((state) => ({ modo: state.modo }));
|
|
1203
|
+
var feedbackRowValidator = (0, bypass_formulario_2.getFeedbackRowValidator)();
|
|
1204
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1205
|
+
const updateOnlineStatus = function () {
|
|
1206
|
+
setOnline(window.navigator.onLine);
|
|
1207
|
+
};
|
|
1208
|
+
const appVersion = (0, redux_formulario_1.getCacheVersion)();
|
|
1209
|
+
const [online, setOnline] = (0, react_1.useState)(window.navigator.onLine);
|
|
1210
|
+
window.addEventListener('online', updateOnlineStatus);
|
|
1211
|
+
window.addEventListener('offline', updateOnlineStatus);
|
|
1212
|
+
return (React.createElement(React.Fragment, null,
|
|
1213
|
+
React.createElement(core_1.AppBar, { position: "fixed" },
|
|
1214
|
+
React.createElement(core_1.Toolbar, null,
|
|
1215
|
+
React.createElement(Typography, { variant: "h6" }, "Hoja de ruta"),
|
|
1216
|
+
online ?
|
|
1217
|
+
React.createElement(React.Fragment, null,
|
|
1218
|
+
React.createElement(core_1.IconButton, { color: "inherit", onClick: () => {
|
|
1219
|
+
(0, redux_formulario_1.gotoSincronizar)();
|
|
1220
|
+
} },
|
|
1221
|
+
React.createElement(render_general_1.ICON.SyncAlt, null)))
|
|
1222
|
+
: null)),
|
|
1223
|
+
React.createElement("div", { className: "hoja-de-ruta" },
|
|
1224
|
+
modo.demo ? React.createElement("div", null,
|
|
1225
|
+
React.createElement(Typography, null, "Modo demo "),
|
|
1226
|
+
React.createElement(Button, { variant: "outlined", color: "secondary", onClick: () => dispatch(redux_formulario_1.dispatchers.REINICIAR_DEMO({})) }, "reiniciar")) : null,
|
|
1227
|
+
React.createElement("div", { className: "nombre-version" },
|
|
1228
|
+
React.createElement("div", null, "Direcci\u00F3n General de Estad\u00EDstica y Censos - C.A.B.A."),
|
|
1229
|
+
React.createElement("div", null,
|
|
1230
|
+
my.getLocalVar('app-version'),
|
|
1231
|
+
" sincro ",
|
|
1232
|
+
num_sincro,
|
|
1233
|
+
" - versi\u00F3n ",
|
|
1234
|
+
appVersion)),
|
|
1235
|
+
(0, like_ar_1.strict)(cargas).map((carga, idCarga, _, posicion) => React.createElement(DesplegarCarga, { key: idCarga, carga: carga, idCarga: idCarga, posicion: posicion, informacionHdr: informacionHdr, feedbackRowValidator: feedbackRowValidator, respuestas: respuestas })).array())));
|
|
1236
|
+
}
|
|
1237
|
+
exports.HojaDeRutaDespliegue = HojaDeRutaDespliegue;
|
|
1238
|
+
function ListaTextos(props) {
|
|
1239
|
+
return React.createElement("ul", null, props.textos.map(t => React.createElement("li", null,
|
|
1240
|
+
React.createElement(Typography, null, t))));
|
|
1241
|
+
}
|
|
1242
|
+
exports.ListaTextos = ListaTextos;
|
|
1243
|
+
function BienvenidaDespliegue(props) {
|
|
1244
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
1245
|
+
return React.createElement(core_1.Paper, { className: "bienvenida" },
|
|
1246
|
+
props.modo.demo ?
|
|
1247
|
+
React.createElement(React.Fragment, null,
|
|
1248
|
+
React.createElement(Typography, null, "DEMO del sistema de relevamiento de DMENCU"),
|
|
1249
|
+
React.createElement(Typography, null, "En esta demo:"),
|
|
1250
|
+
React.createElement(ListaTextos, { textos: [
|
|
1251
|
+
"Algunas viviendas aparecen relevadas (el botón está de color) sirven de ejemplo",
|
|
1252
|
+
"Lo que se carguen se guardan localmente pero no se trasmiten a la base de datos",
|
|
1253
|
+
"Se puede volver a la versión inicial (o sea borrar lo que se guardó localmente) desde la hoja de ruta boton [reiniciar demo]",
|
|
1254
|
+
"Todavía hay cosas que faltan o pueden cambiar",
|
|
1255
|
+
] }))
|
|
1256
|
+
: React.createElement(React.Fragment, null,
|
|
1257
|
+
React.createElement(Typography, null, "Encuesta de Seroprevalencia de COVID-19")),
|
|
1258
|
+
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => { (0, redux_formulario_1.gotoSincronizar)(); } },
|
|
1259
|
+
React.createElement("span", null, "Sincronizar "),
|
|
1260
|
+
" ",
|
|
1261
|
+
React.createElement(render_general_1.ICON.SyncAlt, null)),
|
|
1262
|
+
React.createElement(Button, { variant: "contained", color: "primary", onClick: () => dispatch(redux_formulario_1.dispatchers.SET_OPCION({ opcion: 'bienvenido', valor: true })) },
|
|
1263
|
+
React.createElement("span", null, "Continuar "),
|
|
1264
|
+
" ",
|
|
1265
|
+
React.createElement(render_general_1.ICON.Send, null)));
|
|
1266
|
+
}
|
|
1267
|
+
exports.BienvenidaDespliegue = BienvenidaDespliegue;
|
|
1268
|
+
//CONTROL DE PESTAÑAS
|
|
1269
|
+
var allOpenedTabs = {};
|
|
1270
|
+
var infoOpenedTabs = {
|
|
1271
|
+
allOpenedTabs,
|
|
1272
|
+
myId: 'calculando...',
|
|
1273
|
+
otherTabsNames: ''
|
|
1274
|
+
};
|
|
1275
|
+
function OpenedTabs() {
|
|
1276
|
+
const [tabs, setTabs] = (0, react_1.useState)(infoOpenedTabs.otherTabsNames);
|
|
1277
|
+
var { modoDirecto } = (0, react_redux_1.useSelector)((state) => ({ modoDirecto: state.opciones.modoDirecto }));
|
|
1278
|
+
const updateTabsStatus = function () {
|
|
1279
|
+
setTabs(infoOpenedTabs.otherTabsNames);
|
|
1280
|
+
};
|
|
1281
|
+
(0, react_1.useEffect)(() => {
|
|
1282
|
+
window.addEventListener('my-tabs', updateTabsStatus);
|
|
1283
|
+
return () => window.removeEventListener('my-tabs', updateTabsStatus);
|
|
1284
|
+
}, []);
|
|
1285
|
+
return modoDirecto ? null : (tabs) ?
|
|
1286
|
+
React.createElement("div", { className: "tab-counter tab-error" },
|
|
1287
|
+
"\u00A1ATENCI\u00D3N! Hay m\u00E1s de una ventana abierta. Se pueden perder datos: ",
|
|
1288
|
+
tabs)
|
|
1289
|
+
:
|
|
1290
|
+
React.createElement("div", { className: "tab-counter" }, "\u2714");
|
|
1291
|
+
}
|
|
1292
|
+
exports.OpenedTabs = OpenedTabs;
|
|
1293
|
+
function AppDmEncu() {
|
|
1294
|
+
var { forPk, bienvenido, modo } = (0, react_redux_1.useSelector)((state) => (Object.assign(Object.assign(Object.assign({}, state.opciones), state.modo), state)));
|
|
1295
|
+
if (!bienvenido) {
|
|
1296
|
+
return React.createElement(BienvenidaDespliegue, { modo: modo });
|
|
1297
|
+
}
|
|
1298
|
+
else if (forPk == null) {
|
|
1299
|
+
return React.createElement(HojaDeRutaDespliegue, null);
|
|
1300
|
+
}
|
|
1301
|
+
else {
|
|
1302
|
+
return React.createElement(FormularioDespliegue, { forPk: forPk });
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
exports.AppDmEncu = AppDmEncu;
|
|
1306
|
+
function PantallaInicialSinCarga(_props) {
|
|
1307
|
+
const updateOnlineStatus = function () {
|
|
1308
|
+
setOnline(window.navigator.onLine);
|
|
1309
|
+
};
|
|
1310
|
+
const [online, setOnline] = (0, react_1.useState)(window.navigator.onLine);
|
|
1311
|
+
window.addEventListener('online', updateOnlineStatus);
|
|
1312
|
+
window.addEventListener('offline', updateOnlineStatus);
|
|
1313
|
+
const paragraphStyles = { fontSize: "1.2rem", fontWeight: 600, padding: "5px 10px" };
|
|
1314
|
+
return (React.createElement(React.Fragment, null,
|
|
1315
|
+
React.createElement(core_1.AppBar, { position: "fixed" },
|
|
1316
|
+
React.createElement(Typography, { variant: "h6", style: { margin: 25 } }, "Dispositivo sin carga")),
|
|
1317
|
+
React.createElement("main", null,
|
|
1318
|
+
React.createElement(core_1.Paper, { style: { height: '600px', padding: "15px", marginTop: 75 } },
|
|
1319
|
+
React.createElement("div", null, online ?
|
|
1320
|
+
React.createElement(React.Fragment, null,
|
|
1321
|
+
React.createElement(Typography, { component: "p", style: paragraphStyles },
|
|
1322
|
+
"Sincronizar dispositivo",
|
|
1323
|
+
React.createElement("span", { style: { padding: '5px' } },
|
|
1324
|
+
React.createElement(Button, { color: "primary", variant: "contained", onClick: () => {
|
|
1325
|
+
(0, redux_formulario_1.gotoSincronizar)();
|
|
1326
|
+
} },
|
|
1327
|
+
React.createElement(render_general_1.ICON.SyncAlt, null)))))
|
|
1328
|
+
:
|
|
1329
|
+
React.createElement(Typography, { component: "p", style: paragraphStyles }, "No hay conexi\u00F3n a internet, por favor con\u00E9cte el dispositivo a una red para sincronizar una hoja de ruta."))))));
|
|
1330
|
+
}
|
|
1331
|
+
function PantallaInicial() {
|
|
1332
|
+
var { forPk, bienvenido, modo } = (0, react_redux_1.useSelector)((state) => (Object.assign(Object.assign(Object.assign({}, state.opciones), state.modo), state)));
|
|
1333
|
+
if (!bienvenido) {
|
|
1334
|
+
return React.createElement(BienvenidaDespliegue, { modo: modo });
|
|
1335
|
+
}
|
|
1336
|
+
else if (forPk == null) {
|
|
1337
|
+
return React.createElement(HojaDeRutaDespliegue, null);
|
|
1338
|
+
}
|
|
1339
|
+
else {
|
|
1340
|
+
return React.createElement(FormularioDespliegue, { forPk: forPk });
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
exports.PantallaInicial = PantallaInicial;
|
|
1344
|
+
function dmPantallaInicialSinCarga() {
|
|
1345
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1346
|
+
try {
|
|
1347
|
+
yield loadCSS(BOOTSTRAP_5_1_3_SRC);
|
|
1348
|
+
}
|
|
1349
|
+
catch (err) {
|
|
1350
|
+
throw (err);
|
|
1351
|
+
}
|
|
1352
|
+
ReactDOM.render(React.createElement(PantallaInicialSinCarga, null), document.getElementById('main_layout'));
|
|
1353
|
+
});
|
|
1354
|
+
}
|
|
1355
|
+
exports.dmPantallaInicialSinCarga = dmPantallaInicialSinCarga;
|
|
1356
|
+
function desplegarFormularioActual(opts) {
|
|
1357
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1358
|
+
// traer los metadatos en una "estructura"
|
|
1359
|
+
// traer los datos de localStorage
|
|
1360
|
+
// verificar el main Layout
|
|
1361
|
+
const store = yield (0, redux_formulario_1.dmTraerDatosFormulario)(opts);
|
|
1362
|
+
try {
|
|
1363
|
+
yield loadCSS(BOOTSTRAP_5_1_3_SRC);
|
|
1364
|
+
}
|
|
1365
|
+
catch (err) {
|
|
1366
|
+
throw (err);
|
|
1367
|
+
}
|
|
1368
|
+
ReactDOM.render(React.createElement(render_general_1.RenderPrincipal, { store: store, dispatchers: redux_formulario_1.dispatchers, mensajeRetorno: opts.forPkRaiz ? "Volver al formulario" : "Volver a la hoja de ruta" },
|
|
1369
|
+
React.createElement(OpenedTabs, null),
|
|
1370
|
+
React.createElement(AppDmEncu, null)), document.getElementById('main_layout'));
|
|
1371
|
+
});
|
|
1372
|
+
}
|
|
1373
|
+
exports.desplegarFormularioActual = desplegarFormularioActual;
|
|
1374
|
+
if (typeof window !== 'undefined') {
|
|
1375
|
+
// @ts-ignore para hacerlo
|
|
1376
|
+
window.desplegarFormularioActual = desplegarFormularioActual;
|
|
1377
|
+
// @ts-ignore para hacerlo
|
|
1378
|
+
window.dmPantallaInicialSinCarga = dmPantallaInicialSinCarga;
|
|
1379
|
+
}
|
|
1380
|
+
function loadInstance() {
|
|
1381
|
+
if (typeof BroadcastChannel === 'undefined') {
|
|
1382
|
+
return;
|
|
1383
|
+
}
|
|
1384
|
+
var bc = new BroadcastChannel('contador');
|
|
1385
|
+
var myId = String.fromCodePoint(100 + Math.floor(Math.random() * 1000)) + Math.floor(Math.random() * 100); //+'-'+new Date().getTime();
|
|
1386
|
+
allOpenedTabs[myId] = 1;
|
|
1387
|
+
infoOpenedTabs.myId = myId;
|
|
1388
|
+
var event = new Event('my-tabs');
|
|
1389
|
+
bc.onmessage = function (ev) {
|
|
1390
|
+
if (ev.data.que == 'soy') {
|
|
1391
|
+
if (!allOpenedTabs[ev.data.id]) {
|
|
1392
|
+
allOpenedTabs[ev.data.id] = 0;
|
|
1393
|
+
}
|
|
1394
|
+
allOpenedTabs[ev.data.id]++;
|
|
1395
|
+
}
|
|
1396
|
+
if (ev.data.que == 'unload') {
|
|
1397
|
+
delete allOpenedTabs[ev.data.id];
|
|
1398
|
+
}
|
|
1399
|
+
if (ev.data.que == 'load') {
|
|
1400
|
+
allOpenedTabs[ev.data.id] = 1;
|
|
1401
|
+
bc.postMessage({ que: 'soy', id: myId });
|
|
1402
|
+
}
|
|
1403
|
+
infoOpenedTabs.otherTabsNames = (0, like_ar_1.strict)(allOpenedTabs).filter((_, id) => id != myId).join(',');
|
|
1404
|
+
window.dispatchEvent(event);
|
|
1405
|
+
};
|
|
1406
|
+
bc.postMessage({ que: 'load', id: myId });
|
|
1407
|
+
window.dispatchEvent(event);
|
|
1408
|
+
window.addEventListener('unload', function () {
|
|
1409
|
+
bc.postMessage({ que: 'unload', id: myId });
|
|
1410
|
+
window.dispatchEvent(event);
|
|
1411
|
+
});
|
|
1412
|
+
//mostrarQuienesSomos();
|
|
1413
|
+
}
|
|
1414
|
+
const setLibreDespliegue = (libre) => LibreDespliegue = libre;
|
|
1415
|
+
exports.setLibreDespliegue = setLibreDespliegue;
|
|
1416
|
+
(0, exports.setLibreDespliegue)((props) => React.createElement("div", { key: props.key, id: props.casillero.id_casillero }, "este casillero debe redefinirse en la APP final y su uso es exclusivo del \u00E1rea inform\u00E1tica"));
|
|
1417
|
+
(0, bypass_formulario_1.setCalcularVariables)((respuestasRaiz, forPk) => {
|
|
1418
|
+
//TODO GENERALIZAR
|
|
1419
|
+
var uasIterar = {
|
|
1420
|
+
hogares: {
|
|
1421
|
+
uaPersonas: 'personas',
|
|
1422
|
+
varSexoPersona: 'sexo',
|
|
1423
|
+
varNombrePersona: 'nombre',
|
|
1424
|
+
varLosNombres: "los_nombres"
|
|
1425
|
+
},
|
|
1426
|
+
["hogares_sup"]: {
|
|
1427
|
+
uaPersonas: 'personas_sup',
|
|
1428
|
+
varSexoPersona: 'sexo_sup',
|
|
1429
|
+
varNombrePersona: 'nombre_sup',
|
|
1430
|
+
varLosNombres: "nombres_componentes_sup"
|
|
1431
|
+
}
|
|
1432
|
+
};
|
|
1433
|
+
(0, like_ar_1.strict)(uasIterar).forEach((configHogares, uaHogares) => {
|
|
1434
|
+
var _a;
|
|
1435
|
+
var estructura = (0, bypass_formulario_2.getEstructura)();
|
|
1436
|
+
if (estructura.unidades_analisis[uaHogares]) {
|
|
1437
|
+
for (var respuestasHogar of (0, tipos_1.iterator)((_a = respuestasRaiz[uaHogares]) !== null && _a !== void 0 ? _a : [])) {
|
|
1438
|
+
if (!respuestasHogar[configHogares.uaPersonas] || (0, tipos_1.empty)(respuestasHogar[configHogares.uaPersonas]) || respuestasHogar[configHogares.uaPersonas][0][configHogares.varSexoPersona] == null) {
|
|
1439
|
+
var losNombres = respuestasHogar[configHogares.varLosNombres];
|
|
1440
|
+
if (losNombres != null) {
|
|
1441
|
+
if (!respuestasHogar[configHogares.uaPersonas]) {
|
|
1442
|
+
respuestasHogar[configHogares.uaPersonas] = [];
|
|
1443
|
+
}
|
|
1444
|
+
losNombres
|
|
1445
|
+
.split(',')
|
|
1446
|
+
.filter((nombre) => nombre.trim().length > 0)
|
|
1447
|
+
.forEach((nombre, i) => {
|
|
1448
|
+
respuestasHogar[configHogares.uaPersonas][i] = respuestasHogar[configHogares.uaPersonas][i] || {};
|
|
1449
|
+
respuestasHogar[configHogares.uaPersonas][i][configHogares.varNombrePersona] = nombre.trim();
|
|
1450
|
+
});
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
});
|
|
1456
|
+
respuestasRaiz.vdominio = (0, bypass_formulario_1.getDatosByPass)().informacionHdr[forPk.vivienda].tem.dominio;
|
|
1457
|
+
});
|
|
1458
|
+
window.addEventListener('load', function () {
|
|
1459
|
+
loadInstance();
|
|
1460
|
+
});
|
|
1461
|
+
//FIN CONTROL PESTAÑAS
|
|
1462
|
+
function loadCSS(cssURL, id) {
|
|
1463
|
+
return new Promise((resolve, reject) => {
|
|
1464
|
+
var link = document.createElement('link');
|
|
1465
|
+
link.rel = 'stylesheet';
|
|
1466
|
+
link.href = cssURL;
|
|
1467
|
+
link.id = id || cssURL;
|
|
1468
|
+
document.head.appendChild(link);
|
|
1469
|
+
link.onload = () => {
|
|
1470
|
+
resolve();
|
|
1471
|
+
console.log(`trae ${cssURL}`);
|
|
1472
|
+
};
|
|
1473
|
+
link.onerror = (err) => {
|
|
1474
|
+
console.log('error cargando el estilo', err);
|
|
1475
|
+
reject(new Error(`problema cargando estilo ${cssURL}`));
|
|
1476
|
+
};
|
|
1477
|
+
});
|
|
1478
|
+
}
|
|
1479
|
+
function removeCSSById(id) {
|
|
1480
|
+
var _a;
|
|
1481
|
+
var linkNode = document.getElementById(id);
|
|
1482
|
+
(_a = linkNode === null || linkNode === void 0 ? void 0 : linkNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(linkNode);
|
|
1483
|
+
}
|
|
1484
|
+
const BOOTSTRAP_5_1_3_SRC = 'css/bootstrap.min.css';
|
|
1485
|
+
});
|
|
1486
1486
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdW5sb2dnZWQvcmVuZGVyLWZvcm11bGFyaW8udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsK0JBQStCO0lBQy9CLHNDQUFzQztJQUN0QyxxREFRMEI7SUFDMUIsbUNBY2lCO0lBQ2pCLDJEQVk0QjtJQUM1Qix5REFJNEI7SUFDNUIsaUNBQTZEO0lBQzdELDZDQUF1RDtJQUN2RCxxQ0FBdUQ7SUFDdkQsK0NBQTZDO0lBQzdDLDJDQUF3QztJQUV4Qyw0Q0FNMkI7SUFJM0IsMkRBYzRCO0lBRTVCLDJDQUFrRDtJQUdsRCxTQUFTLGNBQWMsQ0FBQyxJQUFnQixFQUFFLFdBQTZDO1FBQ25GLElBQUcsT0FBTyxJQUFJLElBQUksUUFBUTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUMsSUFBSSxFQUFDLEVBQUUsQ0FBQSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBQyxDQUFDLElBQUksRUFBQyxFQUFFLENBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3pGLElBQUcsQ0FBQyxXQUFXLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JDOztVQUVFO0lBQ04sQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLHFKQUFxSjtJQUNoTCxnSUFBZ0k7SUFFaEksSUFBSSxVQUFVLEdBQVcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVB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dCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XHJcbmltcG9ydCB7ICBcclxuICAgIFJlbmRlclByaW5jaXBhbCwgXHJcbiAgICBhZGFwdGFyVGlwb1ZhckNhc2lsbGVybyxcclxuICAgIElDT04sXHJcbiAgICBmb2N1c1RvSWQsXHJcbiAgICBzY3JvbGxUb1RvcCxcclxuICAgIHNjcm9sbFRvQm90dG9tLFxyXG4gICAgbWF0ZXJpYWxJb0ljb25zU3ZnUGF0aFxyXG59IGZyb20gXCIuL3JlbmRlci1nZW5lcmFsXCI7XHJcbmltcG9ydCB7QmxvcXVlLCBCb3RvbkZvcm11bGFyaW8sIFxyXG4gICAgQ2FzaWxsZXJvQmFzZSwgQ2Fzb1N0YXRlLCBDb25qdW50b1ByZWd1bnRhcywgQ29uc2lzdGVuY2lhLCBcclxuICAgIEVzdGFkb0NhcmdhLCBGaWx0cm8sIEZvclBrLCBGb3JQa1JhaXosIEZvcm11bGFyaW8sIFxyXG4gICAgSWRGb3JtdWxhcmlvLCBJZFByZWd1bnRhLCBJZFRhcmVhLCBJZFZhcmlhYmxlLCBJbmZvRm9ybXVsYXJpbyxcclxuICAgIE1vZG9EZXNwbGllZ3VlLFxyXG4gICAgT3BjaW9uLCBPcGNpb25NdWx0aXBsZSwgUGxhaW5Gb3JQaywgXHJcbiAgICBQcmVndW50YSwgUHJlZ3VudGFDb25PcGNpb25lcywgUHJlZ3VudGFTaW1wbGUsIFxyXG4gICAgUmVzcHVlc3RhcywgUmVzcHVlc3RhTGFzVUEsIFJlc3B1ZXN0YXNSYWl6LCBWYWxvciwgVEVNLCBJZENhcmdhLCBDYXJnYSwgSWRGaW4sIElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBNb2RvQWxtYWNlbmFtaWVudG8sXHJcbiAgICB0b1BsYWluRm9yUGssXHJcbiAgICBJZENhc2lsbGVybyxcclxuICAgIFByZWd1bnRhQ29uU2lObyxcclxuICAgIFRleHRvLCBFc3RydWN0dXJhLCBJbmZvcm1hY2lvbkhkciwgRGF0b3NIZHJVYVBwYWwsIENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLCBSZXN1bWVuRXN0YWRvLCBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcywgSWRPcGVyYXRpdm8sIElkRW5jLCBMaWJyZSwgVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBpdGVyYXRvciwgZW1wdHlcclxufSBmcm9tIFwiLi90aXBvc1wiO1xyXG5pbXBvcnR7IFxyXG4gICAgYWNjaW9uX2FicmlyX2Zvcm11bGFyaW8sXHJcbiAgICBhY2Npb25fYm9ycmFyX2Zvcm11bGFyaW8sXHJcbiAgICBjYWxjdWxhckFjdHVhbEJGLFxyXG4gICAgY2FsY3VsYXJEaXNhYmxlZEJGLFxyXG4gICAgY2FsY3VsYXJQZXJtaXRlQm9ycmFyQkYsXHJcbiAgICBjYWxjdWxhclJlc3VtZW5WaXZpZW5kYSxcclxuICAgIGdldERhdG9zQnlQYXNzLFxyXG4gICAgZ2V0Rm9ybXVsYXJpb3NGb3JJZFZpdmllbmRhLFxyXG4gICAgZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYSxcclxuICAgIGludGVudGFyQmFja3VwLFxyXG4gICAgc2V0Q2FsY3VsYXJWYXJpYWJsZXNcclxufSBmcm9tIFwiLi9ieXBhc3MtZm9ybXVsYXJpb1wiXHJcbmltcG9ydCB7IGRtVHJhZXJEYXRvc0Zvcm11bGFyaW8sIGRpc3BhdGNoZXJzLCBcclxuICAgIGdvdG9TaW5jcm9uaXphcixcclxuICAgIGdldENhY2hlVmVyc2lvbixcclxuICAgIGdvdG9Db25zaXN0aXIsXHJcbn0gZnJvbSBcIi4vcmVkdXgtZm9ybXVsYXJpb1wiO1xyXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7IFxyXG5pbXBvcnQgeyBzdHJpY3QgYXMgbGlrZUFyLCBiZWluZ0FycmF5IH0gZnJvbSBcImxpa2UtYXJcIjtcclxuaW1wb3J0IHtzbGVlcCwgY29hbGVzY2V9IGZyb20gXCJiZXN0LWdsb2JhbHNcIjtcclxuaW1wb3J0IHsgdW5leHBlY3RlZCB9IGZyb20gXCJjYXN0LWVycm9yXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQXBwQmFyLCBCdXR0b25Hcm91cCwgQ2lyY3VsYXJQcm9ncmVzcywgQ2hlY2tib3gsIFxyXG4gICAgRGlhbG9nLCBEaWFsb2dBY3Rpb25zLCBEaWFsb2dDb250ZW50LCBEaWFsb2dDb250ZW50VGV4dCwgXHJcbiAgICBEaWFsb2dUaXRsZSwgRGl2aWRlciwgRmFiLCBJY29uQnV0dG9uLFxyXG4gICAgTWVudSwgTWVudUl0ZW0sIFBhcGVyLCBQb3BvdmVyLFxyXG4gICAgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93LCBUb29sYmFyXHJcbn0gZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlXCI7XHJcbmltcG9ydCB7IEVzdGFkb1ZhcmlhYmxlLCBGb3JtU3RydWN0dXJlU3RhdGUgfSBmcm9tIFwicm93LXZhbGlkYXRvclwiO1xyXG5pbXBvcnQgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL3N0eWxlcy93aXRoU3R5bGVzXCI7XHJcblxyXG5pbXBvcnQgeyBcclxuICAgIHJlZ2lzdHJhckVsZW1lbnRvLCBzZXRBdHRyRGlzdGludG8sIHNldFZhbG9yRGlzdGludG8sIGRpc3BhdGNoQnlQYXNzLCBcclxuICAgIGdldERpcnR5LCBnZXRGZWVkYmFja1Jvd1ZhbGlkYXRvcixcclxuICAgIGdldEZ1bmNpb25IYWJpbGl0YXIsIFxyXG4gICAgZ2V0RXN0cnVjdHVyYSwgXHJcbiAgICBkZWZPcGVyYXRpdm8sXHJcbiAgICB2b2xjYWRvSW5pY2lhbEVsZW1lbnRvc1JlZ2lzdHJhZG9zLFxyXG4gICAgbnVtYmVyT3JTdHJpbmdJbmNJZkFycmF5LCBcclxuICAgIGNhbGN1bGFyRWxlbWVudG9FbmZvY2FkbyxcclxuICAgIGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhLFxyXG4gICAgYWNjaW9uX2lkX3ByZWd1bnRhLFxyXG4gICAgYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyxcclxuICAgIE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8sXHJcbiAgICBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVU1xyXG59IGZyb20gXCIuL2J5cGFzcy1mb3JtdWxhcmlvXCJcclxuXHJcbmltcG9ydCB7YXJyYW5nZSwgaHRtbCwgSHRtbFRhZ30gZnJvbSBcImpzLXRvLWh0bWxcIjtcclxuXHJcbmZ1bmN0aW9uIGJyZWFrZWFibGVUZXh0KHRleHQ6c3RyaW5nfG51bGwpOnN0cmluZ3x1bmRlZmluZWQ7XHJcbmZ1bmN0aW9uIGJyZWFrZWFibGVUZXh0KHRleHQ6c3RyaW5nfG51bGwsIGRpY2Npb25hcmlvPzp7W2NsYXZlOnN0cmluZ106UmVhY3QuUmVhY3ROb2RlfSl7XHJcbiAgICBpZih0eXBlb2YgdGV4dCAhPSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwvL2csXCIvXFx1MjA2M1wiKS5yZXBsYWNlKC9cXC9cXHUyMDYzKFxcdylcXGIvZywnLyQxJyk7XHJcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9fX18qL2csKHRvZG8pPT5gWyR7dG9kb31dYCkucmVwbGFjZSgvXFxAXFx3K1xcQC9nLCh0b2RvKT0+YFske3RvZG99XWApO1xyXG4gICAgaWYoIWRpY2Npb25hcmlvIHx8IHRydWUpIHJldHVybiB0ZXh0O1xyXG4gICAgLypcclxuICAgIHJldHVybiA8c3Bhbj57cGFydGVzLm1hcCgocGFydGU6c3RyaW5nLCBpOm51bWJlcikgPT4gPHNwYW4gc3R5bGU9e2klMj09MT97dGV4dERlY29yYXRpb246XCJ1bmRlcmxpbmVcIn06e319PiB7cGFydGUrXCIgXCJ9IDwvc3Bhbj4pfTwvc3Bhbj5cclxuICAgICovXHJcbn1cclxuXHJcbmNvbnN0IFZFUl9ET01JTklPID0gZmFsc2U7IC8vIGVsIGVuY3Vlc3RhZG9yIG5vIG5lY2VzaXRhIHZlciBlbCBkb21pbmlvIGVuIGNhZGEgZW5jdWVzdGEgcG9ycXVlIGVsIGRvbWluaW8gZGVwZW5kZSBkZWwgw6FyZWEgeSBzZSBkZWR1Y2UgZGVsIHByaW1lciBkw61naXRvIGRlbCBuw7ptZXJvIGRlIGVuY3Vlc3RhXHJcbi8vIG5vIHBvbmVyIFZFUl9ET01JTklPIGVuIHRydWUsIGNhbWJpYXIgcG9yIHVuYSB2YXJpYWJsZSBxdWUgc2UgZmlqZSBzaSBlbCBETSBlc3TDoSBlbiBtb2RvIHBydWViYSBvIGVuIG1vZG8gXCJkaXNlw7FvIGNvbmNlcHR1YWxcIlxyXG5cclxudmFyIGRlYmVTYWx0YXI6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKT0+e1xyXG4gICAgLypcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2OktleWJvYXJkRXZlbnQpPT57XHJcbiAgICAgICAgZGViZVNhbHRhciA9IGV2LmtleSA9PSAnRW50ZXInIHx8IGV2LmtleUNvZGUgPT0gMTM7XHJcbiAgICB9KVxyXG4gICAgKi9cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57XHJcbiAgICAgICAgZGViZVNhbHRhciA9IGZhbHNlO1xyXG4gICAgfSlcclxufSlcclxuXHJcbi8vIC8qXHJcblxyXG50eXBlIENvbW1vbkF0dHJpYnV0ZXMgPSB7Y2xhc3NOYW1lPzpzdHJpbmcsc3R5bGU/OkNTU1Byb3BlcnRpZXMsaWQ/OnN0cmluZywgdGFiSW5kZXg/Om51bWJlcn0gLy8gQ1NTUHJvcGVydGllc1xyXG50eXBlIENvbG9yVmFsdWVzID0gJ3ByaW1hcnknfCdzZWNvbmRhcnknfCdkZWZhdWx0J3wnaW5oZXJpdCdcclxuXHJcbmV4cG9ydCB0eXBlIExpYnJlRGVzcGxpZWd1ZVR5cGUgPSAocHJvcHM6e1xyXG4gICAga2V5OnN0cmluZ1xyXG4gICAgY2FzaWxsZXJvOkxpYnJlXHJcbiAgICBmb3JtdWxhcmlvOkZvcm11bGFyaW9cclxuICAgIGZvclBrOkZvclBrXHJcbn0pPT5KU1guRWxlbWVudDtcclxuXHJcbnZhciBMaWJyZURlc3BsaWVndWU6IExpYnJlRGVzcGxpZWd1ZVR5cGVcclxuXHJcbmNvbnN0IEJ1dHRvbiA9ICh7dmFyaWFudCwgb25DbGljaywgZGlzYWJsZWQsIGNoaWxkcmVuLCBjbGFzc05hbWUsIGNvbG9yLCBzaXplLCBcclxuICAgICAgICBkaXNhYmxlRWxldmF0aW9uLCBkaXNhYmxlRm9jdXNSaXBwbGUsIGRpc2FibGVSaXBwbGUsIFxyXG4gICAgICAgIC4uLm90aGVyXHJcbiAgICB9OntcclxuICAgIHZhcmlhbnQ/OnN0cmluZyxcclxuICAgIGNvbG9yPzpDb2xvclZhbHVlcyxcclxuICAgIG9uQ2xpY2s/OlJlYWN0Lk1vdXNlRXZlbnRIYW5kbGVyPEhUTUxCdXR0b25FbGVtZW50PiwgLy8gIChldmVudDpNb3VzZUV2ZW50LyogPEhUTUxCdXR0b25FbGVtZW50LCBNb3VzZUV2ZW50PiovKT0+dm9pZCxcclxuICAgIGRpc2FibGVkPzpib29sZWFuXHJcbiAgICBjaGlsZHJlbjphbnksXHJcbiAgICBjbGFzc05hbWU/OnN0cmluZyxcclxuICAgIHNpemU/OidzbWFsbCcsXHJcbiAgICBkaXNhYmxlRWxldmF0aW9uPzphbnksIGRpc2FibGVGb2N1c1JpcHBsZT86YW55LCBkaXNhYmxlUmlwcGxlPzphbnksXHJcbn0gJiBDb21tb25BdHRyaWJ1dGVzKT0+PGJ1dHRvbiBcclxuICAgIHsuLi5vdGhlcn1cclxuICAgIGNsYXNzTmFtZT17YGJ0biBidG4ke3ZhcmlhbnQ9PSdjb250YWluZWQnPycnOictJysodmFyaWFudD09J291dGxpbmVkJz8nb3V0bGluZSc6dmFyaWFudCl9LSR7KGNvbG9yPT0nZGVmYXVsdCcgfHwgY29sb3I9PSdpbmhlcml0Jz8nc2Vjb25kYXJ5Jzpjb2xvcj09J3NlY29uZGFyeSc/J2Rhbmdlcic6Y29sb3IpfHwnc2Vjb25kYXJ5J30gJHtjbGFzc05hbWV8fCcnfSAke3NpemU9PSdzbWFsbCc/J2J0bi1zbSc6Jyd9YH1cclxuICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgIG9uQ2xpY2s9e29uQ2xpY2t9XHJcbj57Y2hpbGRyZW59PC9idXR0b24+O1xyXG5cclxuY29uc3QgQnV0dG9uMiA9ICh7dmFyaWFudCwgb25DbGljaywgZGlzYWJsZWQsIGNoaWxkcmVuLCBjbGFzc05hbWUsIGNvbG9yLCBzaXplLCAuLi5vdGhlcn06e1xyXG4gICAgdmFyaWFudD86c3RyaW5nLFxyXG4gICAgY29sb3I/OkNvbG9yVmFsdWVzLFxyXG4gICAgb25DbGljaz86KCk9PnZvaWQsXHJcbiAgICBkaXNhYmxlZD86Ym9vbGVhblxyXG4gICAgY2hpbGRyZW46YW55LFxyXG4gICAgY2xhc3NOYW1lPzpzdHJpbmcsXHJcbiAgICBzaXplPzonc21hbGwnLFxyXG4gICAgJGF0dHJzPzp7fVxyXG59ICYgQ29tbW9uQXR0cmlidXRlcyk9Pmh0bWwuYnV0dG9uKHtcclxuICAgIC4uLm90aGVyLFxyXG4gICAgY2xhc3M6IGBidG4gYnRuJHt2YXJpYW50PT0nY29udGFpbmVkJz8nJzonLScrKHZhcmlhbnQ9PSdvdXRsaW5lZCc/J291dGxpbmUnOnZhcmlhbnQpfS0keyhjb2xvcj09J2RlZmF1bHQnIHx8IGNvbG9yPT0naW5oZXJpdCc/J3NlY29uZGFyeSc6Y29sb3I9PSdzZWNvbmRhcnknPydkYW5nZXInOmNvbG9yKXx8J3NlY29uZGFyeSd9ICR7Y2xhc3NOYW1lfHwnJ30gJHtzaXplPT0nc21hbGwnPydidG4tc20nOicnfWAsXHJcbiAgICBkaXNhYmxlZCxcclxuICAgICRvbjp7Y2xpY2s6b25DbGlja31cclxufSwgY2hpbGRyZW4pO1xyXG5cclxuXHJcbmNvbnN0IFRleHRGaWVsZCA9IChwcm9wczp7XHJcbiAgICBpZDpzdHJpbmcsXHJcbiAgICBkaXNhYmxlZD86Ym9vbGVhbixcclxuICAgIGNsYXNzTmFtZT86c3RyaW5nLFxyXG4gICAgYXV0b0ZvY3VzPzpib29sZWFuLFxyXG4gICAgZnVsbFdpZHRoOmJvb2xlYW5cclxuICAgIGlucHV0UHJvcHM/OmFueSxcclxuICAgIHZhbHVlPzphbnksXHJcbiAgICB0eXBlOmFueSxcclxuICAgIGxhYmVsPzpzdHJpbmcsXHJcbiAgICBlcnJvcj86Ym9vbGVhbixcclxuICAgIGhlbHBlclRleHQ/OnN0cmluZyxcclxuICAgIG11bHRpbGluZT86Ym9vbGVhbixcclxuICAgIG9uQ2hhbmdlPzooZXZlbnQ6YW55KT0+dm9pZCxcclxuICAgIG9uRm9jdXM/OihldmVudDphbnkpPT52b2lkLFxyXG4gICAgb25CbHVyPzooZXZlbnQ6YW55LCB2YWxvcjphbnkpPT52b2lkLFxyXG4gICAgLy8gb25LZXlEb3duPzooZXZlbnQ6S2V5Ym9hcmRFdmVudCk9PnZvaWQgLy8gS2V5Ym9hcmRFdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD5cclxuICAgIG9uS2V5RG93bj86UmVhY3QuS2V5Ym9hcmRFdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD5cclxufSk9PjxpbnB1dFxyXG4gICAgaWQ9e3Byb3BzLmlkfVxyXG4gICAgZGlzYWJsZWQ9e3Byb3BzLmRpc2FibGVkfVxyXG4gICAgY2xhc3NOYW1lPXtwcm9wcy5jbGFzc05hbWV9XHJcbiAgICBhdXRvRm9jdXM9e3Byb3BzLmF1dG9Gb2N1c31cclxuICAgIHZhbHVlPXtwcm9wcy52YWx1ZX0gXHJcbiAgICB0eXBlPXtwcm9wcy50eXBlfVxyXG4gICAgb25DaGFuZ2U9e3Byb3BzLm9uQ2hhbmdlfVxyXG4gICAgb25Gb2N1cz17cHJvcHMub25Gb2N1c31cclxuICAgIG9uQmx1cj17KGV2dCk9PnByb3BzLm9uQmx1cj8uKGV2dCwgZXZ0LnRhcmdldC52YWx1ZSl9XHJcbiAgICBvbktleURvd249e3Byb3BzLm9uS2V5RG93bn1cclxuICAgIHBsYWNlaG9sZGVyPXtwcm9wcy5sYWJlbH1cclxuLz47XHJcblxyXG5jb25zdCBUeXBvZ3JhcGh5ID0gKHtjaGlsZHJlbiwgLi4ub3RoZXJzfTp7XHJcbiAgICBjaGlsZHJlbjphbnksXHJcbiAgICBjb21wb25lbnQ/OnN0cmluZ1xyXG4gICAgdmFyaWFudD86J2g2J1xyXG59JkNvbW1vbkF0dHJpYnV0ZXMpPT5SZWFjdC5jcmVhdGVFbGVtZW50KG90aGVycy52YXJpYW50fHxvdGhlcnMuY29tcG9uZW50fHwnZGl2JyxvdGhlcnMsY2hpbGRyZW4pO1xyXG5cclxuZnVuY3Rpb24gR3JpZChwcm9wczp7XHJcbiAgICBjb250YWluZXI/OmJvb2xlYW4sXHJcbiAgICBzcGFjaW5nPzpudW1iZXIsXHJcbiAgICBpdGVtPzpib29sZWFuLFxyXG4gICAgd3JhcD86J3dyYXAnfCdub3dyYXAnLFxyXG4gICAgZGlyZWN0aW9uPzoncm93J3wnY29sdW1uJ1xyXG4gICAgYWxpZ25JdGVtcz86J3N0cmV0Y2gnIHwgJ2ZsZXgtc3RhcnQnIHwgJ2ZsZXgtZW5kJyB8ICdjZW50ZXInIHwgJ2Jhc2VsaW5lJyxcclxuICAgIGNoaWxkcmVuOmFueSxcclxuICAgIHhzPzpudW1iZXIsXHJcbiAgICBzbT86bnVtYmVyLFxyXG59JkNvbW1vbkF0dHJpYnV0ZXMpe1xyXG4gICAgdmFyIHtjb250YWluZXIsIGl0ZW0sIHdyYXAsIGRpcmVjdGlvbiwgYWxpZ25JdGVtcywgY2hpbGRyZW4sIGNsYXNzTmFtZSwgeHMsIHNtLCBzcGFjaW5nLCAuLi5vdGhlcn0gPSBwcm9wcztcclxuICAgIHJldHVybiA8ZGl2XHJcbiAgICB7Li4ub3RoZXJ9XHJcbiAgICBjbGFzc05hbWU9e2Ake2NsYXNzTmFtZXx8Jyd9ICR7eHMhPW51bGw/J2dyaWQteHMtJyt4czonJ30gJHtzbSE9bnVsbD8nZ3JpZC1zbS0nK3NtOicnfWB9XHJcbiAgICBzdHlsZT17Y29udGFpbmVyP3tcclxuICAgICAgICBkaXNwbGF5OidmbGV4JyxcclxuICAgICAgICBmbGV4V3JhcDp3cmFwLFxyXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ZGlyZWN0aW9uLFxyXG4gICAgICAgIGFsaWduSXRlbXM6YWxpZ25JdGVtcyxcclxuICAgICAgICBtYXJnaW46c3BhY2luZyE9bnVsbD9zcGFjaW5nKjgrJ3B4Jzp1bmRlZmluZWRcclxuICAgIH06e1xyXG4gICAgfX1cclxuPntjaGlsZHJlbn08L2Rpdj5cclxufVxyXG5cclxudmFyIHAxMiA9ICdwMTInIGFzIElkVmFyaWFibGU7XHJcbnZhciBzcDIgPSAnc3AyJyBhcyBJZFZhcmlhYmxlO1xyXG52YXIgc3AzID0gJ3NwMycgYXMgSWRWYXJpYWJsZTtcclxudmFyIHNwNCA9ICdzcDQnIGFzIElkVmFyaWFibGU7XHJcbnZhciBzcDUgPSAnc3A1JyBhcyBJZFZhcmlhYmxlO1xyXG5cclxudmFyIGRpY2Npb25hcmlvID0ge31cclxuXHJcbi8qXHJcbi8vIGNvbnN0IHRha2VFbGVtZW50T3JEZWZhdWx0PEssIFQgZXh0ZW5kcyBbSyBpbl0sIEQ+KClcclxuZnVuY3Rpb24gaXNJbjxWLCBUPihrOmtleW9mIFQsIG9iamVjdDpUKTogb2JqZWN0W2tdIGlzIFZ7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbiovXHJcbmZ1bmN0aW9uIHRha2VFbGVtZW50T3JEZWZhdWx0PFYsSyBleHRlbmRzIHN0cmluZyxLTyBleHRlbmRzIHN0cmluZz4oazpLLCBvYmplY3Q6e1trIGluIEtPXTpWfSwgZGVmYXVsdFZhbHVlOlYpOlZ7XHJcbiAgICByZXR1cm4gayBpbiBvYmplY3QgPyBcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBvciBhbGd1bmEgcmF6w7NuIFRTIG5vIHF1aWVyZSBlbnRlbmRlciBxdWUgc2kgayBlc3TDoSBlbiBvYmplY3QsIG9iamVjdFtrXSBleGlzdGVcclxuICAgICAgICBvYmplY3Rba10gXHJcbiAgICA6IGRlZmF1bHRWYWx1ZVxyXG59XHJcblxyXG5mdW5jdGlvbiBEZXNwbGllZ3VlRW5jYWJlemFkbyhwcm9wczp7Y2FzaWxsZXJvOkNhc2lsbGVyb0VuY2FiZXphYmxlLCBsZWVyPzpib29sZWFufSl7XHJcbiAgICBjb25zdCBmb3JQa051bGw9e30gYXMgRm9yUGs7XHJcbiAgICByZXR1cm4gPEVuY2FiZXphZG9EZXNwbGllZ3VlIGNhc2lsbGVybz17cHJvcHMuY2FzaWxsZXJvfSBsZWVyPXtwcm9wcy5sZWVyfSBmb3JQaz17Zm9yUGtOdWxsfS8+O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdWJpckhhc3RhKGVsZW1lbnRvOkhUTUxFbGVtZW50fG51bGwsIGZ1bjooZWxlbWVudG86SFRNTEVsZW1lbnQpPT5ib29sZWFuKTpIVE1MRWxlbWVudHxudWxse1xyXG4gICAgaWYoZWxlbWVudG8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICBpZihmdW4oZWxlbWVudG8pKSByZXR1cm4gZWxlbWVudG87XHJcbiAgICByZXR1cm4gc3ViaXJIYXN0YShlbGVtZW50by5wYXJlbnRFbGVtZW50LCBmdW4pO1xyXG59XHJcblxyXG52YXIgZWxlbWVudG9Db25TZW5uaWFsQm9ycmFyOkhUTUxFbGVtZW50fG51bGwgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gQm90b25Cb3JyYXIoe2lkLCB2YXJpYWJsZSwgZm9yUGssIHZhbG9yT3BjaW9ufTp7aWQ6c3RyaW5nLCB2YXJpYWJsZTpJZFZhcmlhYmxlLCBmb3JQazpGb3JQaywgdmFsb3JPcGNpb24/OmFueX0pe1xyXG4gICAgdmFyIGhhbmRsZUNsaWNrQm9ycmFyPSgpPT57XHJcbiAgICAgICAgZGlzcGF0Y2hCeVBhc3MoYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGEsIHtyZXNwdWVzdGE6bnVsbCwgdmFyaWFibGU6dmFyaWFibGUsIGZvclBrOmZvclBrfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJib3Rvbi1ib3JyYXJcIj5cclxuICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgIGlkPXtpZH1cclxuICAgICAgICAgICAgbWktdmFyaWFibGU9e3ZhcmlhYmxlfVxyXG4gICAgICAgICAgICB2YWxvci1vcGNpb249e3ZhbG9yT3BjaW9ufVxyXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJib3Rvbi1vcGNpb24gYm90b24tb3BjaW9uLWJvcnJhclwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrQm9ycmFyfVxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPElDT04uRGVsZXRlRm9yZXZlci8+XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICA8L2Rpdj5cclxufVxyXG5cclxuZnVuY3Rpb24gU2FsdG9EZXNwbGllZ3VlKHtjYXNpbGxlcm8scHJlZmlqb306e2Nhc2lsbGVybzpQcmVndW50YXxPcGNpb258RmlsdHJvLCBwcmVmaWpvPzpzdHJpbmd9KXtcclxuICAgIHJldHVybiBjYXNpbGxlcm8uc2FsdG8/XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYXNlXCI+XHJcbiAgICAgICAgICAgIHtwcmVmaWpvPzxzcGFuIGNsYXNzTmFtZT1cInByZWZpam9cIj57cHJlZmlqb30gPC9zcGFuPjpudWxsfVxyXG4gICAgICAgICAgICA8SUNPTi5UcmVuZGluZ0ZsYXQgLz48c3Bhbj57Y2FzaWxsZXJvLnNhbHRvfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDpudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIE9wY2lvbkRlc3BsaWVndWUocHJvcHM6e2Nhc2lsbGVybzpPcGNpb24sIHZhbG9yT3BjaW9uOm51bWJlciwgdmFyaWFibGU6SWRWYXJpYWJsZSwgZm9yUGs6Rm9yUGssIGxlZXI6Ym9vbGVhbiwgY29uQm90b25Cb3JyYXI6Ym9vbGVhbn0pe1xyXG4gICAgY29uc3Qge2Nhc2lsbGVyb30gPSBwcm9wcztcclxuICAgIHZhciBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICB2YXIgc2FsdG9BdXRvbWF0aWNvID0gdXNlU2VsZWN0b3IoKHN0YXRlOkNhc29TdGF0ZSk9PnN0YXRlLm9wY2lvbmVzLnNhbHRvQXV0b21hdGljbyk7XHJcbiAgICB2YXIgaGFuZGxlQ2xpY2s6UmVhY3QuTW91c2VFdmVudEhhbmRsZXI8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gYXN5bmMgKGV2ZW50KT0+e1xyXG4gICAgICAgIHZhciBjb250YWluZXIgPSBzdWJpckhhc3RhKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgZWxlbWVudG89PmVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygncHJlZ3VudGEnKSB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ211bHRpcGxlJykpIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpITtcclxuICAgICAgICB2YXIgdGllbmUgPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdlc3RveS1ib3JyYW5kbycpO1xyXG4gICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2VzdG95LWJvcnJhbmRvJywnTk8nKTtcclxuICAgICAgICBpZihlbGVtZW50b0NvblNlbm5pYWxCb3JyYXIpe1xyXG4gICAgICAgICAgICBlbGVtZW50b0NvblNlbm5pYWxCb3JyYXIuc2V0QXR0cmlidXRlKCdlc3RveS1ib3JyYW5kbycsJ05PJyk7XHJcbiAgICAgICAgICAgIGVsZW1lbnRvQ29uU2VubmlhbEJvcnJhciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB7cmVjZW50TW9kaWZpZWQsIHNpZ3VpZW50ZVZhcmlhYmxlfSA9IGRpc3BhdGNoQnlQYXNzKGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhLCB7cmVzcHVlc3RhOnByb3BzLnZhbG9yT3BjaW9uLCB2YXJpYWJsZTpwcm9wcy52YXJpYWJsZSwgZm9yUGs6cHJvcHMuZm9yUGt9KTtcclxuICAgICAgICBpZighcmVjZW50TW9kaWZpZWQpe1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdlc3RveS1ib3JyYW5kbycsdGllbmU9PSdTSSc/J05PJzonU0knKTtcclxuICAgICAgICAgICAgaWYodGllbmUhPSdTSScpe1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudG9Db25TZW5uaWFsQm9ycmFyPWNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZihzaWd1aWVudGVWYXJpYWJsZSAmJiBzYWx0b0F1dG9tYXRpY28pe1xyXG4gICAgICAgICAgICAgICAgdmFyIGJvdG9uU3R5bGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uc3R5bGU7XHJcbiAgICAgICAgICAgICAgICBpZihib3RvblN0eWxlKSBib3RvblN0eWxlLmNvbG9yID0gJ2dyZWVuJztcclxuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMCk7XHJcbiAgICAgICAgICAgICAgICBpZihib3RvblN0eWxlKSBib3RvblN0eWxlLmNvbG9yID0gJ2JsdWUnO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcclxuICAgICAgICAgICAgICAgIGlmKGJvdG9uU3R5bGUpIGJvdG9uU3R5bGUuY29sb3IgPSAnZ3JlZW4nO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcclxuICAgICAgICAgICAgICAgIGlmKGJvdG9uU3R5bGUpIGJvdG9uU3R5bGUuY29sb3IgPSAnJztcclxuICAgICAgICAgICAgICAgIGVuZm9jYXJFbGVtZW50b0RlVmFyaWFibGUoc2lndWllbnRlVmFyaWFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiA8R3JpZCBjbGFzc05hbWU9XCJvcGNpb25cIj4gXHJcbiAgICAgICAge3Byb3BzLmNvbkJvdG9uQm9ycmFyPzxCb3RvbkJvcnJhclxyXG4gICAgICAgICAgICBpZD17YG9wY2lvbi12YXItJHtwcm9wcy52YXJpYWJsZX0tJHtwcm9wcy52YWxvck9wY2lvbn0tYm9ycmFyYH1cclxuICAgICAgICAgICAgZm9yUGs9e3Byb3BzLmZvclBrfVxyXG4gICAgICAgICAgICB2YXJpYWJsZT17cHJvcHMudmFyaWFibGV9XHJcbiAgICAgICAgICAgIHZhbG9yT3BjaW9uPXtwcm9wcy52YWxvck9wY2lvbn1cclxuICAgICAgICAgICAgLz46bnVsbH1cclxuICAgICAgICA8QnV0dG9uIFxyXG4gICAgICAgICAgICBpZD17YG9wY2lvbi12YXItJHtwcm9wcy52YXJpYWJsZX0tJHtwcm9wcy52YWxvck9wY2lvbn1gfVxyXG4gICAgICAgICAgICBtaS12YXJpYWJsZT17cHJvcHMudmFyaWFibGV9XHJcbiAgICAgICAgICAgIHZhbG9yLW9wY2lvbj17cHJvcHMudmFsb3JPcGNpb259XHJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvdG9uLW9wY2lvbiBib3Rvbi1vcGNpb24tc2VsZWNjaW9uXCJcclxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XHJcbiAgICAgICAgICAgIHRhYkluZGV4PXstMX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxHcmlkIGNvbnRhaW5lciB3cmFwPVwibm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICA8R3JpZCBjbGFzc05hbWU9XCJpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtjYXNpbGxlcm8udmVyX2lkIHx8IGNhc2lsbGVyby5jYXNpbGxlcm99XHJcbiAgICAgICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgICAgICA8R3JpZCBjbGFzc05hbWU9XCJvcGNpb24tdGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeSBkZWJlLWxlZXI9e2Nhc2lsbGVyby5sZWVyPydTSSc6Y2FzaWxsZXJvLmxlZXI9PT1mYWxzZT8nTk8nOnByb3BzLmxlZXI/J1NJJzonTk8nfT57YnJlYWtlYWJsZVRleHQoY2FzaWxsZXJvLm5vbWJyZSl9PC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICAgICAgICAgIHtjYXNpbGxlcm8uYWNsYXJhY2lvbj9cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgY2xhc3NOYW1lPSdhY2xhcmFjaW9uJz57YnJlYWtlYWJsZVRleHQoY2FzaWxsZXJvLmFjbGFyYWNpb24pfTwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgICAgICAgICA6bnVsbH1cclxuICAgICAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgIDxTYWx0b0Rlc3BsaWVndWUgY2FzaWxsZXJvPXtjYXNpbGxlcm99Lz5cclxuICAgIDwvR3JpZD5cclxufVxyXG5pbnRlcmZhY2UgSWNhc2lsbGVyb0Nvbk9wY2lvbmVze1xyXG4gICAgdmFyX25hbWU6SWRWYXJpYWJsZSxcclxuICAgIGRlc3BsaWVndWVDb250ZW5pZG86J3ZlcnRpY2FsJ3wnaG9yaXpvbnRhbCd8bnVsbCxcclxuICAgIGNhc2lsbGVyb3M6T3BjaW9uW11cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIFNpTm9EZXNwbGllZ3VlKHByb3BzOntjYXNpbGxlcm9Db25PcGNpb25lczpJY2FzaWxsZXJvQ29uT3BjaW9uZXMsIGZvclBrOkZvclBrLCBkZXNwbGllZ3VlQ29udGVuaWRvOid2ZXJ0aWNhbCd8J2hvcml6b250YWwnfSl7XHJcbiAgICByZXR1cm4gPE9wY2lvbmVzRGVzcGxpZWd1ZSBcclxuICAgICAgICBjYXNpbGxlcm9Db25PcGNpb25lcz17cHJvcHMuY2FzaWxsZXJvQ29uT3BjaW9uZXN9IFxyXG4gICAgICAgIGZvclBrPXtwcm9wcy5mb3JQa30gXHJcbiAgICAgICAgbGVlcj17ZmFsc2V9XHJcbiAgICAgICAgZGVzcGxpZWd1ZUNvbnRlbmlkbz17cHJvcHMuZGVzcGxpZWd1ZUNvbnRlbmlkb31cclxuICAgIC8+XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlZ2lzdHJhZG9yRGVWYXJpYWJsZShwcmVndW50YTpQcmVndW50YXxPcGNpb25NdWx0aXBsZXxDb25qdW50b1ByZWd1bnRhcyl7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIHJlc3B1ZXN0YXM6UmVzcHVlc3RhcywgZmVlZGJhY2tGb3JtOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiwgZWxlbWVudG86SFRNTERpdkVsZW1lbnRcclxuICAgICk9PntcclxuICAgICAgICB2YXIgdmFsb3JBY3R1YWwgPSBwcmVndW50YS52YXJfbmFtZSA9PSBudWxsID8gbnVsbCA6IHJlc3B1ZXN0YXNbcHJlZ3VudGEudmFyX25hbWVdO1xyXG4gICAgICAgIHZhciBmZWVkYmFja1JvdyA9IGZlZWRiYWNrRm9ybS5mZWVkYmFjaztcclxuICAgICAgICB2YXIgZmVlZGJhY2tWYXIgPSBwcmVndW50YS52YXJfbmFtZSA9PSBudWxsID8gbnVsbCA6IGZlZWRiYWNrUm93W3ByZWd1bnRhLnZhcl9uYW1lXTtcclxuICAgICAgICB2YXIgdGllbmVWYWxvcj12YWxvckFjdHVhbCE9bnVsbCAmJiBmZWVkYmFja1ZhciE9bnVsbD8oZmVlZGJhY2tWYXIuY29uUHJvYmxlbWE/J2ludmFsaWRvJzondmFsaWRvJyk6J05PJztcclxuICAgICAgICB2YXIgZXN0YWRvOkVzdGFkb1ZhcmlhYmxlOyBcclxuICAgICAgICBpZihwcmVndW50YS50aXBvdmFyKXtcclxuICAgICAgICAgICAgZXN0YWRvPWZlZWRiYWNrVmFyPy5lc3RhZG8hO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB2YXIgZmVlZGJhY2tNdWx0aSA9IHByZWd1bnRhLmNhc2lsbGVyb3MuZmlsdGVyKGM9PmMudmFyX25hbWUhPW51bGwpLnJlZHVjZSgocHYsIG9tKT0+e1xyXG4gICAgICAgICAgICAgICAgdmFyIGZiPWZlZWRiYWNrUm93Py5bb20udmFyX25hbWUhXSFcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGllbmVBY3R1YWw6IHB2LnRpZW5lQWN0dWFsIHx8IGZiLmVzdGFkbz09J2FjdHVhbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZXN0YVNhbHRlYWRhOiBwdi5lc3RhU2FsdGVhZGEgJiYgKGZiLmVzdGFkbz09J3NhbHRlYWRhJyB8fCBmYi5lc3RhZG89PSdmdWVyYV9kZV9mbHVqb19wb3Jfc2FsdG8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCB7dGllbmVBY3R1YWw6ZmFsc2UsIGVzdGFTYWx0ZWFkYTp0cnVlfSk7XHJcbiAgICAgICAgICAgIGVzdGFkbz1mZWVkYmFja011bHRpLnRpZW5lQWN0dWFsPydhY3R1YWwnOmZlZWRiYWNrTXVsdGkuZXN0YVNhbHRlYWRhPydzYWx0ZWFkYSc6J3RvZGF2aWFfbm8nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEF0dHJEaXN0aW50byhlbGVtZW50bywgJ251ZXN0cm8tdmFsaWRhdG9yJywgZXN0YWRvKTtcclxuICAgICAgICBzZXRBdHRyRGlzdGludG8oZWxlbWVudG8sICd0aWVuZS12YWxvcicsIHRpZW5lVmFsb3IpO1xyXG4gICAgICAgIHNldEF0dHJEaXN0aW50byhlbGVtZW50bywgJ2VzdGEtaW5oYWJpbGl0YWRhJywgZmVlZGJhY2tWYXI/LmluaGFiaWxpdGFkYT8nU0knOidOTycpO1xyXG4gICAgICAgIGlmKHByZWd1bnRhLnZhcl9uYW1lKXtcclxuICAgICAgICAgICAgdmFyIG9wY2lvbmVzOkhUTUxCdXR0b25FbGVtZW50W10gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbGVtZW50by5xdWVyeVNlbGVjdG9yQWxsKGAuYm90b24tb3BjaW9uW21pLXZhcmlhYmxlPVwiJHtwcmVndW50YS52YXJfbmFtZX1cIl1gKSwwKTtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnRvT3BjaW9uOkhUTUxCdXR0b25FbGVtZW50O1xyXG4gICAgICAgICAgICBmb3IoZWxlbWVudG9PcGNpb24gb2Ygb3BjaW9uZXMpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbG9yT3BjaW9uID0gZWxlbWVudG9PcGNpb24uZ2V0QXR0cmlidXRlKCd2YWxvci1vcGNpb24nKTtcclxuICAgICAgICAgICAgICAgIHNldEF0dHJEaXN0aW50byhlbGVtZW50b09wY2lvbiwgJ29wY2lvbi1zZWxlY2Npb25hZGEnLCB2YWxvck9wY2lvbiA9PSB2YWxvckFjdHVhbCA/IFwiU0lcIjogXCJOT1wiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50b3NJbnB1dDpIVE1MSW5wdXRFbGVtZW50W10gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbGVtZW50by5xdWVyeVNlbGVjdG9yQWxsKCcudmFyaWFibGUnKSk7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50b0lucHV0OkhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGZvcihlbGVtZW50b0lucHV0IG9mIGVsZW1lbnRvc0lucHV0KXtcclxuICAgICAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZWxlbWVudG9JbnB1dCwgJ3ZhbHVlJywgdmFsb3JBY3R1YWwgPT0gbnVsbCA/ICcnIDogdmFsb3JBY3R1YWwudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGJvdG9uTnNOYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibnNuYy1wcmVndW50YS1cIitwcmVndW50YS52YXJfbmFtZSkhO1xyXG4gICAgICAgICAgICBzZXRBdHRyRGlzdGludG8oYm90b25Oc05jLCAnb3BjaW9uLXNlbGVjY2lvbmFkYScsIHZhbG9yQWN0dWFsID09IChwcmVndW50YS52YWxvcl9uc19uYyA/PyAtOSkgPyBcIlNJXCIgOiBcIk5PXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBPcGNpb25NdWx0aXBsZURlc3BsaWVndWUocHJvcHM6e29wY2lvbk06T3BjaW9uTXVsdGlwbGUsIGZvclBrOkZvclBrfSl7XHJcbiAgICBjb25zdCB7b3BjaW9uTX0gPSBwcm9wcztcclxuICAgIHZhciBpZCA9IGBvcGNpb25NLSR7b3BjaW9uTS5pZF9jYXNpbGxlcm99YDtcclxuICAgIHJlZ2lzdHJhckVsZW1lbnRvKHtcclxuICAgICAgICBpZCwgXHJcbiAgICAgICAgZGlyZWN0OnRydWUsIFxyXG4gICAgICAgIGZ1bjogcmVnaXN0cmFkb3JEZVZhcmlhYmxlKG9wY2lvbk0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIDxEZXNwbGVnYXJDYXNpbGxlcm8gXHJcbiAgICAgICAgaWQ9e2lkfVxyXG4gICAgICAgIGNhc2lsbGVybz17b3BjaW9uTX1cclxuICAgICAgICBkZXNwbGllZ3VlRW5jYWJlemFkbz0nbGF0ZXJhbCdcclxuICAgID5cclxuICAgICAgICA8RW5jYWJlemFkb0Rlc3BsaWVndWUgXHJcbiAgICAgICAgICAgIGNhc2lsbGVybz17b3BjaW9uTX0gXHJcbiAgICAgICAgICAgIHZlcklkR3Vpb249e3RydWV9IFxyXG4gICAgICAgICAgICBsZWVyPXtvcGNpb25NLmxlZXIhPT1mYWxzZX0gXHJcbiAgICAgICAgICAgIGZvclBrPXtwcm9wcy5mb3JQa31cclxuICAgICAgICAvPlxyXG4gICAgICAgIDxTaU5vRGVzcGxpZWd1ZSBcclxuICAgICAgICAgICAgY2FzaWxsZXJvQ29uT3BjaW9uZXM9e29wY2lvbk19IFxyXG4gICAgICAgICAgICBmb3JQaz17cHJvcHMuZm9yUGt9XHJcbiAgICAgICAgICAgIGRlc3BsaWVndWVDb250ZW5pZG89e3Byb3BzLm9wY2lvbk0uZGVzcGxpZWd1ZUNvbnRlbmlkbz8/J2hvcml6b250YWwnfVxyXG4gICAgICAgIC8+XHJcbiAgICA8L0Rlc3BsZWdhckNhc2lsbGVybz5cclxufVxyXG5cclxudHlwZSBDYXNpbGxlcm9FbmNhYmV6YWJsZSA9IEZvcm11bGFyaW98QmxvcXVlfEZpbHRyb3xDb25qdW50b1ByZWd1bnRhc3xQcmVndW50YXxPcGNpb25NdWx0aXBsZXxQcmVndW50YVNpbXBsZXxDb25zaXN0ZW5jaWF8VGV4dG9cclxuXHJcbmZ1bmN0aW9uIEVuY2FiZXphZG9EZXNwbGllZ3VlKHByb3BzOntjYXNpbGxlcm86Q2FzaWxsZXJvRW5jYWJlemFibGUsIHZlcklkR3Vpb24/OmJvb2xlYW4sIGxlZXI/OmJvb2xlYW4sIGZvclBrOkZvclBrfSl7XHJcbiAgICB2YXIge2Nhc2lsbGVybywgZm9yUGt9ID0gcHJvcHM7XHJcbiAgICB2YXIgY29uQ2FtcG9PcGNpb25lcyA9IHVzZVNlbGVjdG9yKChzdGF0ZTpDYXNvU3RhdGUpPT5zdGF0ZS5vcGNpb25lcy5jb25DYW1wb09wY2lvbmVzKVxyXG4gICAgdmFyIGhhbmRsZUNsaWNrQm9ycmFyPSgpPT57XHJcbiAgICAgICAgZGlzcGF0Y2hCeVBhc3MoYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGEsIHtyZXNwdWVzdGE6bnVsbCwgdmFyaWFibGU6Y2FzaWxsZXJvLnZhcl9uYW1lIGFzIElkVmFyaWFibGUsIGZvclBrOmZvclBrfSlcclxuICAgIH07XHJcbiAgICB2YXIgdmVyX2lkID0gY2FzaWxsZXJvLnZlcl9pZCA/PyBjYXNpbGxlcm8uY2FzaWxsZXJvO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBubyBlc3TDoSBlbiB0b2RvcyBsb3MgY2FzaWxsZXJvcyBwZXJvIGFjw6EgcGFyYSBlbCBkZXNwbGllZ3VlIGRlIG1ldGFkYXRvcyBubyBpbXBvcnRhXHJcbiAgICB2YXIgY2FsY3VsYWRhID0gY2FzaWxsZXJvLmNhbGN1bGFkYTtcclxuICAgIHZhciBpZCA9IGBpZC1kaXYtJHtjYXNpbGxlcm8udmFyX25hbWV8fGNhc2lsbGVyby5jYXNpbGxlcm99YDtcclxuICAgIHZhciBpZEFjY2lvbmVzID0gXCJhY2Npb25lcy1cIitpZDtcclxuICAgIHJldHVybiA8ZGl2IFxyXG4gICAgICAgIGNsYXNzTmFtZT1cImVuY2FiZXphZG9cIiBcclxuICAgICAgICBkZWJlLWxlZXI9e3Byb3BzLmxlZXI/J1NJJzonTk8nfSBcclxuICAgID5cclxuICAgICAgICA8ZGl2IGlkPXtpZH0gY2xhc3NOYW1lPVwiaWQtZGl2XCIgdGl0bGU9e2Ake2Nhc2lsbGVyby5jYXNpbGxlcm99IC0gJHtjYXNpbGxlcm8udmFyX25hbWV9YH1cclxuICAgICAgICAgICAgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZEFjY2lvbmVzKTtcclxuICAgICAgICAgICAgICAgIGRpdiEuc2V0QXR0cmlidXRlKFwiYWNjaW9uLXZpc2libGVcIiwgKDEtTnVtYmVyKGRpdiEuZ2V0QXR0cmlidXRlKFwiYWNjaW9uLXZpc2libGVcIikpKS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8uIFZlciBxdcOpIGhhY2Vtb3MgY3VhbmRvIHNlIHRvY2EgZWwgSUQgZGUgbGEgcHJlZ3V0bmFcclxuICAgICAgICAgICAgICAgIGRpc3BhdGNoQnlQYXNzKGFjY2lvbl9pZF9wcmVndW50YSwge3ByZWd1bnRhOiBjYXNpbGxlcm8uY2FzaWxsZXJvIGFzIElkUHJlZ3VudGEsIGZvclBrfSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImlkXCI+XHJcbiAgICAgICAgICAgICAgICB7dmVyX2lkfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgeyhjYXNpbGxlcm8udGlwb3Zhcj09XCJzaV9ub1wifHxjYXNpbGxlcm8udGlwb3Zhcj09XCJvcGNpb25lc1wiKT88Q2FtcG8gZGlzYWJsZWQ9e2ZhbHNlfSBwcmVndW50YT17Y2FzaWxsZXJvfSBmb3JQaz17Zm9yUGt9IG1pbmk9e3RydWV9IGhpZGRlbj17IWNvbkNhbXBvT3BjaW9uZXMgJiYgJ3F1aXRhcid9Lz46bnVsbH1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY2Npb25lcy1wcmVndW50YVwiIGlkPXtpZEFjY2lvbmVzfSBhY2Npb24tdmlzaWJsZT1cIjBcIj5cclxuICAgICAgICAgICAgICAgIHtjYXNpbGxlcm8udmFyX25hbWU/PGRpdj48QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9e1wiYm9ycmFyLXByZWd1bnRhLVwiK2Nhc2lsbGVyby52YXJfbmFtZX1cclxuICAgICAgICAgICAgICAgICAgICBtaS12YXJpYWJsZT17Y2FzaWxsZXJvLnZhcl9uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm90b24tcHJlZ3VudGEtYm9ycmFyXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja0JvcnJhcn1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5EZWxldGVGb3JldmVyLz5cclxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPjwvZGl2PjpudWxsfVxyXG4gICAgICAgICAgICAgICAge2Nhc2lsbGVyby52YXJfbmFtZT8obnNfbmM9PjxkaXY+PEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGlkPXtcIm5zbmMtcHJlZ3VudGEtXCIrY2FzaWxsZXJvLnZhcl9uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgIG1pLXZhcmlhYmxlPXtjYXNpbGxlcm8udmFyX25hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3Rvbi1wcmVndW50YS1uc25jXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEJ5UGFzcyhhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YSwge3Jlc3B1ZXN0YTpuc19uYywgdmFyaWFibGU6Y2FzaWxsZXJvLnZhcl9uYW1lIGFzIElkVmFyaWFibGUsIGZvclBrOmZvclBrfSlcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIE5TL05DXHJcbiAgICAgICAgICAgICAgICA8L0J1dHRvbj48L2Rpdj4pKGNhc2lsbGVyby52YWxvcl9uc19uYz8/LTkpOm51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibm9tYnJlLWRpdlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm5vbWJyZVwiPnticmVha2VhYmxlVGV4dChjYXNpbGxlcm8ubm9tYnJlKX08L2Rpdj5cclxuICAgICAgICAgICAge2Nhc2lsbGVyby5hY2xhcmFjaW9uP1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY2xhcmFjaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2Nhc2lsbGVyby5zYWx0byAmJiBjYXNpbGxlcm8udGlwb2M9PSdGSUxUUk8nP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2FsdG9EZXNwbGllZ3VlIGNhc2lsbGVybz17Y2FzaWxsZXJvfSBwcmVmaWpvPXticmVha2VhYmxlVGV4dChjYXNpbGxlcm8uYWNsYXJhY2lvbil9Lz5cclxuICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrZWFibGVUZXh0KGNhc2lsbGVyby5hY2xhcmFjaW9uKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDpudWxsfVxyXG4gICAgICAgICAgICA8ZGl2IGxvcy1tZXRhZGF0b3M9XCJzaVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZWwtbWV0YWRhdG89XCJ2YXJpYWJsZVwiPntjYXNpbGxlcm8udmFyX25hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge2Nhc2lsbGVyby50aXBvdmFyICYmIGNhc2lsbGVyby50aXBvdmFyIT0nb3BjaW9uZXMnICYmIGNhc2lsbGVyby50aXBvdmFyIT0nc2lfbm8nP1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGVsLW1ldGFkYXRvPVwidGlwb3ZhclwiPntjYXNpbGxlcm8udGlwb3Zhcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA6bnVsbH1cclxuICAgICAgICAgICAgICAgIHsgICAvL0B0cy1pZ25vcmUgdW5hIG9wY2nDs24gbcO6bHRpcGxlIG51bmNhIGxvIGEgYSBzZXIsIG5vIHRpZW5lIGVsIGNhbXBvLCBubyBpbXBvcnRhXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzaWxsZXJvLm9wdGF0aXZvPzxzcGFuIGVsLW1ldGFkYXRvPVwib3B0YXRpdmFcIj5vcHRhdGl2YTwvc3Bhbj46bnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAge2NhbGN1bGFkYT88c3BhbiBlbC1tZXRhZGF0bz1cImNhbGN1bGFkYVwiPmNhbGN1bGFkYTwvc3Bhbj46bnVsbH1cclxuICAgICAgICAgICAgICAgIHtjYXNpbGxlcm8uZGVzcGxpZWd1ZU9jdWx0YT88c3BhbiBlbC1tZXRhZGF0bz1cIm9jdWx0YVwiPm9jdWx0YTwvc3Bhbj46bnVsbH1cclxuICAgICAgICAgICAgICAgIHtjYXNpbGxlcm8uZXhwcmVzaW9uX2hhYmlsaXRhcj88c3BhbiBlbC1tZXRhZGF0bz1cImV4cHJlc2lvbl9oYWJpbGl0YXJcIj5oYWJpbGl0YToge2Nhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyfTwvc3Bhbj46bnVsbH1cclxuICAgICAgICAgICAgICAgIHsgICAvL0B0cy1pZ25vcmUgYWx0dW5vcyBjYXNpbGxlcm9zIG5vIHRpZW5lbiBlc3BlY2lhbCwgbm8gaW1wb3J0YSwgZXMgc29sbyBwYXJhIHBvbmVyIGxvcyBtZXRhZGF0b3NcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm8uZXNwZWNpYWw/LmF1dG9pbmc/PHNwYW4gZWwtbWV0YWRhdG89XCJleHByZXNpb25fYXV0b2luZ1wiPmF1dG9pbmc6IHtjYXNpbGxlcm8uZXNwZWNpYWw/LmF1dG9pbmd9PC9zcGFuPjpudWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbn1cclxuXHJcbmZ1bmN0aW9uIERlc3BsZWdhckNvbmZpcm1hckJvcnJhclJlc3B1ZXN0YShwcm9wczp7Zm9yUGs6Rm9yUGssIHZhcmlhYmxlQm9ycmFyOklkVmFyaWFibGV9KXtcclxuICAgIHZhciBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZSghIXByb3BzLnZhcmlhYmxlQm9ycmFyKVxyXG4gICAgdmFyIGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gKCkgPT4ge1xyXG4gICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkNPTkZJUk1BUl9CT1JSQVJfUkVTUFVFU1RBKHtmb3JQazpwcm9wcy5mb3JQaywgdmFyaWFibGU6bnVsbH0pKTtcclxuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8UG9wb3ZlclxyXG4gICAgICAgICAgICBpZD17XCJwb3BvdmVyLWNvbmZpcm1hclwifVxyXG4gICAgICAgICAgICBvcGVuPXtvcGVufVxyXG4gICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cclxuICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luPXt7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAnbGVmdCcsXHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgPiAgIFxyXG4gICAgICAgICAgICA8VHlwb2dyYXBoeT5MYSBwcmVndW50YSB0aWVuZSByZWdpc3RyYWRhIHVuYSByZXNwdWVzdGEgcXVlIG5vIGZ1ZSBkZXRlY3RhZGEgY29tbyBlcnLDs25lYTwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb25maXJtYS1ib3RvbmVzXCI+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIGNvbG9yPVwic2Vjb25kYXJ5XCIgdmFyaWFudD1cIm91dGxpbmVkXCIgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgICAgICBpZihwcm9wcy52YXJpYWJsZUJvcnJhcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoQnlQYXNzKGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhLCB7Zm9yUGs6cHJvcHMuZm9yUGssIHZhcmlhYmxlOnByb3BzLnZhcmlhYmxlQm9ycmFyLCByZXNwdWVzdGE6bnVsbH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9fT5ib3JyYXIgcmVzcHVlc3RhPC9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIG9uQ2xpY2s9e2hhbmRsZUNsb3NlfT52b2x2ZXIgc2luIGJvcnJhcjwvQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L1BvcG92ZXI+O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhck51ZXN0cmFMb25naXR1ZChsb25naXR1ZDpzdHJpbmcgfG51bGwpe1xyXG4gICAgcmV0dXJuIGxvbmdpdHVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmZvY2FyRWxlbWVudG9EZVZhcmlhYmxlKHNpZ3VpZW50ZVZhcmlhYmxlOklkVmFyaWFibGV8SWRGaW4pe1xyXG4gICAgZGViZVNhbHRhciA9IGZhbHNlO1xyXG4gICAgdmFyIHt0b3AsIGVuZm9jYWRvLCBlbGVtZW50b0lucHV0VmFyaWFibGV9ID0gY2FsY3VsYXJFbGVtZW50b0VuZm9jYWRvKHNpZ3VpZW50ZVZhcmlhYmxlKTtcclxuICAgIGlmKHRvcCAhPSBudWxsICYmIHRvcD4wICYmICFlbmZvY2Fkbyl7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHt0b3AsIGxlZnQ6MCwgYmVoYXZpb3I6J3Ntb290aCd9KTtcclxuICAgIH1cclxuICAgIGVsZW1lbnRvSW5wdXRWYXJpYWJsZT8uZm9jdXMoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQ2FtcG8ocHJvcHM6e2Rpc2FibGVkOmJvb2xlYW4sIHByZWd1bnRhOlByZWd1bnRhU2ltcGxlfFByZWd1bnRhQ29uT3BjaW9uZXN8UHJlZ3VudGFDb25TaU5vfE9wY2lvbk11bHRpcGxlLCBmb3JQazpGb3JQaywgbWluaT86Ym9vbGVhbiwgaGlkZGVuPzpib29sZWFufCdxdWl0YXInfSl7XHJcbiAgICB2YXIge3ByZWd1bnRhLCBkaXNhYmxlZCwgbWluaSB9ID0gcHJvcHM7XHJcbiAgICB2YXIge3NhbHRvQXV0b21hdGljbywgY29uQ2FtcG9PcGNpb25lc30gPSB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+c3RhdGUub3BjaW9uZXMpO1xyXG4gICAgY29uc3QgbG9uZ2l0dWQgPSBtaW5pID8gcHJlZ3VudGEuY2FzaWxsZXJvcy5yZWR1Y2UoKGFjdW0sIG8pPT5NYXRoLm1heChvLmNhc2lsbGVyby50b1N0cmluZygpLmxlbmd0aCwgYWN1bSksIDApIDogXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBtaW5pIGVzIHBhcmEgbG9zIG90cm9zXHJcbiAgICAgICAgcHJlZ3VudGEubG9uZ2l0dWQ7XHJcbiAgICAvLyB2YXIgW3ZhbG9yLCBzZXRWYWxvcl0gPSB1c2VTdGF0ZShwcm9wcy52YWxvcik7XHJcbiAgICB2YXIgW2VkaXRhbmRvLCBzZXRFZGl0YW5kb10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgICAvLyB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgLy8gICAgIHNldFZhbG9yKHByb3BzLnZhbG9yKVxyXG4gICAgLy8gfSwgW3Byb3BzLnZhbG9yXSk7XHJcbiAgICBjb25zdCBpbnB1dFByb3BzID0ge1xyXG4gICAgICAgIG1heExlbmd0aDogbG9uZ2l0dWQsXHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25DaGFuZ2U9KG51ZXZvVmFsb3I6VmFsb3J8dHlwZW9mIE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8pPT57XHJcbiAgICAgICAgdmFyIHtzaWd1aWVudGVWYXJpYWJsZX0gPSBkaXNwYXRjaEJ5UGFzcyhhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YSwge2ZvclBrOnByb3BzLmZvclBrLCB2YXJpYWJsZTpwcmVndW50YS52YXJfbmFtZSwgcmVzcHVlc3RhOm51ZXZvVmFsb3J9KTtcclxuICAgICAgICBpZihzaWd1aWVudGVWYXJpYWJsZSAmJiBkZWJlU2FsdGFyKXtcclxuICAgICAgICAgICAgZW5mb2NhckVsZW1lbnRvRGVWYXJpYWJsZShzaWd1aWVudGVWYXJpYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHZhciBudWVzdHJhTG9uZ2l0dWQgPSBjYWxjdWxhck51ZXN0cmFMb25naXR1ZChsb25naXR1ZClcclxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImNhbXBvXCIgbnVlc3RyYS1sb25naXR1ZD17bnVlc3RyYUxvbmdpdHVkfSBzdHlsZT17cHJvcHMuaGlkZGVuPT0ncXVpdGFyJz97ZGlzcGxheTonbm9uZSd9OnByb3BzLmhpZGRlbj97dmlzaWJpbGl0eTonaGlkZGVuJ306dW5kZWZpbmVkfT5cclxuICAgICAgICB7bWluaT9udWxsOjxCb3RvbkJvcnJhclxyXG4gICAgICAgICAgICBpZD17YGJvcnJhci1hYmllcnRhLSR7cHJlZ3VudGEudmFyX25hbWV9YH1cclxuICAgICAgICAgICAgdmFyaWFibGU9e3ByZWd1bnRhLnZhcl9uYW1lfVxyXG4gICAgICAgICAgICBmb3JQaz17cHJvcHMuZm9yUGt9XHJcbiAgICAgICAgLz59XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbnB1dC1jYW1wb1wiPlxyXG4gICAgICAgICAgICA8VGV4dEZpZWxkIFxyXG4gICAgICAgICAgICAgICAgaWQ9e2B2YXItJHtwcmVndW50YS52YXJfbmFtZX1gfVxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidmFyaWFibGVcIiBcclxuICAgICAgICAgICAgICAgIC8vdmFyLWxlbmd0aD17cHJlZ3VudGEubG9uZ2l0dWR9IFxyXG4gICAgICAgICAgICAgICAgZnVsbFdpZHRoPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgaW5wdXRQcm9wcz17aW5wdXRQcm9wc31cclxuICAgICAgICAgICAgICAgIHR5cGU9e3ByZWd1bnRhLmRlc3BsaWVndWVUaXBvSW5wdXQ/P2FkYXB0YXJUaXBvVmFyQ2FzaWxsZXJvKHByZWd1bnRhLnRpcG92YXIpfVxyXG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXsoZXZlbnQ6UmVhY3QuS2V5Ym9hcmRFdmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZXNFbnRlciA9IChldmVudC5rZXkgPT0gJ0VudGVyJyB8fCBldmVudC5rZXlDb2RlID09IDEzKVxyXG4gICAgICAgICAgICAgICAgICAgIGRlYmVTYWx0YXIgPSBlc0VudGVyICYmIChzYWx0b0F1dG9tYXRpY28gfHwgY29uQ2FtcG9PcGNpb25lcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZXNFbnRlcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5ibHVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgb25Gb2N1cz17KF9ldmVudCk9PnNldEVkaXRhbmRvKHRydWUpfVxyXG4gICAgICAgICAgICAgICAgb25CbHVyPXsoZXZlbnQsIHZhbG9yKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50Py5yZWxhdGVkVGFyZ2V0Py5nZXRBdHRyaWJ1dGUoJ2JvdG9uLWNvbmZpcm1hcicpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGViZVNhbHRhciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRFZGl0YW5kbyhmYWxzZSlcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAge2Rpc2FibGVkIHx8IG1pbmk/bnVsbDpcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3Rvbi1jb25maXJtYXItY2FtcG9cIj5cclxuICAgICAgICAgICAgICAgIDxCdXR0b24gdmFyaWFudD17ZWRpdGFuZG8/XCJjb250YWluZWRcIjonb3V0bGluZWQnfSBzaXplPVwic21hbGxcIiBjb2xvcj17ZWRpdGFuZG8/J3ByaW1hcnknOidkZWZhdWx0J31cclxuICAgICAgICAgICAgICAgICAgICBib3Rvbi1jb25maXJtYXI9e3ByZWd1bnRhLnZhcl9uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgID48SUNPTi5DaGVjay8+PC9CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG59XHJcblxyXG5pbnRlcmZhY2UgSWNhc2lsbGVyb0Nvbk9wY2lvbmVze1xyXG4gICAgdmFyX25hbWU6SWRWYXJpYWJsZSxcclxuICAgIGNhc2lsbGVyb3M6T3BjaW9uW11cclxufVxyXG5cclxuZnVuY3Rpb24gT3BjaW9uZXNEZXNwbGllZ3VlKFxyXG4gICAge2Nhc2lsbGVyb0Nvbk9wY2lvbmVzLCBmb3JQaywgIGxlZXIsIGRlc3BsaWVndWVDb250ZW5pZG99OlxyXG4gICAge2Nhc2lsbGVyb0Nvbk9wY2lvbmVzOkljYXNpbGxlcm9Db25PcGNpb25lcywgZm9yUGs6Rm9yUGssIGxlZXI6Ym9vbGVhbiwgZGVzcGxpZWd1ZUNvbnRlbmlkbzondmVydGljYWwnfCdob3Jpem9udGFsJ31cclxuKXtcclxuICAgIGNvbnN0IGRlc3BsZWdhck90cm9zID0gKG9wY2lvbjpPcGNpb24sIHNvbG9QYXJhRGVzcGxpZWd1ZTondmVydGljYWwnfCdob3Jpem9udGFsJ3xudWxsKSA9PiBvcGNpb24uY2FzaWxsZXJvcy5tYXAoKHN1YlByZWd1bnRhOlByZWd1bnRhKT0+KFxyXG4gICAgICAgIHNvbG9QYXJhRGVzcGxpZWd1ZSA9PSBudWxsIHx8IHNvbG9QYXJhRGVzcGxpZWd1ZSA9PSBzdWJQcmVndW50YS5kZXNwbGllZ3VlQ29udGVuaWRvID9cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm90cm9zLWVzcGVjaWZpY2FyXCIga2V5PXtzdWJQcmVndW50YS5pZF9jYXNpbGxlcm99PlxyXG4gICAgICAgICAgICA8UHJlZ3VudGFEZXNwbGllZ3VlIFxyXG4gICAgICAgICAgICAgICAgcHJlZ3VudGE9e3N1YlByZWd1bnRhfSBcclxuICAgICAgICAgICAgICAgIGZvclBrPXtmb3JQa30gXHJcbiAgICAgICAgICAgICAgICBkZXNwbGllZ3VlRW5jYWJlemFkbz0nc3VwZXJpb3InXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+Om51bGxcclxuICAgICkpXHJcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJjb250ZW5pZG9cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvcGNpb25lc1wiIGRlc3BsaWVndWUtY29udGVuaWRvPXtkZXNwbGllZ3VlQ29udGVuaWRvPz8ndmVydGljYWwnfT5cclxuICAgICAgICAgICAge2Nhc2lsbGVyb0Nvbk9wY2lvbmVzLmNhc2lsbGVyb3MubWFwKChvcGNpb246T3BjaW9uLCBpOm51bWJlcik9PlxyXG4gICAgICAgICAgICAgICAgPEdyaWQga2V5PXtvcGNpb24uaWRfY2FzaWxsZXJvfSBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgb2N1bHRhci1zYWx0ZWFkYT17b3BjaW9uLmRlc3BsaWVndWVPY3VsdGE/KG9wY2lvbi5leHByZXNpb25faGFiaWxpdGFyX2pzPydJTkhBQklMSVRBUic6J1NJJyk6J05PJ31cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8T3BjaW9uRGVzcGxpZWd1ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzaWxsZXJvPXtvcGNpb259IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT17Y2FzaWxsZXJvQ29uT3BjaW9uZXMudmFyX25hbWV9IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvck9wY2lvbj17b3BjaW9uLmNhc2lsbGVyb31cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yUGs9e2ZvclBrfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVlcj17bGVlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uQm90b25Cb3JyYXI9e2k9PTAgfHwgZGVzcGxpZWd1ZUNvbnRlbmlkbyE9J2hvcml6b250YWwnfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAge2Rlc3BsaWVndWVDb250ZW5pZG89PSdob3Jpem9udGFsJz9udWxsOmRlc3BsZWdhck90cm9zKG9wY2lvbixudWxsKX1cclxuICAgICAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB7ZGVzcGxpZWd1ZUNvbnRlbmlkbz09J2hvcml6b250YWwnP2Nhc2lsbGVyb0Nvbk9wY2lvbmVzLmNhc2lsbGVyb3MubWFwKChvcGNpb246T3BjaW9uKT0+XHJcbiAgICAgICAgICAgIGRlc3BsZWdhck90cm9zKG9wY2lvbixudWxsKVxyXG4gICAgICAgICk6bnVsbH1cclxuICAgIDwvZGl2PlxyXG59XHJcblxyXG5jb25zdCBub21icmVDYXNpbGxlcm89e1xyXG4gICAgRjogJ2Zvcm11bGFyaW8nLFxyXG4gICAgQjogJ2Jsb3F1ZScsXHJcbiAgICBQOiAncHJlZ3VudGEnLFxyXG4gICAgQ1A6ICdjb25qdW50b3ByZWd1bnRhcycsXHJcbiAgICBPOiAnb3BjaW9uJyxcclxuICAgIE9NOiAnbXVsdGlwbGUnLFxyXG4gICAgRklMVFJPOiAnZmlsdHJvJyxcclxuICAgIENPTlM6ICdjb25zaXN0ZW5jaWEnLFxyXG4gICAgQkY6ICdib3RvbmZvcm11bGFyaW8nLFxyXG4gICAgVEVYVE86ICdhY2xhcmFjaW9uc3VwZXJpb3InLFxyXG59XHJcblxyXG5mdW5jdGlvbiBEZXNwbGVnYXJDYXNpbGxlcm8ocHJvcHM6e1xyXG4gICAgY2FzaWxsZXJvOlByZWd1bnRhfEJsb3F1ZXxGaWx0cm98Q29uanVudG9QcmVndW50YXN8Qm90b25Gb3JtdWxhcmlvfENvbnNpc3RlbmNpYXxPcGNpb25NdWx0aXBsZXxUZXh0byxcclxuICAgIGlkPzpzdHJpbmcsXHJcbiAgICBzdHlsZT86UmVhY3QuQ1NTUHJvcGVydGllcyxcclxuICAgIGRlc3BsaWVndWVFbmNhYmV6YWRvPzonbGF0ZXJhbCd8J3N1cGVyaW9yJ1xyXG4gICAgY2hpbGRyZW46UmVhY3QuUmVhY3ROb2RlfFJlYWN0LlJlYWN0Tm9kZVtdLFxyXG4gICAgXCJvY3VsdGFyLXNhbHRlYWRhXCI/OidTSSd8J05PJ3wnSU5IQUJJTElUQVInfHVuZGVmaW5lZFxyXG59KXtcclxuICAgIHJldHVybiA8ZGl2IFxyXG4gICAgICAgIGtleT17YCR7cHJvcHMuY2FzaWxsZXJvLnRpcG9jfS0ke3Byb3BzLmlkfHxwcm9wcy5jYXNpbGxlcm8uaWRfY2FzaWxsZXJvfWB9XHJcbiAgICAgICAgY2xhc3NOYW1lPXtgY2FzaWxsZXJvICR7bm9tYnJlQ2FzaWxsZXJvW3Byb3BzLmNhc2lsbGVyby50aXBvY119YH1cclxuICAgICAgICBpZD17cHJvcHMuaWR9XHJcbiAgICAgICAgc3R5bGU9e3Byb3BzLnN0eWxlfVxyXG4gICAgICAgIGRlc3BsaWVndWUtZW5jYWJlemFkbz17cHJvcHMuY2FzaWxsZXJvLmRlc3BsaWVndWVFbmNhYmV6YWRvPz9wcm9wcy5kZXNwbGllZ3VlRW5jYWJlemFkbz8/J3N1cGVyaW9yJ31cclxuICAgICAgICBvY3VsdGFyLXNhbHRlYWRhPXtwcm9wc1tcIm9jdWx0YXItc2FsdGVhZGFcIl19XHJcbiAgICA+e3Byb3BzLmNoaWxkcmVufTwvZGl2PlxyXG59XHJcblxyXG5mdW5jdGlvbiBQcmVndW50YURlc3BsaWVndWUocHJvcHM6e1xyXG4gICAgcHJlZ3VudGE6UHJlZ3VudGEsIFxyXG4gICAgZm9yUGs6Rm9yUGssIFxyXG4gICAgZGVzcGxpZWd1ZUVuY2FiZXphZG86J2xhdGVyYWwnfCdzdXBlcmlvcidcclxufSl7XHJcbiAgICB2YXIge3ByZWd1bnRhfSA9IHByb3BzO1xyXG4gICAgdmFyIGRpc3BhdGNoPXVzZURpc3BhdGNoKCk7XHJcbiAgICB2YXIgZXN0YWRvOkVzdGFkb1ZhcmlhYmxlO1xyXG4gICAgdmFyIGlkID0gYHByZWd1bnRhLSR7cHJlZ3VudGEuaWRfY2FzaWxsZXJvfWBcclxuICAgIHJlZ2lzdHJhckVsZW1lbnRvKHtcclxuICAgICAgICBpZCwgXHJcbiAgICAgICAgZGlyZWN0OnRydWUsIFxyXG4gICAgICAgIGZ1bjogcmVnaXN0cmFkb3JEZVZhcmlhYmxlKHByZWd1bnRhKVxyXG4gICAgfSlcclxuICAgIHJldHVybiA8RGVzcGxlZ2FyQ2FzaWxsZXJvXHJcbiAgICAgICAgaWQ9e2lkfVxyXG4gICAgICAgIGNhc2lsbGVybz17cHJlZ3VudGF9XHJcbiAgICAgICAgbnVlc3Ryby10aXBvdmFyPXtwcmVndW50YS50aXBvdmFyfHxcIm11bHRpcGxlXCJ9IFxyXG4gICAgICAgIG9jdWx0YXItc2FsdGVhZGE9e3ByZWd1bnRhLmRlc3BsaWVndWVPY3VsdGE/KHByZWd1bnRhLmV4cHJlc2lvbl9oYWJpbGl0YXJfanM/J0lOSEFCSUxJVEFSJzonU0knKTonTk8nfVxyXG4gICAgICAgIGRlc3BsaWVndWVFbmNhYmV6YWRvPXtwcm9wcy5kZXNwbGllZ3VlRW5jYWJlemFkb31cclxuICAgID5cclxuICAgICAgICA8RW5jYWJlemFkb0Rlc3BsaWVndWUgXHJcbiAgICAgICAgICAgIGNhc2lsbGVybz17cHJlZ3VudGF9IFxyXG4gICAgICAgICAgICBsZWVyPXtwcmVndW50YS5sZWVyIT09ZmFsc2V9ICBcclxuICAgICAgICAgICAgZm9yUGs9e3Byb3BzLmZvclBrfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250ZW5pZG9cIj57XHJcbiAgICAgICAgICAgIHByZWd1bnRhLnRpcG92YXI9PVwic2lfbm9cIj88R3JpZCBjb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8U2lOb0Rlc3BsaWVndWUgXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzaWxsZXJvQ29uT3BjaW9uZXM9e3ByZWd1bnRhfSBcclxuICAgICAgICAgICAgICAgICAgICBmb3JQaz17cHJvcHMuZm9yUGt9IFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc3BsaWVndWVDb250ZW5pZG89e3Byb3BzLnByZWd1bnRhLmRlc3BsaWVndWVDb250ZW5pZG8/Pyd2ZXJ0aWNhbCd9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+OlxyXG4gICAgICAgICAgICBwcmVndW50YS50aXBvdmFyPT1cIm9wY2lvbmVzXCIgP1xyXG4gICAgICAgICAgICAgICAgPE9wY2lvbmVzRGVzcGxpZWd1ZSBcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm9Db25PcGNpb25lcz17cHJlZ3VudGF9IFxyXG4gICAgICAgICAgICAgICAgICAgIGZvclBrPXtwcm9wcy5mb3JQa30gXHJcbiAgICAgICAgICAgICAgICAgICAgbGVlcj17ISFwcmVndW50YS5sZWVyfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlc3BsaWVndWVDb250ZW5pZG89e3ByZWd1bnRhLmRlc3BsaWVndWVDb250ZW5pZG8/Pyd2ZXJ0aWNhbCd9XHJcbiAgICAgICAgICAgICAgICAvPjpcclxuICAgICAgICAgICAgcHJlZ3VudGEudGlwb3Zhcj09bnVsbD9cclxuICAgICAgICAgICAgICAgIChwcmVndW50YS5jYXNpbGxlcm9zIGFzIChPcGNpb25NdWx0aXBsZXxDb25zaXN0ZW5jaWEpW10pLm1hcCgob3BjaW9uTXVsdGlwbGUpPT5cclxuICAgICAgICAgICAgICAgICAgICBvcGNpb25NdWx0aXBsZS50aXBvYz09J09NJz8gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxPcGNpb25NdWx0aXBsZURlc3BsaWVndWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17b3BjaW9uTXVsdGlwbGUuaWRfY2FzaWxsZXJvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY2lvbk09e29wY2lvbk11bHRpcGxlfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclBrPXtwcm9wcy5mb3JQa30gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgOiAvL2xhcyBjb25zaXN0ZW5jaWFzIHB1ZWRlbiBzZXIgaGVybWFuYXMgZGUgT01cclxuICAgICAgICAgICAgICAgICAgICAgICAgPENvbnNpc3RlbmNpYURlc3BsaWVndWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17b3BjaW9uTXVsdGlwbGUuaWRfY2FzaWxsZXJvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzaWxsZXJvPXtvcGNpb25NdWx0aXBsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclBrPXtwcm9wcy5mb3JQa31cclxuICAgICAgICAgICAgICAgICAgICAgICAgLz4gICAgXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgKChwcmVndW50YVNpbXBsZTpQcmVndW50YVNpbXBsZSk9PlxyXG4gICAgICAgICAgICAgICAgPENhbXBvXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3ByZWd1bnRhU2ltcGxlLmNhbGN1bGFkYT90cnVlOmZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgIHByZWd1bnRhPXtwcmVndW50YVNpbXBsZX1cclxuICAgICAgICAgICAgICAgICAgICBmb3JQaz17cHJvcHMuZm9yUGt9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICApKHByZWd1bnRhKVxyXG4gICAgICAgIH08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBpZS1wcmVndW50YVwiPlxyXG4gICAgICAgICAgICA8U2FsdG9EZXNwbGllZ3VlIFxyXG4gICAgICAgICAgICAgICAgY2FzaWxsZXJvPXtwcmVndW50YX1cclxuICAgICAgICAgICAgICAgIHByZWZpam89e3ByZWd1bnRhLnRpcG92YXI9PVwib3BjaW9uZXNcIj8oXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlZ3VudGEuY2FzaWxsZXJvcy5zb21lKG9wY2lvbj0+b3BjaW9uLnNhbHRvKT9cInJlc3RvIGRlIGxhcyBvcGNpb25lc1wiOlwidG9kYXMgbGFzIG9wY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICk6XCJcIn1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvRGVzcGxlZ2FyQ2FzaWxsZXJvPlxyXG59XHJcblxyXG52YXIgY2FsY3VsYXJEaXNhYmxlZEJGQWdyZWdhckxpc3RvID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW98bnVsbCwgZm9ybXVsYXJpbzpJZEZvcm11bGFyaW8pPT5cclxuICAgICEhKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiYgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbylcclxuXHJcbmZ1bmN0aW9uIGJvdG9uZXNEZWxGb3JtdWxhcmlvKHI6UmVzcHVlc3RhcywgdW5pZGFkX2FuYWxpc2lzOklkVW5pZGFkQW5hbGlzaXMsIGVzdHJ1Y3R1cmE6RXN0cnVjdHVyYSwgZm9yUGtQYWRyZTpGb3JQaywgZmVlZGJhY2tBbGw6e1tmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+fSk6SHRtbFRhZzxIVE1MRGl2RWxlbWVudD57XHJcbiAgICB2YXIgZm9ybXNWaXZpZW5kYSA9IGdldEZvcm11bGFyaW9zRm9ySWRWaXZpZW5kYShmb3JQa1BhZHJlLnZpdmllbmRhKTtcclxuICAgIHZhciB1YURlZiA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBhcnJheUVzdHJ1Y3R1cmFGb3JtdWxhcmlvcyA9IChsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykpLmFycmF5KCk7XHJcbiAgICB2YXIgeCA9IGxpa2VBcih1YURlZi5oaWphcykuZmlsdGVyKHVhSGlqYT0+XHJcbiAgICAgICAgICAgIGZvcm1zVml2aWVuZGEuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgICBhcnJheUVzdHJ1Y3R1cmFGb3JtdWxhcmlvcy5maW5kKChpbmZvRm9ybXVsYXJpbyk9PlxyXG4gICAgICAgICAgICAgICAgICAgIGluZm9Gb3JtdWxhcmlvLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhSGlqYT8udW5pZGFkX2FuYWxpc2lzKVxyXG4gICAgICAgICAgICAgICAgPy5jYXNpbGxlcm9zLmlkX2Nhc2lsbGVybyBhcyBJZEZvcm11bGFyaW9cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICkubWFwKHVhSGlqYT0+KFxyXG4gICAgICAgIHVhSGlqYSA9PSBudWxsID8gbnVsbCA6XHJcbiAgICAgICAgaHRtbC5kaXYoe2NsYXNzOid1YS1oaWphcyd9LFtcclxuICAgICAgICAgICAgaHRtbC5kaXYodWFIaWphLnVuaWRhZF9hbmFsaXNpcyksXHJcbiAgICAgICAgICAgIGh0bWwuZGl2KFxyXG4gICAgICAgICAgICAgICAgbGlrZUFyKHJbdWFIaWphLnVuaWRhZF9hbmFsaXNpc118fFtdKS5tYXAoKHJlc3B1ZXN0YXNIaWphLCBpKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBudW0gPSBOdW1iZXIoaSkrMVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmb3JQa0hpamFQYXJjaWFsID0gey4uLmZvclBrUGFkcmUsIFt1YUhpamEucGtfYWdyZWdhZGFdOiBudW19O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5jb25maWdTb3J0ZW8/ZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1BhZHJlLnZpdmllbmRhISldOm51bGxcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbC5kaXYoe2NsYXNzOidudW1lcmFkb3ItdWEnfSwgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmRpdih7Y2xhc3M6J2JvdG9uZXMtdWEnfSxbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sLmRpdih7Y2xhc3M6J251bWVyby11YSd9LG51bS50b1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmb3JtRGVmPT5mb3JtRGVmLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhSGlqYS51bmlkYWRfYW5hbGlzaXMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoX2Zvcm1EZWYsIGZvcm11bGFyaW8pPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvclBrID0gey4uLmZvclBrSGlqYVBhcmNpYWwsIGZvcm11bGFyaW99O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWVkYmFja0Zvcm0gPSBmZWVkYmFja0FsbFt0b1BsYWluRm9yUGsoZm9yUGspXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmVlZGJhY2tGb3JtID8gaHRtbC5kaXYoe30sW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodG1sLmJ1dHRvbigodWFIaWphISkucGtfYWdyZWdhZGErXCIgb2s6IFwiKyhOdW1iZXIoaSkrMSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RvbkZvcm11bGFyaW9Db25SZXN1bWVuKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclBrLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdHJ1ZSB8fCBjYWxjdWxhckFjdHVhbEJGKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8sIG51bSwgbnVsbCwgZm9ybXVsYXJpbywgciksIC8vUkVWSVNBUiB0cnVlIHBhcmEgcXVlIG5vIHNlIGdyaXNlblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpbzpmYWxzZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNhbGN1bGFyRGlzYWJsZWRCRihjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLCBudW0sIGZvcm11bGFyaW8sIHIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2tGb3JtLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGVzcGxpZWd1ZU9jdWx0YTpmYWxzZSwgZXhwcmVzaW9uX2hhYmlsaXRhcl9qczonJywgbm9tYnJlOmZvcm11bGFyaW8sIGFjbGFyYWNpb246bnVsbCwgc2FsdG86Zm9ybXVsYXJpb30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JQa1BhZHJlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3Rvbi1pci1yZXN1bWVuLWZvcm11bGFyaW9cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9ybXVsYXJpb10uY2FzaWxsZXJvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5hcnJheSgpLm1hcCh4PT54ID09IG51bGwgPyBudWxsIDogeCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICxib3RvbmVzRGVsRm9ybXVsYXJpbyhyZXNwdWVzdGFzSGlqYSwgdWFIaWphLnVuaWRhZF9hbmFsaXNpcywgZXN0cnVjdHVyYSwgZm9yUGtIaWphUGFyY2lhbCwgZmVlZGJhY2tBbGwpXHJcbiAgICAgICAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkubWFwKHg9PnggPT0gbnVsbCA/IG51bGwgOiB4KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgXSlcclxuICAgICkpLmFycmF5KCkubWFwKHg9PnggPT0gbnVsbCA/IG51bGwgOiB4KTtcclxuICAgIHJldHVybiBodG1sLmRpdigvKntzdHlsZTonZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpyb3cnfSwqL3gpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBUZXh0b0Rlc3BsaWVndWUocHJvcHM6e2Nhc2lsbGVybzpUZXh0bywgZm9yUGs6Rm9yUGt9KXtcclxuICAgIHZhciB7Y2FzaWxsZXJvLCBmb3JQa30gPSBwcm9wcztcclxuICAgIHZhciBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICB2YXIgaGFiaWxpdGFkb3IgPSBjYXNpbGxlcm8uZXhwcmVzaW9uX2hhYmlsaXRhcl9qcz9nZXRGdW5jaW9uSGFiaWxpdGFyKGNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyX2pzKTooKT0+dHJ1ZTtcclxuICAgIHZhciB7bW9kb0Rlc3BsaWVndWV9ID0gdXNlU2VsZWN0b3JWaXZpZW5kYShmb3JQayk7XHJcbiAgICB2YXIgaWQgPSBgdGV4dG8tJHtjYXNpbGxlcm8uaWRfY2FzaWxsZXJvfWA7XHJcbiAgICByZWdpc3RyYXJFbGVtZW50byh7aWQsIHN0eWxlOidkaXNwbGF5JywgZnVuOihyOlJlc3B1ZXN0YXMpPT5oYWJpbGl0YWRvcihyKSB8fCBtb2RvRGVzcGxpZWd1ZT09J21ldGFkYXRvcyc/J2Jsb2NrJzonbm9uZSd9KVxyXG4gICAgdmFyIGVzUmVzdW1lbkZvcm11bGFyaW8gPSBjYXNpbGxlcm8uY2FzaWxsZXJvPT0nUmVzRm9yJyBhcyBJZENhc2lsbGVybzsgLy8gVE9ETzogQ2FtYmlhIGVzdG8gcXVlIGVzdMOhIGphcmNvZGVhZG8uXHJcbiAgICBpZihlc1Jlc3VtZW5Gb3JtdWxhcmlvKXtcclxuICAgICAgICByZWdpc3RyYXJFbGVtZW50byh7aWQsIGRpcmVjdDp0cnVlLCBcclxuICAgICAgICAgICAgZnVuOihcclxuICAgICAgICAgICAgICAgIHI6UmVzcHVlc3RhcywgXHJcbiAgICAgICAgICAgICAgICBfZmVlZGJhY2tGb3JtOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiwgXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50bzpIVE1MRGl2RWxlbWVudCwgXHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja0FsbDp7W2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsVmFsb3IsIElkRmluPn0sIFxyXG4gICAgICAgICAgICAgICAgZXN0cnVjdHVyYTpFc3RydWN0dXJhXHJcbiAgICAgICAgICAgICk9PntcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvLnN0eWxlLmRpc3BsYXk9Jyc7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgbGFzIHJlc3B1ZXN0YXMgc29uIHJlc3B1ZXN0YXNSYWl6IHBvcnF1ZSBSZXNGb3IgZXN0w6EgZW4gZWwgZm9ybSBwcGFsXHJcbiAgICAgICAgICAgICAgICBpZihyWydyZXN1bWVuRXN0YWRvJ10gYXMgUmVzdW1lbkVzdGFkbyA9PSAndmFjaW8nKXtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50by50ZXh0Q29udGVudCA9IFwicmVsZXZhbWllbnRvIHNpbiBlbXBlemFyXCI7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50by50ZXh0Q29udGVudCA9IFwicmVsZXZhbWllbnRvIGVtcGV6YWRvXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHt1bmlkYWRfYW5hbGlzaXN9ID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5jYXNpbGxlcm9zO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvLmlubmVySFRNTD1cIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvLmFwcGVuZENoaWxkKGJvdG9uZXNEZWxGb3JtdWxhcmlvKHIsIHVuaWRhZF9hbmFsaXNpcywgZXN0cnVjdHVyYSwgZm9yUGssIGZlZWRiYWNrQWxsKS5jcmVhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgdmFyIGlyID0gKGRlZkJvdG9uOkRlZmluaWNpb25Gb3JtdWxhcmlvQWJyaXIpPT57XHJcbiAgICAgICAgLy8gdmFyIG51ZXZhRm9yUGs9ey4uLmZvclBrLCBmb3JtdWxhcmlvOmlkRm9ybXVsYXJpb0Rlc3Rpbm99O1xyXG4gICAgICAgIC8vIG51ZXZhRm9yUGtbbnVldm9DYW1wb1BrXSA9IGRlZkJvdG9uLm51bVxyXG4gICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkNBTUJJQVJfRk9STVVMQVJJTyh7Zm9yUGs6ZGVmQm90b24uZm9yUGssIGFwaWxhclZ1ZWx0YTp0cnVlfSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDxEZXNwbGVnYXJDYXNpbGxlcm8gXHJcbiAgICAgICAgaWQ9e2Ake2lkfS1leHRlcm5vYH1cclxuICAgICAgICBjYXNpbGxlcm89e2Nhc2lsbGVyb31cclxuICAgID5cclxuICAgICAgICA8RW5jYWJlemFkb0Rlc3BsaWVndWUgY2FzaWxsZXJvPXtjYXNpbGxlcm99IGxlZXI9e2ZhbHNlfSBmb3JQaz17Zm9yUGt9Lz5cclxuICAgICAgICA8ZGl2IGlkPXtpZH0gc3R5bGU9e3tkaXNwbGF5Oidub25lJ319PjwvZGl2PlxyXG4gICAgICAgIHtlc1Jlc3VtZW5Gb3JtdWxhcmlvP1xyXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwic3BlY2lhbC1idXR0b25cIiBpZD1cImJvdG9uLWlyLXJlc3VtZW4tZm9ybXVsYXJpb1wiIHN0eWxlPXt7ZGlzcGxheTonbm9uZSd9fVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoZXZlbnQpPT57XHJcbiAgICAgICAgICAgICAgICBpcihKU09OLnBhcnNlKChldmVudC50YXJnZXQhIGFzIHVua25vd24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnZGVmLWJ1dHRvbicpISkpXHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgPmlyIChpbnRlcm5vKTwvQnV0dG9uPlxyXG4gICAgICAgIDpudWxsfVxyXG5cclxuICAgIDwvRGVzcGxlZ2FyQ2FzaWxsZXJvPlxyXG59XHJcblxyXG5mdW5jdGlvbiBGaWx0cm9EZXNwbGllZ3VlKHByb3BzOntmaWx0cm86RmlsdHJvLCBmb3JQazpGb3JQa30pe1xyXG4gICAgdmFyIHtmaWx0cm99ID0gcHJvcHM7XHJcbiAgICByZXR1cm4gPERlc3BsZWdhckNhc2lsbGVybyBjYXNpbGxlcm89e2ZpbHRyb30+XHJcbiAgICAgICAgPERlc3BsaWVndWVFbmNhYmV6YWRvIGNhc2lsbGVybz17ZmlsdHJvfS8+XHJcbiAgICA8L0Rlc3BsZWdhckNhc2lsbGVybz5cclxufVxyXG5cclxuZnVuY3Rpb24gQ29uc2lzdGVuY2lhRGVzcGxpZWd1ZShwcm9wczp7Y2FzaWxsZXJvOkNvbnNpc3RlbmNpYSwgZm9yUGs6Rm9yUGt9KXtcclxuICAgIHZhciB7Y2FzaWxsZXJvLCBmb3JQa30gPSBwcm9wcztcclxuICAgIHZhciBoYWJpbGl0YWRvciA9IGNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyX2pzP2dldEZ1bmNpb25IYWJpbGl0YXIoY2FzaWxsZXJvLmV4cHJlc2lvbl9oYWJpbGl0YXJfanMpOigpPT50cnVlO1xyXG4gICAgdmFyIHttb2RvRGVzcGxpZWd1ZX0gPSB1c2VTZWxlY3RvclZpdmllbmRhKGZvclBrKTtcclxuICAgIHZhciBpZCA9IGBjb25zaXN0ZW5jaWEtJHtjYXNpbGxlcm8uaWRfY2FzaWxsZXJvfWA7XHJcbiAgICByZWdpc3RyYXJFbGVtZW50byh7aWQsIHN0eWxlOidkaXNwbGF5JywgZnVuOihyOlJlc3B1ZXN0YXMpPT5oYWJpbGl0YWRvcihyKSB8fCBtb2RvRGVzcGxpZWd1ZT09J21ldGFkYXRvcyc/J2Jsb2NrJzonbm9uZSd9KVxyXG4gICAgcmV0dXJuIDxEZXNwbGVnYXJDYXNpbGxlcm8gXHJcbiAgICAgICAgaWQ9e2lkfVxyXG4gICAgICAgIGNhc2lsbGVybz17Y2FzaWxsZXJvfVxyXG4gICAgICAgIHN0eWxlPXt7ZGlzcGxheTonbm9uZSd9fVxyXG4gICAgPlxyXG4gICAgICAgIDxFbmNhYmV6YWRvRGVzcGxpZWd1ZSBjYXNpbGxlcm89e2Nhc2lsbGVyb30gbGVlcj17ZmFsc2V9IGZvclBrPXtmb3JQa30vPlxyXG4gICAgPC9EZXNwbGVnYXJDYXNpbGxlcm8+XHJcbn1cclxuXHJcbnR5cGUgRGVmaW5pY2lvbkZvcm11bGFyaW9BYnJpcj1cclxuKHtmb3JQazpGb3JQaywgbnVtOm51bWJlciwgYWN0dWFsOmJvb2xlYW4sIHByZXZpbzpib29sZWFufSB8IFxyXG57Zm9yUGs6Rm9yUGssIG51bTpudW1iZXIsIGFjdHVhbDpib29sZWFuLCBwcmV2aW86ZmFsc2UsIGVzQWdyZWdhcjp0cnVlfSB8IFxyXG57Zm9yUGs6Rm9yUGssIG51bTpudW1iZXIsIGFjdHVhbDpib29sZWFuLCBwcmV2aW86ZmFsc2UsIGVzQ29uZmlybWFyOnRydWV9IHxcclxue2ZvclBrOkZvclBrLCBudW06bnVtYmVyLCBhY3R1YWw6Ym9vbGVhbiwgcHJldmlvOmZhbHNlLCBwZXJtaXRlQm9ycmFyOmJvb2xlYW59IHxcclxue2ZvclBrOkZvclBrLCBudW06ZmFsc2UsIGFjdHVhbDpib29sZWFuLCBwcmV2aW86dHJ1ZSwgdW5pY286dHJ1ZX0pXHJcbiYge2VzQ29uZmlybWFyPzp0cnVlLCBlc0FncmVnYXI/OnRydWUsIHBlcm1pdGVCb3JyYXI/OmJvb2xlYW4sIGRpc2FibGVkPzpib29sZWFufHVuZGVmaW5lZH07XHJcblxyXG5cclxudmFyIGJvdG9uRm9ybXVsYXJpb0NvblJlc3VtZW4gPSAoXHJcbiAgICBkZWZCb3RvbjpEZWZpbmljaW9uRm9ybXVsYXJpb0FicmlyLCBcclxuICAgIGZlZWRiYWNrRm9ybTpGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiwgXHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhczpSZXNwdWVzdGFzLFxyXG4gICAgY2FzaWxsZXJvOntkZXNwbGllZ3VlT2N1bHRhPzpib29sZWFufG51bGwsIGV4cHJlc2lvbl9oYWJpbGl0YXJfanM/OnN0cmluZywgYWNsYXJhY2lvbjpzdHJpbmd8bnVsbCwgZXhwcmVzaW9uX2hhYmlsaXRhcj86c3RyaW5nLCBub21icmU/OnN0cmluZywgc2FsdG86c3RyaW5nfG51bGwsIGVzcGVjaWFsPzphbnl9LFxyXG4gICAgZm9yUGtQYWRyZTogRm9yUGssXHJcbiAgICBpZEJ1dHRvbjpzdHJpbmcsXHJcbiAgICBmb3JtdWxhcmlvQUFicmlyOkZvcm11bGFyaW9cclxuKT0+e1xyXG4gICAgdmFyIGZvclBrOkZvclBrID0gZGVmQm90b24uZm9yUGs7XHJcbiAgICB2YXIgc3VmaWpvSWRFbGVtZW50byA9IHRvUGxhaW5Gb3JQayhmb3JQaykrKGRlZkJvdG9uLmVzQ29uZmlybWFyPyctbGlzdG8nOicnKTtcclxuICAgIHZhciBpZCA9IGBkaXYtYm90b24tZm9ybXVsYXJpby0ke3N1Zmlqb0lkRWxlbWVudG99YDtcclxuICAgIHZhciBlc3RhZG8gPSBmZWVkYmFja0Zvcm0ucmVzdW1lbjtcclxuICAgIHJldHVybiBodG1sLmRpdih7XHJcbiAgICAgICAgaWQsIFxyXG4gICAgICAgIGNsYXNzOlwic2VjY2lvbi1ib3Rvbi1mb3JtdWxhcmlvXCIgLCBcclxuICAgICAgICAkYXR0cnM6e1xyXG4gICAgICAgICAgICBcIm51ZXN0cm8tdmFsaWRhdG9yXCI6ZGVmQm90b24uYWN0dWFsPydhY3R1YWwnOmRlZkJvdG9uLnByZXZpbz8ndmFsaWRhJzondG9kYXZpYV9ubycsXHJcbiAgICAgICAgICAgIFwib2N1bHRhci1zYWx0ZWFkYVwiOmNhc2lsbGVyby5kZXNwbGllZ3VlT2N1bHRhPyhjYXNpbGxlcm8uZXhwcmVzaW9uX2hhYmlsaXRhcl9qcz8nSU5IQUJJTElUQVInOidTSScpOidOTycsXHJcbiAgICAgICAgICAgIFwidGllbmUtdmFsb3JcIjpcIk5PXCIsXHJcbiAgICAgICAgICAgIFwiZGVmLWJ1dHRvblwiOkpTT04uc3RyaW5naWZ5KGRlZkJvdG9uKVxyXG4gICAgICAgIH1cclxuICAgIH0sIFtcclxuICAgICAgICBjYXNpbGxlcm8uYWNsYXJhY2lvbiB8fCBodG1sLmRpdih7Y2xhc3M6XCJhY2xhcmFjaW9uXCJ9LCBbYnJlYWtlYWJsZVRleHQoY2FzaWxsZXJvLmFjbGFyYWNpb24pPz9udWxsXSksXHJcbiAgICAgICAgaHRtbC5kaXYoW1xyXG4gICAgICAgICAgICBCdXR0b24yKHtcclxuICAgICAgICAgICAgICAgIC8vIGlkOmB2YXItJHtpZFZhcmlhYmxlfWAsXHJcbiAgICAgICAgICAgICAgICBpZDpgYm90b24tZm9ybXVsYXJpby0ke3N1Zmlqb0lkRWxlbWVudG99YCwgXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50Olwib3V0bGluZWRcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkZWZCb3Rvbi5kaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgIGNvbG9yOlwiaW5oZXJpdFwiLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazooKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRlZkJvdG9uLmVzQ29uZmlybWFyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVmQm90b24ubnVtICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hCeVBhc3MoYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGEse2ZvclBrOmZvclBrUGFkcmUsIHZhcmlhYmxlOmNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyIGFzIElkVmFyaWFibGUsIHJlc3B1ZXN0YTpkZWZCb3Rvbi5udW0gYXMgVmFsb3J9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRCdXR0b24pISBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnZGVmLWJ1dHRvbicsIEpTT04uc3RyaW5naWZ5KGRlZkJvdG9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAkYXR0cnM6e1xyXG4gICAgICAgICAgICAgICAgICAgIFwicmVzdW1lbi1lc3RhZG9cIjplc3RhZG8hPSd2YWNpbyc/ZXN0YWRvOiBkZWZCb3Rvbi5hY3R1YWw/J2FjdHVhbCc6ZGVmQm90b24ucHJldmlvP2VzdGFkbzondG9kYXZpYV9ubycsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAsIGNoaWxkcmVuOltcclxuICAgICAgICAgICAgICAgICAgICAoZGVmQm90b24uZXNBZ3JlZ2FyPydhZ3JlZ2FyJzpkZWZCb3Rvbi5lc0NvbmZpcm1hcj8nTGlzdG8nOmNhc2lsbGVyby5ub21icmUgKyAnICcgKyAoZGVmQm90b24ubnVtfHwnJykpLFxyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwuc3ZnKHtjbGFzczpcIk11aVN2Z0ljb24tcm9vdFwiLCBmb2N1c2FibGU6ZmFsc2UsIHZpZXdib3g6XCIwIDAgMjQgMjRcIiwgXCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwifSxbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwucGF0aCh7ZDooZGVmQm90b24uZXNBZ3JlZ2FyP21hdGVyaWFsSW9JY29uc1N2Z1BhdGguQWRkOmRlZkJvdG9uLmVzQ29uZmlybWFyP21hdGVyaWFsSW9JY29uc1N2Z1BhdGguQ2hlY2s6Y2FzaWxsZXJvLnNhbHRvP21hdGVyaWFsSW9JY29uc1N2Z1BhdGguRm9yd2FyZDptYXRlcmlhbElvSWNvbnNTdmdQYXRoLkV4aXRUb0FwcCl9KVxyXG4gICAgICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAoZGVmQm90b24ucGVybWl0ZUJvcnJhcj9cclxuICAgICAgICAgICAgICAgIEJ1dHRvbjIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTpcImJvdG9uLWJvcnJhci11YS12YWNpYVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOlwiZGVmYXVsdFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ6XCJvdXRsaW5lZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLnN2Zyh7Y2xhc3M6XCJNdWlTdmdJY29uLXJvb3RcIiwgZm9jdXNhYmxlOmZhbHNlLCB2aWV3Ym94OlwiMCAwIDI0IDI0XCIsIFwiYXJpYS1oaWRkZW5cIjpcInRydWVcIn0sW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5wYXRoKHtkOm1hdGVyaWFsSW9JY29uc1N2Z1BhdGguRGVsZXRlRm9yZXZlcn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOigpPT5hY2Npb25fYm9ycmFyX2Zvcm11bGFyaW8oe2ZvclBrLCBmb3JQa1BhZHJlfSl9KVxyXG4gICAgICAgICAgICA6bnVsbCksXHJcbiAgICAgICAgICAgIChkZWZCb3Rvbi5udW0gIT09IGZhbHNlICYmICFkZWZCb3Rvbi5lc0FncmVnYXIgJiYgIWRlZkJvdG9uLmVzQ29uZmlybWFyP1xyXG4gICAgICAgICAgICAgICAgaHRtbC5zcGFuKChjYXNpbGxlcm8uZXNwZWNpYWw/LmNhbXBvc1Jlc3VtZW4/P1tkZWZCb3Rvbi5udW0udG9TdHJpbmcoKV0pLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAoY2FtcG86c3RyaW5nKT0+cmVzcHVlc3Rhc0F1bWVudGFkYXNbZm9ybXVsYXJpb0FBYnJpci51bmlkYWRfYW5hbGlzaXNdW2RlZkJvdG9uLm51bS0xXVtjYW1wbyBhcyBJZFZhcmlhYmxlXVxyXG4gICAgICAgICAgICAgICAgKS5qb2luKCcsICcpIClcclxuICAgICAgICAgICAgOm51bGwpXHJcbiAgICAgICAgICAgIC8vIGh0bWwuZGl2KHtjbGFzczonaW5saW5lLWRpYWxvZycsICRhdHRyczp7XCJpbmxpbmUtZGlhbG9nLW9wZW5cIjogY29uZmlybWFyRm9yemFySXIgPT0gZGVmQm90b24ubnVtPyd2aXNpYmxlJzonaGlkZGVuJ319LFsgICAgICAgICAgICAgICAgXSlcclxuICAgICAgICBdKVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICAgIHtkZWZCb3Rvbi5lc0FncmVnYXI/PD4gPHNwYW4+ICA8L3NwYW4+IDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cImluaGVyaXRcIlxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgID48SUNPTi5DaGVjay8+PC9CdXR0b24+PC8+Om51bGx9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKi9cclxuICAgIF0pLmNyZWF0ZSgpXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBCb3RvbkZvcm11bGFyaW9EZXNwbGllZ3VlKHByb3BzOntjYXNpbGxlcm86Qm90b25Gb3JtdWxhcmlvLCBmb3JtdWxhcmlvOkZvcm11bGFyaW8sIGZvclBrOkZvclBrfSl7XHJcbiAgICB2YXIge2Nhc2lsbGVybywgZm9yUGt9ID0gcHJvcHM7XHJcbiAgICB2YXIgaGFiaWxpdGFkb3IgPSBjYXNpbGxlcm8uZXhwcmVzaW9uX2hhYmlsaXRhcl9qcz9nZXRGdW5jaW9uSGFiaWxpdGFyKGNhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyX2pzKTooKT0+dHJ1ZTtcclxuICAgIHZhciB7b3BjaW9uZXN9ID0gdXNlU2VsZWN0b3JWaXZpZW5kYShmb3JQayk7XHJcbiAgICAvL3ZhciBpZEZvcm11bGFyaW9EZXN0aW5vID0gJ0Y6JytjYXNpbGxlcm8uc2FsdG8hIGFzIElkRm9ybXVsYXJpbzsgICAvL29yaWdpbmFsXHJcbiAgICB2YXIgYXJtb05vbVNhbHRvPWNhc2lsbGVyby5zYWx0bz8uc3Vic3RyaW5nKDAsMik9PSdGOic/Y2FzaWxsZXJvLnNhbHRvLnNsaWNlKDIpOmNhc2lsbGVyby5zYWx0bztcclxuICAgIC8vY29uc29sZS5sb2coJ0JvdG9uRm9ybXVsYXJpb0Rlc3BsaWVndWUgYXJtb05vbVNhbHRvICcgK2FybW9Ob21TYWx0byk7XHJcbiAgICB2YXIgaWRGb3JtdWxhcmlvRGVzdGlubyA9ICdGOicrYXJtb05vbVNhbHRvISBhcyBJZEZvcm11bGFyaW87XHJcbiAgICB2YXIgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgIHZhciB7Zm9ybXVsYXJpb0FBYnJpcn0gPSB1c2VTZWxlY3RvcigoX3N0YXRlOkNhc29TdGF0ZSk9Pih7XHJcbiAgICAgICAgZm9ybXVsYXJpb0FBYnJpcjplc3RydWN0dXJhLmZvcm11bGFyaW9zW2lkRm9ybXVsYXJpb0Rlc3Rpbm9dLmNhc2lsbGVyb3MsXHJcbiAgICB9KSk7XHJcbiAgICB2YXIgc3VmaWpvSWRFbGVtZW50byA9IHRvUGxhaW5Gb3JQayhmb3JQayk7XHJcbiAgICAvKlxyXG4gICAgcmVnaXN0cmFyRWxlbWVudG8oe1xyXG4gICAgICAgIGlkOmBkaXYtYm90b24tZm9ybXVsYXJpby0ke3N1Zmlqb0lkRWxlbWVudG99YCwgXHJcbiAgICAgICAgYXR0cjonZXN0YS1pbmhhYmlsaXRhZGEnLCBcclxuICAgICAgICAvLyBmdW46IChyOlJlc3B1ZXN0YXMpPT5oYWJpbGl0YWRvcihyKT8nU0knOidOTydcclxuICAgICAgICBmdW46IChfcjpSZXNwdWVzdGFzKT0+J05PJ1xyXG4gICAgfSk7XHJcbiAgICByZWdpc3RyYXJFbGVtZW50bzxIVE1MQnV0dG9uRWxlbWVudD4oe1xyXG4gICAgICAgIGlkOmBib3Rvbi1mb3JtdWxhcmlvLSR7c3VmaWpvSWRFbGVtZW50b31gLCBcclxuICAgICAgICBwcm9wOidkaXNhYmxlZCcsIFxyXG4gICAgICAgIC8vIGZ1bjogKHI6UmVzcHVlc3Rhcyk9PiFoYWJpbGl0YWRvcihyKVxyXG4gICAgICAgIGZ1bjogKF9yOlJlc3B1ZXN0YXMpPT5mYWxzZVxyXG4gICAgfSk7XHJcbiAgICAqL1xyXG4gICAgdmFyIGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIHZhciBbY29uZmlybWFyRm9yemFySXIsIHNldENvbmZpcm1hckZvcnphcklyXSA9IHVzZVN0YXRlPERlZmluaWNpb25Gb3JtdWxhcmlvQWJyaXJ8ZmFsc2V8bnVsbD4obnVsbCk7XHJcbiAgICB2YXIgbXVsdGlwbGVGb3JtdWxhcmlvcz1mb3JtdWxhcmlvQUFicmlyLnVuaWRhZF9hbmFsaXNpcyAhPSBwcm9wcy5mb3JtdWxhcmlvLnVuaWRhZF9hbmFsaXNpcztcclxuICAgIHZhciBudWV2b0NhbXBvUGsgPSBkZWZPcGVyYXRpdm8uZGVmVUFbZm9ybXVsYXJpb0FBYnJpci51bmlkYWRfYW5hbGlzaXNdLnBrO1xyXG4gICAvLyB2YXIgdmFyX25hbWU9JyRCLicrY2FzaWxsZXJvLnNhbHRvOyAvL29yaWdpbmFsXHJcbiAgICB2YXIgdmFyX25hbWU9JyRCLkY6Jythcm1vTm9tU2FsdG87XHJcbiAgICB2YXIgaWRTZWNjaW9uPWBzZWNjaW9uLWJvdG9uLWZvcm11bGFyaW8tJHt2YXJfbmFtZX1gO1xyXG4gICAgdmFyIGlkQnV0dG9uPWBzcGVjaWFsLWJ1dHRvbi0ke2lkU2VjY2lvbn1gO1xyXG4gICAgcmVnaXN0cmFyRWxlbWVudG88SFRNTERpdkVsZW1lbnQ+KHtcclxuICAgICAgICBpZDppZFNlY2Npb24sIFxyXG4gICAgICAgIGRpcmVjdDp0cnVlLFxyXG4gICAgICAgIGZ1bjogKHJlc3B1ZXN0YXNBdW1lbnRhZGFzOlJlc3B1ZXN0YXMsIGZlZWRiYWNrUm93OiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiwgZGl2OkhUTUxEaXZFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tBbGw6e1xyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk9PntcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpc3RhRGVCb3RvbmVzQWJyaXI6RGVmaW5pY2lvbkZvcm11bGFyaW9BYnJpcltdID0gW107XHJcbiAgICAgICAgICAgICAgIC8vIHZhciBlc1ZhckFjdHVhbCA9IGZlZWRiYWNrUm93LmFjdHVhbCA9PSAnJEIuRjonK2Nhc2lsbGVyby5zYWx0bzsgIC8vb3JpZ2luYWxcclxuICAgICAgICAgICAgICAgIHZhciBlc1ZhckFjdHVhbCA9IGZlZWRiYWNrUm93LmFjdHVhbCAgPT0gJyRCLkY6Jythcm1vTm9tU2FsdG87XHJcbiAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3RvbkZvcm11bGFyaW9EZXNwbGllZ3VlIGVzVmFyQWN0dWFsICcgK2VzVmFyQWN0dWFsICApO1xyXG4gICAgICAgICAgICAgICAgaWYobXVsdGlwbGVGb3JtdWxhcmlvcyAmJiBjYXNpbGxlcm8uc2FsdG8hPW51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAvLyAgbGV0IGRlZkZvcm11bGFyaW86SW5mb0Zvcm11bGFyaW8gPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zWydGOicrY2FzaWxsZXJvLnNhbHRvIGFzIElkRm9ybXVsYXJpb107ICAgICAgLy9vcmlnaW5hbFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWZGb3JtdWxhcmlvOkluZm9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1snRjonK2FybW9Ob21TYWx0byBhcyBJZEZvcm11bGFyaW9dO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWZVQSA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbZGVmRm9ybXVsYXJpby5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25qdW50byA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW2RlZkZvcm11bGFyaW8uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMhXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FudGlkYWRFc3BlcmFkYSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW2Nhc2lsbGVyby5leHByZXNpb25faGFiaWxpdGFyIGFzIElkVmFyaWFibGVdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1BY3R1YWw6bnVtYmVyfG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAvLyAgdmFyIGVzdGFkb0RlbEJvdG9uID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbJyRCLkY6JytjYXNpbGxlcm8uc2FsdG8gYXMgSWRWYXJpYWJsZV0uZXN0YWRvICAgLy9vcmlnaW5hbFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGVzdGFkb0RlbEJvdG9uID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbJyRCLkY6Jythcm1vTm9tU2FsdG8gYXMgSWRWYXJpYWJsZV0uZXN0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQm90b25Gb3JtdWxhcmlvRGVzcGxpZWd1ZSBlc3RhZG9EZWxCb3RvbiAnICtlc3RhZG9EZWxCb3RvbiAgKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnU29ydGVvRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvP2VzdHJ1Y3R1cmEuY29uZmlnU29ydGVvW2dldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGsudml2aWVuZGEpXTpudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFEZUJvdG9uZXNBYnJpciA9IGxpa2VBcihjb25qdW50bykubWFwKChfLCBpKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtOm51bWJlciA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheShpLCBjb25qdW50bykgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9yUGs9ey4uLnByb3BzLmZvclBrLCBmb3JtdWxhcmlvOmlkRm9ybXVsYXJpb0Rlc3Rpbm8sIFtudWV2b0NhbXBvUGtdOm51bX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWVkYmFjayA9IGZlZWRiYWNrQWxsW3RvUGxhaW5Gb3JQayhmb3JQayldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihudW1BY3R1YWwgPT0gbnVsbCAmJiBmZWVkYmFjay5yZXN1bWVuID09IFwidmFjaW9cIiAmJiBlc3RhZG9EZWxCb3RvbiA9PSd2YWxpZGEnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUFjdHVhbCA9IG51bTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yUGssIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lbjpudWxsLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGNhbGN1bGFyQWN0dWFsQkYoY29uZmlnU29ydGVvRm9ybXVsYXJpbywgbnVtLCBudW1BY3R1YWwsIGlkRm9ybXVsYXJpb0Rlc3Rpbm8sIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpbzogbnVtQWN0dWFsID09IG51bGwsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWl0ZUJvcnJhcjogbGlrZUFyKGNvbmp1bnRvKS5hcnJheSgpLmxlbmd0aCA9PSBOdW1iZXIoaSkgKyAxICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrLnJlc3VtZW4gPT0gJ3ZhY2lvJyAmJiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhclBlcm1pdGVCb3JyYXJCRihjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLGlkRm9ybXVsYXJpb0Rlc3Rpbm8pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNhbGN1bGFyRGlzYWJsZWRCRihjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLCBudW0sIGlkRm9ybXVsYXJpb0Rlc3Rpbm8sIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuYXJyYXkoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihcInB1ZWRlIGFncmVnYXIgLy9UT0RPIFZFUiBFU1RPXCIgJiYgKGNvbmp1bnRvIGluc3RhbmNlb2YgQXJyYXkgfHwgY29uanVudG8gPT0gbnVsbCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvclBrPShjb25qdW50bz09bnVsbCA/IDAgOiBjb25qdW50by5sZW5ndGgpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvclBrPXsuLi5wcm9wcy5mb3JQaywgZm9ybXVsYXJpbzppZEZvcm11bGFyaW9EZXN0aW5vLCBbbnVldm9DYW1wb1BrXTpudWV2b1ZhbG9yUGt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGViZUFncmVnYXJPbGlzdG8gPSBudW1BY3R1YWwgPT0gbnVsbCAmJiAoY2FudGlkYWRFc3BlcmFkYSA9PSBudWxsIHx8IGNhbnRpZGFkRXNwZXJhZGEgIT0gKGNvbmp1bnRvICE9bnVsbCAmJiBjb25qdW50by5sZW5ndGgpKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChlc3RhZG9EZWxCb3RvbiA9PSd2YWxpZGEnIHx8IGVzVmFyQWN0dWFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGFEZUJvdG9uZXNBYnJpci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclBrLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTpudWV2b1ZhbG9yUGssIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNBZ3JlZ2FyOnRydWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOmRlYmVBZ3JlZ2FyT2xpc3RvLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpbzogZmFsc2UsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNhbGN1bGFyRGlzYWJsZWRCRkFncmVnYXJMaXN0byhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLGlkRm9ybXVsYXJpb0Rlc3Rpbm8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0YURlQm90b25lc0FicmlyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yUGssIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtOm51ZXZvVmFsb3JQayAtIDEsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNDb25maXJtYXI6dHJ1ZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6ZGViZUFncmVnYXJPbGlzdG8gJiYgKCFjYXNpbGxlcm8ubG9uZ2l0dWQgfHwgbnVldm9WYWxvclBrID4gTnVtYmVyKGNhc2lsbGVyby5sb25naXR1ZCkpLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpbzogZmFsc2UsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNhbGN1bGFyRGlzYWJsZWRCRkFncmVnYXJMaXN0byhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLGlkRm9ybXVsYXJpb0Rlc3Rpbm8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3JQaz17Li4ucHJvcHMuZm9yUGssIGZvcm11bGFyaW86aWRGb3JtdWxhcmlvRGVzdGlub307XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFEZUJvdG9uZXNBYnJpciA9IFt7Zm9yUGssIG51bTpmYWxzZSwgdW5pY286dHJ1ZSwgYWN0dWFsOmVzVmFyQWN0dWFsLCBwcmV2aW86dHJ1ZX1dXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgdG9kb3NMb3NCb3RvbmVzID0gbGlzdGFEZUJvdG9uZXNBYnJpci5tYXAoZGVmQm90b249PlxyXG4gICAgICAgICAgICAgICAgICAgIGJvdG9uRm9ybXVsYXJpb0NvblJlc3VtZW4oZGVmQm90b24sIGZlZWRiYWNrQWxsW3RvUGxhaW5Gb3JQayhkZWZCb3Rvbi5mb3JQayldPz97cmVzdW1lbjondmFjaW8nfSwgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2lsbGVybywgcHJvcHMuZm9yUGssIGlkQnV0dG9uLCBmb3JtdWxhcmlvQUFicmlyXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdmFyIGh0bWxTZWNjaW9uPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkU2VjY2lvbikhO1xyXG4gICAgICAgICAgICAgICAgaHRtbFNlY2Npb24uaW5uZXJIVE1MPVwiXCI7XHJcbiAgICAgICAgICAgICAgICBodG1sU2VjY2lvbi5hcHBlbmRDaGlsZChodG1sLmRpdih0b2Rvc0xvc0JvdG9uZXMpLmNyZWF0ZSgpKTtcclxuICAgICAgICAgICAgICAgIC8vYXJyYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFNlY2Npb24pISwgdG9kb3NMb3NCb3RvbmVzKTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSB1bmV4cGVjdGVkKGVycik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVudHJhIGFsIGNhdGNoXCIpXHJcbiAgICAgICAgICAgICAgICBkaXYudGV4dENvbnRlbnQ9J2VzdG8sIEZBTEzDiSAnK2Vycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGlyID0gKGRlZkJvdG9uOkRlZmluaWNpb25Gb3JtdWxhcmlvQWJyaXIpPT57XHJcbiAgICAgICAgaWYoIWNhc2lsbGVyby5zYWx0byl7XHJcbiAgICAgICAgICAgIG9wY2lvbmVzLm1vZG9EaXJlY3RvP1xyXG4gICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5WT0xWRVJfSERSKHt9KSk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHZhciBudWV2YUZvclBrPXsuLi5mb3JQaywgZm9ybXVsYXJpbzppZEZvcm11bGFyaW9EZXN0aW5vfTtcclxuICAgICAgICAgICAgaWYobXVsdGlwbGVGb3JtdWxhcmlvcyl7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGZvclBrIHkgc3VzIGNvbXBvbmVudGVzXHJcbiAgICAgICAgICAgICAgICBudWV2YUZvclBrW251ZXZvQ2FtcG9Qa10gPSBkZWZCb3Rvbi5udW1cclxuICAgICAgICAgICAgICAgIGlmKGRlZkJvdG9uLmVzQWdyZWdhcil7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hCeVBhc3MoYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyx7Zm9yUGs6bnVldmFGb3JQa30pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hCeVBhc3MoYWNjaW9uX2FicmlyX2Zvcm11bGFyaW8se2ZvclBrOm51ZXZhRm9yUGt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5DQU1CSUFSX0ZPUk1VTEFSSU8oe2ZvclBrOm51ZXZhRm9yUGssIGFwaWxhclZ1ZWx0YTp0cnVlfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjb25maXJtYXJGb3J6YXJJcil7c2V0Q29uZmlybWFyRm9yemFySXIoZmFsc2UpfVxyXG4gICAgfTtcclxuICAgIHJldHVybiA8RGVzcGxlZ2FyQ2FzaWxsZXJvIGNhc2lsbGVybz17Y2FzaWxsZXJvfT5cclxuICAgICAgICA8ZGl2IGlkPXtpZFNlY2Npb259PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwic3BlY2lhbC1idXR0b25cIiBpZD17aWRCdXR0b259XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgIGlyKEpTT04ucGFyc2UoKGV2ZW50LnRhcmdldCEgYXMgdW5rbm93biBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdkZWYtYnV0dG9uJykhKSlcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICA+aXIgKGludGVybm8pPC9CdXR0b24+XHJcbiAgICAgICAgPERpYWxvZyBcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibnVlc3Ryby1kaWFsb2dvXCJcclxuICAgICAgICAgICAgb3Blbj17ISFjb25maXJtYXJGb3J6YXJJcn1cclxuICAgICAgICAgICAgb25DbG9zZT17KCk9PnNldENvbmZpcm1hckZvcnphcklyKG51bGwpfVxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJudWVzdHJvLWRpYWxvZ29cIj5cclxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5Pk5vIHNlIHB1ZWRlIGF2YW56YXIgYWwgc2lndWllbnRlIGZvcm11bGFyaW8uPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICAgICAgPFR5cG9ncmFwaHk+UXVpesOhcyBubyB0ZXJtaW7DsyBkZSBjb250ZXN0YXIgbGFzIHByZWd1bnRhcyBjb3JyZXNwb25kaWVudGVzPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICAgICAgPFR5cG9ncmFwaHk+UXVpesOhcyBubyBjb3JyZXNwb25kZSBlbiBiYXNlIGEgbGFzIHJlc3B1ZXN0YXMgb2J0ZW5pZGFzPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPEJ1dHRvbiBjb2xvcj1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpPT5jb25maXJtYXJGb3J6YXJJciAmJiBpcihjb25maXJtYXJGb3J6YXJJcil9PmZvcnphcjwvQnV0dG9uPlxyXG4gICAgICAgICAgICA8QnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHZhcmlhbnQ9XCJjb250YWluZWRcIiBvbkNsaWNrPXsoKT0+c2V0Q29uZmlybWFyRm9yemFySXIobnVsbCl9PkVudGVuZGlkbzwvQnV0dG9uPlxyXG4gICAgICAgIDwvRGlhbG9nPlxyXG4gICAgPC9EZXNwbGVnYXJDYXNpbGxlcm8+XHJcbn1cclxuXHJcbmZ1bmN0aW9uIENhc2lsbGVyb0Rlc2Nvbm9jaWRvKHByb3BzOntjYXNpbGxlcm86Q2FzaWxsZXJvQmFzZSwgZm9yUGs6Rm9yUGt9KXtcclxuICAgIHJldHVybiA8RGVzcGxlZ2FyQ2FzaWxsZXJvIFxyXG4gICAgICAgIGlkPXtgY2FzaWxsZXJvZGVzY29ub2NpZG8tJHtwcm9wcy5jYXNpbGxlcm8uaWRfY2FzaWxsZXJvfWB9XHJcbiAgICAgICAgY2FzaWxsZXJvPXtwcm9wcy5jYXNpbGxlcm8gYXMgQmxvcXVlfVxyXG4gICAgICAgIHN0eWxlPXt7ZGlzcGxheTonbm9uZSd9fVxyXG4gICAgPlxyXG4gICAgICAgIDxUeXBvZ3JhcGh5PlRpcG8gZGUgY2FzaWxsZXJvIG5vIGltcGxlbWVudGFkbzogXCJ7cHJvcHMuY2FzaWxsZXJvLnRpcG9jfVwiIHBhcmEgXCJ7cHJvcHMuY2FzaWxsZXJvLmNhc2lsbGVyb31cIjwvVHlwb2dyYXBoeT5cclxuICAgICAgICA8RW5jYWJlemFkb0Rlc3BsaWVndWUgY2FzaWxsZXJvPXtwcm9wcy5jYXNpbGxlcm8gYXMgQ2FzaWxsZXJvRW5jYWJlemFibGV9IGxlZXI9e2ZhbHNlfSBmb3JQaz17cHJvcHMuZm9yUGt9Lz5cclxuICAgIDwvRGVzcGxlZ2FyQ2FzaWxsZXJvPlxyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTZWxlY3RvclZpdmllbmRhKGZvclBrOkZvclBrKXtcclxuICAgIHJldHVybiB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+e1xyXG4gICAgICAgIHZhciBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZvcm11bGFyaW86IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uY2FzaWxsZXJvcyxcclxuICAgICAgICAgICAgbW9kb0Rlc3BsaWVndWU6IHRydWUgfHwgc3RhdGUubW9kby5kZW1vP3N0YXRlLm9wY2lvbmVzLm1vZG9EZXNwbGllZ3VlOidyZWxldmFtaWVudG8nLFxyXG4gICAgICAgICAgICBtb2RvOiBzdGF0ZS5tb2RvLFxyXG4gICAgICAgICAgICBvcGNpb25lczogc3RhdGUub3BjaW9uZXMsXHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gQ29uanVudG9QcmVndW50YXNEZXNwbGllZ3VlKHByb3BzOntjYXNpbGxlcm86Q29uanVudG9QcmVndW50YXMsIGZvcm11bGFyaW86Rm9ybXVsYXJpbywgZm9yUGs6Rm9yUGt9KXtcclxuICAgIGxldCB7Y2FzaWxsZXJvLCBmb3JQa30gPSBwcm9wcztcclxuICAgIHZhciBpZCA9IGBjb25qdW50by1wcmVndW50YXMtJHtjYXNpbGxlcm8uaWRfY2FzaWxsZXJvfWA7XHJcbiAgICByZWdpc3RyYXJFbGVtZW50byh7XHJcbiAgICAgICAgaWQsIFxyXG4gICAgICAgIGRpcmVjdDp0cnVlLCBcclxuICAgICAgICBmdW46IHJlZ2lzdHJhZG9yRGVWYXJpYWJsZShjYXNpbGxlcm8pXHJcbiAgICB9KVxyXG4gICAgbGV0IG1vZG9EZXNwbGllZ3VlID0gXCJub3JtYWxcIjtcclxuICAgIGxldCBoYWJpbGl0YWRvID0gdHJ1ZTtcclxuICAgIHJldHVybiBoYWJpbGl0YWRvIHx8IG1vZG9EZXNwbGllZ3VlPT0nbWV0YWRhdG9zJz88RGVzcGxlZ2FyQ2FzaWxsZXJvIGlkPXtpZH0gY2FzaWxsZXJvPXtjYXNpbGxlcm99PlxyXG4gICAgICAgIDxFbmNhYmV6YWRvRGVzcGxpZWd1ZSBjYXNpbGxlcm89e2Nhc2lsbGVyb30gZm9yUGs9e2ZvclBrfSBsZWVyPXtjYXNpbGxlcm8ubGVlciE9PWZhbHNlfS8+XHJcbiAgICAgICAgPERlc3BsZWdhckNvbnRlbmlkb0ludGVybm9CbG9xdWVPRm9ybXVsYXJpbyBibG9xdWVPRm9ybXVsYXJpbz17Y2FzaWxsZXJvfSBmb3JtdWxhcmlvPXtwcm9wcy5mb3JtdWxhcmlvfSBmb3JQaz17Zm9yUGt9IG11bHRpcGxlPXtmYWxzZX0vPlxyXG4gICAgPC9EZXNwbGVnYXJDYXNpbGxlcm8+Om51bGw7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIERlc3BsZWdhckNvbnRlbmlkb0ludGVybm9CbG9xdWVPRm9ybXVsYXJpbyhwcm9wczp7YmxvcXVlT0Zvcm11bGFyaW86QmxvcXVlfEZvcm11bGFyaW98Q29uanVudG9QcmVndW50YXMsIGZvcm11bGFyaW86Rm9ybXVsYXJpbywgZm9yUGs6Rm9yUGssIG11bHRpcGxlOmJvb2xlYW59KXtcclxuICAgIHZhciBwYXJjaWFsaXphYmxlID0gcHJvcHMuYmxvcXVlT0Zvcm11bGFyaW8udGlwb2M9PSdGJztcclxuICAgIGNvbnN0IFt2ZXJUb2RvLCBzZXRWZXJUb2RvXSA9IHVzZVN0YXRlKCFwYXJjaWFsaXphYmxlKTtcclxuICAgIGNvbnN0IFtmb3JQa0FjdHVhbCwgc2V0Rm9yUGtBY3R1YWxdID0gdXNlU3RhdGU8SWRDYXNpbGxlcm98bnVsbD4obnVsbCk7XHJcbiAgICBpZihwYXJjaWFsaXphYmxlKXtcclxuICAgICAgICBpZihmb3JQa0FjdHVhbCAhPSBwcm9wcy5ibG9xdWVPRm9ybXVsYXJpby5jYXNpbGxlcm8pe1xyXG4gICAgICAgICAgICBzZXRWZXJUb2RvKGZhbHNlKVxyXG4gICAgICAgICAgICBzZXRGb3JQa0FjdHVhbChwcm9wcy5ibG9xdWVPRm9ybXVsYXJpby5jYXNpbGxlcm8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHVzZUVmZmVjdCgoKT0+e1xyXG4gICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICAgICAgICBzZXRWZXJUb2RvKHRydWUpO1xyXG4gICAgICAgICAgICB9LDI1MClcclxuICAgICAgICAgICAgcmV0dXJuICgpPT57XHJcbiAgICAgICAgICAgICAgICBpZih0aW1lcil7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsaW1pdGVOb1ZlclRvZG8gPSAzO1xyXG4gICAgdXNlRWZmZWN0KCgpPT57XHJcbiAgICAgICAgaWYocHJvcHMuYmxvcXVlT0Zvcm11bGFyaW8udGlwb2M9PSdGJyl7XHJcbiAgICAgICAgICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MocHJvcHMuZm9yUGspO1xyXG4gICAgICAgIH1cclxuICAgIH0sW3RvUGxhaW5Gb3JQayhwcm9wcy5mb3JQayksdmVyVG9kb10pXHJcbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmKHByb3BzLmJsb3F1ZU9Gb3JtdWxhcmlvLnRpcG9jPT0nRicgJiYgdmVyVG9kbyl7XHJcbiAgICAgICAgICAgIHZhciB7c2lndWllbnRlVmFyaWFibGUsIHZhcmlhYmxlQWN0dWFsfSA9IGRpc3BhdGNoQnlQYXNzKGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhLCB7cmVzcHVlc3RhOm51bGwsIHZhcmlhYmxlOk5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTLCBmb3JQazpwcm9wcy5mb3JQa30pO1xyXG4gICAgICAgICAgICBpZih2YXJpYWJsZUFjdHVhbCB8fCBzaWd1aWVudGVWYXJpYWJsZSl7XHJcbiAgICAgICAgICAgICAgICBlbmZvY2FyRWxlbWVudG9EZVZhcmlhYmxlKGNvYWxlc2NlKHZhcmlhYmxlQWN0dWFsIGFzIHN0cmluZ3xudWxsLHNpZ3VpZW50ZVZhcmlhYmxlIGFzIHN0cmluZ3xudWxsKSBhcyBJZFZhcmlhYmxlKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHZhciBmZWVkYmFja1Jvd1ZhbGlkYXRvciA9IGdldEZlZWRiYWNrUm93VmFsaWRhdG9yKClcclxuICAgICAgICAgICAgICAgIGlmKGZlZWRiYWNrUm93VmFsaWRhdG9yW3RvUGxhaW5Gb3JQayhwcm9wcy5mb3JQayldLnJlc3VtZW49PSdvaycpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKClcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiY29udGVuaWRvXCI+XHJcbiAgICAgICAge3ZlclRvZG8/bnVsbDo8ZGl2IHN0eWxlPXt7aGVpZ2h0OlwiNTAwcHhcIiwgdGV4dEFsaWduOidjZW50ZXInLCB2ZXJ0aWNhbEFsaWduOidtaWRkbGUnLCB3aWR0aDonMTAwJScsIHBvc2l0aW9uOlwiZml4ZWRcIiwgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsMTAwLDEwMCwwLjMpJywgZm9udFNpemU6JzIwMCUnfX0gPmNhcmdhbmRvLi4uPC9kaXY+fVxyXG4gICAgICAgIHtwcm9wcy5ibG9xdWVPRm9ybXVsYXJpby5jYXNpbGxlcm9zLm1hcCgoY2FzaWxsZXJvLCBpKT0+e1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gY2FzaWxsZXJvLnRpcG9jKyctJytjYXNpbGxlcm8uaWRfY2FzaWxsZXJvKyctJytpO1xyXG4gICAgICAgICAgICByZXR1cm4gKHZlclRvZG8gfHwgaSA8IGxpbWl0ZU5vVmVyVG9kbz9cclxuICAgICAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm8udGlwb2MgPT0gXCJQXCI/PFByZWd1bnRhRGVzcGxpZWd1ZSBrZXk9e2tleX0gcHJlZ3VudGE9e2Nhc2lsbGVyb30gZm9yUGs9e3Byb3BzLmZvclBrfSBkZXNwbGllZ3VlRW5jYWJlemFkbz17Y2FzaWxsZXJvLmRlc3BsaWVndWVFbmNhYmV6YWRvPz8ocHJvcHMuYmxvcXVlT0Zvcm11bGFyaW8udGlwb2M9PSdDUCc/J2xhdGVyYWwnOidzdXBlcmlvcicpfS8+OlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2lsbGVyby50aXBvYyA9PSBcIkJcIj88QmxvcXVlRGVzcGxpZWd1ZSBrZXk9e2tleX0gYmxvcXVlPXtjYXNpbGxlcm99IGZvcm11bGFyaW89e3Byb3BzLmZvcm11bGFyaW99IGZvclBrPXtwcm9wcy5mb3JQa30vPjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm8udGlwb2MgPT0gXCJGSUxUUk9cIj88RmlsdHJvRGVzcGxpZWd1ZSBrZXk9e2tleX0gZmlsdHJvPXtjYXNpbGxlcm99IGZvclBrPXtwcm9wcy5mb3JQa30vPjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm8udGlwb2MgPT0gXCJCRlwiPzxCb3RvbkZvcm11bGFyaW9EZXNwbGllZ3VlIGtleT17a2V5fSBjYXNpbGxlcm89e2Nhc2lsbGVyb30gZm9ybXVsYXJpbz17cHJvcHMuZm9ybXVsYXJpb30gZm9yUGs9e3Byb3BzLmZvclBrfS8+OlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2lsbGVyby50aXBvYyA9PSBcIkNPTlNcIj88Q29uc2lzdGVuY2lhRGVzcGxpZWd1ZSBrZXk9e2tleX0gY2FzaWxsZXJvPXtjYXNpbGxlcm99IGZvclBrPXtwcm9wcy5mb3JQa30vPjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNpbGxlcm8udGlwb2MgPT0gXCJDUFwiPzxDb25qdW50b1ByZWd1bnRhc0Rlc3BsaWVndWUga2V5PXtrZXl9IGNhc2lsbGVybz17Y2FzaWxsZXJvfSBmb3JtdWxhcmlvPXtwcm9wcy5mb3JtdWxhcmlvfSBmb3JQaz17cHJvcHMuZm9yUGt9Lz46XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzaWxsZXJvLnRpcG9jID09IFwiVEVYVE9cIj88VGV4dG9EZXNwbGllZ3VlIGtleT17a2V5fSBjYXNpbGxlcm89e2Nhc2lsbGVyb30gZm9yUGs9e3Byb3BzLmZvclBrfS8+OlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2lsbGVyby50aXBvYyA9PSBcIkxJQlJFXCI/PExpYnJlRGVzcGxpZWd1ZSBrZXk9e2tleX0gY2FzaWxsZXJvPXtjYXNpbGxlcm99IGZvcm11bGFyaW89e3Byb3BzLmZvcm11bGFyaW99IGZvclBrPXtwcm9wcy5mb3JQa30vPjpcclxuICAgICAgICAgICAgICAgICAgICA8Q2FzaWxsZXJvRGVzY29ub2NpZG8ga2V5PXtrZXl9IGNhc2lsbGVybz17Y2FzaWxsZXJvfSBmb3JQaz17cHJvcHMuZm9yUGt9Lz5cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgOmk9PWxpbWl0ZU5vVmVyVG9kbz9cclxuICAgICAgICAgICAgICAgIDxkaXYga2V5PSckc3Bpbm5lcicgY2xhc3NOYW1lPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Y2FyZ2FuZG8gYmxvcXVlLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDpudWxsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgfTwvZGl2PlxyXG59XHJcblxyXG5mdW5jdGlvbiBCbG9xdWVEZXNwbGllZ3VlKHByb3BzOntibG9xdWU6QmxvcXVlLCBmb3JtdWxhcmlvOkZvcm11bGFyaW8sIGZvclBrOkZvclBrfSl7XHJcbiAgICB2YXIge2Jsb3F1ZSwgZm9yUGt9ID0gcHJvcHM7XHJcbiAgICB2YXIga2V5PWJsb3F1ZS52ZXJfaWQhPSctJyAmJiBibG9xdWUudmVyX2lkIHx8IGJsb3F1ZS5jYXNpbGxlcm87XHJcbiAgICB2YXIgYWN0aXZlU3RlcD0wO1xyXG4gICAgdmFyIG11bHRpcGxlID0gISFibG9xdWUudW5pZGFkX2FuYWxpc2lzO1xyXG4gICAgdmFyIGxpc3RhID0gW3tmb3JQaywga2V5OjAsIG11bHRpcGxlOmZhbHNlfV07XHJcbiAgICB2YXIgaGFiaWxpdGFkb3IgPSBibG9xdWUuZXhwcmVzaW9uX2hhYmlsaXRhcl9qcz9nZXRGdW5jaW9uSGFiaWxpdGFyKGJsb3F1ZS5leHByZXNpb25faGFiaWxpdGFyX2pzKTooKT0+dHJ1ZTtcclxuICAgIHZhciB7bW9kb0Rlc3BsaWVndWV9ID0gdXNlU2VsZWN0b3JWaXZpZW5kYShmb3JQayk7XHJcbiAgICBpZihtdWx0aXBsZSl7XHJcbiAgICAgICAgLy8gVE9ETzogR0VORVJBTElaQVJcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFxyXG4gICAgICAgIC8vIGxpc3RhPXJlc3B1ZXN0YXMucGVyc29uYXMubWFwKChfcGVyc29uYSwgaSk9PihcclxuICAgICAgICAvLyAgICAge2ZvclBrOnsuLi5mb3JQaywgcGVyc29uYTppKzF9LCBrZXk6aSsxLCBtdWx0aXBsZTp0cnVlfVxyXG4gICAgICAgIC8vICkpXHJcbiAgICB9XHJcbiAgICB2YXIgaWQgPSBgYmxvcXVlLSR7YmxvcXVlLmlkX2Nhc2lsbGVyb31gO1xyXG4gICAgcmVnaXN0cmFyRWxlbWVudG8oe1xyXG4gICAgICAgIGlkLFxyXG4gICAgICAgIHN0eWxlOidkaXNwbGF5JyxcclxuICAgICAgICBmdW46IChyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT4gaGFiaWxpdGFkb3IocmVzcHVlc3RhcykgfHwgbW9kb0Rlc3BsaWVndWU9PSdtZXRhZGF0b3MnPyd1bnNldCc6J25vbmUnXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIDxEZXNwbGVnYXJDYXNpbGxlcm8gY2FzaWxsZXJvPXtibG9xdWV9IG51ZXN0cm8tYmxvcXVlPXtibG9xdWUuaWRfY2FzaWxsZXJvfSBlcy1tdWx0aXBsZT17bXVsdGlwbGU/J1NJJzonTk8nfSBpZD17aWR9PlxyXG4gICAgICAgIDxFbmNhYmV6YWRvRGVzcGxpZWd1ZSBjYXNpbGxlcm89e2Jsb3F1ZX0gZm9yUGs9e2ZvclBrfS8+XHJcbiAgICAgICAge2xpc3RhLm1hcCgoe2tleSwgZm9yUGssIG11bHRpcGxlfSk9PlxyXG4gICAgICAgICAgICA8RGVzcGxlZ2FyQ29udGVuaWRvSW50ZXJub0Jsb3F1ZU9Gb3JtdWxhcmlvIGtleT17a2V5fSBibG9xdWVPRm9ybXVsYXJpbz17YmxvcXVlfSBmb3JtdWxhcmlvPXtwcm9wcy5mb3JtdWxhcmlvfSBmb3JQaz17Zm9yUGt9IG11bHRpcGxlPXttdWx0aXBsZX0vPlxyXG4gICAgICAgICl9XHJcbiAgICA8L0Rlc3BsZWdhckNhc2lsbGVybz47XHJcbn1cclxuXHJcbmNvbnN0IEZvcm11bGFyaW9FbmNhYmV6YWRvID0gRGVzcGxpZWd1ZUVuY2FiZXphZG87XHJcblxyXG5mdW5jdGlvbiBNZW51TGV0cmEocHJvcHM6e3RhbWFubmlvOm51bWJlciwgZGVub21pbmFjaW9uOnN0cmluZ30pe1xyXG4gICAgY29uc3QgY2FtYmlhckxldHJhID0gKHRhbWFubmlvOm51bWJlcik9PntcclxuICAgICAgICB2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICByb290LnN0eWxlLmZvbnRTaXplPXRhbWFubmlvK1wicHhcIjtcclxuICAgIH1cclxuICAgIHJldHVybiA8TWVudUl0ZW1cclxuICAgICAgICBvbkNsaWNrPXsoKT0+Y2FtYmlhckxldHJhKHByb3BzLnRhbWFubmlvKX0gc3R5bGU9e3tmb250U2l6ZTpwcm9wcy50YW1hbm5pbysncHgnfX1cclxuICAgID5sZXRyYSB7cHJvcHMuZGVub21pbmFjaW9ufTwvTWVudUl0ZW0+XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEZhc3RTZXR0dXAoKXtcclxuICAgIGNvbnN0IFthbmNob3JFbCwgc2V0QW5jaG9yRWxdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XHJcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChldmVudDphbnkpID0+IHtcclxuICAgICAgICBzZXRBbmNob3JFbChldmVudC5jdXJyZW50VGFyZ2V0KTtcclxuICAgICAgICBzZXRPcGVuKChwcmV2KSA9PiAhcHJldik7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY2FtYmlhciA9IChtb2RvRGVzcGxpZWd1ZTpNb2RvRGVzcGxpZWd1ZSk9PntcclxuICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5NT0RPX0RFU1BMSUVHVUUoe21vZG9EZXNwbGllZ3VlfSkpO1xyXG4gICAgICAgIHNldE9wZW4oZmFsc2UpXHJcbiAgICB9XHJcbiAgICBjb25zdCBvcGNpb25lcyA9IHVzZVNlbGVjdG9yKChzdGF0ZTpDYXNvU3RhdGUpPT5zdGF0ZS5vcGNpb25lcylcclxuICAgIHJldHVybiA8PlxyXG4gICAgICAgIDxCdXR0b24gb25DbGljaz17aGFuZGxlQ2xpY2t9PlxyXG4gICAgICAgICAgICA8SUNPTi5TZXR0aW5ncy8+XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgPE1lbnUgb3Blbj17b3Blbn0gYW5jaG9yRWw9e2FuY2hvckVsfSBvbkNsb3NlPXsoKT0+c2V0T3BlbihmYWxzZSl9PlxyXG4gICAgICAgICAgICA8TWVudUl0ZW0gb25DbGljaz17KCk9PmNhbWJpYXIoXCJyZWxldmFtaWVudG9cIil9Pm5vcm1hbDwvTWVudUl0ZW0+XHJcbiAgICAgICAgICAgIDxNZW51SXRlbSBvbkNsaWNrPXsoKT0+Y2FtYmlhcihcIlBERlwiICAgICAgICAgKX0+UERGIHBhcmEgcmVsZXZhbWllbnRvPC9NZW51SXRlbT5cclxuICAgICAgICAgICAgPE1lbnVJdGVtIG9uQ2xpY2s9eygpPT5jYW1iaWFyKFwibWV0YWRhdG9zXCIgICApfT5yZXZpc2FyIG1ldGFkYXRvczwvTWVudUl0ZW0+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICAgICAgPE1lbnVMZXRyYSB0YW1hbm5pbz17MTJ9IGRlbm9taW5hY2lvbiA9IFwibXV5IGNoaWNhXCIvPlxyXG4gICAgICAgICAgICA8TWVudUxldHJhIHRhbWFubmlvPXsxNH0gZGVub21pbmFjaW9uID0gXCJjaGljYVwiLz5cclxuICAgICAgICAgICAgPE1lbnVMZXRyYSB0YW1hbm5pbz17MTZ9IGRlbm9taW5hY2lvbiA9IFwibm9ybWFsXCIvPlxyXG4gICAgICAgICAgICA8TWVudUxldHJhIHRhbWFubmlvPXsxOX0gZGVub21pbmFjaW9uID0gXCJncmFuZGVcIi8+XHJcbiAgICAgICAgICAgIDxNZW51TGV0cmEgdGFtYW5uaW89ezIyfSBkZW5vbWluYWNpb24gPSBcImVub3JtZVwiLz5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgICAgICA8TWVudUl0ZW0+PGxhYmVsPjxDaGVja2JveCBjaGVja2VkPXtvcGNpb25lcy5jb25DYW1wb09wY2lvbmVzfSBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAoKT0+ZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX09QQ0lPTih7b3BjaW9uOidjb25DYW1wb09wY2lvbmVzJywgdmFsb3I6IW9wY2lvbmVzLmNvbkNhbXBvT3BjaW9uZXN9KSlcclxuICAgICAgICAgICAgfSBpbnB1dFByb3BzPXt7ICdhcmlhLWxhYmVsJzogJ3ByaW1hcnkgY2hlY2tib3gnIH19Lz5jYW1wbyBvcGNpb25lczwvbGFiZWw+PC9NZW51SXRlbT5cclxuICAgICAgICAgICAgPE1lbnVJdGVtPjxsYWJlbD48Q2hlY2tib3ggY2hlY2tlZD17b3BjaW9uZXMuc2FsdG9BdXRvbWF0aWNvfSBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAoKT0+ZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX09QQ0lPTih7b3BjaW9uOidzYWx0b0F1dG9tYXRpY28nLCB2YWxvcjohb3BjaW9uZXMuc2FsdG9BdXRvbWF0aWNvfSkpXHJcbiAgICAgICAgICAgIH0gaW5wdXRQcm9wcz17eyAnYXJpYS1sYWJlbCc6ICdwcmltYXJ5IGNoZWNrYm94JyB9fS8+c2FsdG8gYXV0b23DoXRpY288L2xhYmVsPjwvTWVudUl0ZW0+XHJcbiAgICAgICAgPC9NZW51PlxyXG4gICAgPC8+O1xyXG59XHJcblxyXG5mdW5jdGlvbiBCYXJyYURlTmF2ZWdhY2lvbihwcm9wczp7Zm9yUGs6Rm9yUGssIHNvbG9MZWN0dXJhOmJvb2xlYW4sIG1vZG9EaXJlY3RvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IGZvclBrID0gcHJvcHMuZm9yUGs7XHJcbiAgICBjb25zdCB7b3BjaW9uZXN9ID0gdXNlU2VsZWN0b3JWaXZpZW5kYShmb3JQayk7XHJcbiAgICBjb25zdCBbY29uZmlybWFDZXJyYXIsIHNldENvbmZpcm1hQ2VycmFyXSA9IHVzZVN0YXRlPGJvb2xlYW58bnVsbD4oZmFsc2UpO1xyXG4gICAgdmFyIGRvbWluaW8gPSBnZXREYXRvc0J5UGFzcygpLmluZm9ybWFjaW9uSGRyW2ZvclBrLnZpdmllbmRhXS50ZW0uZG9taW5pbztcclxuICAgIHZhciBjZXJyYXJEaXJlY3RvID0gYXN5bmMgZnVuY3Rpb24oKXtcclxuICAgICAgICByZW1vdmVDU1NCeUlkKEJPT1RTVFJBUF81XzFfM19TUkMpO1xyXG4gICAgICAgIHZhciBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIGdvdG9Db25zaXN0aXIoXHJcbiAgICAgICAgICAgIGVzdHJ1Y3R1cmEub3BlcmF0aXZvIGFzIElkT3BlcmF0aXZvLFxyXG4gICAgICAgICAgICBnZXREYXRvc0J5UGFzcygpLmluZm9ybWFjaW9uSGRyW2ZvclBrLnZpdmllbmRhXS50YXJlYS50YXJlYSxcclxuICAgICAgICAgICAgZm9yUGsudml2aWVuZGFcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vdmFyIGhhc2g9bmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5oYXNoPy5yZXBsYWNlKC9eXFwjLywnJykuc3BsaXQoJyZhdXRvcHJvY2VkJylbMF0pO1xyXG4gICAgICAgIC8vLy9oYXNoLmRlbGV0ZSgnYXV0b3Byb2NlZCcpXHJcbiAgICAgICAgLy9jbG9zZSgpO1xyXG4gICAgICAgIC8vbG9jYXRpb24uaGFzaD1oYXNoLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICB2YXIgYm90b25lc0Zvcm11bGFyaW89W107XHJcbiAgICBpZighb3BjaW9uZXMubW9kb0RpcmVjdG8pe1xyXG4gICAgICAgIGJvdG9uZXNGb3JtdWxhcmlvLnB1c2goe3F1ZTogJ2hkcicgICAgLCBhYnI6J0hkUicsIGxhYmVsOidob2phIGRlIHJ1dGEnLCByZXRyb2Nlc286MH0pXHJcbiAgICB9XHJcbiAgICBvcGNpb25lcy5waWxhRm9yUGsuZm9yRWFjaCgoZm9yUGssaSk9PlxyXG4gICAgICAgIGJvdG9uZXNGb3JtdWxhcmlvLnB1c2goe3F1ZTondm9sdmVyJywgYWJyOmZvclBrLmZvcm11bGFyaW8ucmVwbGFjZSgvXkY6LywnJyksIGxhYmVsOmZvclBrLmZvcm11bGFyaW8sIHJldHJvY2VzbzpvcGNpb25lcy5waWxhRm9yUGsubGVuZ3RoLWl9KVxyXG4gICAgKVxyXG4gICAgYm90b25lc0Zvcm11bGFyaW8ucHVzaCh7cXVlOicnLCBhYnI6Zm9yUGsuZm9ybXVsYXJpby5yZXBsYWNlKC9eRjovLCcnKSwgbGFiZWw6Zm9yUGsuZm9ybXVsYXJpbywgcmV0cm9jZXNvOjB9KTtcclxuICAgIHJldHVybiA8PlxyXG4gICAgICAgIDxCdXR0b25Hcm91cCBrZXk9XCJmb3JtdWxhcmlvc1wiIGNsYXNzTmFtZT1cImJhcnJhLW5hdmVnYWNpb25cIiBzb2xvLWxlY3R1cmE9e3Byb3BzLnNvbG9MZWN0dXJhPydzaSc6J25vJ30gPlxyXG4gICAgICAgICAgICB7Ym90b25lc0Zvcm11bGFyaW8ubWFwKChiLGkpPT5cclxuICAgICAgICAgICAgICAgIDxCdXR0b24gY29sb3I9e2IucXVlPT1mb3JQay5mb3JtdWxhcmlvP1wicHJpbWFyeVwiOlwiaW5oZXJpdFwifSB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGtleT17YCR7aX0tJHtiLnF1ZX0tJHtiLnJldHJvY2Vzb31gfVxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshYi5xdWV9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIucXVlPT0naGRyJz9kaXNwYXRjaGVycy5WT0xWRVJfSERSKHt9KTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJzLlZPTFZFUl9ERV9GT1JNVUxBUklPKHttYWduaXR1ZFJldHJvY2VzbzpiLnJldHJvY2Vzb30pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWJyXCI+e2IuYWJyfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJsYWJlbFwiPntiLmxhYmVsfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvQnV0dG9uR3JvdXA+XHJcbiAgICAgICAge3Byb3BzLnNvbG9MZWN0dXJhPzxUeXBvZ3JhcGh5IGNvbXBvbmVudD1cInNwYW5cIiBzdHlsZT17e21hcmdpbjonMCAxMHB4J319PiAoU29sbyBMZWN0dXJhKSA8L1R5cG9ncmFwaHk+Om51bGx9XHJcbiAgICAgICAge3Byb3BzLm1vZG9EaXJlY3RvP1xyXG4gICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgPEJ1dHRvbkdyb3VwIGtleT1cInZvbHZlcl95X2dyYWJhclwiIHN0eWxlPXt7bWFyZ2luOicwIDAgMCAzMHB4J319PlxyXG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJpbmhlcml0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb3BzLnNvbG9MZWN0dXJhIHx8ICFnZXREaXJ0eSgpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyYXJEaXJlY3RvKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb25maXJtYUNlcnJhcih0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPElDT04uRXhpdFRvQXBwLz5cclxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8RGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW49eyEhY29uZmlybWFDZXJyYXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaGFjZSBxdWUgbm8gc2UgY2llcnJlIGVsIG1lbnNhamVcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbG9zZT17KCk9PnNldENvbmZpcm1hQ2VycmFyKGZhbHNlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiYWxlcnQtZGlhbG9nLXRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RGlhbG9nVGl0bGUgaWQ9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj5Db25maXJtZSBjaWVycmUgZGUgZW5jdWVzdGE8L0RpYWxvZ1RpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RGlhbG9nQ29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEaWFsb2dDb250ZW50VGV4dCBpZD1cImFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdMOhIHBvciBzYWxpciBkZSBsYSBlbmN1ZXN0YSwgc2UgcGVyZGVyw6FuIGxvcyBjYW1iaW9zIG5vIGd1YXJkYWRvcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRGlhbG9nQ29udGVudFRleHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRGlhbG9nQ29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERpYWxvZ0FjdGlvbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnJhckRpcmVjdG8oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjYXJ0YXIgY2FtYmlvcyB5IGNlcnJhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpcm1hQ2VycmFyKGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhciBlZGl0YW5kbyBlbmN1ZXN0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9EaWFsb2dBY3Rpb25zPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvRGlhbG9nPlxyXG4gICAgICAgICAgICAgICAgICAgIHtwcm9wcy5zb2xvTGVjdHVyYT9udWxsOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD17XCJzYXZlLWJ1dHRvblwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJpbmhlcml0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpPT50cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNPTi5TYXZlLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9CdXR0b25Hcm91cD5cclxuICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgOm51bGx9XHJcbiAgICAgICAgPFR5cG9ncmFwaHkgY2xhc3NOYW1lPVwibW9zdHJhci1mb3JQa1wiIGNvbXBvbmVudD1cInNwYW5cIiBzdHlsZT17e21hcmdpbjonMCAxMHB4J319PiBcclxuICAgICAgICAgICAge1ZFUl9ET01JTklPPzxkaXYga2V5PXtkb21pbmlvfT48c3Bhbj5kb21pbmlvPC9zcGFuPjxzcGFuPntkb21pbmlvfTwvc3Bhbj48L2Rpdj46Jyd9XHJcbiAgICAgICAgICAgIHtsaWtlQXIocHJvcHMuZm9yUGspLmZpbHRlcigoXyxrKT0+ayE9J2Zvcm11bGFyaW8nKS5tYXAoKHYsayk9PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBrZXk9e2t9PjxzcGFuPntrfTwvc3Bhbj48c3Bhbj57dn08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICkuYXJyYXkoKX0gXHJcbiAgICAgICAgPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgIDxGYXN0U2V0dHVwLz5cclxuICAgIDwvPlxyXG59XHJcblxyXG5mdW5jdGlvbiBCb3RvblZvbHZlckVuRGl2KHtpZH06e2lkOnN0cmluZ30pe1xyXG4gICAgdmFyIHtvcGNpb25lc30gPSB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+KHtvcGNpb25lczpzdGF0ZS5vcGNpb25lc30pKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImRpdi1ib3Rvbi12b2x2ZXJcIj5cclxuICAgICAgICB7b3BjaW9uZXMucGlsYUZvclBrLmxlbmd0aD4wP1xyXG4gICAgICAgIDxCdXR0b24gaWQ9e2lkfSBjbGFzc05hbWU9XCJib3Rvbi12b2x2ZXJcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKT0+ZGlzcGF0Y2goZGlzcGF0Y2hlcnMuVk9MVkVSX0RFX0ZPUk1VTEFSSU8oe21hZ25pdHVkUmV0cm9jZXNvOjF9KSl9XHJcbiAgICAgICAgPiA8SUNPTi5DaGV2cm9uTGVmdC8+IFZvbHZlcjwvQnV0dG9uPlxyXG4gICAgICAgIDpudWxsfVxyXG4gICAgPC9kaXY+XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEZvcm11bGFyaW9EZXNwbGllZ3VlKHByb3BzOntmb3JQazpGb3JQa30pe1xyXG4gICAgdmFyIGZvclBrID0gcHJvcHMuZm9yUGs7XHJcbiAgICB2YXIge2Zvcm11bGFyaW8sIG1vZG9EZXNwbGllZ3VlLCBtb2RvLCBvcGNpb25lc30gXHJcbiAgICAgICAgPSB1c2VTZWxlY3RvclZpdmllbmRhKHByb3BzLmZvclBrKTtcclxuICAgIHZhciBzb2xvTGVjdHVyYSA9IGdldERhdG9zQnlQYXNzKCkuc29sb0xlY3R1cmE7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICB1c2VFZmZlY3QoKCk9PntcclxuICAgICAgICB2YXIgY29udHJvbFNjcm9sbD0oKT0+e1xyXG4gICAgICAgICAgICB2YXIgYXJyaWJhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhYi1hY3Rpdm8tYXJyaWJhJyk7XHJcbiAgICAgICAgICAgIGlmKGFycmliYSl7XHJcbiAgICAgICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGFycmliYS5zdHlsZSwgJ3Zpc2liaWxpdHknLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICBhcnJpYmEuZWxUb3BWaXNpYmlsaXphciAhPW51bGwgJiYgYXJyaWJhLmVsVG9wVmlzaWJpbGl6YXIgKyAxMCBcclxuICAgICAgICAgICAgICAgICAgICA8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYWJham8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hYmFqbycpO1xyXG4gICAgICAgICAgICBpZihhYmFqbyl7XHJcbiAgICAgICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGFiYWpvLnN0eWxlLCAndmlzaWJpbGl0eScsIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICBhYmFqby5lbEJvdHRvbVZpc2liaWxpemFyICE9IG51bGwgJiYgYWJham8uZWxCb3R0b21WaXNpYmlsaXphciAtIDIwXHJcbiAgICAgICAgICAgICAgICAgICAgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICsgd2luZG93LmlubmVySGVpZ2h0ICogMC43ID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGNvbnRyb2xTY3JvbGwpO1xyXG4gICAgICAgIGNvbnRyb2xTY3JvbGwoKTtcclxuICAgICAgICByZXR1cm4gKCk9PntcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGNvbnRyb2xTY3JvbGwpO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbiAgICAvLyBUT0RPIFZvbHZlciBhIHBvbmVyIGVsIG1vdmltaWVudG8gYSBsYSBhY3R1YWxcclxuICAgIHZhciBhY3R1YWw6YW55XHJcbiAgICB2YXIgY29tcGxldG86YW55XHJcbiAgICB2YXIgb25DbGlja1NhbHRhckFjdHVhbCA9ICgpPT57XHJcbiAgICAgICAgdmFyIHt2YXJpYWJsZUFjdHVhbH0gPSBkaXNwYXRjaEJ5UGFzcyhhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YSwge3Jlc3B1ZXN0YTpudWxsLCB2YXJpYWJsZTpOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUywgZm9yUGs6cHJvcHMuZm9yUGt9KTtcclxuICAgICAgICBpZih2YXJpYWJsZUFjdHVhbCl7XHJcbiAgICAgICAgICAgIGVuZm9jYXJFbGVtZW50b0RlVmFyaWFibGUodmFyaWFibGVBY3R1YWwpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIGxpc3RhTW9kb3M6TW9kb0Rlc3BsaWVndWVbXT1bJ21ldGFkYXRvcycsJ3JlbGV2YW1pZW50bycsJ1BERiddO1xyXG4gICAgWydib3Rvbi12b2x2ZXItMScsICdib3Rvbi12b2x2ZXItMiddLmZvckVhY2goaWQ9PntcclxuICAgICAgICByZWdpc3RyYXJFbGVtZW50byh7aWQsIGF0dHI6J3Jlc3VtZW4tZXN0YWRvJywgZnVuOihfOlJlc3B1ZXN0YXMsIGZlZWRiYWNrRm9ybTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4pPT4oXHJcbiAgICAgICAgICAgIGZlZWRiYWNrRm9ybS5yZXN1bWVuXHJcbiAgICAgICAgKX0pXHJcbiAgICB9KVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBlc3BlY2lhbCBoYXkgcXVlIGxlZXJsbyBlbiBlbCBwYXJzZXIgZGUgY2FzaWxsZXJvcyBzaSBlc3RvIHRlcm1pbmEgcXVlZGFuZG8gYXPDrVxyXG4gICAgdmFyIHBhbnRhbGxhQ29tcGxldGEgPSBmb3JtdWxhcmlvLmVzcGVjaWFsPy5wYW50YWxsYUNvbXBsZXRhO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAgICA8QXBwQmFyIHBvc2l0aW9uPVwiZml4ZWRcIiBjb2xvcj17c29sb0xlY3R1cmE/J3NlY29uZGFyeSc6J3ByaW1hcnknfT5cclxuICAgICAgICAgICAgICAgIDxUb29sYmFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCYXJyYURlTmF2ZWdhY2lvbiBmb3JQaz17Zm9yUGt9IHNvbG9MZWN0dXJhPXtzb2xvTGVjdHVyYSB8fCBmYWxzZX0gbW9kb0RpcmVjdG89e29wY2lvbmVzLm1vZG9EaXJlY3RvfS8+XHJcbiAgICAgICAgICAgICAgICA8L1Rvb2xiYXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibWluaS1jb25zb2xlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvQXBwQmFyPlxyXG4gICAgICAgICAgICA8bWFpbj5cclxuICAgICAgICAgICAgICAgIDxQYXBlciBjbGFzc05hbWU9XCJmb3JtdWxhcmlvXCIgbW9kby1kZXNwbGllZ3VlPXttb2RvRGVzcGxpZWd1ZX0gdmVyLW51bS1vcGNpb25lcz17b3BjaW9uZXMuY29uQ2FtcG9PcGNpb25lcz8nU0knOidOTyd9PlxyXG4gICAgICAgICAgICAgICAgICAgIHttb2RvLmRlbW8/PGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgY29tcG9uZW50PVwic3BhblwiPk1vZG8gZGUgZGVzcGxpZWd1ZTo8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25Hcm91cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2xpc3RhTW9kb3MubWFwKG1vZG89PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBrZXk9e21vZG99IHZhcmlhbnQ9e21vZG89PW1vZG9EZXNwbGllZ3VlP1wiY29udGFpbmVkXCI6XCJvdXRsaW5lZFwifSBvbkNsaWNrPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKT0+ZGlzcGF0Y2goZGlzcGF0Y2hlcnMuTU9ET19ERVNQTElFR1VFKHttb2RvRGVzcGxpZWd1ZTptb2RvfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Pnttb2RvfTwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbkdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgIHtwYW50YWxsYUNvbXBsZXRhP251bGw6PEJvdG9uVm9sdmVyRW5EaXYgaWQ9XCJib3Rvbi12b2x2ZXItMVwiLz59XHJcbiAgICAgICAgICAgICAgICAgICAge3BhbnRhbGxhQ29tcGxldGE/bnVsbDo8Rm9ybXVsYXJpb0VuY2FiZXphZG8gY2FzaWxsZXJvPXtmb3JtdWxhcmlvfS8+fVxyXG4gICAgICAgICAgICAgICAgICAgIDxEZXNwbGVnYXJDb250ZW5pZG9JbnRlcm5vQmxvcXVlT0Zvcm11bGFyaW8gYmxvcXVlT0Zvcm11bGFyaW89e2Zvcm11bGFyaW99IGZvcm11bGFyaW89e2Zvcm11bGFyaW99IGZvclBrPXtmb3JQa30gbXVsdGlwbGU9e2ZhbHNlfS8+XHJcbiAgICAgICAgICAgICAgICAgICAge3BhbnRhbGxhQ29tcGxldGE/bnVsbDo8Qm90b25Wb2x2ZXJFbkRpdiBpZD1cImJvdG9uLXZvbHZlci0yXCIvPn1cclxuICAgICAgICAgICAgICAgIDwvUGFwZXI+XHJcbiAgICAgICAgICAgICAgICA8RmFiIGlkPSdmYWItYWN0aXZvLWFycmliYScgY29sb3I9XCJwcmltYXJ5XCIgYXJpYS1sYWJlbD1cImFkZFwiIG9uQ2xpY2s9e29uQ2xpY2tTYWx0YXJBY3R1YWx9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxJQ09OLktleWJvYXJkQXJyb3dVcCAvPlxyXG4gICAgICAgICAgICAgICAgPC9GYWI+XHJcbiAgICAgICAgICAgICAgICA8RmFiIGlkPSdmYWItYWN0aXZvLWFiYWpvJyBjb2xvcj1cInByaW1hcnlcIiBhcmlhLWxhYmVsPVwiYWRkXCIgb25DbGljaz17b25DbGlja1NhbHRhckFjdHVhbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uS2V5Ym9hcmRBcnJvd0Rvd24gLz5cclxuICAgICAgICAgICAgICAgIDwvRmFiPlxyXG4gICAgICAgICAgICAgICAgPEZhYiBpZD0nZmFiLWVycm9yLWFycmliYScgdmFyaWFudD1cImV4dGVuZGVkXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiZWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxJQ09OLk5hdmlnYXRpb24gLz5cclxuICAgICAgICAgICAgICAgICAgICBFcnJvclxyXG4gICAgICAgICAgICAgICAgPC9GYWI+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPEZhYiBpZD0nZmFiLWVycm9yLWFiYWpvJyB2YXJpYW50PVwiZXh0ZW5kZWRcIiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJlZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uTmF2aWdhdGlvbkRvd24gLz5cclxuICAgICAgICAgICAgICAgICAgICBFcnJvclxyXG4gICAgICAgICAgICAgICAgPC9GYWI+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2VzcGFjaW8tZmluYWwtZm9ybXVsYXJpbyc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7b3BjaW9uZXMubW9kb0JvcnJhclJlc3B1ZXN0YSAmJiBvcGNpb25lcy5mb3JQaz88RGVzcGxlZ2FyQ29uZmlybWFyQm9ycmFyUmVzcHVlc3RhIGZvclBrPXtvcGNpb25lcy5mb3JQa30gdmFyaWFibGVCb3JyYXI9e29wY2lvbmVzLm1vZG9Cb3JyYXJSZXNwdWVzdGF9Lz46bnVsbH1cclxuICAgICAgICAgICAgPC9tYWluPlxyXG4gICAgICAgIDwvPlxyXG4gICAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEF0cmlidXRvKHByb3BzOntub21icmU6c3RyaW5nLCB2YWxvcjphbnl9KXtcclxuICAgIHJldHVybiBwcm9wcy52YWxvciE9bnVsbCAmJiBwcm9wcy52YWxvciE9Jyc/PHNwYW4gY2xhc3NOYW1lPVwiYXRyaWJ1dG8tcGFyXCI+XHJcbiAgICAgICAge3Byb3BzLm5vbWJyZT88c3BhbiBjbGFzc05hbWU9XCJhdHJpYnV0by1ub21icmVcIj57cHJvcHMubm9tYnJlfTwvc3Bhbj46bnVsbH1cclxuICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYXRyaWJ1dG8tdmFsb3JcIj57cHJvcHMudmFsb3IudG9TdHJpbmcoKX08L3NwYW4+XHJcbiAgICA8L3NwYW4+Om51bGxcclxufVxyXG5cclxuY29uc3QgbGlzdGFFc3RhZG9zQ2FyZ2E6RXN0YWRvQ2FyZ2FbXT1bJ3Jlc3VtZW4nLCdyZWxldmFtaWVudG8nLCdyZWNpYm8nXTtcclxudmFyIHJlc3VtaWRvcmVzID0gW1xyXG4gICAge25vbWJyZTonUkVBJyAgICAgICAgICwgZjoocnI6UmVzcHVlc3Rhc1JhaXopPT5yci5yZXN1bWVuRXN0YWRvPT1cIm9rXCIgICAgICAgICAgfSxcclxuICAgIHtub21icmU6J0NpdGEgcGFjdGFkYScsIGY6KHJyOlJlc3B1ZXN0YXNSYWl6KT0+cnIucmVzdW1lbkVzdGFkbz09XCJjaXRhIHBhY3RhZGFcIn0sXHJcbiAgICB7bm9tYnJlOidQZW5kaWVudGVzJyAgLCBmOihycjpSZXNwdWVzdGFzUmFpeik9PnJyLnJlc3VtZW5Fc3RhZG89PVwidmFjaW9cIiAgICAgICB9LFxyXG5dO1xyXG5cclxucmVzdW1pZG9yZXMucHVzaChcclxuICAgIHtub21icmU6J090cm9zJywgZjpyZXN1bWlkb3Jlcy5yZWR1Y2UoKGcscik9Pihycj0+IXIuZihycikgJiYgZyhycikgKSwoXzpSZXNwdWVzdGFzUmFpeik9PnRydWUpIH1cclxuKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIERlc3BsZWdhckxpbmVhUmVzdW1lblVBUHJpbmNpcGFsKHByb3BzOntcclxuICAgIG51bVZpdmllbmRhOklkRW5jLFxyXG4gICAgZm9ybVByaW5jaXBhbDpJZEZvcm11bGFyaW8sXHJcbiAgICB0YXJlYTogc3RyaW5nLFxyXG4gICAgcmVzcHVlc3RhczpSZXNwdWVzdGFzUmFpeixcclxufSl7XHJcbiAgICBjb25zdCB7bnVtVml2aWVuZGEsIHJlc3B1ZXN0YXMsIGZvcm1QcmluY2lwYWwsIHRhcmVhfSA9IHByb3BzO1xyXG4gICAgY29uc3QgaWQ9J3Zpdi0nK251bVZpdmllbmRhO1xyXG4gICAgY29uc3QgZm9yUGs6Rm9yUGs9e2Zvcm11bGFyaW86Zm9ybVByaW5jaXBhbCwgdml2aWVuZGE6TnVtYmVyKG51bVZpdmllbmRhKSBhcyBJZEVuY307IC8vbm8gcXVpdGFyIGVsIGNhc3RlbyBwb3JxdWUgdmllbmUgY29tbyB0ZXh0byB5IG5lY2VzaXRvIHF1ZSBzZWEgbsO6bWVyb1xyXG4gICAgdmFyIHRlbSA9IGdldERhdG9zQnlQYXNzKCkuaW5mb3JtYWNpb25IZHJbbnVtVml2aWVuZGFdLnRlbTtcclxuICAgIHZhciBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICB1c2VFZmZlY3QoKCk9PntcclxuICAgICAgICB2b2xjYWRvSW5pY2lhbEVsZW1lbnRvc1JlZ2lzdHJhZG9zKGZvclBrKTtcclxuICAgICAgICBpbnRlbnRhckJhY2t1cChmb3JQaylcclxuICAgIH0pXHJcbiAgICByZWdpc3RyYXJFbGVtZW50byh7aWQsIGRpcmVjdDp0cnVlLFxyXG4gICAgICAgIGZ1bjooXHJcbiAgICAgICAgICAgIHI6UmVzcHVlc3RhcywgXHJcbiAgICAgICAgICAgIF9mZWVkYmFja0Zvcm06IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+LCBcclxuICAgICAgICAgICAgZWxlbWVudG86SFRNTERpdkVsZW1lbnQsIFxyXG4gICAgICAgICAgICBmZWVkYmFja0FsbDp7W2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj59LCBcclxuICAgICAgICAgICAgX2VzdHJ1Y3R1cmE6RXN0cnVjdHVyYVxyXG4gICAgICAgICk9PntcclxuICAgICAgICAgICAgLy9wcmVndW50byBzaSBlcyBsYSBtaXNtYSB2aXZpZW5kYSBwb3JxdWUgbGEgZnVuY2lvbiBzZSBkaXNwYXJhIFxyXG4gICAgICAgICAgICAvL2NvbiB0b2RhcyBsYXMgY29tYmluYWNpb25lcyBkZSByZXNwdWVzdGFzIHBhcmEgY2FkYSBmb3JQa1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgdml2aWVuZGEgZXhpc3RlXHJcbiAgICAgICAgICAgIGlmKHIudml2aWVuZGEgPT0gZm9yUGsudml2aWVuZGEpe1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudG8uc2V0QXR0cmlidXRlKCdyZXN1bWVuLWVzdGFkbycsY2FsY3VsYXJSZXN1bWVuVml2aWVuZGEoZm9yUGssIGZlZWRiYWNrQWxsLCByKS5yZXN1bWVuRXN0YWRvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIDxUYWJsZVJvdyBrZXk9e251bVZpdmllbmRhfT5cclxuICAgICAgICA8VGFibGVDZWxsPlxyXG4gICAgICAgICAgICB7dGVtP1xyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8RGVzcGxlZ2FyVGVtIHRlbT17dGVtfS8+XHJcbiAgICAgICAgICAgICAgICAgICAge3Jlc3B1ZXN0YXNbJ3Jlc3VtZW5Fc3RhZG8nIGFzIElkVmFyaWFibGVdPT1cImNpdGEgcGFjdGFkYVwiP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RGVzcGxlZ2FyQ2l0YVBhY3RhZGEgcmVzcHVlc3Rhcz17cmVzcHVlc3Rhc30vPlxyXG4gICAgICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPERlc3BsZWdhckNpdGFQYWN0YWRhWVNlbGVjY2lvbmFkb0FudGVyaW9yVGVtIHRlbT17dGVtfS8+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgIDpudWxsfVxyXG4gICAgICAgIDwvVGFibGVDZWxsPlxyXG4gICAgICAgIDxUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIHt0YXJlYX1cclxuICAgICAgICA8L1RhYmxlQ2VsbD5cclxuICAgICAgICA8VGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8QnV0dG9uIGlkPXtpZH0gb25DbGljaz17KCk9PiBcclxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkNBTUJJQVJfRk9STVVMQVJJTyh7Zm9yUGssIGFwaWxhclZ1ZWx0YTpmYWxzZX0pKVxyXG4gICAgICAgICAgICB9PlxyXG4gICAgICAgICAgICAgICAge251bVZpdmllbmRhLnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgIDwvVGFibGVDZWxsPlxyXG4gICAgPC9UYWJsZVJvdz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIERlc3BsZWdhckNhcmdhKHByb3BzOntcclxuICAgIGNhcmdhOkNhcmdhLCBcclxuICAgIGlkQ2FyZ2E6SWRDYXJnYSwgXHJcbiAgICBwb3NpY2lvbjpudW1iZXIsXHJcbiAgICBpbmZvcm1hY2lvbkhkcjpJbmZvcm1hY2lvbkhkciwgXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFMYXNVQSxcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOntcclxuICAgICAgICBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTpGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiBcclxuICAgIH1cclxufSl7XHJcbiAgICBjb25zdCB7Y2FyZ2EsIGlkQ2FyZ2EsIGluZm9ybWFjaW9uSGRyLCByZXNwdWVzdGFzfSA9IHByb3BzO1xyXG4gICAgcmV0dXJuIDxQYXBlciBjbGFzc05hbWU9XCJjYXJnYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5mb3JtYWNpb24tY2FyZ2FcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjYXJnYVwiPsOBcmVhOiB7aWRDYXJnYX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvYnNlcnZhY2lvbmVzXCI+e2NhcmdhLm9ic2VydmFjaW9uZXN9PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbmZvcm1hY2lvbi1jYXJnYVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZlY2hhXCI+e2NhcmdhLmZlY2hhfTwvZGl2PlxyXG4gICAgICAgICAgICB7LypcclxuICAgICAgICAgICAgPEJ1dHRvbkdyb3VwPlxyXG4gICAgICAgICAgICB7bGlzdGFFc3RhZG9zQ2FyZ2EubWFwKGVzdGFkb19jYXJnYT0+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIGtleT17ZXN0YWRvX2NhcmdhfSB2YXJpYW50PXtlc3RhZG9fY2FyZ2E9PWNhcmdhLmVzdGFkb19jYXJnYT9cImNvbnRhaW5lZFwiOlwib3V0bGluZWRcIn0gb25DbGljaz17XHJcbiAgICAgICAgICAgICAgICAgICAgKCk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLkVTVEFET19DQVJHQSh7aWRDYXJnYSwgZXN0YWRvX2NhcmdhfSkpXHJcbiAgICAgICAgICAgICAgICB9Pntlc3RhZG9fY2FyZ2F9PC9CdXR0b24+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XHJcbiAgICAgICAgICAgICovfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIHtjYXJnYS5lc3RhZG9fY2FyZ2E9PW51bGwgJiYgIXByb3BzLnBvc2ljaW9uIHx8IGNhcmdhLmVzdGFkb19jYXJnYT09J3JlbGV2YW1pZW50byc/XHJcbiAgICAgICAgPFRhYmxlIGNsYXNzTmFtZT1cInRhYmxhLWNhcmdhLWhvamEtZGUtcnV0YVwiPlxyXG4gICAgICAgICAgICA8Y29sZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICA8Y29sIHN0eWxlPXt7d2lkdGg6XCI3NSVcIn19Lz5cclxuICAgICAgICAgICAgICAgIDxjb2wgc3R5bGU9e3t3aWR0aDpcIjEwJVwifX0vPiAgICBcclxuICAgICAgICAgICAgICAgIDxjb2wgc3R5bGU9e3t3aWR0aDpcIjE1JVwifX0vPiAgICBcclxuICAgICAgICAgICAgPC9jb2xncm91cD5cclxuICAgICAgICAgICAgPFRhYmxlSGVhZCBzdHlsZT17e2ZvbnRTaXplOiBcIjEuMnJlbVwifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwidHItY2FyZ2FcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsPmRvbWljaWxpbzwvVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGw+dGFyZWE8L1RhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsPmVuYzwvVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cclxuICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XHJcbiAgICAgICAgICAgIDxUYWJsZUJvZHk+XHJcbiAgICAgICAgICAgICAgICB7bGlrZUFyKGluZm9ybWFjaW9uSGRyKS5maWx0ZXIoKGluZm9ybWFjaW9uKT0+aW5mb3JtYWNpb24udGVtLmNhcmdhPT1pZENhcmdhKS5tYXAoKGluZm9ybWFjaW9uLCBudW1WaXZpZW5kYSk9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxEZXNwbGVnYXJMaW5lYVJlc3VtZW5VQVByaW5jaXBhbCBcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtudW1WaXZpZW5kYX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVZpdmllbmRhPXtudW1WaXZpZW5kYX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE9e2luZm9ybWFjaW9uLnRhcmVhLnRhcmVhfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUHJpbmNpcGFsPXtpbmZvcm1hY2lvbi50YXJlYS5tYWluX2Zvcm19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXM9e3Jlc3B1ZXN0YXMudml2aWVuZGFzW251bVZpdmllbmRhXSBhcyBSZXNwdWVzdGFzUmFpen1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgKS5hcnJheSgpfVxyXG4gICAgICAgICAgICA8L1RhYmxlQm9keT5cclxuICAgICAgICA8L1RhYmxlPjpcclxuICAgICAgICA8VGFibGU+XHJcbiAgICAgICAgICAgIDxUYWJsZUhlYWQgc3R5bGU9e3tmb250U2l6ZTogXCIxLjJyZW1cIn19PlxyXG4gICAgICAgICAgICAgICAgPFRhYmxlUm93IGNsYXNzTmFtZT1cInRyLWNhcmdhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3Jlc3VtaWRvcmVzLm1hcCgocmVzdW1pZG9yOiB0eXBlb2YgcmVzdW1pZG9yZXNbMF0sIGk6bnVtYmVyKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwga2V5PXtpfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXN1bWlkb3Iubm9tYnJlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cclxuICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XHJcbiAgICAgICAgPC9UYWJsZT5cclxuICAgICAgICB9XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBEZXNwbGVnYXJDaXRhUGFjdGFkYShwcm9wczp7cmVzcHVlc3RhczpSZXNwdWVzdGFzfSl7XHJcbiAgICBjb25zdCB7cmVzcHVlc3Rhc30gPSBwcm9wcztcclxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImNpdGEtcGFjdGFkYVwiPlxyXG4gICAgICAgIDxkaXY+PEF0cmlidXRvIG5vbWJyZT1cIkNpdGEgcGFjdGFkYSBjb24gXCIgdmFsb3I9e3Jlc3B1ZXN0YXNbcDEyXX0vPjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PEF0cmlidXRvIG5vbWJyZT1cIkNlbC46XCIgdmFsb3I9e3Jlc3B1ZXN0YXNbc3AyXX0vPjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PEF0cmlidXRvIG5vbWJyZT1cIlRlbC46XCIgdmFsb3I9e3Jlc3B1ZXN0YXNbc3AzXX0vPjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PEF0cmlidXRvIG5vbWJyZT1cIkZlY2hhOlwiIHZhbG9yPXtyZXNwdWVzdGFzW3NwNF19Lz48L2Rpdj5cclxuICAgICAgICA8ZGl2PjxBdHJpYnV0byBub21icmU9XCJIb3JhOlwiIHZhbG9yPXtyZXNwdWVzdGFzW3NwNV19Lz48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVzcGxlZ2FyQ2l0YVBhY3RhZGFZU2VsZWNjaW9uYWRvQW50ZXJpb3JUZW0ocHJvcHM6e3RlbTpURU19KXtcclxuICAgIGNvbnN0IHt0ZW19ID0gcHJvcHM7XHJcbiAgICByZXR1cm4gPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRlbS1jaXRhXCI+XHJcbiAgICAgICAgICAgIDxBdHJpYnV0byBub21icmU9XCJDaXRhOlwiIHZhbG9yPXt0ZW0uY2l0YX0vPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBEZXNwbGVnYXJUZW0ocHJvcHM6e3RlbTpURU19KXtcclxuICAgIGNvbnN0IHt0ZW19ID0gcHJvcHM7XHJcbiAgICByZXR1cm4gPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRlbS1kb21pY2lsaW9cIj57dGVtLm5vbWNhbGxlfSB7dGVtLm5yb2NhdGFzdHJhbH0gPEF0cmlidXRvIG5vbWJyZT1cInBpc29cIiB2YWxvcj17dGVtLnBpc299Lz4gPEF0cmlidXRvIG5vbWJyZT1cImRwdG9cIiB2YWxvcj17dGVtLmRlcGFydGFtZW50b30vPiA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8QXRyaWJ1dG8gbm9tYnJlPVwic2VjdG9yXCIgdmFsb3I9e3RlbS5zZWN0b3J9Lz5cclxuICAgICAgICAgICAgPEF0cmlidXRvIG5vbWJyZT1cImVkaWZpY2lvXCIgdmFsb3I9e3RlbS5lZGlmaWNpb30vPlxyXG4gICAgICAgICAgICA8QXRyaWJ1dG8gbm9tYnJlPVwiY2FzYVwiIHZhbG9yPXt0ZW0uY2FzYX0vPlxyXG4gICAgICAgICAgICA8QXRyaWJ1dG8gbm9tYnJlPVwiZW50cmFkYVwiIHZhbG9yPXt0ZW0uZW50cmFkYX0vPlxyXG4gICAgICAgICAgICA8QXRyaWJ1dG8gbm9tYnJlPVwiaGFiaXRhY2lvblwiIHZhbG9yPXt0ZW0uaGFiaXRhY2lvbn0vPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGVtLW9ic2VydmFjaW9uZXNcIj5cclxuICAgICAgICAgICAge3RlbS5vYnNlcnZhY2lvbmVzfSBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSG9qYURlUnV0YURlc3BsaWVndWUoKXtcclxuICAgIHZhciB7Y2FyZ2FzLCBudW1fc2luY3JvLCBpbmZvcm1hY2lvbkhkciwgcmVzcHVlc3Rhc30gPSBnZXREYXRvc0J5UGFzcygpO1xyXG4gICAgdmFyIHttb2RvfSA9IHVzZVNlbGVjdG9yKChzdGF0ZTpDYXNvU3RhdGUpPT4oe21vZG86c3RhdGUubW9kb30pKTtcclxuICAgIHZhciBmZWVkYmFja1Jvd1ZhbGlkYXRvciA9IGdldEZlZWRiYWNrUm93VmFsaWRhdG9yKClcclxuICAgIHZhciBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCB1cGRhdGVPbmxpbmVTdGF0dXMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIHNldE9ubGluZSh3aW5kb3cubmF2aWdhdG9yLm9uTGluZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhcHBWZXJzaW9uID0gZ2V0Q2FjaGVWZXJzaW9uKCk7XHJcbiAgICBjb25zdCBbb25saW5lLCBzZXRPbmxpbmVdID0gdXNlU3RhdGUod2luZG93Lm5hdmlnYXRvci5vbkxpbmUpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICB1cGRhdGVPbmxpbmVTdGF0dXMpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB1cGRhdGVPbmxpbmVTdGF0dXMpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAgICA8QXBwQmFyIHBvc2l0aW9uPVwiZml4ZWRcIj5cclxuICAgICAgICAgICAgICAgIDxUb29sYmFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5IHZhcmlhbnQ9XCJoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBIb2phIGRlIHJ1dGFcclxuICAgICAgICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vPEljb25CdXR0b24gc3R5bGU9e3ttYXJnaW5Ub3A6JzNweCd9fVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbG9yPVwiaW5oZXJpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgLy9vbkNsaWNrPXsvKmRpc3BhdGNoIHF1ZSBsbGV2YSBhIHBhbnRhbGxhIG9wY2lvbmVzKi99XHJcbiAgICAgICAgICAgICAgICAgICAgLy8+XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgPElDT04uU2V0dGluZ3MvPlxyXG4gICAgICAgICAgICAgICAgICAgIC8vPC9JY29uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB7b25saW5lP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImluaGVyaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG9TaW5jcm9uaXphcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNPTi5TeW5jQWx0Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgOm51bGx9XHJcbiAgICAgICAgICAgICAgICA8L1Rvb2xiYXI+XHJcbiAgICAgICAgICAgIDwvQXBwQmFyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhvamEtZGUtcnV0YVwiPlxyXG4gICAgICAgICAgICAgICAge21vZG8uZGVtbz88ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5Pk1vZG8gZGVtbyA8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBjb2xvcj1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5SRUlOSUNJQVJfREVNTyh7fSkpfVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbmljaWFyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj46bnVsbH1cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibm9tYnJlLXZlcnNpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PkRpcmVjY2nDs24gR2VuZXJhbCBkZSBFc3RhZMOtc3RpY2EgeSBDZW5zb3MgLSBDLkEuQi5BLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e215LmdldExvY2FsVmFyKCdhcHAtdmVyc2lvbicpfSBzaW5jcm8ge251bV9zaW5jcm99IC0gdmVyc2nDs24ge2FwcFZlcnNpb259PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIHtsaWtlQXIoY2FyZ2FzKS5tYXAoKGNhcmdhLCBpZENhcmdhLCBfLCBwb3NpY2lvbik9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxEZXNwbGVnYXJDYXJnYSBrZXk9e2lkQ2FyZ2F9IGNhcmdhPXtjYXJnYX0gaWRDYXJnYT17aWRDYXJnYX0gcG9zaWNpb249e3Bvc2ljaW9ufSBpbmZvcm1hY2lvbkhkcj17aW5mb3JtYWNpb25IZHJ9IGZlZWRiYWNrUm93VmFsaWRhdG9yPXtmZWVkYmFja1Jvd1ZhbGlkYXRvcn0gcmVzcHVlc3Rhcz17cmVzcHVlc3Rhc30vPlxyXG4gICAgICAgICAgICAgICAgKS5hcnJheSgpfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8Lz5cclxuICAgICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBMaXN0YVRleHRvcyhwcm9wczp7dGV4dG9zOnN0cmluZ1tdfSl7XHJcbiAgICByZXR1cm4gPHVsPlxyXG4gICAgICAgIHtwcm9wcy50ZXh0b3MubWFwKHQ9PjxsaT48VHlwb2dyYXBoeT57dH08L1R5cG9ncmFwaHk+PC9saT4pfVxyXG4gICAgPC91bD47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBCaWVudmVuaWRhRGVzcGxpZWd1ZShwcm9wczp7bW9kbzpDYXNvU3RhdGVbXCJtb2RvXCJdfSl7XHJcbiAgICB2YXIgZGlzcGF0Y2g9dXNlRGlzcGF0Y2goKTtcclxuICAgIHJldHVybiA8UGFwZXIgY2xhc3NOYW1lPVwiYmllbnZlbmlkYVwiPlxyXG4gICAgICAgIHtwcm9wcy5tb2RvLmRlbW8/XHJcbiAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeT5ERU1PIGRlbCBzaXN0ZW1hIGRlIHJlbGV2YW1pZW50byBkZSBETUVOQ1U8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeT5FbiBlc3RhIGRlbW86PC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICAgICAgPExpc3RhVGV4dG9zIHRleHRvcz17W1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWxndW5hcyB2aXZpZW5kYXMgYXBhcmVjZW4gcmVsZXZhZGFzIChlbCBib3TDs24gZXN0w6EgZGUgY29sb3IpIHNpcnZlbiBkZSBlamVtcGxvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJMbyBxdWUgc2UgY2FyZ3VlbiBzZSBndWFyZGFuIGxvY2FsbWVudGUgcGVybyBubyBzZSB0cmFzbWl0ZW4gYSBsYSBiYXNlIGRlIGRhdG9zXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJTZSBwdWVkZSB2b2x2ZXIgYSBsYSB2ZXJzacOzbiBpbmljaWFsIChvIHNlYSBib3JyYXIgbG8gcXVlIHNlIGd1YXJkw7MgbG9jYWxtZW50ZSkgZGVzZGUgbGEgaG9qYSBkZSBydXRhIGJvdG9uIFtyZWluaWNpYXIgZGVtb11cIixcclxuICAgICAgICAgICAgICAgICAgICBcIlRvZGF2w61hIGhheSBjb3NhcyBxdWUgZmFsdGFuIG8gcHVlZGVuIGNhbWJpYXJcIixcclxuICAgICAgICAgICAgICAgIF19IC8+XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICA6PD5cclxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5PkVuY3Vlc3RhIGRlIFNlcm9wcmV2YWxlbmNpYSBkZSBDT1ZJRC0xOTwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgb25DbGljaz17KCk9PnsgZ290b1NpbmNyb25pemFyKCk7IH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3Bhbj5TaW5jcm9uaXphciA8L3NwYW4+IDxJQ09OLlN5bmNBbHQvPlxyXG4gICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfT1BDSU9OKHtvcGNpb246J2JpZW52ZW5pZG8nLCB2YWxvcjp0cnVlfSkpfVxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4+Q29udGludWFyIDwvc3Bhbj4gPElDT04uU2VuZC8+XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG4vL0NPTlRST0wgREUgUEVTVEHDkUFTXHJcbnZhciBhbGxPcGVuZWRUYWJzOntbeDpzdHJpbmddOm51bWJlcn09e307XHJcbnZhciBpbmZvT3BlbmVkVGFicz17XHJcbiAgICBhbGxPcGVuZWRUYWJzLFxyXG4gICAgbXlJZDonY2FsY3VsYW5kby4uLicsXHJcbiAgICBvdGhlclRhYnNOYW1lczonJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gT3BlbmVkVGFicygpe1xyXG4gICAgY29uc3QgW3RhYnMsIHNldFRhYnNdID0gdXNlU3RhdGUoaW5mb09wZW5lZFRhYnMub3RoZXJUYWJzTmFtZXMpO1xyXG4gICAgdmFyIHttb2RvRGlyZWN0b30gPSB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+KHttb2RvRGlyZWN0bzpzdGF0ZS5vcGNpb25lcy5tb2RvRGlyZWN0b30pKTtcclxuICAgIGNvbnN0IHVwZGF0ZVRhYnNTdGF0dXMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIHNldFRhYnMoaW5mb09wZW5lZFRhYnMub3RoZXJUYWJzTmFtZXMpO1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpPT57XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ215LXRhYnMnLHVwZGF0ZVRhYnNTdGF0dXMpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbXktdGFicycsdXBkYXRlVGFic1N0YXR1cyk7XHJcbiAgICB9LFtdKVxyXG4gICAgcmV0dXJuIG1vZG9EaXJlY3RvP251bGw6KHRhYnMpP1xyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFiLWNvdW50ZXIgdGFiLWVycm9yXCI+wqFBVEVOQ0nDk04hIEhheSBtw6FzIGRlIHVuYSB2ZW50YW5hIGFiaWVydGEuIFNlIHB1ZWRlbiBwZXJkZXIgZGF0b3M6IHt0YWJzfTwvZGl2PlxyXG4gICAgOlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFiLWNvdW50ZXJcIj7inJQ8L2Rpdj5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEFwcERtRW5jdSgpe1xyXG4gICAgdmFyIHtmb3JQaywgYmllbnZlbmlkbywgbW9kb30gPSB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+KHsuLi5zdGF0ZS5vcGNpb25lcywgLi4uc3RhdGUubW9kbywgLi4uc3RhdGV9KSk7XHJcbiAgICBpZighYmllbnZlbmlkbyl7XHJcbiAgICAgICAgcmV0dXJuIDxCaWVudmVuaWRhRGVzcGxpZWd1ZSBtb2RvPXttb2RvfS8+IFxyXG4gICAgfWVsc2UgaWYoZm9yUGs9PW51bGwpe1xyXG4gICAgICAgIHJldHVybiA8SG9qYURlUnV0YURlc3BsaWVndWUgLz4gXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gPEZvcm11bGFyaW9EZXNwbGllZ3VlIGZvclBrPXtmb3JQa30vPlxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBQYW50YWxsYUluaWNpYWxTaW5DYXJnYShfcHJvcHM6e30pe1xyXG4gICAgY29uc3QgdXBkYXRlT25saW5lU3RhdHVzID0gZnVuY3Rpb24oKXtcclxuICAgICAgICBzZXRPbmxpbmUod2luZG93Lm5hdmlnYXRvci5vbkxpbmUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgW29ubGluZSwgc2V0T25saW5lXSA9IHVzZVN0YXRlKHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCAgdXBkYXRlT25saW5lU3RhdHVzKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdXBkYXRlT25saW5lU3RhdHVzKTtcclxuICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcz17Zm9udFNpemU6XCIxLjJyZW1cIiwgZm9udFdlaWdodDo2MDAsIHBhZGRpbmc6IFwiNXB4IDEwcHhcIn07XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIDw+XHJcbiAgICAgICAgICAgIDxBcHBCYXIgcG9zaXRpb249XCJmaXhlZFwiPlxyXG4gICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImg2XCIgc3R5bGU9e3ttYXJnaW46MjV9fT5cclxuICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGl2byBzaW4gY2FyZ2FcclxuICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgPC9BcHBCYXI+XHJcbiAgICAgICAgICAgIDxtYWluPlxyXG4gICAgICAgICAgICAgICAgPFBhcGVyIHN0eWxlPXt7aGVpZ2h0Oic2MDBweCcsIHBhZGRpbmc6XCIxNXB4XCIsIG1hcmdpblRvcDo3NX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtvbmxpbmU/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5IGNvbXBvbmVudD1cInBcIiBzdHlsZT17cGFyYWdyYXBoU3R5bGVzfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY3Jvbml6YXIgZGlzcG9zaXRpdm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3twYWRkaW5nOic1cHgnfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY29udGFpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvU2luY3Jvbml6YXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDT04uU3luY0FsdC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeSBjb21wb25lbnQ9XCJwXCIgc3R5bGU9e3BhcmFncmFwaFN0eWxlc30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gaGF5IGNvbmV4acOzbiBhIGludGVybmV0LCBwb3IgZmF2b3IgY29uw6ljdGUgZWwgZGlzcG9zaXRpdm8gYSB1bmEgcmVkIHBhcmEgc2luY3Jvbml6YXIgdW5hIGhvamEgZGUgcnV0YS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9QYXBlcj5cclxuICAgICAgICAgICAgPC9tYWluPlxyXG4gICAgICAgIDwvPlxyXG4gICAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFBhbnRhbGxhSW5pY2lhbCgpe1xyXG4gICAgdmFyIHtmb3JQaywgYmllbnZlbmlkbywgbW9kb30gPSB1c2VTZWxlY3Rvcigoc3RhdGU6Q2Fzb1N0YXRlKT0+KHsuLi5zdGF0ZS5vcGNpb25lcywgLi4uc3RhdGUubW9kbywgLi4uc3RhdGV9KSk7XHJcbiAgICBpZighYmllbnZlbmlkbyl7XHJcbiAgICAgICAgcmV0dXJuIDxCaWVudmVuaWRhRGVzcGxpZWd1ZSBtb2RvPXttb2RvfS8+IFxyXG4gICAgfWVsc2UgaWYoZm9yUGs9PW51bGwpe1xyXG4gICAgICAgIHJldHVybiA8SG9qYURlUnV0YURlc3BsaWVndWUgLz4gXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gPEZvcm11bGFyaW9EZXNwbGllZ3VlIGZvclBrPXtmb3JQa30vPlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG1QYW50YWxsYUluaWNpYWxTaW5DYXJnYSgpe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGF3YWl0IGxvYWRDU1MoQk9PVFNUUkFQXzVfMV8zX1NSQyk7XHJcbiAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICB0aHJvdyhlcnIpXHJcbiAgICB9XHJcbiAgICBSZWFjdERPTS5yZW5kZXIoXHJcbiAgICAgICAgPFBhbnRhbGxhSW5pY2lhbFNpbkNhcmdhLz4sXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW5fbGF5b3V0JylcclxuICAgIClcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3BsZWdhckZvcm11bGFyaW9BY3R1YWwob3B0czp7bW9kb0RlbW86Ym9vbGVhbiwgZm9yUGtSYWl6PzpGb3JQa1JhaXosIG9wZXJhdGl2bzpJZE9wZXJhdGl2b30pe1xyXG4gICAgLy8gdHJhZXIgbG9zIG1ldGFkYXRvcyBlbiB1bmEgXCJlc3RydWN0dXJhXCJcclxuICAgIC8vIHRyYWVyIGxvcyBkYXRvcyBkZSBsb2NhbFN0b3JhZ2VcclxuICAgIC8vIHZlcmlmaWNhciBlbCBtYWluIExheW91dFxyXG4gICAgY29uc3Qgc3RvcmUgPSBhd2FpdCBkbVRyYWVyRGF0b3NGb3JtdWxhcmlvKG9wdHMpXHJcbiAgICB0cnl7XHJcbiAgICAgICAgYXdhaXQgbG9hZENTUyhCT09UU1RSQVBfNV8xXzNfU1JDKTtcclxuICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgIHRocm93KGVycilcclxuICAgIH1cclxuICAgIFJlYWN0RE9NLnJlbmRlcihcclxuICAgICAgICA8UmVuZGVyUHJpbmNpcGFsIHN0b3JlPXtzdG9yZX0gZGlzcGF0Y2hlcnM9e2Rpc3BhdGNoZXJzfSBtZW5zYWplUmV0b3Jubz17b3B0cy5mb3JQa1JhaXo/XCJWb2x2ZXIgYWwgZm9ybXVsYXJpb1wiOlwiVm9sdmVyIGEgbGEgaG9qYSBkZSBydXRhXCJ9PlxyXG4gICAgICAgICAgICA8T3BlbmVkVGFicy8+XHJcbiAgICAgICAgICAgIDxBcHBEbUVuY3UvPlxyXG4gICAgICAgIDwvUmVuZGVyUHJpbmNpcGFsPixcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbl9sYXlvdXQnKVxyXG4gICAgKVxyXG59XHJcblxyXG5pZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyl7XHJcbiAgICAvLyBAdHMtaWdub3JlIHBhcmEgaGFjZXJsb1xyXG4gICAgd2luZG93LmRlc3BsZWdhckZvcm11bGFyaW9BY3R1YWwgPSBkZXNwbGVnYXJGb3JtdWxhcmlvQWN0dWFsO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBwYXJhIGhhY2VybG9cclxuICAgIHdpbmRvdy5kbVBhbnRhbGxhSW5pY2lhbFNpbkNhcmdhID0gZG1QYW50YWxsYUluaWNpYWxTaW5DYXJnYTtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGxvYWRJbnN0YW5jZSgpe1xyXG4gICAgaWYodHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgPT09ICd1bmRlZmluZWQnKXtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgYmMgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnY29udGFkb3InKTtcclxuICAgIHZhciBteUlkPVN0cmluZy5mcm9tQ29kZVBvaW50KDEwMCtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMCkpK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMDApLy8rJy0nK25ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgYWxsT3BlbmVkVGFic1tteUlkXT0xO1xyXG4gICAgaW5mb09wZW5lZFRhYnMubXlJZD1teUlkO1xyXG4gICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCdteS10YWJzJyk7XHJcbiAgICBiYy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZXYpe1xyXG4gICAgICAgIGlmKGV2LmRhdGEucXVlPT0nc295Jyl7XHJcbiAgICAgICAgICAgIGlmKCFhbGxPcGVuZWRUYWJzW2V2LmRhdGEuaWRdKXtcclxuICAgICAgICAgICAgICAgIGFsbE9wZW5lZFRhYnNbZXYuZGF0YS5pZF09MDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbGxPcGVuZWRUYWJzW2V2LmRhdGEuaWRdKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGV2LmRhdGEucXVlPT0ndW5sb2FkJyl7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhbGxPcGVuZWRUYWJzW2V2LmRhdGEuaWRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihldi5kYXRhLnF1ZT09J2xvYWQnKXtcclxuICAgICAgICAgICAgYWxsT3BlbmVkVGFic1tldi5kYXRhLmlkXT0xO1xyXG4gICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7cXVlOidzb3knLGlkOm15SWR9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5mb09wZW5lZFRhYnMub3RoZXJUYWJzTmFtZXM9bGlrZUFyKGFsbE9wZW5lZFRhYnMpLmZpbHRlcigoXyxpZCk9PmlkIT1teUlkKS5qb2luKCcsJyk7XHJcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfTtcclxuICAgIGJjLnBvc3RNZXNzYWdlKHtxdWU6J2xvYWQnLGlkOm15SWR9KTtcclxuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgYmMucG9zdE1lc3NhZ2Uoe3F1ZTondW5sb2FkJyxpZDpteUlkfSk7XHJcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfSlcclxuICAgIC8vbW9zdHJhclF1aWVuZXNTb21vcygpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0TGlicmVEZXNwbGllZ3VlID0gKGxpYnJlOkxpYnJlRGVzcGxpZWd1ZVR5cGUpPT5MaWJyZURlc3BsaWVndWUgPSBsaWJyZVxyXG5cclxuc2V0TGlicmVEZXNwbGllZ3VlKChwcm9wczp7XHJcbiAgICBrZXk6c3RyaW5nXHJcbiAgICBjYXNpbGxlcm86TGlicmVcclxuICAgIGZvcm11bGFyaW86Rm9ybXVsYXJpb1xyXG4gICAgZm9yUGs6Rm9yUGtcclxufSk9PjxkaXYga2V5PXtwcm9wcy5rZXl9IGlkPXtwcm9wcy5jYXNpbGxlcm8uaWRfY2FzaWxsZXJvfT5lc3RlIGNhc2lsbGVybyBkZWJlIHJlZGVmaW5pcnNlIGVuIGxhIEFQUCBmaW5hbCB5IHN1IHVzbyBlcyBleGNsdXNpdm8gZGVsIMOhcmVhIGluZm9ybcOhdGljYTwvZGl2PilcclxuXHJcbnNldENhbGN1bGFyVmFyaWFibGVzKChyZXNwdWVzdGFzUmFpejpSZXNwdWVzdGFzUmFpeiwgZm9yUGs6Rm9yUGspPT57XHJcbiAgICAvL1RPRE8gR0VORVJBTElaQVJcclxuICAgIHZhciB1YXNJdGVyYXI6e1xyXG4gICAgICAgIFtrZXkgaW4gSWRVbmlkYWRBbmFsaXNpc106e1xyXG4gICAgICAgICAgICB1YVBlcnNvbmFzOiBJZFVuaWRhZEFuYWxpc2lzXHJcbiAgICAgICAgICAgIHZhclNleG9QZXJzb25hOiBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIHZhck5vbWJyZVBlcnNvbmE6IElkVmFyaWFibGVcclxuICAgICAgICAgICAgdmFyTG9zTm9tYnJlczogSWRWYXJpYWJsZVxyXG4gICAgICAgIH1cclxuICAgIH0gPSB7XHJcbiAgICAgICAgaG9nYXJlczoge1xyXG4gICAgICAgICAgICB1YVBlcnNvbmFzOiAncGVyc29uYXMnLFxyXG4gICAgICAgICAgICB2YXJTZXhvUGVyc29uYTogJ3NleG8nIGFzIElkVmFyaWFibGUsXHJcbiAgICAgICAgICAgIHZhck5vbWJyZVBlcnNvbmE6ICdub21icmUnIGFzIElkVmFyaWFibGUsXHJcbiAgICAgICAgICAgIHZhckxvc05vbWJyZXM6IFwibG9zX25vbWJyZXNcIiBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBbXCJob2dhcmVzX3N1cFwiIGFzIElkVW5pZGFkQW5hbGlzaXNdIDoge1xyXG4gICAgICAgICAgICB1YVBlcnNvbmFzOiAncGVyc29uYXNfc3VwJyBhcyBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgICAgICAgICB2YXJTZXhvUGVyc29uYTogJ3NleG9fc3VwJyAgYXMgSWRWYXJpYWJsZSxcclxuICAgICAgICAgICAgdmFyTm9tYnJlUGVyc29uYTogJ25vbWJyZV9zdXAnICBhcyBJZFZhcmlhYmxlLFxyXG4gICAgICAgICAgICB2YXJMb3NOb21icmVzOiBcIm5vbWJyZXNfY29tcG9uZW50ZXNfc3VwXCIgIGFzIElkVmFyaWFibGVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBsaWtlQXIodWFzSXRlcmFyKS5mb3JFYWNoKChjb25maWdIb2dhcmVzLHVhSG9nYXJlcyk9PntcclxuICAgICAgICB2YXIgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgICAgICBpZihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW3VhSG9nYXJlc10pe1xyXG4gICAgICAgICAgICBmb3IodmFyIHJlc3B1ZXN0YXNIb2dhciBvZiBpdGVyYXRvcihyZXNwdWVzdGFzUmFpelt1YUhvZ2FyZXNdPz9bXSkpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXJlc3B1ZXN0YXNIb2dhcltjb25maWdIb2dhcmVzLnVhUGVyc29uYXNdIHx8IGVtcHR5KHJlc3B1ZXN0YXNIb2dhcltjb25maWdIb2dhcmVzLnVhUGVyc29uYXNdKSB8fCByZXNwdWVzdGFzSG9nYXJbY29uZmlnSG9nYXJlcy51YVBlcnNvbmFzXVswXVtjb25maWdIb2dhcmVzLnZhclNleG9QZXJzb25hXSA9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbG9zTm9tYnJlcyA9IHJlc3B1ZXN0YXNIb2dhcltjb25maWdIb2dhcmVzLnZhckxvc05vbWJyZXNdIGFzIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGxvc05vbWJyZXMgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFyZXNwdWVzdGFzSG9nYXJbY29uZmlnSG9nYXJlcy51YVBlcnNvbmFzXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzSG9nYXJbY29uZmlnSG9nYXJlcy51YVBlcnNvbmFzXT1bXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb3NOb21icmVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigobm9tYnJlOnN0cmluZyk9Pm5vbWJyZS50cmltKCkubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChub21icmU6c3RyaW5nLCBpOm51bWJlcik9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzSG9nYXJbY29uZmlnSG9nYXJlcy51YVBlcnNvbmFzXVtpXSA9IHJlc3B1ZXN0YXNIb2dhcltjb25maWdIb2dhcmVzLnVhUGVyc29uYXNdW2ldIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNIb2dhcltjb25maWdIb2dhcmVzLnVhUGVyc29uYXNdW2ldW2NvbmZpZ0hvZ2FyZXMudmFyTm9tYnJlUGVyc29uYV0gPSBub21icmUudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmVzcHVlc3Rhc1JhaXoudmRvbWluaW89Z2V0RGF0b3NCeVBhc3MoKS5pbmZvcm1hY2lvbkhkcltmb3JQay52aXZpZW5kYV0udGVtLmRvbWluaW87XHJcbn0pXHJcblxyXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCl7XHJcbiAgICBsb2FkSW5zdGFuY2UoKVxyXG59KVxyXG4vL0ZJTiBDT05UUk9MIFBFU1RBw5FBU1xyXG5cclxuZnVuY3Rpb24gbG9hZENTUyhjc3NVUkw6c3RyaW5nLCBpZD86c3RyaW5nKTpQcm9taXNlPHZvaWQ+e1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCggcmVzb2x2ZSwgcmVqZWN0ICk9PntcclxuICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsaW5rJyApO1xyXG4gICAgICAgIGxpbmsucmVsICA9ICdzdHlsZXNoZWV0JztcclxuICAgICAgICBsaW5rLmhyZWYgPSBjc3NVUkw7XHJcbiAgICAgICAgbGluay5pZCA9IGlkIHx8IGNzc1VSTDtcclxuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBsaW5rICk7XHJcbiAgICAgICAgbGluay5vbmxvYWQgPSAoKT0+eyBcclxuICAgICAgICAgICAgcmVzb2x2ZSgpOyBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRyYWUgJHtjc3NVUkx9YCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBsaW5rLm9uZXJyb3I9KGVycik9PntcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGNhcmdhbmRvIGVsIGVzdGlsbycsIGVycilcclxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgcHJvYmxlbWEgY2FyZ2FuZG8gZXN0aWxvICR7Y3NzVVJMfWApKVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVDU1NCeUlkKGlkOnN0cmluZyl7XHJcbiAgICB2YXIgbGlua05vZGUgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgbGlua05vZGU/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGxpbmtOb2RlKTtcclxufVxyXG5cclxuY29uc3QgQk9PVFNUUkFQXzVfMV8zX1NSQyA9ICdjc3MvYm9vdHN0cmFwLm1pbi5jc3MnOyJdfQ==
|