dmencu 0.1.53 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/unlogged/render-formulario.tsx +21 -1
- package/dist/client/unlogged/tipos.d.ts +9 -2
- package/dist/client/unlogged/tipos.js +1 -1
- package/dist/server/server/app-dmencu.d.ts +4 -0
- package/dist/server/server/table-acciones.d.ts +3 -0
- package/dist/server/server/table-acciones.js +55 -0
- package/dist/server/server/table-estados.d.ts +3 -0
- package/dist/server/server/table-estados.js +51 -0
- package/dist/server/server/table-estados_acciones.d.ts +3 -0
- package/dist/server/server/table-estados_acciones.js +43 -0
- package/dist/server/server/table-mis_tareas_tem copy.d.ts +3 -0
- package/dist/server/server/table-mis_tareas_tem copy.js +19 -0
- package/dist/server/server/table-tareas_tem copy.d.ts +3 -0
- package/dist/server/server/table-tareas_tem copy.js +176 -0
- package/dist/server/server/table-tareas_tem disponibles.d.ts +3 -0
- package/dist/server/server/table-tareas_tem disponibles.js +19 -0
- package/dist/server/server/table-tareas_tem_asignables copy.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_asignables copy.js +24 -0
- package/dist/server/server/table-tareas_tem_asignables.d.ts +5 -0
- package/dist/server/server/table-tareas_tem_asignables.js +53 -0
- package/dist/server/server/table-tareas_tem_disponibles.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_disponibles.js +19 -0
- package/dist/server/server/table-tareas_tem_recepcion.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_recepcion.js +28 -0
- package/dist/server/unlogged/tipos.d.ts +9 -2
- package/dist/server/unlogged/tipos.js +1 -1
- package/dist/unlogged/unlogged/render-formulario.d.ts +8 -1
- package/dist/unlogged/unlogged/render-formulario.js +9 -3
- package/dist/unlogged/unlogged/render-formulario.tsx +21 -1
- package/dist/unlogged/unlogged/tipos.d.ts +9 -2
- package/dist/unlogged/unlogged/tipos.js +1 -1
- package/install/esquema_comun.sql +2 -2
- package/install/{metadatos/tipoc.tab → tipoc.tab} +14 -12
- package/install/{metadatos/tipoc_tipoc.tab → tipoc_tipoc.tab} +24 -22
- package/package.json +1 -1
- package/dist/client/client/carga-dm/dm-manifest.manifest +0 -70
- package/dist/client/client/css/etiquetas-qr.styl +0 -84
- package/dist/client/client/service-worker.js +0 -114
- package/dist/client/unlogged/digitov.js +0 -59
- package/dist/client/unlogged/generador-qr.js +0 -60
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/client/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/client/unlogged/img/_logo-128.png +0 -0
- package/dist/client/unlogged/img/_logo.png +0 -0
- package/dist/server/server/app-dmencu.ts.BASE.js +0 -580
- package/dist/server/server/app-dmencu.ts.LOCAL.js +0 -598
- package/dist/server/server/app-dmencu.ts.REMOTE.js +0 -582
- package/dist/server/server/table-etiquetas.js +0 -48
- package/dist/server/server/table-etiquetas_resultado.js +0 -113
- package/dist/server/server/table-etiquetas_resultado_plus.js +0 -19
- package/dist/server/server/table-mis_relevadores.js +0 -78
- package/dist/server/server/table-planchas.js +0 -38
- package/dist/server/server/table-relevadores.js +0 -19
- package/dist/server/server/table-resultados-test.js +0 -37
- package/dist/unlogged/unlogged/consola-errores.js +0 -25
- package/dist/unlogged/unlogged/digitov.js +0 -59
- package/dist/unlogged/unlogged/generador-qr.js +0 -60
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/unlogged/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/unlogged/unlogged/img/_logo-128.png +0 -0
- package/dist/unlogged/unlogged/img/_logo.png +0 -0
|
@@ -1,582 +0,0 @@
|
|
|
1
|
-
(function (factory) {
|
|
2
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
-
var v = factory(require, exports);
|
|
4
|
-
if (v !== undefined) module.exports = v;
|
|
5
|
-
}
|
|
6
|
-
else if (typeof define === "function" && define.amd) {
|
|
7
|
-
define(["require", "exports", "./procedures-dmencu", "pg-promise-strict", "mini-tools", "yazl", "like-ar", "fs", "./table-roles", "./table-personal", "./table-recepcionistas", "./table-encuestadores", "./table-mis_encuestadores", "./table-recuperadores", "./table-supervisores", "./table-personal_rol", "./table-permisos", "./table-roles_permisos", "./table-parametros", "./table-roles_subordinados", "./table-no_rea", "./table-tem", "./table-tem_recepcion", "./table-semanas", "./table-usuarios", "./table-operaciones", "./table-comunas", "./table-areas", "./table-sincronizaciones", "./table-tareas", "./table-tareas_tem", "./table-tareas_areas", "./table-mis_tareas", "./table-mis_tareas_tem", "./table-mis_tareas_areas", "./table-resultados_tarea", "./table-control_campo", "./table-control_resumen", "./def-config"], factory);
|
|
8
|
-
}
|
|
9
|
-
})(function (require, exports) {
|
|
10
|
-
"use strict";
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.emergeAppDmEncu = void 0;
|
|
13
|
-
const procedures_dmencu_1 = require("./procedures-dmencu");
|
|
14
|
-
const pg = require("pg-promise-strict");
|
|
15
|
-
const miniTools = require("mini-tools");
|
|
16
|
-
const yazl = require("yazl");
|
|
17
|
-
const likeAr = require("like-ar");
|
|
18
|
-
const fs_1 = require("fs");
|
|
19
|
-
const table_roles_1 = require("./table-roles");
|
|
20
|
-
const table_personal_1 = require("./table-personal");
|
|
21
|
-
const table_recepcionistas_1 = require("./table-recepcionistas");
|
|
22
|
-
const table_encuestadores_1 = require("./table-encuestadores");
|
|
23
|
-
const table_mis_encuestadores_1 = require("./table-mis_encuestadores");
|
|
24
|
-
const table_recuperadores_1 = require("./table-recuperadores");
|
|
25
|
-
const table_supervisores_1 = require("./table-supervisores");
|
|
26
|
-
const table_personal_rol_1 = require("./table-personal_rol");
|
|
27
|
-
const table_permisos_1 = require("./table-permisos");
|
|
28
|
-
const table_roles_permisos_1 = require("./table-roles_permisos");
|
|
29
|
-
const table_parametros_1 = require("./table-parametros");
|
|
30
|
-
const table_roles_subordinados_1 = require("./table-roles_subordinados");
|
|
31
|
-
const table_no_rea_1 = require("./table-no_rea");
|
|
32
|
-
const table_tem_1 = require("./table-tem");
|
|
33
|
-
const table_tem_recepcion_1 = require("./table-tem_recepcion");
|
|
34
|
-
const table_semanas_1 = require("./table-semanas");
|
|
35
|
-
const table_usuarios_1 = require("./table-usuarios");
|
|
36
|
-
const table_operaciones_1 = require("./table-operaciones");
|
|
37
|
-
const table_comunas_1 = require("./table-comunas");
|
|
38
|
-
const table_areas_1 = require("./table-areas");
|
|
39
|
-
const table_sincronizaciones_1 = require("./table-sincronizaciones");
|
|
40
|
-
const table_tareas_1 = require("./table-tareas");
|
|
41
|
-
const table_tareas_tem_1 = require("./table-tareas_tem");
|
|
42
|
-
const table_tareas_areas_1 = require("./table-tareas_areas");
|
|
43
|
-
const table_mis_tareas_1 = require("./table-mis_tareas");
|
|
44
|
-
const table_mis_tareas_tem_1 = require("./table-mis_tareas_tem");
|
|
45
|
-
const table_mis_tareas_areas_1 = require("./table-mis_tareas_areas");
|
|
46
|
-
const table_resultados_tarea_1 = require("./table-resultados_tarea");
|
|
47
|
-
const table_control_campo_1 = require("./table-control_campo");
|
|
48
|
-
const table_control_resumen_1 = require("./table-control_resumen");
|
|
49
|
-
const def_config_1 = require("./def-config");
|
|
50
|
-
const APP_DM_VERSION = "#22-03-29";
|
|
51
|
-
function emergeAppDmEncu(Base) {
|
|
52
|
-
return class AppDmEncu extends Base {
|
|
53
|
-
constructor(...args) {
|
|
54
|
-
super(args);
|
|
55
|
-
this.caches.tableContent = this.caches.tableContent || {};
|
|
56
|
-
this.caches.tableContent.no_rea = [];
|
|
57
|
-
this.caches.tableContent.no_rea_groups = [];
|
|
58
|
-
this.metaEncIncluirCasillerosSaltoREL = false;
|
|
59
|
-
this.timestampEstructura = new Date().getTime();
|
|
60
|
-
}
|
|
61
|
-
async getProcedures() {
|
|
62
|
-
var be = this;
|
|
63
|
-
var procedimientoAReemplazar = ["caso_guardar", "caso_traer"];
|
|
64
|
-
var parentProc = await super.getProcedures();
|
|
65
|
-
parentProc = parentProc.filter((procedure) => !procedimientoAReemplazar.includes(procedure.action));
|
|
66
|
-
parentProc = parentProc.map(procDef => {
|
|
67
|
-
if (procDef.action == 'table_record_save' || procDef.action == 'table_record_delete') {
|
|
68
|
-
var coreFunctionInterno = procDef.coreFunction;
|
|
69
|
-
procDef.coreFunction = async function (context, parameters) {
|
|
70
|
-
var result = await coreFunctionInterno(context, parameters);
|
|
71
|
-
if (parameters.table == 'casilleros') {
|
|
72
|
-
be.timestampEstructura = new Date().getTime();
|
|
73
|
-
console.log('se tocó la estructura', be.timestampEstructura);
|
|
74
|
-
}
|
|
75
|
-
return result;
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
return procDef;
|
|
79
|
-
});
|
|
80
|
-
return parentProc.concat(procedures_dmencu_1.ProceduresDmEncu);
|
|
81
|
-
}
|
|
82
|
-
async checkDatabaseStructure(_client) {
|
|
83
|
-
}
|
|
84
|
-
addSchrödingerServices(mainApp, baseUrl) {
|
|
85
|
-
let be = this;
|
|
86
|
-
super.addSchrödingerServices(mainApp, baseUrl);
|
|
87
|
-
mainApp.use(function (req, res, next) {
|
|
88
|
-
if (req.session && !req.session.install) {
|
|
89
|
-
req.session.install = Math.random().toString().replace('.', '');
|
|
90
|
-
}
|
|
91
|
-
next();
|
|
92
|
-
});
|
|
93
|
-
mainApp.get(baseUrl + '/campo', async function (req, res, _next) {
|
|
94
|
-
// @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
|
|
95
|
-
var { useragent, user } = req;
|
|
96
|
-
if (user) {
|
|
97
|
-
/** @type {{type:'js', src:string}[]} */
|
|
98
|
-
var webManifestPath = 'carga-dm/web-manifest.webmanifest';
|
|
99
|
-
var htmlMain = be.mainPage({ useragent, user }, false, { skipMenu: true, webManifestPath }).toHtmlDoc();
|
|
100
|
-
miniTools.serveText(htmlMain, 'html')(req, res);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
res.redirect(baseUrl + '/login#w=path&path=/campo');
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
var createServiceWorker = async function () {
|
|
107
|
-
var sw = await fs_1.promises.readFile('node_modules/service-worker-admin/dist/service-worker-wo-manifest.js', 'utf8');
|
|
108
|
-
var manifest = be.createResourcesForCacheJson({});
|
|
109
|
-
var swManifest = sw
|
|
110
|
-
.replace("'/*version*/'", JSON.stringify(manifest.version))
|
|
111
|
-
.replace("'/*appName*/'", JSON.stringify(manifest.appName))
|
|
112
|
-
.replace(/\[\s*\/\*urlsToCache\*\/\s*\]/, JSON.stringify(manifest.cache))
|
|
113
|
-
.replace(/\[\s*\/\*fallbacks\*\/\s*\]/, JSON.stringify(manifest.fallback || []));
|
|
114
|
-
//.replace("/#CACHE$/", "/(a\\d+m\\d+p\\d+t\\d+_estructura.js)|(a\\d+m\\d+p\\d+t\\d+_hdr.json)/");
|
|
115
|
-
return swManifest;
|
|
116
|
-
};
|
|
117
|
-
mainApp.get(baseUrl + `/sw-manifest.js`, async function (req, res, next) {
|
|
118
|
-
try {
|
|
119
|
-
miniTools.serveText(await createServiceWorker(), 'application/javascript')(req, res);
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
miniTools.serveErr(req, res, next)(err);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
mainApp.get(baseUrl + `/carga-dm/web-manifest.webmanifest`, async function (req, res, next) {
|
|
126
|
-
const APP_NAME = (await be.inTransaction(null, (client) => client.query("select operativo from parametros where unico_registro").fetchUniqueValue())).value;
|
|
127
|
-
var sufijo = baseUrl.includes('test') ? '_test' :
|
|
128
|
-
baseUrl.includes('capa') ? '_capa' : '';
|
|
129
|
-
try {
|
|
130
|
-
const content = {
|
|
131
|
-
"name": `${APP_NAME} Progressive Web App`,
|
|
132
|
-
"short_name": `${APP_NAME} PWA`,
|
|
133
|
-
"description": `Progressive Web App for ${APP_NAME}.`,
|
|
134
|
-
"icons": [
|
|
135
|
-
{
|
|
136
|
-
"src": `../img/${APP_NAME}-logo-dm-32${sufijo}.png`,
|
|
137
|
-
"sizes": "32x32",
|
|
138
|
-
"type": "image/png"
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
"src": `../img/${APP_NAME}-logo-dm-48${sufijo}.png`,
|
|
142
|
-
"sizes": "48x48",
|
|
143
|
-
"type": "image/png"
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
"src": `../img/${APP_NAME}-logo-dm-64${sufijo}.png`,
|
|
147
|
-
"sizes": "64x64",
|
|
148
|
-
"type": "image/png"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"src": `../img/${APP_NAME}-logo-dm-72${sufijo}.png`,
|
|
152
|
-
"sizes": "72x72",
|
|
153
|
-
"type": "image/png"
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
"src": `../img/${APP_NAME}-logo-dm-192${sufijo}.png`,
|
|
157
|
-
"sizes": "192x192",
|
|
158
|
-
"type": "image/png"
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"src": `../img/${APP_NAME}-logo-dm-512${sufijo}.png`,
|
|
162
|
-
"sizes": "512x512",
|
|
163
|
-
"type": "image/png"
|
|
164
|
-
}
|
|
165
|
-
],
|
|
166
|
-
"start_url": "../campo",
|
|
167
|
-
"display": "standalone",
|
|
168
|
-
"theme_color": "#3F51B5",
|
|
169
|
-
"background_color": "#6d60ed"
|
|
170
|
-
};
|
|
171
|
-
miniTools.serveText(JSON.stringify(content), 'application/json')(req, res);
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
console.log(err);
|
|
175
|
-
miniTools.serveErr(req, res, next)(err);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
addLoggedServices() {
|
|
180
|
-
var be = this;
|
|
181
|
-
super.addLoggedServices();
|
|
182
|
-
be.app.get('/manifest.manifest', async function (req, res, next) {
|
|
183
|
-
miniTools.serveFile('src/client/manifest.manifest', {})(req, res);
|
|
184
|
-
});
|
|
185
|
-
this.app.get('/file', async function (req, res) {
|
|
186
|
-
let result = await be.inTransaction(req, (client) => client.query("select ruta from adjuntos where id_adjunto = $1", [req.query.id_adjunto])
|
|
187
|
-
.fetchUniqueValue());
|
|
188
|
-
var path = result.value;
|
|
189
|
-
miniTools.serveFile(path, {})(req, res);
|
|
190
|
-
});
|
|
191
|
-
this.app.get('/imagenes', async function (req, res) {
|
|
192
|
-
miniTools.serveFile('local-images/' + req.query.pdf, {})(req, res);
|
|
193
|
-
});
|
|
194
|
-
this.app.get('/download/all', async function (req, res, next) {
|
|
195
|
-
if (req.user == null || req.user.rol != 'admin') {
|
|
196
|
-
console.log('no está autorizado a bajarse todo', req.user);
|
|
197
|
-
return next();
|
|
198
|
-
}
|
|
199
|
-
let zip = new yazl.ZipFile();
|
|
200
|
-
zip.outputStream.pipe(res);
|
|
201
|
-
let base = 'local-attachments';
|
|
202
|
-
let files = await fs_1.promises.readdir(base);
|
|
203
|
-
await Promise.all(files.map(async function (fileName) {
|
|
204
|
-
var path = base + '/' + fileName;
|
|
205
|
-
var stat = await fs_1.promises.stat(path);
|
|
206
|
-
if (stat.isFile) {
|
|
207
|
-
zip.addFile(path, fileName);
|
|
208
|
-
}
|
|
209
|
-
}));
|
|
210
|
-
zip.end();
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
async postConfig() {
|
|
214
|
-
await super.postConfig();
|
|
215
|
-
var be = this;
|
|
216
|
-
be.metaEncIncluirCasillerosSaltoREL = false;
|
|
217
|
-
await be.inTransaction(null, async function (client) {
|
|
218
|
-
var qPermisos = `
|
|
219
|
-
SELECT jsonb_object_agg(r.rol,jsonb_build_object('superuser',r.superuser,'puede',(
|
|
220
|
-
SELECT jsonb_object_agg(rp.permiso,(
|
|
221
|
-
SELECT jsonb_object_agg(rpa.accion,rpa.habilitado)
|
|
222
|
-
FROM roles_permisos rpa
|
|
223
|
-
WHERE rpa.rol=rp.rol AND rpa.permiso=rp.permiso
|
|
224
|
-
))
|
|
225
|
-
FROM roles_permisos rp
|
|
226
|
-
WHERE rp.rol=r.rol #condHabilitado#
|
|
227
|
-
)))
|
|
228
|
-
FROM roles r
|
|
229
|
-
`;
|
|
230
|
-
var results = [
|
|
231
|
-
await client.query(qPermisos.replace('#condHabilitado#', '')).fetchUniqueValue(),
|
|
232
|
-
await client.query(qPermisos.replace('#condHabilitado#', ` and rp.${pg.quoteIdent('habilitado')}`)).fetchUniqueValue(),
|
|
233
|
-
await client.query(`
|
|
234
|
-
SELECT jsonb_object_agg(permiso,(
|
|
235
|
-
SELECT jsonb_object_agg(accion,true)
|
|
236
|
-
FROM permisos pa
|
|
237
|
-
WHERE pa.permiso=p.permiso
|
|
238
|
-
))
|
|
239
|
-
FROM permisos p
|
|
240
|
-
`).fetchUniqueValue()
|
|
241
|
-
];
|
|
242
|
-
be.permisosRol = results[0].value;
|
|
243
|
-
be.permisosRolSoloTrue = results[1].value;
|
|
244
|
-
be.permisosSuperuser = results[2].value;
|
|
245
|
-
be.permisosParaNadie = likeAr(be.permisosSuperuser).map(p => likeAr(p).map(va => false).plain()).plain();
|
|
246
|
-
//console.dir(be.permisosRolSoloTrue,{depth:9});
|
|
247
|
-
//console.dir(be.permisosSuperuser,{depth:9});
|
|
248
|
-
//console.dir(be.permisosParaNadie,{depth:9});
|
|
249
|
-
});
|
|
250
|
-
await this.refreshCaches();
|
|
251
|
-
}
|
|
252
|
-
configStaticConfig() {
|
|
253
|
-
super.configStaticConfig();
|
|
254
|
-
this.setStaticConfig(def_config_1.defConfig);
|
|
255
|
-
}
|
|
256
|
-
clientIncludes(req, opts) {
|
|
257
|
-
var be = this;
|
|
258
|
-
var logged = req && opts && !opts.skipMenu;
|
|
259
|
-
var menuedResources = logged ? [
|
|
260
|
-
{ type: 'js', src: 'client/client.js' },
|
|
261
|
-
] : [
|
|
262
|
-
{ type: 'js', src: 'unlogged.js' },
|
|
263
|
-
];
|
|
264
|
-
if (opts && opts.extraFiles) {
|
|
265
|
-
menuedResources = menuedResources.concat(opts.extraFiles);
|
|
266
|
-
}
|
|
267
|
-
var resources = [
|
|
268
|
-
{ type: 'js', module: 'react', modPath: 'umd', fileDevelopment: 'react.development.js', file: 'react.production.min.js' },
|
|
269
|
-
{ type: 'js', module: 'react-dom', modPath: 'umd', fileDevelopment: 'react-dom.development.js', file: 'react-dom.production.min.js' },
|
|
270
|
-
{ type: 'js', module: '@material-ui/core', modPath: 'umd', fileDevelopment: 'material-ui.development.js', file: 'material-ui.production.min.js' },
|
|
271
|
-
{ type: 'js', module: 'clsx', file: 'clsx.min.js' },
|
|
272
|
-
{ type: 'js', module: 'redux', modPath: '../dist', fileDevelopment: 'redux.js', file: 'redux.min.js' },
|
|
273
|
-
{ type: 'js', module: 'react-redux', modPath: '../dist', fileDevelopment: 'react-redux.js', file: 'react-redux.min.js' },
|
|
274
|
-
{ type: 'js', module: 'memoize-one', file: 'memoize-one.js' },
|
|
275
|
-
{ type: 'js', module: 'qrcode', modPath: '../build', file: 'qrcode.js' },
|
|
276
|
-
...super.clientIncludes(req, opts).filter(m => m.file != 'formularios.css')
|
|
277
|
-
.filter(m => logged || true
|
|
278
|
-
//&& m.file!='operativos.js'
|
|
279
|
-
//&& m.file!='meta-enc.js'
|
|
280
|
-
//&& m.file!='datos-ext.js'
|
|
281
|
-
//&& m.file!='consistencias.js'
|
|
282
|
-
&& m.file != 'var-cal.js'
|
|
283
|
-
&& m.file != 'var-cal.js'
|
|
284
|
-
//&& m.file!='varcal.js'
|
|
285
|
-
//)
|
|
286
|
-
//.filter(m=>logged || true
|
|
287
|
-
// && m.file!='operativos.js'
|
|
288
|
-
// && m.file!='meta-enc.js'
|
|
289
|
-
// && m.file!='datos-ext.js'
|
|
290
|
-
// && m.file!='consistencias.js'
|
|
291
|
-
// && m.file!='varcal.js'
|
|
292
|
-
),
|
|
293
|
-
{ type: 'js', module: 'service-worker-admin', file: 'service-worker-admin.js' },
|
|
294
|
-
{ type: 'js', module: 'redux-typed-reducer', modPath: '../dist', file: 'redux-typed-reducer.js' },
|
|
295
|
-
{ type: 'js', src: 'adapt.js' },
|
|
296
|
-
{ type: 'js', src: 'tipos.js' },
|
|
297
|
-
{ type: 'js', src: 'bypass-formulario.js' },
|
|
298
|
-
{ type: 'js', src: 'redux-formulario.js' },
|
|
299
|
-
{ type: 'js', src: 'render-general.js' },
|
|
300
|
-
{ type: 'js', src: 'render-formulario.js' },
|
|
301
|
-
{ type: 'js', src: 'abrir-formulario.js' },
|
|
302
|
-
{ type: 'css', file: 'menu.css' },
|
|
303
|
-
{ type: 'css', file: 'formulario-react.css' },
|
|
304
|
-
...menuedResources
|
|
305
|
-
];
|
|
306
|
-
return resources;
|
|
307
|
-
// .map(m=>({...m, file:m.fileDevelopment||m.file}));
|
|
308
|
-
}
|
|
309
|
-
async refreshCaches() {
|
|
310
|
-
this.caches.tableContent = this.caches.tableContent || {};
|
|
311
|
-
await this.inDbClient(null, async (client) => {
|
|
312
|
-
this.caches.tableContent.no_rea = (await client.query(`select * from no_rea order by no_rea`).fetchAll()).rows;
|
|
313
|
-
console.log('caches', this.caches.tableContent.no_rea);
|
|
314
|
-
this.caches.tableContent.no_rea_groups = (await client.query(`
|
|
315
|
-
select grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo order by 1
|
|
316
|
-
`).fetchAll()).rows;
|
|
317
|
-
this.caches.tableContent.no_rea_groups0 = (await client.query(`
|
|
318
|
-
select grupo0 as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo0 order by 1
|
|
319
|
-
`).fetchAll()).rows;
|
|
320
|
-
});
|
|
321
|
-
console.log('caches ok');
|
|
322
|
-
}
|
|
323
|
-
sqlNoreaCase(campoNecesario) {
|
|
324
|
-
var be = this;
|
|
325
|
-
return `CASE ${be.caches.tableContent.no_rea.map(x => ` WHEN json_encuesta ->> ${be.db.quoteLiteral(x.variable)} = ${be.db.quoteLiteral(x.valor)} THEN ${be.db.quoteLiteral(x[campoNecesario])}`).join('')} WHEN TRUE THEN NULL END`;
|
|
326
|
-
}
|
|
327
|
-
getContext(req) {
|
|
328
|
-
var _a, _b;
|
|
329
|
-
var be = this;
|
|
330
|
-
var fatherContext = super.getContext(req);
|
|
331
|
-
if (fatherContext.user) {
|
|
332
|
-
if ((_a = be.permisosRol[req.user.rol]) === null || _a === void 0 ? void 0 : _a.superuser) {
|
|
333
|
-
return { superuser: true, puede: be.permisosSuperuser, ...fatherContext };
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
return { puede: (_b = be.permisosRol[req.user.rol]) === null || _b === void 0 ? void 0 : _b.puede, ...fatherContext };
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
return { puede: be.permisosParaNadie, ...fatherContext };
|
|
340
|
-
}
|
|
341
|
-
getContextForDump() {
|
|
342
|
-
var fatherContext = super.getContextForDump();
|
|
343
|
-
return { superuser: true, puede: this.permisosSuperuser, ...fatherContext };
|
|
344
|
-
}
|
|
345
|
-
getClientSetupForSendToFrontEnd(req) {
|
|
346
|
-
var _a;
|
|
347
|
-
return {
|
|
348
|
-
...super.getClientSetupForSendToFrontEnd(req),
|
|
349
|
-
idper: (_a = req.user) === null || _a === void 0 ? void 0 : _a.idper
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
createResourcesForCacheJson(parameters) {
|
|
353
|
-
var be = this;
|
|
354
|
-
var jsonResult = {};
|
|
355
|
-
jsonResult.version = APP_DM_VERSION;
|
|
356
|
-
jsonResult.appName = 'dmencu';
|
|
357
|
-
jsonResult.cache = [
|
|
358
|
-
"campo",
|
|
359
|
-
"offline",
|
|
360
|
-
"lib/react.production.min.js",
|
|
361
|
-
"lib/react-dom.production.min.js",
|
|
362
|
-
"lib/material-ui.production.min.js",
|
|
363
|
-
"lib/clsx.min.js",
|
|
364
|
-
"lib/redux.min.js",
|
|
365
|
-
"lib/react-redux.min.js",
|
|
366
|
-
"lib/memoize-one.js",
|
|
367
|
-
"lib/qrcode.js",
|
|
368
|
-
"lib/require-bro.js",
|
|
369
|
-
"lib/cast-error.js",
|
|
370
|
-
"lib/like-ar.js",
|
|
371
|
-
"lib/best-globals.js",
|
|
372
|
-
"lib/json4all.js",
|
|
373
|
-
"lib/js-to-html.js",
|
|
374
|
-
"lib/redux-typed-reducer.js",
|
|
375
|
-
"adapt.js",
|
|
376
|
-
"unlogged.js",
|
|
377
|
-
"lib/js-yaml.js",
|
|
378
|
-
"lib/xlsx.core.min.js",
|
|
379
|
-
"lib/lazy-some.js",
|
|
380
|
-
"lib/sql-tools.js",
|
|
381
|
-
"dialog-promise/dialog-promise.js",
|
|
382
|
-
"moment/min/moment.js",
|
|
383
|
-
"pikaday/pikaday.js",
|
|
384
|
-
"lib/polyfills-bro.js",
|
|
385
|
-
"lib/big.js",
|
|
386
|
-
"lib/type-store.js",
|
|
387
|
-
"lib/typed-controls.js",
|
|
388
|
-
"lib/ajax-best-promise.js",
|
|
389
|
-
"my-ajax.js",
|
|
390
|
-
"my-start.js",
|
|
391
|
-
"lib/my-localdb.js",
|
|
392
|
-
"lib/my-websqldb.js",
|
|
393
|
-
"lib/my-localdb.js.map",
|
|
394
|
-
"lib/my-websqldb.js.map",
|
|
395
|
-
"lib/my-things.js",
|
|
396
|
-
"lib/my-tables.js",
|
|
397
|
-
"lib/my-inform-net-status.js",
|
|
398
|
-
"lib/my-menu.js",
|
|
399
|
-
"lib/my-skin.js",
|
|
400
|
-
"lib/cliente-en-castellano.js",
|
|
401
|
-
"lib/service-worker-admin.js",
|
|
402
|
-
"lib/redux-typed-reducer.js",
|
|
403
|
-
"tipos.js",
|
|
404
|
-
"bypass-formulario.js",
|
|
405
|
-
"redux-formulario.js",
|
|
406
|
-
"render-general.js",
|
|
407
|
-
"render-formulario.js",
|
|
408
|
-
"abrir-formulario.js",
|
|
409
|
-
"client_modules/row-validator.js",
|
|
410
|
-
"client/menu.js",
|
|
411
|
-
"client/menu.js",
|
|
412
|
-
"img/logo.png",
|
|
413
|
-
//"img/logo-dm.png",
|
|
414
|
-
"img/logo-128.png",
|
|
415
|
-
"img/main-loading.gif",
|
|
416
|
-
"img/borrar-valor.png",
|
|
417
|
-
"img/fondo-salteado-error.png",
|
|
418
|
-
"img/fondo-salteado.png",
|
|
419
|
-
"client-setup",
|
|
420
|
-
"css/bootstrap.min.css",
|
|
421
|
-
"css/formulario-react.css",
|
|
422
|
-
"css/Roboto-Regular.ttf"
|
|
423
|
-
];
|
|
424
|
-
jsonResult.fallback = [
|
|
425
|
-
{ "path": "login", "fallback": "offline" },
|
|
426
|
-
{ "path": "logout", "fallback": "offline" },
|
|
427
|
-
{ "path": "login#i=sincronizar", "fallback": "offline" },
|
|
428
|
-
{ "path": "menu#i=sincronizar", "fallback": "offline" }
|
|
429
|
-
];
|
|
430
|
-
return jsonResult;
|
|
431
|
-
}
|
|
432
|
-
getMenu(context) {
|
|
433
|
-
var _a, _b, _c;
|
|
434
|
-
let menu = [];
|
|
435
|
-
if (this.config.server.policy == 'web') {
|
|
436
|
-
if ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.relevar) {
|
|
437
|
-
if (this.config['client-setup'].ambiente == 'demo' || this.config['client-setup'].ambiente == 'test' || this.config['client-setup'].ambiente == 'capa') {
|
|
438
|
-
menu.push({ menuType: 'demo', name: 'demo', selectedByDefault: true });
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
menu.push({ menuType: 'path', name: 'relevamiento', path: '/campo' });
|
|
442
|
-
}
|
|
443
|
-
menu.push({ menuType: 'sincronizar_dm', name: 'sincronizar' });
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
if ((_c = (_b = context.puede) === null || _b === void 0 ? void 0 : _b.campo) === null || _c === void 0 ? void 0 : _c.editar) {
|
|
448
|
-
menu.push({ menuType: 'abrir_encuesta', name: 'abrir_encuesta' });
|
|
449
|
-
menu.push({ menuType: 'menu', name: 'recepcion', label: 'recepción', menuContent: [
|
|
450
|
-
{ menuType: 'table', name: 'mis_areas', table: 'areas', ff: { recepcionista: context.user.idper } },
|
|
451
|
-
{ menuType: 'table', name: 'mis_encuestadores' },
|
|
452
|
-
{ menuType: 'table', name: 'areas' },
|
|
453
|
-
{ menuType: 'table', name: 'tem_recepcion', label: 'TEM' },
|
|
454
|
-
] });
|
|
455
|
-
}
|
|
456
|
-
console.log("context user", context.user);
|
|
457
|
-
if (context.superuser) {
|
|
458
|
-
menu.push({ menuType: 'menu', name: 'control', menuContent: [
|
|
459
|
-
{ menuType: 'table', name: 'resumen', table: 'control_resumen', selectedByDefault: true },
|
|
460
|
-
{ menuType: 'table', name: 'dominio', table: 'control_campo' },
|
|
461
|
-
{ menuType: 'table', name: 'zona', table: 'control_campo_zona' },
|
|
462
|
-
{ menuType: 'table', name: 'comuna', table: 'control_campo_comuna' },
|
|
463
|
-
{ menuType: 'table', name: 'área', table: 'control_campo_area' },
|
|
464
|
-
{ menuType: 'table', name: 'participacion', table: 'control_campo_participacion' },
|
|
465
|
-
] });
|
|
466
|
-
}
|
|
467
|
-
if (context.superuser) {
|
|
468
|
-
menu = [...menu,
|
|
469
|
-
{ menuType: 'menu', name: 'configurar', menuContent: [
|
|
470
|
-
{ menuType: 'menu', name: 'muestra', label: 'muestra', menuContent: [
|
|
471
|
-
{ menuType: 'table', name: 'tem', label: 'TEM' },
|
|
472
|
-
{ menuType: 'table', name: 'tareas' },
|
|
473
|
-
{ menuType: 'table', name: 'resultados_tarea' },
|
|
474
|
-
// {menuType:'table', name:'personal_rol'},
|
|
475
|
-
] },
|
|
476
|
-
{ menuType: 'menu', name: 'metadatos', menuContent: [
|
|
477
|
-
{ menuType: 'table', name: 'operativos' },
|
|
478
|
-
{ menuType: 'table', name: 'formularios', table: 'casilleros_principales' },
|
|
479
|
-
{ menuType: 'table', name: 'plano', table: 'casilleros' },
|
|
480
|
-
{ menuType: 'table', name: 'tipoc', label: 'tipos de celdas' },
|
|
481
|
-
{ menuType: 'table', name: 'tipoc_tipoc', label: 'inclusiones de celdas' },
|
|
482
|
-
] },
|
|
483
|
-
{ menuType: 'table', name: 'parametros' },
|
|
484
|
-
] },
|
|
485
|
-
{ menuType: 'menu', name: 'usuarios', menuContent: [
|
|
486
|
-
{ menuType: 'table', name: 'usuarios', selectedByDefault: true },
|
|
487
|
-
{ menuType: 'table', name: 'roles' },
|
|
488
|
-
{ menuType: 'table', name: 'permisos' },
|
|
489
|
-
{ menuType: 'table', name: 'roles_permisos' },
|
|
490
|
-
] },
|
|
491
|
-
// {menuType:'proc', name:'generate_tabledef', proc:'tabledef_generate', label:'generar tablas' },
|
|
492
|
-
];
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
return { menu };
|
|
496
|
-
}
|
|
497
|
-
prepareGetTables() {
|
|
498
|
-
var be = this;
|
|
499
|
-
super.prepareGetTables();
|
|
500
|
-
this.getTableDefinition = {
|
|
501
|
-
...this.getTableDefinition,
|
|
502
|
-
roles: table_roles_1.roles,
|
|
503
|
-
usuarios: table_usuarios_1.usuarios,
|
|
504
|
-
personal: table_personal_1.personal,
|
|
505
|
-
recepcionistas: table_recepcionistas_1.recepcionistas,
|
|
506
|
-
encuestadores: table_encuestadores_1.encuestadores,
|
|
507
|
-
mis_encuestadores: table_mis_encuestadores_1.mis_encuestadores,
|
|
508
|
-
recuperadores: table_recuperadores_1.recuperadores,
|
|
509
|
-
supervisores: table_supervisores_1.supervisores,
|
|
510
|
-
personal_rol: table_personal_rol_1.personal_rol,
|
|
511
|
-
permisos: table_permisos_1.permisos,
|
|
512
|
-
roles_permisos: table_roles_permisos_1.roles_permisos,
|
|
513
|
-
roles_subordinados: table_roles_subordinados_1.roles_subordinados,
|
|
514
|
-
no_rea: table_no_rea_1.no_rea,
|
|
515
|
-
semanas: table_semanas_1.semanas,
|
|
516
|
-
tem: table_tem_1.tem,
|
|
517
|
-
tem_recepcion: table_tem_recepcion_1.tem_recepcion,
|
|
518
|
-
parametros: table_parametros_1.parametros,
|
|
519
|
-
operaciones: table_operaciones_1.operaciones,
|
|
520
|
-
comunas: table_comunas_1.comunas,
|
|
521
|
-
areas: table_areas_1.areas,
|
|
522
|
-
sincronizaciones: table_sincronizaciones_1.sincronizaciones,
|
|
523
|
-
tareas: table_tareas_1.tareas,
|
|
524
|
-
resultados_tarea: table_resultados_tarea_1.resultados_tarea,
|
|
525
|
-
tareas_tem: table_tareas_tem_1.tareas_tem,
|
|
526
|
-
tareas_areas: table_tareas_areas_1.tareas_areas,
|
|
527
|
-
mis_tareas: table_mis_tareas_1.mis_tareas,
|
|
528
|
-
mis_tareas_tem: table_mis_tareas_tem_1.mis_tareas_tem,
|
|
529
|
-
mis_tareas_areas: table_mis_tareas_areas_1.mis_tareas_areas,
|
|
530
|
-
control_campo: table_control_campo_1.control_campo,
|
|
531
|
-
control_resumen: table_control_resumen_1.control_resumen,
|
|
532
|
-
control_campo_zona: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x zona solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }], filtroWhere: 'true' }),
|
|
533
|
-
control_campo_comuna: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x comuna solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'integer' }], filtroWhere: 'true' }),
|
|
534
|
-
control_campo_area: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x area', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'integer' }, { name: 'area', typeName: 'integer' }, { name: 'participacion_a', typeName: 'text' }, { name: 'clase_a', typeName: 'text' }] }),
|
|
535
|
-
control_campo_participacion: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x participacion', camposCorte: [{ name: 'participacion', typeName: 'bigint' }] }),
|
|
536
|
-
};
|
|
537
|
-
be.appendToTableDefinition('consistencias', function (tableDef, context) {
|
|
538
|
-
tableDef.fields.forEach(function (field) {
|
|
539
|
-
if (field.name == 'error_compilacion') {
|
|
540
|
-
if (field.visible) {
|
|
541
|
-
console.error('************ QUITAR ESTO error_compilacion ya es visible');
|
|
542
|
-
}
|
|
543
|
-
field.visible = true;
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
});
|
|
547
|
-
be.appendToTableDefinition('inconsistencias', function (tableDef, context) {
|
|
548
|
-
var _a;
|
|
549
|
-
tableDef.fields.splice(2, 0, { name: 'id_caso', typeName: 'text', label: 'caso', editable: false });
|
|
550
|
-
tableDef.editable = tableDef.editable || ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.justificar);
|
|
551
|
-
tableDef.fields.forEach(function (field) {
|
|
552
|
-
var _a;
|
|
553
|
-
if (field.name == 'pk_integrada') {
|
|
554
|
-
field.visible = false;
|
|
555
|
-
}
|
|
556
|
-
if (field.name == 'justificacion') {
|
|
557
|
-
field.editable = context.forDump || ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.justificar);
|
|
558
|
-
}
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
be.appendToTableDefinition('operativos', function (tableDef, context) {
|
|
562
|
-
tableDef.fields.splice(2, 0, {
|
|
563
|
-
name: 'config_sorteo',
|
|
564
|
-
typeName: 'jsonb',
|
|
565
|
-
editable: false
|
|
566
|
-
});
|
|
567
|
-
tableDef.fields.splice(3, 0, {
|
|
568
|
-
name: 'disform_cerrado',
|
|
569
|
-
typeName: 'boolean',
|
|
570
|
-
defaultValue: false,
|
|
571
|
-
editable: context.forDump || ['admin', 'dis_conceptual'].includes(context.user.rol)
|
|
572
|
-
});
|
|
573
|
-
});
|
|
574
|
-
// be.appendToTableDefinition('casilleros',function(tableDef, context){
|
|
575
|
-
// tableDef.constraints = tableDef.constraints.filter(c=>c.consName!='casilleros salto REL')
|
|
576
|
-
// })
|
|
577
|
-
}
|
|
578
|
-
};
|
|
579
|
-
}
|
|
580
|
-
exports.emergeAppDmEncu = emergeAppDmEncu;
|
|
581
|
-
});
|
|
582
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRtZW5jdS50cy5SRU1PVEUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL2FwcC1kbWVuY3UudHMuUkVNT1RFLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBR2IsMkRBQXlFO0lBRXpFLHdDQUF3QztJQUV4Qyx3Q0FBd0M7SUFJeEMsNkJBQTZCO0lBRTdCLGtDQUFrQztJQUVsQywyQkFBbUM7SUFFbkMsK0NBQW9EO0lBQ3BELHFEQUF1RDtJQUN2RCxpRUFBNkQ7SUFDN0QsK0RBQThEO0lBQzlELHVFQUFrRTtJQUNsRSwrREFBNEQ7SUFDNUQsNkRBQTJEO0lBQzNELDZEQUEyRDtJQUMzRCxxREFBdUQ7SUFDdkQsaUVBQTZEO0lBQzdELHlEQUF5RDtJQUN6RCx5RUFBaUU7SUFFakUsaURBQXFEO0lBQ3JELDJDQUFrRDtJQUNsRCwrREFBNEQ7SUFDNUQsbURBQXNEO0lBQ3RELHFEQUF1RDtJQUN2RCwyREFBMEQ7SUFDMUQsbURBQXNEO0lBQ3RELCtDQUFvRDtJQUNwRCxxRUFBK0Q7SUFDL0QsaURBQXFEO0lBQ3JELHlEQUF5RDtJQUN6RCw2REFBMkQ7SUFDM0QseURBQXlEO0lBQ3pELGlFQUE2RDtJQUM3RCxxRUFBK0Q7SUFDL0QscUVBQStEO0lBQy9ELCtEQUE0RDtJQUM1RCxtRUFBOEQ7SUFFOUQsNkNBQXNDO0lBRXRDLE1BQU0sY0FBYyxHQUFDLFdBQVcsQ0FBQztJQUdqQyxTQUFnQixlQUFlLENBQTRELElBQU07UUFDL0YsT0FBTyxNQUFNLFNBQVUsU0FBUSxJQUFJO1lBQ2pDLFlBQVksR0FBRyxJQUFVO2dCQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFBO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUMsRUFBRSxDQUFBO2dCQUN6QyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsS0FBSyxDQUFDLGFBQWE7Z0JBQ2YsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUNkLElBQUksd0JBQXdCLEdBQUMsQ0FBQyxjQUFjLEVBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVSxHQUFHLE1BQU0sS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM3QyxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQSxFQUFFO29CQUNqQyxJQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksbUJBQW1CLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxxQkFBcUIsRUFBQzt3QkFDaEYsSUFBSSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO3dCQUMvQyxPQUFPLENBQUMsWUFBWSxHQUFHLEtBQUssV0FBVSxPQUFPLEVBQUUsVUFBVTs0QkFDckQsSUFBSSxNQUFNLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7NEJBQzNELElBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxZQUFZLEVBQUM7Z0NBQ2hDLEVBQUUsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBOzZCQUMvRDs0QkFDRCxPQUFPLE1BQU0sQ0FBQzt3QkFDbEIsQ0FBQyxDQUFBO3FCQUNKO29CQUNELE9BQU8sT0FBTyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQTtnQkFDRixPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsb0NBQWdCLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE9BQWM7WUFDM0MsQ0FBQztZQUNELHNCQUFzQixDQUFDLE9BQTZCLEVBQUUsT0FBYztnQkFDaEUsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDO2dCQUNaLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBUyxHQUFXLEVBQUMsR0FBWSxFQUFFLElBQWlCO29CQUM1RCxJQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQzt3QkFDbkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2hFO29CQUNELElBQUksRUFBRSxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFBO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFDLFFBQVEsRUFBQyxLQUFLLFdBQVUsR0FBRyxFQUFDLEdBQUcsRUFBQyxLQUFLO29CQUNyRCxnRkFBZ0Y7b0JBQ2hGLElBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDO29CQUM1QixJQUFHLElBQUksRUFBQzt3QkFDSix3Q0FBd0M7d0JBQ3hDLElBQUksZUFBZSxHQUFHLG1DQUFtQyxDQUFDO3dCQUMxRCxJQUFJLFFBQVEsR0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbEcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNoRDt5QkFBSTt3QkFDRCxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBQywyQkFBMkIsQ0FBQyxDQUFBO3FCQUNwRDtnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLG1CQUFtQixHQUFHLEtBQUs7b0JBQzNCLElBQUksRUFBRSxHQUFHLE1BQU0sYUFBRSxDQUFDLFFBQVEsQ0FBQyxzRUFBc0UsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0csSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLFVBQVUsR0FBRyxFQUFFO3lCQUNkLE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQzFELE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQzFELE9BQU8sQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDeEUsT0FBTyxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNqRixrR0FBa0c7b0JBQ3RHLE9BQU8sVUFBVSxDQUFBO2dCQUNyQixDQUFDLENBQUE7Z0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUMsaUJBQWlCLEVBQUUsS0FBSyxXQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtvQkFDaEUsSUFBRzt3QkFDQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sbUJBQW1CLEVBQUUsRUFBQyx3QkFBd0IsQ0FBQyxDQUFDLEdBQUcsRUFBQyxHQUFHLENBQUMsQ0FBQztxQkFDdEY7b0JBQUEsT0FBTSxHQUFHLEVBQUM7d0JBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN6QztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBQyxvQ0FBb0MsRUFBRSxLQUFLLFdBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO29CQUNuRixNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFnQixFQUFDLEVBQUUsQ0FDL0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQzNGLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ1QsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUEsT0FBTyxDQUFBLENBQUM7d0JBQzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFBLE9BQU8sQ0FBQSxDQUFDLENBQUEsRUFBRSxDQUFDO29CQUN4QyxJQUFHO3dCQUNDLE1BQU0sT0FBTyxHQUFHOzRCQUNkLE1BQU0sRUFBRSxHQUFHLFFBQVEsc0JBQXNCOzRCQUN6QyxZQUFZLEVBQUUsR0FBRyxRQUFRLE1BQU07NEJBQy9CLGFBQWEsRUFBRSwyQkFBMkIsUUFBUSxHQUFHOzRCQUNyRCxPQUFPLEVBQUU7Z0NBQ1A7b0NBQ0UsS0FBSyxFQUFFLFVBQVUsUUFBUSxjQUFjLE1BQU0sTUFBTTtvQ0FDbkQsT0FBTyxFQUFFLE9BQU87b0NBQ2hCLE1BQU0sRUFBRSxXQUFXO2lDQUNwQjtnQ0FDRDtvQ0FDRSxLQUFLLEVBQUUsVUFBVSxRQUFRLGNBQWMsTUFBTSxNQUFNO29DQUNuRCxPQUFPLEVBQUUsT0FBTztvQ0FDaEIsTUFBTSxFQUFFLFdBQVc7aUNBQ3BCO2dDQUNEO29DQUNFLEtBQUssRUFBRSxVQUFVLFFBQVEsY0FBYyxNQUFNLE1BQU07b0NBQ25ELE9BQU8sRUFBRSxPQUFPO29DQUNoQixNQUFNLEVBQUUsV0FBVztpQ0FDcEI7Z0NBQ0Q7b0NBQ0UsS0FBSyxFQUFFLFVBQVUsUUFBUSxjQUFjLE1BQU0sTUFBTTtvQ0FDbkQsT0FBTyxFQUFFLE9BQU87b0NBQ2hCLE1BQU0sRUFBRSxXQUFXO2lDQUNwQjtnQ0FDRDtvQ0FDRSxLQUFLLEVBQUUsVUFBVSxRQUFRLGVBQWUsTUFBTSxNQUFNO29DQUNwRCxPQUFPLEVBQUUsU0FBUztvQ0FDbEIsTUFBTSxFQUFFLFdBQVc7aUNBQ3BCO2dDQUNEO29DQUNFLEtBQUssRUFBRSxVQUFVLFFBQVEsZUFBZSxNQUFNLE1BQU07b0NBQ3BELE9BQU8sRUFBRSxTQUFTO29DQUNsQixNQUFNLEVBQUUsV0FBVztpQ0FDcEI7NkJBQ0Y7NEJBQ0QsV0FBVyxFQUFFLFVBQVU7NEJBQ3ZCLFNBQVMsRUFBRSxZQUFZOzRCQUN2QixhQUFhLEVBQUUsU0FBUzs0QkFDeEIsa0JBQWtCLEVBQUUsU0FBUzt5QkFDOUIsQ0FBQTt3QkFDRCxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzdFO29CQUFBLE9BQU0sR0FBRyxFQUFDO3dCQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDM0M7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1lBQ0QsaUJBQWlCO2dCQUNiLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDZCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDMUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxXQUFVLEdBQVcsRUFBRSxHQUFZLEVBQUUsSUFBaUI7b0JBQ3hGLFNBQVMsQ0FBQyxTQUFTLENBQUMsOEJBQThCLEVBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFVLEdBQVcsRUFBQyxHQUFZO29CQUN6RCxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUNuQyxDQUFDLE1BQWdCLEVBQUMsRUFBRSxDQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxFQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzt5QkFDckYsZ0JBQWdCLEVBQUUsQ0FDdEIsQ0FBQztvQkFDRixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN4QixTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLFdBQVUsR0FBVyxFQUFDLEdBQVk7b0JBQzdELFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLEtBQUssV0FBVSxHQUFXLEVBQUUsR0FBWSxFQUFFLElBQWE7b0JBQ2hGLElBQUcsR0FBRyxDQUFDLElBQUksSUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUUsT0FBTyxFQUFDO3dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDekQsT0FBTyxJQUFJLEVBQUUsQ0FBQztxQkFDakI7b0JBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzdCLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixJQUFJLElBQUksR0FBRyxtQkFBbUIsQ0FBQTtvQkFDOUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxhQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFdBQVUsUUFBZTt3QkFDdEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFDLEdBQUcsR0FBQyxRQUFRLENBQUM7d0JBQzdCLElBQUksSUFBSSxHQUFHLE1BQU0sYUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDL0IsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFDOzRCQUNYLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM5QjtvQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNKLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQTtZQUNOLENBQUM7WUFDRCxLQUFLLENBQUMsVUFBVTtnQkFDWixNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDO2dCQUNaLEVBQUUsQ0FBQyxnQ0FBZ0MsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxXQUFVLE1BQWdCO29CQUN4RCxJQUFJLFNBQVMsR0FBQzs7Ozs7Ozs7Ozs7YUFXYixDQUFDO29CQUNGLElBQUksT0FBTyxHQUFHO3dCQUNWLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7d0JBQy9FLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDckgsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDOzs7Ozs7O2lCQU9sQixDQUFDLENBQUMsZ0JBQWdCLEVBQUU7cUJBQ3hCLENBQUM7b0JBQ0YsRUFBRSxDQUFDLFdBQVcsR0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNoQyxFQUFFLENBQUMsbUJBQW1CLEdBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDeEMsRUFBRSxDQUFDLGlCQUFpQixHQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3RDLEVBQUUsQ0FBQyxpQkFBaUIsR0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxFQUFFLENBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUEsRUFBRSxDQUFBLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7b0JBQ2xHLGdEQUFnRDtvQkFDaEQsOENBQThDO29CQUM5Qyw4Q0FBOEM7Z0JBQ2xELENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLENBQUM7WUFDRCxrQkFBa0I7Z0JBQ2QsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQVMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUk7Z0JBQ3BCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBRTtnQkFDNUMsSUFBSSxlQUFlLEdBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDekIsRUFBRSxJQUFJLEVBQUMsSUFBSSxFQUFHLEdBQUcsRUFBRSxrQkFBa0IsRUFBRTtpQkFDMUMsQ0FBQSxDQUFDLENBQUE7b0JBQ0UsRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFHLEdBQUcsRUFBQyxhQUFhLEVBQUU7aUJBQ25DLENBQUM7Z0JBQ0YsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBQztvQkFDdkIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3RDtnQkFDRCxJQUFJLFNBQVMsR0FBRztvQkFDWixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUMseUJBQXlCLEVBQUU7b0JBQ3ZILEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFDLDBCQUEwQixFQUFFLElBQUksRUFBQyw2QkFBNkIsRUFBRTtvQkFDbkksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBQyw0QkFBNEIsRUFBRSxJQUFJLEVBQUMsK0JBQStCLEVBQUU7b0JBQy9JLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxhQUFhLEVBQUU7b0JBQ2xELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsY0FBYyxFQUFFO29CQUNuRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsb0JBQW9CLEVBQUU7b0JBQ3JILEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFHLElBQUksRUFBQyxnQkFBZ0IsRUFBRTtvQkFDN0QsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDO29CQUN2RSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLENBQUMsQ0FBQyxJQUFJLElBQUUsaUJBQWlCLENBQUM7eUJBQ2xFLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLE1BQU0sSUFBSSxJQUFJO3dCQUNULDZCQUE2Qjt3QkFDN0IsMEJBQTBCO3dCQUMxQiwyQkFBMkI7d0JBQzNCLCtCQUErQjsyQkFDNUIsQ0FBQyxDQUFDLElBQUksSUFBRSxZQUFZOzJCQUNwQixDQUFDLENBQUMsSUFBSSxJQUFFLFlBQVk7b0JBQ3ZCLHdCQUF3QjtvQkFDeEMsR0FBRztvQkFDSCwyQkFBMkI7b0JBQzNCLGlDQUFpQztvQkFDakMsOEJBQThCO29CQUM5QiwrQkFBK0I7b0JBQy9CLG1DQUFtQztvQkFDbkMsNEJBQTRCO3FCQUMzQjtvQkFDTCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFHLElBQUksRUFBQyx5QkFBeUIsRUFBRTtvQkFDL0UsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyx3QkFBd0IsRUFBRTtvQkFDL0YsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7b0JBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFO29CQUMvQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFO29CQUMzQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHFCQUFxQixFQUFFO29CQUMxQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixFQUFFO29CQUN4QyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFO29CQUMzQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHFCQUFxQixFQUFFO29CQUMxQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtvQkFDakMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRTtvQkFDN0MsR0FBSSxlQUFlO2lCQUN0QixDQUFBO2dCQUNELE9BQU8sU0FBUyxDQUFBO2dCQUNoQixxREFBcUQ7WUFDekQsQ0FBQztZQUNELEtBQUssQ0FBQyxhQUFhO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUMvRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDOzthQUU1RCxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQzs7YUFFN0QsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQTtnQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFDRCxZQUFZLENBQUMsY0FBcUI7Z0JBQzlCLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQztnQkFDWixPQUFPLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUNoRCwyQkFBMkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUM3SSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUE7WUFDeEMsQ0FBQztZQUNELFVBQVUsQ0FBQyxHQUFXOztnQkFDbEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUNkLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLElBQUcsYUFBYSxDQUFDLElBQUksRUFBQztvQkFDbEIsSUFBRyxNQUFBLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMENBQUUsU0FBUyxFQUFDO3dCQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUE7cUJBQ3pFO3lCQUFJO3dCQUNELE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBQSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLDBDQUFFLEtBQUssRUFBRSxHQUFHLGFBQWEsRUFBQyxDQUFBO3FCQUN4RTtpQkFDSjtnQkFDRCxPQUFPLEVBQUMsS0FBSyxFQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLGFBQWEsRUFBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxpQkFBaUI7Z0JBQ2IsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzlDLE9BQU8sRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxhQUFhLEVBQUMsQ0FBQztZQUM3RSxDQUFDO1lBQ0QsK0JBQStCLENBQUMsR0FBVzs7Z0JBQ3ZDLE9BQU87b0JBQ0gsR0FBRyxLQUFLLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDO29CQUM3QyxLQUFLLEVBQUUsTUFBQSxHQUFHLENBQUMsSUFBSSwwQ0FBRSxLQUFLO2lCQUN6QixDQUFBO1lBRUwsQ0FBQztZQUNELDJCQUEyQixDQUFDLFVBQVU7Z0JBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBRXBCLFVBQVUsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO2dCQUNwQyxVQUFVLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztnQkFDOUIsVUFBVSxDQUFDLEtBQUssR0FBQztvQkFDYixPQUFPO29CQUNQLFNBQVM7b0JBQ1QsNkJBQTZCO29CQUM3QixpQ0FBaUM7b0JBQ2pDLG1DQUFtQztvQkFDbkMsaUJBQWlCO29CQUNqQixrQkFBa0I7b0JBQ2xCLHdCQUF3QjtvQkFDeEIsb0JBQW9CO29CQUNwQixlQUFlO29CQUNmLG9CQUFvQjtvQkFDcEIsbUJBQW1CO29CQUNuQixnQkFBZ0I7b0JBQ2hCLHFCQUFxQjtvQkFDckIsaUJBQWlCO29CQUNqQixtQkFBbUI7b0JBQ25CLDRCQUE0QjtvQkFDNUIsVUFBVTtvQkFDVixhQUFhO29CQUNiLGdCQUFnQjtvQkFDaEIsc0JBQXNCO29CQUN0QixrQkFBa0I7b0JBQ2xCLGtCQUFrQjtvQkFDbEIsa0NBQWtDO29CQUNsQyxzQkFBc0I7b0JBQ3RCLG9CQUFvQjtvQkFDcEIsc0JBQXNCO29CQUN0QixZQUFZO29CQUNaLG1CQUFtQjtvQkFDbkIsdUJBQXVCO29CQUN2QiwwQkFBMEI7b0JBQzFCLFlBQVk7b0JBQ1osYUFBYTtvQkFDYixtQkFBbUI7b0JBQ25CLG9CQUFvQjtvQkFDcEIsdUJBQXVCO29CQUN2Qix3QkFBd0I7b0JBQ3hCLGtCQUFrQjtvQkFDbEIsa0JBQWtCO29CQUNsQiw2QkFBNkI7b0JBQzdCLGdCQUFnQjtvQkFDaEIsZ0JBQWdCO29CQUNoQiw4QkFBOEI7b0JBQzlCLDZCQUE2QjtvQkFDN0IsNEJBQTRCO29CQUM1QixVQUFVO29CQUNWLHNCQUFzQjtvQkFDdEIscUJBQXFCO29CQUNyQixtQkFBbUI7b0JBQ25CLHNCQUFzQjtvQkFDdEIscUJBQXFCO29CQUNyQixpQ0FBaUM7b0JBQ2pDLGdCQUFnQjtvQkFDaEIsZ0JBQWdCO29CQUNoQixjQUFjO29CQUNkLG9CQUFvQjtvQkFDcEIsa0JBQWtCO29CQUNsQixzQkFBc0I7b0JBQ3RCLHNCQUFzQjtvQkFDdEIsOEJBQThCO29CQUM5Qix3QkFBd0I7b0JBQ3hCLGNBQWM7b0JBQ2QsdUJBQXVCO29CQUN2QiwwQkFBMEI7b0JBQzFCLHdCQUF3QjtpQkFDM0IsQ0FBQTtnQkFDRCxVQUFVLENBQUMsUUFBUSxHQUFDO29CQUNoQixFQUFDLE1BQU0sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFDLFNBQVMsRUFBQztvQkFDdEMsRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxTQUFTLEVBQUM7b0JBQ3ZDLEVBQUMsTUFBTSxFQUFDLHFCQUFxQixFQUFFLFVBQVUsRUFBQyxTQUFTLEVBQUM7b0JBQ3BELEVBQUMsTUFBTSxFQUFDLG9CQUFvQixFQUFFLFVBQVUsRUFBQyxTQUFTLEVBQUM7aUJBQ3RELENBQUM7Z0JBQ0YsT0FBTyxVQUFVLENBQUE7WUFDckIsQ0FBQztZQUNELE9BQU8sQ0FBQyxPQUFlOztnQkFDbkIsSUFBSSxJQUFJLEdBQWtCLEVBQUUsQ0FBQztnQkFDN0IsSUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUUsS0FBSyxFQUFDO29CQUNoQyxJQUFHLE1BQUEsT0FBTyxDQUFDLEtBQUssMENBQUUsU0FBUyxDQUFDLE9BQU8sRUFBQzt3QkFDaEMsSUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsSUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLElBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxJQUFFLE1BQU0sRUFBQzs0QkFDNUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO3lCQUNwRTs2QkFBSTs0QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsY0FBYyxFQUFFLElBQUksRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO3lCQUNuRTt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUNMLEVBQUMsUUFBUSxFQUFDLGdCQUFnQixFQUFFLElBQUksRUFBQyxhQUFhLEVBQUMsQ0FDbEQsQ0FBQztxQkFDTDtpQkFDSjtxQkFBSTtvQkFDRCxJQUFHLE1BQUEsTUFBQSxPQUFPLENBQUMsS0FBSywwQ0FBRSxLQUFLLDBDQUFFLE1BQU0sRUFBQzt3QkFDNUIsSUFBSSxDQUFDLElBQUksQ0FDTCxFQUFDLFFBQVEsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsZ0JBQWdCLEVBQUMsQ0FDckQsQ0FBQTt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUNMLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFDO2dDQUMvRCxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQyxFQUFDLGFBQWEsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQyxFQUFDO2dDQUMxRixFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLG1CQUFtQixFQUFDO2dDQUM1QyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE9BQU8sRUFBQztnQ0FDaEMsRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLEtBQUssRUFBQzs2QkFDeEQsRUFBQyxDQUNMLENBQUE7cUJBQ0o7b0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUN6QyxJQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUM7d0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQ0wsRUFBQyxRQUFRLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFDO2dDQUMxQyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUMsSUFBSSxFQUFDO2dDQUNuRixFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsZUFBZSxFQUFDO2dDQUN6RCxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sRUFBSyxLQUFLLEVBQUMsb0JBQW9CLEVBQUc7Z0NBQ2hFLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsUUFBUSxFQUFHLEtBQUssRUFBQyxzQkFBc0IsRUFBQztnQ0FDaEUsRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLEVBQUssS0FBSyxFQUFDLG9CQUFvQixFQUFHO2dDQUNoRSxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLGVBQWUsRUFBVSxLQUFLLEVBQUMsNkJBQTZCLEVBQUc7NkJBQzFGLEVBQUMsQ0FDTCxDQUFBO3FCQUNKO29CQUNELElBQUcsT0FBTyxDQUFDLFNBQVMsRUFBQzt3QkFDakIsSUFBSSxHQUFHLENBQUUsR0FBRyxJQUFJOzRCQUNaLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBQztvQ0FDN0MsRUFBQyxRQUFRLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUM7NENBQzNELEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUM7NENBQzVDLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsUUFBUSxFQUFDOzRDQUNqQyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLGtCQUFrQixFQUFDOzRDQUMvQywyQ0FBMkM7eUNBQzFDLEVBQUM7b0NBQ0YsRUFBQyxRQUFRLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFDOzRDQUM1QyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLFlBQVksRUFBQzs0Q0FDckMsRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxhQUFhLEVBQUcsS0FBSyxFQUFDLHdCQUF3QixFQUFDOzRDQUN2RSxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE9BQU8sRUFBUyxLQUFLLEVBQUMsWUFBWSxFQUFDOzRDQUMzRCxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE9BQU8sRUFBUyxLQUFLLEVBQUMsaUJBQWlCLEVBQUM7NENBQ2hFLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsYUFBYSxFQUFHLEtBQUssRUFBQyx1QkFBdUIsRUFBQzt5Q0FDekUsRUFBQztvQ0FDRixFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLFlBQVksRUFBQztpQ0FDeEMsRUFBQzs0QkFDRixFQUFDLFFBQVEsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUM7b0NBQzNDLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLElBQUksRUFBQztvQ0FDM0QsRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxPQUFPLEVBQUM7b0NBQ2hDLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsVUFBVSxFQUFDO29DQUNuQyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLGdCQUFnQixFQUFDO2lDQUM1QyxFQUFDOzRCQUNGLG1HQUFtRzt5QkFDdEcsQ0FBQTtxQkFDSjtpQkFDSjtnQkFHRCxPQUFPLEVBQUMsSUFBSSxFQUFDLENBQUM7WUFDbEIsQ0FBQztZQUNELGdCQUFnQjtnQkFDWixJQUFJLEVBQUUsR0FBQyxJQUFJLENBQUM7Z0JBQ1osS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBQztvQkFDcEIsR0FBRyxJQUFJLENBQUMsa0JBQWtCO29CQUN4QixLQUFLLEVBQUwsbUJBQUs7b0JBQ0wsUUFBUSxFQUFSLHlCQUFRO29CQUNSLFFBQVEsRUFBUix5QkFBUTtvQkFDUixjQUFjLEVBQWQscUNBQWM7b0JBQ2QsYUFBYSxFQUFiLG1DQUFhO29CQUNiLGlCQUFpQixFQUFqQiwyQ0FBaUI7b0JBQ2pCLGFBQWEsRUFBYixtQ0FBYTtvQkFDYixZQUFZLEVBQVosaUNBQVk7b0JBQ1osWUFBWSxFQUFaLGlDQUFZO29CQUNaLFFBQVEsRUFBUix5QkFBUTtvQkFDUixjQUFjLEVBQWQscUNBQWM7b0JBQ2Qsa0JBQWtCLEVBQWxCLDZDQUFrQjtvQkFDbEIsTUFBTSxFQUFOLHFCQUFNO29CQUNOLE9BQU8sRUFBUCx1QkFBTztvQkFDUCxHQUFHLEVBQUUsZUFBRztvQkFDUixhQUFhLEVBQWIsbUNBQWE7b0JBQ2IsVUFBVSxFQUFWLDZCQUFVO29CQUNWLFdBQVcsRUFBWCwrQkFBVztvQkFDWCxPQUFPLEVBQVAsdUJBQU87b0JBQ1AsS0FBSyxFQUFMLG1CQUFLO29CQUNMLGdCQUFnQixFQUFoQix5Q0FBZ0I7b0JBQ2hCLE1BQU0sRUFBTixxQkFBTTtvQkFDTixnQkFBZ0IsRUFBaEIseUNBQWdCO29CQUNoQixVQUFVLEVBQUUsNkJBQVU7b0JBQ3RCLFlBQVksRUFBWixpQ0FBWTtvQkFDWixVQUFVLEVBQVYsNkJBQVU7b0JBQ1YsY0FBYyxFQUFkLHFDQUFjO29CQUNkLGdCQUFnQixFQUFoQix5Q0FBZ0I7b0JBQ2hCLGFBQWEsRUFBYixtQ0FBYTtvQkFDYixlQUFlLEVBQWYsdUNBQWU7b0JBQ2Ysa0JBQWtCLEVBQUUsT0FBTyxDQUFBLEVBQUUsQ0FBQSxJQUFBLG1DQUFhLEVBQUMsT0FBTyxFQUNoRCxFQUFDLE1BQU0sRUFBQyxzQkFBc0IsRUFBRSxLQUFLLEVBQUMsbUNBQW1DLEVBQUUsV0FBVyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBQyxNQUFNLEVBQUUsQ0FDaEo7b0JBQ0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFBLEVBQUUsQ0FBQSxJQUFBLG1DQUFhLEVBQUMsT0FBTyxFQUNsRCxFQUFDLE1BQU0sRUFBQyxzQkFBc0IsRUFBRSxLQUFLLEVBQUMscUNBQXFDLEVBQUUsV0FBVyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUUsV0FBVyxFQUFDLE1BQU0sRUFBRSxDQUN6TDtvQkFDQyxrQkFBa0IsRUFBRSxPQUFPLENBQUEsRUFBRSxDQUFBLElBQUEsbUNBQWEsRUFBQyxPQUFPLEVBQ2hELEVBQUMsTUFBTSxFQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLE1BQU0sRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUMsU0FBUyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxTQUFTLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUMsTUFBTSxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLENBQ25RO29CQUNDLDJCQUEyQixFQUFFLE9BQU8sQ0FBQSxFQUFFLENBQUEsSUFBQSxtQ0FBYSxFQUFDLE9BQU8sRUFDekQsRUFBQyxNQUFNLEVBQUMsc0JBQXNCLEVBQUUsS0FBSyxFQUFDLCtCQUErQixFQUFFLFdBQVcsRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUNsSTtpQkFDSixDQUFBO2dCQUNELEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUMsVUFBUyxRQUFRLEVBQUUsT0FBTztvQkFDakUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBUyxLQUFLO3dCQUNsQyxJQUFHLEtBQUssQ0FBQyxJQUFJLElBQUUsbUJBQW1CLEVBQUM7NEJBQy9CLElBQUcsS0FBSyxDQUFDLE9BQU8sRUFBQztnQ0FDYixPQUFPLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7NkJBQzdFOzRCQUNELEtBQUssQ0FBQyxPQUFPLEdBQUMsSUFBSSxDQUFDO3lCQUN0QjtvQkFDTCxDQUFDLENBQUMsQ0FBQTtnQkFDTixDQUFDLENBQUMsQ0FBQTtnQkFDRixFQUFFLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLEVBQUMsVUFBUyxRQUFRLEVBQUUsT0FBTzs7b0JBQ25FLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQ3RCLEVBQUMsSUFBSSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsTUFBTSxFQUFLLEtBQUssRUFBQyxNQUFNLEVBQUssUUFBUSxFQUFFLEtBQUssRUFBQyxDQUV6RSxDQUFDO29CQUNGLFFBQVEsQ0FBQyxRQUFRLEdBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSSxNQUFBLE9BQU8sQ0FBQyxLQUFLLDBDQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUEsQ0FBQztvQkFDM0UsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBUyxLQUFLOzt3QkFDbEMsSUFBRyxLQUFLLENBQUMsSUFBSSxJQUFFLGNBQWMsRUFBQzs0QkFDMUIsS0FBSyxDQUFDLE9BQU8sR0FBQyxLQUFLLENBQUM7eUJBQ3ZCO3dCQUNELElBQUcsS0FBSyxDQUFDLElBQUksSUFBRSxlQUFlLEVBQUM7NEJBQzNCLEtBQUssQ0FBQyxRQUFRLEdBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSSxNQUFBLE9BQU8sQ0FBQyxLQUFLLDBDQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUEsQ0FBQzt5QkFDekU7b0JBQ0wsQ0FBQyxDQUFDLENBQUE7Z0JBQ04sQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsRUFBRSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBQyxVQUFTLFFBQVEsRUFBRSxPQUFPO29CQUM5RCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDO3dCQUN2QixJQUFJLEVBQUMsZUFBZTt3QkFDcEIsUUFBUSxFQUFDLE9BQU87d0JBQ2hCLFFBQVEsRUFBRSxLQUFLO3FCQUNsQixDQUFDLENBQUM7b0JBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQzt3QkFDdkIsSUFBSSxFQUFDLGlCQUFpQjt3QkFDdEIsUUFBUSxFQUFDLFNBQVM7d0JBQ2xCLFlBQVksRUFBRSxLQUFLO3dCQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBRSxDQUFDLE9BQU8sRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztxQkFBQyxDQUNwRixDQUFDO2dCQUNOLENBQUMsQ0FBQyxDQUFBO2dCQUVGLHVFQUF1RTtnQkFDdkUsZ0dBQWdHO2dCQUNoRyxLQUFLO1lBQ1QsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBcGlCRCwwQ0FvaUJDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgKiBhcyBwcm9jZXNhbWllbnRvIGZyb20gXCJwcm9jZXNhbWllbnRvXCI7XHJcbmltcG9ydCB7Z2V0T3BlcmF0aXZvQWN0dWFsLCBQcm9jZWR1cmVzRG1FbmN1fSBmcm9tIFwiLi9wcm9jZWR1cmVzLWRtZW5jdVwiO1xyXG5cclxuaW1wb3J0ICogYXMgcGcgZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcbmltcG9ydCB7anNvbn0gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcbmltcG9ydCAqIGFzIG1pbmlUb29scyBmcm9tIFwibWluaS10b29sc1wiO1xyXG5pbXBvcnQge0NvbnRleHQsIE1lbnVJbmZvQmFzZSwgUmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBjaGFuZ2luZyB9IGZyb20gXCJiZXN0LWdsb2JhbHNcIjtcclxuXHJcbmltcG9ydCAqIGFzIHlhemwgZnJvbSBcInlhemxcIjtcclxuaW1wb3J0IHsgTmV4dEZ1bmN0aW9uIH0gZnJvbSBcImV4cHJlc3Mtc2VydmUtc3RhdGljLWNvcmVcIjtcclxuaW1wb3J0ICogYXMgbGlrZUFyIGZyb20gXCJsaWtlLWFyXCI7XHJcblxyXG5pbXBvcnQge3Byb21pc2VzIGFzIGZzIH0gZnJvbSBcImZzXCI7XHJcblxyXG5pbXBvcnQgeyByb2xlcyAgICAgICAgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtcm9sZXNcIjtcclxuaW1wb3J0IHsgcGVyc29uYWwgICAgICAgICAgICB9IGZyb20gXCIuL3RhYmxlLXBlcnNvbmFsXCI7XHJcbmltcG9ydCB7IHJlY2VwY2lvbmlzdGFzICAgICAgfSBmcm9tIFwiLi90YWJsZS1yZWNlcGNpb25pc3Rhc1wiO1xyXG5pbXBvcnQgeyBlbmN1ZXN0YWRvcmVzICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1lbmN1ZXN0YWRvcmVzXCI7XHJcbmltcG9ydCB7IG1pc19lbmN1ZXN0YWRvcmVzICAgICB9IGZyb20gXCIuL3RhYmxlLW1pc19lbmN1ZXN0YWRvcmVzXCI7XHJcbmltcG9ydCB7IHJlY3VwZXJhZG9yZXMgICAgICAgfSBmcm9tIFwiLi90YWJsZS1yZWN1cGVyYWRvcmVzXCI7XHJcbmltcG9ydCB7IHN1cGVydmlzb3JlcyAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1zdXBlcnZpc29yZXNcIjtcclxuaW1wb3J0IHsgcGVyc29uYWxfcm9sICAgICAgICB9IGZyb20gXCIuL3RhYmxlLXBlcnNvbmFsX3JvbFwiO1xyXG5pbXBvcnQgeyBwZXJtaXNvcyAgICAgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtcGVybWlzb3NcIjtcclxuaW1wb3J0IHsgcm9sZXNfcGVybWlzb3MgICAgICB9IGZyb20gXCIuL3RhYmxlLXJvbGVzX3Blcm1pc29zXCI7XHJcbmltcG9ydCB7IHBhcmFtZXRyb3MgICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1wYXJhbWV0cm9zXCI7XHJcbmltcG9ydCB7IHJvbGVzX3N1Ym9yZGluYWRvcyAgfSBmcm9tIFwiLi90YWJsZS1yb2xlc19zdWJvcmRpbmFkb3NcIjtcclxuXHJcbmltcG9ydCB7bm9fcmVhICAgICAgICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1ub19yZWFcIjtcclxuaW1wb3J0IHt0ZW0gICAgICAgICAgICAgICAgICB9IGZyb20gXCIuL3RhYmxlLXRlbVwiO1xyXG5pbXBvcnQge3RlbV9yZWNlcGNpb24gICAgICAgIH0gZnJvbSBcIi4vdGFibGUtdGVtX3JlY2VwY2lvblwiO1xyXG5pbXBvcnQge3NlbWFuYXMgICAgICAgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtc2VtYW5hc1wiO1xyXG5pbXBvcnQgeyB1c3VhcmlvcyAgICAgICAgICAgIH0gZnJvbSAnLi90YWJsZS11c3Vhcmlvcyc7XHJcbmltcG9ydCB7IG9wZXJhY2lvbmVzICAgICAgICAgfSBmcm9tICcuL3RhYmxlLW9wZXJhY2lvbmVzJztcclxuaW1wb3J0IHsgY29tdW5hcyAgICAgICAgICAgICB9IGZyb20gJy4vdGFibGUtY29tdW5hcyc7XHJcbmltcG9ydCB7IGFyZWFzICAgICAgICAgICAgICAgfSBmcm9tICcuL3RhYmxlLWFyZWFzJztcclxuaW1wb3J0IHsgc2luY3Jvbml6YWNpb25lcyAgICB9IGZyb20gJy4vdGFibGUtc2luY3Jvbml6YWNpb25lcyc7XHJcbmltcG9ydCB7IHRhcmVhcyAgICAgICAgICAgICAgfSBmcm9tICcuL3RhYmxlLXRhcmVhcyc7XHJcbmltcG9ydCB7IHRhcmVhc190ZW0gICAgICAgICAgfSBmcm9tICcuL3RhYmxlLXRhcmVhc190ZW0nO1xyXG5pbXBvcnQgeyB0YXJlYXNfYXJlYXMgICAgICAgIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyBtaXNfdGFyZWFzICAgICAgICAgIH0gZnJvbSAnLi90YWJsZS1taXNfdGFyZWFzJztcclxuaW1wb3J0IHsgbWlzX3RhcmVhc190ZW0gICAgICB9IGZyb20gJy4vdGFibGUtbWlzX3RhcmVhc190ZW0nO1xyXG5pbXBvcnQgeyBtaXNfdGFyZWFzX2FyZWFzICAgIH0gZnJvbSAnLi90YWJsZS1taXNfdGFyZWFzX2FyZWFzJztcclxuaW1wb3J0IHsgcmVzdWx0YWRvc190YXJlYSAgICB9IGZyb20gJy4vdGFibGUtcmVzdWx0YWRvc190YXJlYSc7XHJcbmltcG9ydCB7IGNvbnRyb2xfY2FtcG8gICAgICAgfSBmcm9tICcuL3RhYmxlLWNvbnRyb2xfY2FtcG8nO1xyXG5pbXBvcnQgeyBjb250cm9sX3Jlc3VtZW4gICAgIH0gZnJvbSAnLi90YWJsZS1jb250cm9sX3Jlc3VtZW4nO1xyXG5cclxuaW1wb3J0IHtkZWZDb25maWd9IGZyb20gXCIuL2RlZi1jb25maWdcIlxyXG5cclxuY29uc3QgQVBQX0RNX1ZFUlNJT049XCIjMjItMDMtMjlcIjtcclxuXHJcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3KC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gZW1lcmdlQXBwRG1FbmN1PFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcjxwcm9jZXNhbWllbnRvLkFwcFByb2Nlc2FtaWVudG9UeXBlPj4oQmFzZTpUKXtcclxuICByZXR1cm4gY2xhc3MgQXBwRG1FbmN1IGV4dGVuZHMgQmFzZXtcclxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6YW55W10peyBcclxuICAgICAgICBzdXBlcihhcmdzKTsgXHJcbiAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50ID0gdGhpcy5jYWNoZXMudGFibGVDb250ZW50IHx8IHt9O1xyXG4gICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWE9W11cclxuICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3Vwcz1bXVxyXG4gICAgICAgIHRoaXMubWV0YUVuY0luY2x1aXJDYXNpbGxlcm9zU2FsdG9SRUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFByb2NlZHVyZXMoKXtcclxuICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgIHZhciBwcm9jZWRpbWllbnRvQVJlZW1wbGF6YXI9W1wiY2Fzb19ndWFyZGFyXCIsXCJjYXNvX3RyYWVyXCJdO1xyXG4gICAgICAgIHZhciBwYXJlbnRQcm9jID0gYXdhaXQgc3VwZXIuZ2V0UHJvY2VkdXJlcygpO1xyXG4gICAgICAgIHBhcmVudFByb2MgPSBwYXJlbnRQcm9jLmZpbHRlcigocHJvY2VkdXJlOmFueSkgPT4gIXByb2NlZGltaWVudG9BUmVlbXBsYXphci5pbmNsdWRlcyhwcm9jZWR1cmUuYWN0aW9uKSk7XHJcbiAgICAgICAgcGFyZW50UHJvYyA9IHBhcmVudFByb2MubWFwKHByb2NEZWY9PntcclxuICAgICAgICAgICAgaWYocHJvY0RlZi5hY3Rpb24gPT0gJ3RhYmxlX3JlY29yZF9zYXZlJyB8fCBwcm9jRGVmLmFjdGlvbiA9PSAndGFibGVfcmVjb3JkX2RlbGV0ZScpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvcmVGdW5jdGlvbkludGVybm8gPSBwcm9jRGVmLmNvcmVGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIHByb2NEZWYuY29yZUZ1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24oY29udGV4dCwgcGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvcmVGdW5jdGlvbkludGVybm8oY29udGV4dCwgcGFyYW1ldGVycylcclxuICAgICAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRhYmxlID09ICdjYXNpbGxlcm9zJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlIHRvY8OzIGxhIGVzdHJ1Y3R1cmEnLCBiZS50aW1lc3RhbXBFc3RydWN0dXJhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9jRGVmO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHBhcmVudFByb2MuY29uY2F0KFByb2NlZHVyZXNEbUVuY3UpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgY2hlY2tEYXRhYmFzZVN0cnVjdHVyZShfY2xpZW50OkNsaWVudCl7XHJcbiAgICB9XHJcbiAgICBhZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwOnByb2Nlc2FtaWVudG8uRXhwcmVzcywgYmFzZVVybDpzdHJpbmcpe1xyXG4gICAgICAgIGxldCBiZT10aGlzO1xyXG4gICAgICAgIHN1cGVyLmFkZFNjaHLDtmRpbmdlclNlcnZpY2VzKG1haW5BcHAsIGJhc2VVcmwpO1xyXG4gICAgICAgIG1haW5BcHAudXNlKGZ1bmN0aW9uKHJlcTpSZXF1ZXN0LHJlczpSZXNwb25zZSwgbmV4dDpOZXh0RnVuY3Rpb24pe1xyXG4gICAgICAgICAgICBpZihyZXEuc2Vzc2lvbiAmJiAhcmVxLnNlc3Npb24uaW5zdGFsbCl7XHJcbiAgICAgICAgICAgICAgICByZXEuc2Vzc2lvbi5pbnN0YWxsPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbWFpbkFwcC5nZXQoYmFzZVVybCsnL2NhbXBvJyxhc3luYyBmdW5jdGlvbihyZXEscmVzLF9uZXh0KXtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBzw6kgcXVlIHZveSBhIHJlY2liaXIgdXNlcmFnZW50IHBvciBsb3MgbWlkZGxld2FyZXMgZGUgQmFja2VuZC1wbHVzXHJcbiAgICAgICAgICAgIHZhciB7dXNlcmFnZW50LCB1c2VyfSA9IHJlcTtcclxuICAgICAgICAgICAgaWYodXNlcil7XHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge3t0eXBlOidqcycsIHNyYzpzdHJpbmd9W119ICovXHJcbiAgICAgICAgICAgICAgICB2YXIgd2ViTWFuaWZlc3RQYXRoID0gJ2NhcmdhLWRtL3dlYi1tYW5pZmVzdC53ZWJtYW5pZmVzdCc7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbE1haW49YmUubWFpblBhZ2Uoe3VzZXJhZ2VudCwgdXNlcn0sIGZhbHNlLCB7c2tpcE1lbnU6dHJ1ZSwgd2ViTWFuaWZlc3RQYXRofSkudG9IdG1sRG9jKCk7XHJcbiAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZVRleHQoaHRtbE1haW4sJ2h0bWwnKShyZXEscmVzKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXMucmVkaXJlY3QoYmFzZVVybCsnL2xvZ2luI3c9cGF0aCZwYXRoPS9jYW1wbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgY3JlYXRlU2VydmljZVdvcmtlciA9IGFzeW5jIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBzdyA9IGF3YWl0IGZzLnJlYWRGaWxlKCdub2RlX21vZHVsZXMvc2VydmljZS13b3JrZXItYWRtaW4vZGlzdC9zZXJ2aWNlLXdvcmtlci13by1tYW5pZmVzdC5qcycsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgIHZhciBtYW5pZmVzdCA9IGJlLmNyZWF0ZVJlc291cmNlc0ZvckNhY2hlSnNvbih7fSk7XHJcbiAgICAgICAgICAgIHZhciBzd01hbmlmZXN0ID0gc3dcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qdmVyc2lvbiovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC52ZXJzaW9uKSlcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qYXBwTmFtZSovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5hcHBOYW1lKSlcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtcXHMqXFwvXFwqdXJsc1RvQ2FjaGVcXCpcXC9cXHMqXFxdLywgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QuY2FjaGUpKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcW1xccypcXC9cXCpmYWxsYmFja3NcXCpcXC9cXHMqXFxdLywgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QuZmFsbGJhY2sgfHwgW10pKTtcclxuICAgICAgICAgICAgICAgIC8vLnJlcGxhY2UoXCIvI0NBQ0hFJC9cIiwgXCIvKGFcXFxcZCttXFxcXGQrcFxcXFxkK3RcXFxcZCtfZXN0cnVjdHVyYS5qcyl8KGFcXFxcZCttXFxcXGQrcFxcXFxkK3RcXFxcZCtfaGRyLmpzb24pL1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN3TWFuaWZlc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFpbkFwcC5nZXQoYmFzZVVybCtgL3N3LW1hbmlmZXN0LmpzYCwgYXN5bmMgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpe1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVUZXh0KGF3YWl0IGNyZWF0ZVNlcnZpY2VXb3JrZXIoKSwnYXBwbGljYXRpb24vamF2YXNjcmlwdCcpKHJlcSxyZXMpO1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUVycihyZXEscmVzLG5leHQpKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsK2AvY2FyZ2EtZG0vd2ViLW1hbmlmZXN0LndlYm1hbmlmZXN0YCwgYXN5bmMgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpe1xyXG4gICAgICAgICAgICBjb25zdCBBUFBfTkFNRSA9IChhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIChjbGllbnQ6cGcuQ2xpZW50KT0+XHJcbiAgICAgICAgICAgICAgICBjbGllbnQucXVlcnkoXCJzZWxlY3Qgb3BlcmF0aXZvIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb1wiKS5mZXRjaFVuaXF1ZVZhbHVlKClcclxuICAgICAgICAgICAgKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBzdWZpam8gPSBiYXNlVXJsLmluY2x1ZGVzKCd0ZXN0Jyk/J190ZXN0JzpcclxuICAgICAgICAgICAgICAgIGJhc2VVcmwuaW5jbHVkZXMoJ2NhcGEnKT8nX2NhcGEnOicnO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICBcIm5hbWVcIjogYCR7QVBQX05BTUV9IFByb2dyZXNzaXZlIFdlYiBBcHBgLFxyXG4gICAgICAgICAgICAgICAgICBcInNob3J0X25hbWVcIjogYCR7QVBQX05BTUV9IFBXQWAsXHJcbiAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogYFByb2dyZXNzaXZlIFdlYiBBcHAgZm9yICR7QVBQX05BTUV9LmAsXHJcbiAgICAgICAgICAgICAgICAgIFwiaWNvbnNcIjogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwic3JjXCI6IGAuLi9pbWcvJHtBUFBfTkFNRX0tbG9nby1kbS0zMiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzaXplc1wiOiBcIjMyeDMyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZS9wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTQ4JHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNpemVzXCI6IFwiNDh4NDhcIixcclxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImltYWdlL3BuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNyY1wiOiBgLi4vaW1nLyR7QVBQX05BTUV9LWxvZ28tZG0tNjQke3N1Zmlqb30ucG5nYCxcclxuICAgICAgICAgICAgICAgICAgICAgIFwic2l6ZXNcIjogXCI2NHg2NFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwic3JjXCI6IGAuLi9pbWcvJHtBUFBfTkFNRX0tbG9nby1kbS03MiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzaXplc1wiOiBcIjcyeDcyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZS9wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTE5MiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzaXplc1wiOiBcIjE5MngxOTJcIixcclxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImltYWdlL3BuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNyY1wiOiBgLi4vaW1nLyR7QVBQX05BTUV9LWxvZ28tZG0tNTEyJHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNpemVzXCI6IFwiNTEyeDUxMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgIFwic3RhcnRfdXJsXCI6IFwiLi4vY2FtcG9cIixcclxuICAgICAgICAgICAgICAgICAgXCJkaXNwbGF5XCI6IFwic3RhbmRhbG9uZVwiLFxyXG4gICAgICAgICAgICAgICAgICBcInRoZW1lX2NvbG9yXCI6IFwiIzNGNTFCNVwiLFxyXG4gICAgICAgICAgICAgICAgICBcImJhY2tncm91bmRfY29sb3JcIjogXCIjNmQ2MGVkXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZVRleHQoSlNPTi5zdHJpbmdpZnkoY29udGVudCksICdhcHBsaWNhdGlvbi9qc29uJykocmVxLHJlcyk7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUVycihyZXEsIHJlcywgbmV4dCkoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkTG9nZ2VkU2VydmljZXMoKXtcclxuICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgIHN1cGVyLmFkZExvZ2dlZFNlcnZpY2VzKCk7XHJcbiAgICAgICAgYmUuYXBwLmdldCgnL21hbmlmZXN0Lm1hbmlmZXN0JywgYXN5bmMgZnVuY3Rpb24ocmVxOlJlcXVlc3QsIHJlczpSZXNwb25zZSwgbmV4dDpOZXh0RnVuY3Rpb24pe1xyXG4gICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVGaWxlKCdzcmMvY2xpZW50L21hbmlmZXN0Lm1hbmlmZXN0Jyx7fSkocmVxLHJlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hcHAuZ2V0KCcvZmlsZScsIGFzeW5jIGZ1bmN0aW9uKHJlcTpSZXF1ZXN0LHJlczpSZXNwb25zZSl7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKHJlcSwgXHJcbiAgICAgICAgICAgICAgICAoY2xpZW50OnBnLkNsaWVudCk9PlxyXG4gICAgICAgICAgICAgICAgY2xpZW50LnF1ZXJ5KFwic2VsZWN0IHJ1dGEgZnJvbSBhZGp1bnRvcyB3aGVyZSBpZF9hZGp1bnRvID0gJDFcIixbcmVxLnF1ZXJ5LmlkX2FkanVudG9dKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YXIgcGF0aCA9IHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlRmlsZShwYXRoLHt9KShyZXEscmVzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFwcC5nZXQoJy9pbWFnZW5lcycsIGFzeW5jIGZ1bmN0aW9uKHJlcTpSZXF1ZXN0LHJlczpSZXNwb25zZSl7XHJcbiAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoJ2xvY2FsLWltYWdlcy8nK3JlcS5xdWVyeS5wZGYse30pKHJlcSxyZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYXBwLmdldCgnL2Rvd25sb2FkL2FsbCcsYXN5bmMgZnVuY3Rpb24ocmVxOlJlcXVlc3QsIHJlczpSZXNwb25zZSwgbmV4dDooKT0+dm9pZCl7XHJcbiAgICAgICAgICAgIGlmKHJlcS51c2VyPT1udWxsIHx8IHJlcS51c2VyLnJvbCE9J2FkbWluJyl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbm8gZXN0w6EgYXV0b3JpemFkbyBhIGJhamFyc2UgdG9kbycscmVxLnVzZXIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB6aXAgPSBuZXcgeWF6bC5aaXBGaWxlKCk7XHJcbiAgICAgICAgICAgIHppcC5vdXRwdXRTdHJlYW0ucGlwZShyZXMpO1xyXG4gICAgICAgICAgICBsZXQgYmFzZSA9ICdsb2NhbC1hdHRhY2htZW50cydcclxuICAgICAgICAgICAgbGV0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihiYXNlKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIGZ1bmN0aW9uKGZpbGVOYW1lOnN0cmluZyl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGJhc2UrJy8nK2ZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXQgPSBhd2FpdCBmcy5zdGF0KHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYoc3RhdC5pc0ZpbGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHppcC5hZGRGaWxlKHBhdGgsZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIHppcC5lbmQoKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgYXN5bmMgcG9zdENvbmZpZygpe1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnBvc3RDb25maWcoKTtcclxuICAgICAgICB2YXIgYmU9dGhpcztcclxuICAgICAgICBiZS5tZXRhRW5jSW5jbHVpckNhc2lsbGVyb3NTYWx0b1JFTCA9IGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50OnBnLkNsaWVudCl7XHJcbiAgICAgICAgICAgIHZhciBxUGVybWlzb3M9YFxyXG4gICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhyLnJvbCxqc29uYl9idWlsZF9vYmplY3QoJ3N1cGVydXNlcicsci5zdXBlcnVzZXIsJ3B1ZWRlJywoXHJcbiAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHJwLnBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhycGEuYWNjaW9uLHJwYS5oYWJpbGl0YWRvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcnBhLnJvbD1ycC5yb2wgQU5EIHJwYS5wZXJtaXNvPXJwLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBycC5yb2w9ci5yb2wgI2NvbmRIYWJpbGl0YWRvI1xyXG4gICAgICAgICAgICAgICkpKVxyXG4gICAgICAgICAgICAgIEZST00gcm9sZXMgclxyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShxUGVybWlzb3MucmVwbGFjZSgnI2NvbmRIYWJpbGl0YWRvIycsJycpKS5mZXRjaFVuaXF1ZVZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkocVBlcm1pc29zLnJlcGxhY2UoJyNjb25kSGFiaWxpdGFkbyMnLGAgYW5kIHJwLiR7cGcucXVvdGVJZGVudCgnaGFiaWxpdGFkbycpfWApKS5mZXRjaFVuaXF1ZVZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhhY2Npb24sdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcGEucGVybWlzbz1wLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBcclxuICAgICAgICAgICAgICAgIGApLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBiZS5wZXJtaXNvc1JvbD1yZXN1bHRzWzBdLnZhbHVlO1xyXG4gICAgICAgICAgICBiZS5wZXJtaXNvc1JvbFNvbG9UcnVlPXJlc3VsdHNbMV0udmFsdWU7XHJcbiAgICAgICAgICAgIGJlLnBlcm1pc29zU3VwZXJ1c2VyPXJlc3VsdHNbMl0udmFsdWU7XHJcbiAgICAgICAgICAgIGJlLnBlcm1pc29zUGFyYU5hZGllPWxpa2VBcihiZS5wZXJtaXNvc1N1cGVydXNlcikubWFwKHA9Pmxpa2VBcihwKS5tYXAodmE9PmZhbHNlKS5wbGFpbigpKS5wbGFpbigpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kaXIoYmUucGVybWlzb3NSb2xTb2xvVHJ1ZSx7ZGVwdGg6OX0pO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGlyKGJlLnBlcm1pc29zU3VwZXJ1c2VyLHtkZXB0aDo5fSk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kaXIoYmUucGVybWlzb3NQYXJhTmFkaWUse2RlcHRoOjl9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hDYWNoZXMoKTtcclxuICAgIH1cclxuICAgIGNvbmZpZ1N0YXRpY0NvbmZpZygpe1xyXG4gICAgICAgIHN1cGVyLmNvbmZpZ1N0YXRpY0NvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGljQ29uZmlnKGRlZkNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBjbGllbnRJbmNsdWRlcyhyZXEsIG9wdHMpIHtcclxuICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgIHZhciBsb2dnZWQgPSByZXEgJiYgb3B0cyAmJiAhb3B0cy5za2lwTWVudSA7XHJcbiAgICAgICAgdmFyIG1lbnVlZFJlc291cmNlcz1sb2dnZWQgPyBbXHJcbiAgICAgICAgICAgIHsgdHlwZTonanMnICwgc3JjOiAnY2xpZW50L2NsaWVudC5qcycgfSxcclxuICAgICAgICBdOltcclxuICAgICAgICAgICAge3R5cGU6J2pzJyAsIHNyYzondW5sb2dnZWQuanMnIH0sXHJcbiAgICAgICAgXTtcclxuICAgICAgICBpZihvcHRzICYmIG9wdHMuZXh0cmFGaWxlcyl7XHJcbiAgICAgICAgICAgIG1lbnVlZFJlc291cmNlcyA9IG1lbnVlZFJlc291cmNlcy5jb25jYXQob3B0cy5leHRyYUZpbGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc291cmNlcyA9IFtcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWFjdCcsIG1vZFBhdGg6ICd1bWQnLCBmaWxlRGV2ZWxvcG1lbnQ6J3JlYWN0LmRldmVsb3BtZW50LmpzJywgZmlsZToncmVhY3QucHJvZHVjdGlvbi5taW4uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVhY3QtZG9tJywgbW9kUGF0aDogJ3VtZCcsIGZpbGVEZXZlbG9wbWVudDoncmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJywgZmlsZToncmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ0BtYXRlcmlhbC11aS9jb3JlJywgbW9kUGF0aDogJ3VtZCcsIGZpbGVEZXZlbG9wbWVudDonbWF0ZXJpYWwtdWkuZGV2ZWxvcG1lbnQuanMnLCBmaWxlOidtYXRlcmlhbC11aS5wcm9kdWN0aW9uLm1pbi5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdjbHN4JywgZmlsZTonY2xzeC5taW4uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVkdXgnLCBtb2RQYXRoOicuLi9kaXN0JywgZmlsZURldmVsb3BtZW50OidyZWR1eC5qcycsIGZpbGU6J3JlZHV4Lm1pbi5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWFjdC1yZWR1eCcsIG1vZFBhdGg6Jy4uL2Rpc3QnLCBmaWxlRGV2ZWxvcG1lbnQ6J3JlYWN0LXJlZHV4LmpzJywgZmlsZToncmVhY3QtcmVkdXgubWluLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ21lbW9pemUtb25lJywgIGZpbGU6J21lbW9pemUtb25lLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3FyY29kZScsIG1vZFBhdGg6ICcuLi9idWlsZCcsIGZpbGU6ICdxcmNvZGUuanMnfSxcclxuICAgICAgICAgICAgLi4uc3VwZXIuY2xpZW50SW5jbHVkZXMocmVxLCBvcHRzKS5maWx0ZXIobT0+bS5maWxlIT0nZm9ybXVsYXJpb3MuY3NzJylcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIobT0+bG9nZ2VkIHx8IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyYmIG0uZmlsZSE9J29wZXJhdGl2b3MuanMnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJiYgbS5maWxlIT0nbWV0YS1lbmMuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8mJiBtLmZpbGUhPSdkYXRvcy1leHQuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8mJiBtLmZpbGUhPSdjb25zaXN0ZW5jaWFzLmpzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG0uZmlsZSE9J3Zhci1jYWwuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbS5maWxlIT0ndmFyLWNhbC5qcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyYmIG0uZmlsZSE9J3ZhcmNhbC5qcydcclxuICAgICAgICAgICAgICAgIC8vKVxyXG4gICAgICAgICAgICAgICAgLy8uZmlsdGVyKG09PmxvZ2dlZCB8fCB0cnVlXHJcbiAgICAgICAgICAgICAgICAvLyAgICAmJiBtLmZpbGUhPSdvcGVyYXRpdm9zLmpzJyBcclxuICAgICAgICAgICAgICAgIC8vICAgICYmIG0uZmlsZSE9J21ldGEtZW5jLmpzJ1xyXG4gICAgICAgICAgICAgICAgLy8gICAgJiYgbS5maWxlIT0nZGF0b3MtZXh0LmpzJ1xyXG4gICAgICAgICAgICAgICAgLy8gICAgJiYgbS5maWxlIT0nY29uc2lzdGVuY2lhcy5qcydcclxuICAgICAgICAgICAgICAgIC8vICAgICYmIG0uZmlsZSE9J3ZhcmNhbC5qcydcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnc2VydmljZS13b3JrZXItYWRtaW4nLCAgZmlsZTonc2VydmljZS13b3JrZXItYWRtaW4uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVkdXgtdHlwZWQtcmVkdWNlcicsIG1vZFBhdGg6Jy4uL2Rpc3QnLCBmaWxlOidyZWR1eC10eXBlZC1yZWR1Y2VyLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIHNyYzogJ2FkYXB0LmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIHNyYzogJ3RpcG9zLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIHNyYzogJ2J5cGFzcy1mb3JtdWxhcmlvLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIHNyYzogJ3JlZHV4LWZvcm11bGFyaW8uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAncmVuZGVyLWdlbmVyYWwuanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAncmVuZGVyLWZvcm11bGFyaW8uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAnYWJyaXItZm9ybXVsYXJpby5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnY3NzJywgZmlsZTogJ21lbnUuY3NzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdjc3MnLCBmaWxlOiAnZm9ybXVsYXJpby1yZWFjdC5jc3MnIH0sXHJcbiAgICAgICAgICAgIC4uLiBtZW51ZWRSZXNvdXJjZXNcclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIHJlc291cmNlc1xyXG4gICAgICAgIC8vIC5tYXAobT0+KHsuLi5tLCBmaWxlOm0uZmlsZURldmVsb3BtZW50fHxtLmZpbGV9KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZWZyZXNoQ2FjaGVzKCl7XHJcbiAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50ID0gdGhpcy5jYWNoZXMudGFibGVDb250ZW50IHx8IHt9O1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5EYkNsaWVudChudWxsLCBhc3luYyAoY2xpZW50KT0+e1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhID0gKGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBub19yZWEgb3JkZXIgYnkgbm9fcmVhYCkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NhY2hlcycsdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYSlcclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBncnVwbywganNvbmJfYWdnKHRvX2pzb24oci4qKSkgYXMgY29kaWdvcyBmcm9tIG5vX3JlYSByIGdyb3VwIGJ5IGdydXBvIG9yZGVyIGJ5IDFcclxuICAgICAgICAgICAgYCkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMwID0gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgZ3J1cG8wIGFzIGdydXBvLCBqc29uYl9hZ2codG9fanNvbihyLiopKSBhcyBjb2RpZ29zIGZyb20gbm9fcmVhIHIgZ3JvdXAgYnkgZ3J1cG8wIG9yZGVyIGJ5IDFcclxuICAgICAgICAgICAgYCkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjYWNoZXMgb2snKTtcclxuICAgIH1cclxuICAgIHNxbE5vcmVhQ2FzZShjYW1wb05lY2VzYXJpbzpzdHJpbmcpe1xyXG4gICAgICAgIHZhciBiZT10aGlzO1xyXG4gICAgICAgIHJldHVybiBgQ0FTRSAke2JlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLm1hcCh4PT5cclxuICAgICAgICAgICAgYCBXSEVOIGpzb25fZW5jdWVzdGEgLT4+ICR7YmUuZGIucXVvdGVMaXRlcmFsKHgudmFyaWFibGUpfSA9ICR7YmUuZGIucXVvdGVMaXRlcmFsKHgudmFsb3IpfSBUSEVOICR7YmUuZGIucXVvdGVMaXRlcmFsKHhbY2FtcG9OZWNlc2FyaW9dKX1gXHJcbiAgICAgICAgKS5qb2luKCcnKX0gV0hFTiBUUlVFIFRIRU4gTlVMTCBFTkRgXHJcbiAgICB9XHJcbiAgICBnZXRDb250ZXh0KHJlcTpSZXF1ZXN0KTpDb250ZXh0e1xyXG4gICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGZhdGhlckNvbnRleHQgPSBzdXBlci5nZXRDb250ZXh0KHJlcSk7XHJcbiAgICAgICAgaWYoZmF0aGVyQ29udGV4dC51c2VyKXtcclxuICAgICAgICAgICAgaWYoYmUucGVybWlzb3NSb2xbcmVxLnVzZXIucm9sXT8uc3VwZXJ1c2VyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7c3VwZXJ1c2VyOnRydWUsIHB1ZWRlOiBiZS5wZXJtaXNvc1N1cGVydXNlciwgLi4uZmF0aGVyQ29udGV4dH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge3B1ZWRlOiBiZS5wZXJtaXNvc1JvbFtyZXEudXNlci5yb2xdPy5wdWVkZSwgLi4uZmF0aGVyQ29udGV4dH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge3B1ZWRlOmJlLnBlcm1pc29zUGFyYU5hZGllLCAuLi5mYXRoZXJDb250ZXh0fTtcclxuICAgIH1cclxuICAgIGdldENvbnRleHRGb3JEdW1wKCk6Q29udGV4dHtcclxuICAgICAgICB2YXIgZmF0aGVyQ29udGV4dCA9IHN1cGVyLmdldENvbnRleHRGb3JEdW1wKCk7XHJcbiAgICAgICAgcmV0dXJuIHtzdXBlcnVzZXI6dHJ1ZSwgcHVlZGU6IHRoaXMucGVybWlzb3NTdXBlcnVzZXIsIC4uLmZhdGhlckNvbnRleHR9O1xyXG4gICAgfVxyXG4gICAgZ2V0Q2xpZW50U2V0dXBGb3JTZW5kVG9Gcm9udEVuZChyZXE6UmVxdWVzdCl7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIuZ2V0Q2xpZW50U2V0dXBGb3JTZW5kVG9Gcm9udEVuZChyZXEpLFxyXG4gICAgICAgICAgICBpZHBlcjogcmVxLnVzZXI/LmlkcGVyXHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICB9XHJcbiAgICBjcmVhdGVSZXNvdXJjZXNGb3JDYWNoZUpzb24ocGFyYW1ldGVycyl7XHJcbiAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICB2YXIganNvblJlc3VsdCA9IHt9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGpzb25SZXN1bHQudmVyc2lvbiA9IEFQUF9ETV9WRVJTSU9OO1xyXG4gICAgICAgIGpzb25SZXN1bHQuYXBwTmFtZSA9ICdkbWVuY3UnO1xyXG4gICAgICAgIGpzb25SZXN1bHQuY2FjaGU9W1xyXG4gICAgICAgICAgICBcImNhbXBvXCIsXHJcbiAgICAgICAgICAgIFwib2ZmbGluZVwiLFxyXG4gICAgICAgICAgICBcImxpYi9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbWF0ZXJpYWwtdWkucHJvZHVjdGlvbi5taW4uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvY2xzeC5taW4uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvcmVkdXgubWluLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3JlYWN0LXJlZHV4Lm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9tZW1vaXplLW9uZS5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9xcmNvZGUuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvcmVxdWlyZS1icm8uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvY2FzdC1lcnJvci5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9saWtlLWFyLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2Jlc3QtZ2xvYmFscy5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9qc29uNGFsbC5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9qcy10by1odG1sLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3JlZHV4LXR5cGVkLXJlZHVjZXIuanNcIixcclxuICAgICAgICAgICAgXCJhZGFwdC5qc1wiLFxyXG4gICAgICAgICAgICBcInVubG9nZ2VkLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2pzLXlhbWwuanNcIixcclxuICAgICAgICAgICAgXCJsaWIveGxzeC5jb3JlLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9sYXp5LXNvbWUuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvc3FsLXRvb2xzLmpzXCIsXHJcbiAgICAgICAgICAgIFwiZGlhbG9nLXByb21pc2UvZGlhbG9nLXByb21pc2UuanNcIixcclxuICAgICAgICAgICAgXCJtb21lbnQvbWluL21vbWVudC5qc1wiLFxyXG4gICAgICAgICAgICBcInBpa2FkYXkvcGlrYWRheS5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9wb2x5ZmlsbHMtYnJvLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2JpZy5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi90eXBlLXN0b3JlLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3R5cGVkLWNvbnRyb2xzLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2FqYXgtYmVzdC1wcm9taXNlLmpzXCIsXHJcbiAgICAgICAgICAgIFwibXktYWpheC5qc1wiLFxyXG4gICAgICAgICAgICBcIm15LXN0YXJ0LmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL215LWxvY2FsZGIuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktd2Vic3FsZGIuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktbG9jYWxkYi5qcy5tYXBcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktd2Vic3FsZGIuanMubWFwXCIsXHJcbiAgICAgICAgICAgIFwibGliL215LXRoaW5ncy5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS10YWJsZXMuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktaW5mb3JtLW5ldC1zdGF0dXMuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktbWVudS5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS1za2luLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2NsaWVudGUtZW4tY2FzdGVsbGFuby5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9zZXJ2aWNlLXdvcmtlci1hZG1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9yZWR1eC10eXBlZC1yZWR1Y2VyLmpzXCIsXHJcbiAgICAgICAgICAgIFwidGlwb3MuanNcIixcclxuICAgICAgICAgICAgXCJieXBhc3MtZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICBcInJlZHV4LWZvcm11bGFyaW8uanNcIixcclxuICAgICAgICAgICAgXCJyZW5kZXItZ2VuZXJhbC5qc1wiLFxyXG4gICAgICAgICAgICBcInJlbmRlci1mb3JtdWxhcmlvLmpzXCIsXHJcbiAgICAgICAgICAgIFwiYWJyaXItZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL3Jvdy12YWxpZGF0b3IuanNcIixcclxuICAgICAgICAgICAgXCJjbGllbnQvbWVudS5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudC9tZW51LmpzXCIsXHJcbiAgICAgICAgICAgIFwiaW1nL2xvZ28ucG5nXCIsXHJcbiAgICAgICAgICAgIC8vXCJpbWcvbG9nby1kbS5wbmdcIixcclxuICAgICAgICAgICAgXCJpbWcvbG9nby0xMjgucG5nXCIsXHJcbiAgICAgICAgICAgIFwiaW1nL21haW4tbG9hZGluZy5naWZcIixcclxuICAgICAgICAgICAgXCJpbWcvYm9ycmFyLXZhbG9yLnBuZ1wiLFxyXG4gICAgICAgICAgICBcImltZy9mb25kby1zYWx0ZWFkby1lcnJvci5wbmdcIixcclxuICAgICAgICAgICAgXCJpbWcvZm9uZG8tc2FsdGVhZG8ucG5nXCIsXHJcbiAgICAgICAgICAgIFwiY2xpZW50LXNldHVwXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL2Jvb3RzdHJhcC5taW4uY3NzXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL2Zvcm11bGFyaW8tcmVhY3QuY3NzXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL1JvYm90by1SZWd1bGFyLnR0ZlwiXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGpzb25SZXN1bHQuZmFsbGJhY2s9W1xyXG4gICAgICAgICAgICB7XCJwYXRoXCI6XCJsb2dpblwiLCBcImZhbGxiYWNrXCI6XCJvZmZsaW5lXCJ9LFxyXG4gICAgICAgICAgICB7XCJwYXRoXCI6XCJsb2dvdXRcIiwgXCJmYWxsYmFja1wiOlwib2ZmbGluZVwifSxcclxuICAgICAgICAgICAge1wicGF0aFwiOlwibG9naW4jaT1zaW5jcm9uaXphclwiLCBcImZhbGxiYWNrXCI6XCJvZmZsaW5lXCJ9LFxyXG4gICAgICAgICAgICB7XCJwYXRoXCI6XCJtZW51I2k9c2luY3Jvbml6YXJcIiwgXCJmYWxsYmFja1wiOlwib2ZmbGluZVwifVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgcmV0dXJuIGpzb25SZXN1bHRcclxuICAgIH1cclxuICAgIGdldE1lbnUoY29udGV4dDpDb250ZXh0KXtcclxuICAgICAgICBsZXQgbWVudTpNZW51SW5mb0Jhc2VbXSA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMuY29uZmlnLnNlcnZlci5wb2xpY3k9PSd3ZWInKXtcclxuICAgICAgICAgICAgaWYoY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzLnJlbGV2YXIpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb25maWdbJ2NsaWVudC1zZXR1cCddLmFtYmllbnRlPT0nZGVtbycgfHwgdGhpcy5jb25maWdbJ2NsaWVudC1zZXR1cCddLmFtYmllbnRlPT0ndGVzdCcgfHwgdGhpcy5jb25maWdbJ2NsaWVudC1zZXR1cCddLmFtYmllbnRlPT0nY2FwYScpe1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaCh7bWVudVR5cGU6J2RlbW8nLCBuYW1lOidkZW1vJywgc2VsZWN0ZWRCeURlZmF1bHQ6dHJ1ZX0pXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goe21lbnVUeXBlOidwYXRoJywgbmFtZToncmVsZXZhbWllbnRvJywgcGF0aDonL2NhbXBvJ30pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOidzaW5jcm9uaXphcl9kbScsIG5hbWU6J3NpbmNyb25pemFyJ30sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGlmKGNvbnRleHQucHVlZGU/LmNhbXBvPy5lZGl0YXIpe1xyXG4gICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonYWJyaXJfZW5jdWVzdGEnLCBuYW1lOidhYnJpcl9lbmN1ZXN0YSd9LFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J3JlY2VwY2lvbicsIGxhYmVsOidyZWNlcGNpw7NuJyAsbWVudUNvbnRlbnQ6W1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonbWlzX2FyZWFzJywgdGFibGU6J2FyZWFzJywgZmY6e3JlY2VwY2lvbmlzdGE6Y29udGV4dC51c2VyLmlkcGVyfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidtaXNfZW5jdWVzdGFkb3Jlcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonYXJlYXMnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3RlbV9yZWNlcGNpb24nLCBsYWJlbDonVEVNJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgXX0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJjb250ZXh0IHVzZXJcIiwgY29udGV4dC51c2VyKVxyXG4gICAgICAgICAgICBpZihjb250ZXh0LnN1cGVydXNlcil7XHJcbiAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOidtZW51JywgbmFtZTonY29udHJvbCcsIG1lbnVDb250ZW50OltcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3Jlc3VtZW4nLCB0YWJsZTonY29udHJvbF9yZXN1bWVuJywgc2VsZWN0ZWRCeURlZmF1bHQ6dHJ1ZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidkb21pbmlvJywgdGFibGU6J2NvbnRyb2xfY2FtcG8nfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3pvbmEnICAgLCB0YWJsZTonY29udHJvbF9jYW1wb196b25hJyAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J2NvbXVuYScgLCB0YWJsZTonY29udHJvbF9jYW1wb19jb211bmEnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J8OhcmVhJyAgICwgdGFibGU6J2NvbnRyb2xfY2FtcG9fYXJlYScgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidwYXJ0aWNpcGFjaW9uJyAgICAgICAgLCB0YWJsZTonY29udHJvbF9jYW1wb19wYXJ0aWNpcGFjaW9uJyAgfSxcclxuICAgICAgICAgICAgICAgICAgICBdfSwgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihjb250ZXh0LnN1cGVydXNlcil7XHJcbiAgICAgICAgICAgICAgICBtZW51ID0gWyAuLi5tZW51LFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J2NvbmZpZ3VyYXInLCBtZW51Q29udGVudDpbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J211ZXN0cmEnLCBsYWJlbDonbXVlc3RyYScsIG1lbnVDb250ZW50OltcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid0ZW0nLCBsYWJlbDogJ1RFTSd9ICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid0YXJlYXMnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidyZXN1bHRhZG9zX3RhcmVhJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHttZW51VHlwZTondGFibGUnLCBuYW1lOidwZXJzb25hbF9yb2wnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J21ldGFkYXRvcycsIG1lbnVDb250ZW50OltcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidvcGVyYXRpdm9zJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonZm9ybXVsYXJpb3MnICwgdGFibGU6J2Nhc2lsbGVyb3NfcHJpbmNpcGFsZXMnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidwbGFubycgICAgICAgLCB0YWJsZTonY2FzaWxsZXJvcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3RpcG9jJyAgICAgICAsIGxhYmVsOid0aXBvcyBkZSBjZWxkYXMnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid0aXBvY190aXBvYycgLCBsYWJlbDonaW5jbHVzaW9uZXMgZGUgY2VsZGFzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncGFyYW1ldHJvcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgIF19LFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J3VzdWFyaW9zJywgbWVudUNvbnRlbnQ6W1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTondXN1YXJpb3MnLCBzZWxlY3RlZEJ5RGVmYXVsdDp0cnVlfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3JvbGVzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidwZXJtaXNvcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncm9sZXNfcGVybWlzb3MnfSxcclxuICAgICAgICAgICAgICAgICAgICBdfSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB7bWVudVR5cGU6J3Byb2MnLCBuYW1lOidnZW5lcmF0ZV90YWJsZWRlZicsIHByb2M6J3RhYmxlZGVmX2dlbmVyYXRlJywgbGFiZWw6J2dlbmVyYXIgdGFibGFzJyAgfSxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge21lbnV9O1xyXG4gICAgfVxyXG4gICAgcHJlcGFyZUdldFRhYmxlcygpe1xyXG4gICAgICAgIHZhciBiZT10aGlzO1xyXG4gICAgICAgIHN1cGVyLnByZXBhcmVHZXRUYWJsZXMoKTtcclxuICAgICAgICB0aGlzLmdldFRhYmxlRGVmaW5pdGlvbj17XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0VGFibGVEZWZpbml0aW9uXHJcbiAgICAgICAgICAgICwgcm9sZXNcclxuICAgICAgICAgICAgLCB1c3Vhcmlvc1xyXG4gICAgICAgICAgICAsIHBlcnNvbmFsXHJcbiAgICAgICAgICAgICwgcmVjZXBjaW9uaXN0YXNcclxuICAgICAgICAgICAgLCBlbmN1ZXN0YWRvcmVzXHJcbiAgICAgICAgICAgICwgbWlzX2VuY3Vlc3RhZG9yZXNcclxuICAgICAgICAgICAgLCByZWN1cGVyYWRvcmVzXHJcbiAgICAgICAgICAgICwgc3VwZXJ2aXNvcmVzXHJcbiAgICAgICAgICAgICwgcGVyc29uYWxfcm9sXHJcbiAgICAgICAgICAgICwgcGVybWlzb3NcclxuICAgICAgICAgICAgLCByb2xlc19wZXJtaXNvc1xyXG4gICAgICAgICAgICAsIHJvbGVzX3N1Ym9yZGluYWRvc1xyXG4gICAgICAgICAgICAsIG5vX3JlYVxyXG4gICAgICAgICAgICAsIHNlbWFuYXNcclxuICAgICAgICAgICAgLCB0ZW06IHRlbVxyXG4gICAgICAgICAgICAsIHRlbV9yZWNlcGNpb25cclxuICAgICAgICAgICAgLCBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgICwgb3BlcmFjaW9uZXNcclxuICAgICAgICAgICAgLCBjb211bmFzXHJcbiAgICAgICAgICAgICwgYXJlYXNcclxuICAgICAgICAgICAgLCBzaW5jcm9uaXphY2lvbmVzXHJcbiAgICAgICAgICAgICwgdGFyZWFzXHJcbiAgICAgICAgICAgICwgcmVzdWx0YWRvc190YXJlYVxyXG4gICAgICAgICAgICAsIHRhcmVhc190ZW06IHRhcmVhc190ZW1cclxuICAgICAgICAgICAgLCB0YXJlYXNfYXJlYXNcclxuICAgICAgICAgICAgLCBtaXNfdGFyZWFzXHJcbiAgICAgICAgICAgICwgbWlzX3RhcmVhc190ZW1cclxuICAgICAgICAgICAgLCBtaXNfdGFyZWFzX2FyZWFzXHJcbiAgICAgICAgICAgICwgY29udHJvbF9jYW1wb1xyXG4gICAgICAgICAgICAsIGNvbnRyb2xfcmVzdW1lblxyXG4gICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fem9uYTogY29udGV4dD0+Y29udHJvbF9jYW1wbyhjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgIHtub21icmU6J2NvbnRyb2xfY2FtcG9fY29tdW5hJywgdGl0bGU6J2NvbnRyb2wgY2FtcG8geCB6b25hIHNvbG8gY2VtZW50bycsIGNhbXBvc0NvcnRlOlt7bmFtZTonem9uYScsIHR5cGVOYW1lOid0ZXh0J31dLCBmaWx0cm9XaGVyZTondHJ1ZScgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICwgY29udHJvbF9jYW1wb19jb211bmE6IGNvbnRleHQ9PmNvbnRyb2xfY2FtcG8oY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICB7bm9tYnJlOidjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOidjb250cm9sIGNhbXBvIHggY29tdW5hIHNvbG8gY2VtZW50bycsIGNhbXBvc0NvcnRlOlt7bmFtZTonem9uYScsIHR5cGVOYW1lOid0ZXh0J30se25hbWU6J25yb2NvbXVuYScsIHR5cGVOYW1lOidpbnRlZ2VyJ31dLCBmaWx0cm9XaGVyZTondHJ1ZScgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICwgY29udHJvbF9jYW1wb19hcmVhOiBjb250ZXh0PT5jb250cm9sX2NhbXBvKGNvbnRleHQsIFxyXG4gICAgICAgICAgICAgICAge25vbWJyZTonY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTonY29udHJvbCBjYW1wbyB4IGFyZWEnLCBjYW1wb3NDb3J0ZTpbe25hbWU6J3pvbmEnLCB0eXBlTmFtZTondGV4dCd9LHtuYW1lOiducm9jb211bmEnLCB0eXBlTmFtZTonaW50ZWdlcid9LHtuYW1lOidhcmVhJywgdHlwZU5hbWU6J2ludGVnZXInfSx7bmFtZToncGFydGljaXBhY2lvbl9hJywgdHlwZU5hbWU6J3RleHQnfSx7bmFtZTonY2xhc2VfYScsIHR5cGVOYW1lOid0ZXh0J31dfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICwgY29udHJvbF9jYW1wb19wYXJ0aWNpcGFjaW9uOiBjb250ZXh0PT5jb250cm9sX2NhbXBvKGNvbnRleHQsIFxyXG4gICAgICAgICAgICAgICAge25vbWJyZTonY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTonY29udHJvbCBjYW1wbyB4IHBhcnRpY2lwYWNpb24nLCBjYW1wb3NDb3J0ZTpbe25hbWU6J3BhcnRpY2lwYWNpb24nLCB0eXBlTmFtZTonYmlnaW50J31dfVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgIH1cclxuICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignY29uc2lzdGVuY2lhcycsZnVuY3Rpb24odGFibGVEZWYsIGNvbnRleHQpe1xyXG4gICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCl7XHJcbiAgICAgICAgICAgICAgICBpZihmaWVsZC5uYW1lPT0nZXJyb3JfY29tcGlsYWNpb24nKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihmaWVsZC52aXNpYmxlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqIFFVSVRBUiBFU1RPIGVycm9yX2NvbXBpbGFjaW9uIHlhIGVzIHZpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ2luY29uc2lzdGVuY2lhcycsZnVuY3Rpb24odGFibGVEZWYsIGNvbnRleHQpe1xyXG4gICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuc3BsaWNlKDIsMCxcclxuICAgICAgICAgICAgICAgIHtuYW1lOidpZF9jYXNvJywgdHlwZU5hbWU6J3RleHQnICAgLCBsYWJlbDonY2FzbycgICAsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgICAgICAgICAgIC8vIHtuYW1lOidwMCcgICAgICwgdHlwZU5hbWU6J2ludGVnZXInLCBsYWJlbDoncGVyc29uYScsIGVkaXRhYmxlOiBmYWxzZX1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGFibGVEZWYuZWRpdGFibGU9dGFibGVEZWYuZWRpdGFibGUgfHwgY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzLmp1c3RpZmljYXI7XHJcbiAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkKXtcclxuICAgICAgICAgICAgICAgIGlmKGZpZWxkLm5hbWU9PSdwa19pbnRlZ3JhZGEnKXtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZC52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQubmFtZT09J2p1c3RpZmljYWNpb24nKXtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5lZGl0YWJsZT1jb250ZXh0LmZvckR1bXAgfHwgY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzLmp1c3RpZmljYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignb3BlcmF0aXZvcycsZnVuY3Rpb24odGFibGVEZWYsIGNvbnRleHQpe1xyXG4gICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuc3BsaWNlKDIsMCx7XHJcbiAgICAgICAgICAgICAgICBuYW1lOidjb25maWdfc29ydGVvJywgXHJcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTonanNvbmInLFxyXG4gICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuc3BsaWNlKDMsMCx7XHJcbiAgICAgICAgICAgICAgICBuYW1lOidkaXNmb3JtX2NlcnJhZG8nLCBcclxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOidib29sZWFuJywgXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLCBcclxuICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBjb250ZXh0LmZvckR1bXB8fFsnYWRtaW4nLCdkaXNfY29uY2VwdHVhbCddLmluY2x1ZGVzKGNvbnRleHQudXNlci5yb2wpfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIC8vIGJlLmFwcGVuZFRvVGFibGVEZWZpbml0aW9uKCdjYXNpbGxlcm9zJyxmdW5jdGlvbih0YWJsZURlZiwgY29udGV4dCl7XHJcbiAgICAgICAgLy8gICAgIHRhYmxlRGVmLmNvbnN0cmFpbnRzID0gdGFibGVEZWYuY29uc3RyYWludHMuZmlsdGVyKGM9PmMuY29uc05hbWUhPSdjYXNpbGxlcm9zIHNhbHRvIFJFTCcpXHJcbiAgICAgICAgLy8gfSlcclxuICAgIH1cclxuICB9XHJcbn0iXX0=
|