wm-menu 1.2.9 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/bundles/wm-menu.umd.js +368 -31
  2. package/bundles/wm-menu.umd.js.map +1 -1
  3. package/bundles/wm-menu.umd.min.js +2 -2
  4. package/bundles/wm-menu.umd.min.js.map +1 -1
  5. package/esm2015/lib/wm-menu/asistente-datos/asistente-datos-api.service.js +52 -0
  6. package/esm2015/lib/wm-menu/asistente-datos/asistente-datos.component.js +178 -0
  7. package/esm2015/lib/wm-menu/asistente-datos/reconocimiento-voz.service.js +77 -0
  8. package/esm2015/lib/wm-menu/services/wm-menu-alerta-panico.service.js +4 -21
  9. package/esm2015/lib/wm-menu/services/wm-menu-servicio.service.js +9 -1
  10. package/esm2015/lib/wm-menu/wm-menu.component.js +35 -7
  11. package/esm2015/lib/wm-menu.module.js +9 -2
  12. package/esm2015/wm-menu.js +4 -1
  13. package/esm5/lib/wm-menu/asistente-datos/asistente-datos-api.service.js +53 -0
  14. package/esm5/lib/wm-menu/asistente-datos/asistente-datos.component.js +194 -0
  15. package/esm5/lib/wm-menu/asistente-datos/reconocimiento-voz.service.js +79 -0
  16. package/esm5/lib/wm-menu/services/wm-menu-alerta-panico.service.js +4 -21
  17. package/esm5/lib/wm-menu/services/wm-menu-servicio.service.js +9 -1
  18. package/esm5/lib/wm-menu/wm-menu.component.js +39 -7
  19. package/esm5/lib/wm-menu.module.js +9 -2
  20. package/esm5/wm-menu.js +4 -1
  21. package/fesm2015/wm-menu.js +343 -29
  22. package/fesm2015/wm-menu.js.map +1 -1
  23. package/fesm5/wm-menu.js +366 -29
  24. package/fesm5/wm-menu.js.map +1 -1
  25. package/lib/wm-menu/asistente-datos/asistente-datos-api.service.d.ts +26 -0
  26. package/lib/wm-menu/asistente-datos/asistente-datos.component.d.ts +39 -0
  27. package/lib/wm-menu/asistente-datos/reconocimiento-voz.service.d.ts +7 -0
  28. package/lib/wm-menu/services/wm-menu-servicio.service.d.ts +1 -0
  29. package/lib/wm-menu/wm-menu.component.d.ts +10 -3
  30. package/package.json +1 -1
  31. package/wm-menu.d.ts +3 -0
  32. package/wm-menu.metadata.json +1 -1
@@ -0,0 +1,53 @@
1
+ import { __decorate } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
4
+ import { throwError } from 'rxjs';
5
+ import { catchError } from 'rxjs/operators';
6
+ import { JwtHelperService } from '@auth0/angular-jwt';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ var AsistenteDatosApiService = /** @class */ (function () {
10
+ function AsistenteDatosApiService(http) {
11
+ this.http = http;
12
+ // La fija el componente desde su @Input urlConsultar (reemplaza WmChatConfigService.urlConsultar).
13
+ this.url = '';
14
+ // Mismo origen del JWT que WmSeguridadService.getJWT() en wm-chat: localStorage['WMTKN'],
15
+ // descartado si está vencido. Se replica aquí para que el header Authorization sea idéntico
16
+ // al del chat original sin depender de un servicio de config externo.
17
+ this.TOKEN_KEY = 'WMTKN';
18
+ this.jwtHelper = new JwtHelperService();
19
+ }
20
+ AsistenteDatosApiService.prototype.consultar = function (pregunta, proveedor) {
21
+ var headers = new HttpHeaders({
22
+ Authorization: "Bearer " + this.obtenerJWT(),
23
+ 'Content-Type': 'application/json; charset=utf-8',
24
+ });
25
+ return this.http
26
+ .post(this.url, { Pregunta: pregunta, Proveedor: proveedor }, { headers: headers })
27
+ .pipe(catchError(function (error) {
28
+ return throwError(error.error);
29
+ }));
30
+ };
31
+ AsistenteDatosApiService.prototype.obtenerJWT = function () {
32
+ var jwt = localStorage.getItem(this.TOKEN_KEY);
33
+ if (jwt) {
34
+ try {
35
+ return this.jwtHelper.isTokenExpired(jwt) ? null : jwt;
36
+ }
37
+ catch (_a) { }
38
+ }
39
+ return null;
40
+ };
41
+ AsistenteDatosApiService.ctorParameters = function () { return [
42
+ { type: HttpClient }
43
+ ]; };
44
+ AsistenteDatosApiService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AsistenteDatosApiService_Factory() { return new AsistenteDatosApiService(i0.ɵɵinject(i1.HttpClient)); }, token: AsistenteDatosApiService, providedIn: "root" });
45
+ AsistenteDatosApiService = __decorate([
46
+ Injectable({
47
+ providedIn: 'root',
48
+ })
49
+ ], AsistenteDatosApiService);
50
+ return AsistenteDatosApiService;
51
+ }());
52
+ export { AsistenteDatosApiService };
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpc3RlbnRlLWRhdG9zLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vd20tbWVudS8iLCJzb3VyY2VzIjpbImxpYi93bS1tZW51L2FzaXN0ZW50ZS1kYXRvcy9hc2lzdGVudGUtZGF0b3MtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBc0J0RDtJQVVJLGtDQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBVHBDLG1HQUFtRztRQUM1RixRQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWhCLDBGQUEwRjtRQUMxRiw0RkFBNEY7UUFDNUYsc0VBQXNFO1FBQ3JELGNBQVMsR0FBRyxPQUFPLENBQUM7UUFDcEIsY0FBUyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUViLENBQUM7SUFFeEMsNENBQVMsR0FBVCxVQUFVLFFBQWdCLEVBQUUsU0FBa0I7UUFDMUMsSUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDNUIsYUFBYSxFQUFFLFlBQVUsSUFBSSxDQUFDLFVBQVUsRUFBSTtZQUM1QyxjQUFjLEVBQUUsaUNBQWlDO1NBQ3BELENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDWCxJQUFJLENBQ0QsSUFBSSxDQUFDLEdBQUcsRUFDUixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUM1QyxFQUFFLE9BQU8sU0FBQSxFQUFFLENBQ2Q7YUFDQSxJQUFJLENBQ0QsVUFBVSxDQUFDLFVBQUMsS0FBSztZQUNiLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ1YsQ0FBQztJQUVPLDZDQUFVLEdBQWxCO1FBQ0ksSUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxHQUFHLEVBQUU7WUFDTCxJQUFJO2dCQUNBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2FBQzFEO1lBQUMsV0FBTSxHQUFFO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOztnQkE5QnlCLFVBQVU7OztJQVYzQix3QkFBd0I7UUFIcEMsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLHdCQUF3QixDQXlDcEM7bUNBbkVEO0NBbUVDLEFBekNELElBeUNDO1NBekNZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSnd0SGVscGVyU2VydmljZSB9IGZyb20gJ0BhdXRoMC9hbmd1bGFyLWp3dCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVDb25zdWx0YURpbmFtaWNhQXBpIHtcclxuICAgIEVudGlkYWQ6IHN0cmluZztcclxuICAgIFdoZXJlPzogc3RyaW5nO1xyXG4gICAgU2VsZWN0Pzogc3RyaW5nO1xyXG4gICAgR3JvdXBCeT86IHN0cmluZztcclxuICAgIE9yZGVyQnk/OiBzdHJpbmc7XHJcbiAgICBUYWtlOiBudW1iZXI7XHJcbiAgICBTa2lwOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzcHVlc3RhQXNpc3RlbnRlRGF0b3Mge1xyXG4gICAgUmVzdWx0YWRvOiBhbnlbXTtcclxuICAgIENvbnN1bHRhOiBFQ29uc3VsdGFEaW5hbWljYUFwaTtcclxuICAgIFByb3ZlZWRvcjogc3RyaW5nO1xyXG4gICAgRGVzY3JpcGNpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFzaXN0ZW50ZURhdG9zQXBpU2VydmljZSB7XHJcbiAgICAvLyBMYSBmaWphIGVsIGNvbXBvbmVudGUgZGVzZGUgc3UgQElucHV0IHVybENvbnN1bHRhciAocmVlbXBsYXphIFdtQ2hhdENvbmZpZ1NlcnZpY2UudXJsQ29uc3VsdGFyKS5cclxuICAgIHB1YmxpYyB1cmwgPSAnJztcclxuXHJcbiAgICAvLyBNaXNtbyBvcmlnZW4gZGVsIEpXVCBxdWUgV21TZWd1cmlkYWRTZXJ2aWNlLmdldEpXVCgpIGVuIHdtLWNoYXQ6IGxvY2FsU3RvcmFnZVsnV01US04nXSxcclxuICAgIC8vIGRlc2NhcnRhZG8gc2kgZXN0w6EgdmVuY2lkby4gU2UgcmVwbGljYSBhcXXDrSBwYXJhIHF1ZSBlbCBoZWFkZXIgQXV0aG9yaXphdGlvbiBzZWEgaWTDqW50aWNvXHJcbiAgICAvLyBhbCBkZWwgY2hhdCBvcmlnaW5hbCBzaW4gZGVwZW5kZXIgZGUgdW4gc2VydmljaW8gZGUgY29uZmlnIGV4dGVybm8uXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRPS0VOX0tFWSA9ICdXTVRLTic7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGp3dEhlbHBlciA9IG5ldyBKd3RIZWxwZXJTZXJ2aWNlKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7fVxyXG5cclxuICAgIGNvbnN1bHRhcihwcmVndW50YTogc3RyaW5nLCBwcm92ZWVkb3I/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlc3B1ZXN0YUFzaXN0ZW50ZURhdG9zPiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLm9idGVuZXJKV1QoKX1gLFxyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgICAgICAgIC5wb3N0PFJlc3B1ZXN0YUFzaXN0ZW50ZURhdG9zPihcclxuICAgICAgICAgICAgICAgIHRoaXMudXJsLFxyXG4gICAgICAgICAgICAgICAgeyBQcmVndW50YTogcHJlZ3VudGEsIFByb3ZlZWRvcjogcHJvdmVlZG9yIH0sXHJcbiAgICAgICAgICAgICAgICB7IGhlYWRlcnMgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb2J0ZW5lckpXVCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGp3dCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVE9LRU5fS0VZKTtcclxuXHJcbiAgICAgICAgaWYgKGp3dCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKGp3dCkgPyBudWxsIDogand0O1xyXG4gICAgICAgICAgICB9IGNhdGNoIHt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,194 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import { ReconocimientoVozService } from './reconocimiento-voz.service';
4
+ import { AsistenteDatosApiService } from './asistente-datos-api.service';
5
+ var AsistenteDatosComponent = /** @class */ (function () {
6
+ function AsistenteDatosComponent(asistenteDatosApiService, reconocimientoVoz) {
7
+ this.asistenteDatosApiService = asistenteDatosApiService;
8
+ this.reconocimientoVoz = reconocimientoVoz;
9
+ // La apertura/cierre del panel la controla el padre (el menú). El panel solo se renderiza
10
+ // cuando `abierto` es true y avisa, vía `cerrarChange`, cuando el usuario toca la X.
11
+ this.abierto = false;
12
+ // Idioma para el reconocimiento de voz (Web Speech API).
13
+ this.idioma = 'es-CO';
14
+ this.cerrarChange = new EventEmitter();
15
+ this.mensajes = [];
16
+ this.borrador = '';
17
+ // Alterna el alto de la caja del mensaje (compacta ↔ expandida), igual que el "pedir cambios"
18
+ // del asistente de IA del generador de formularios (ver filasBorrador / onClickExpandirBorrador).
19
+ this.borradorExpandido = false;
20
+ this.consultando = false;
21
+ // "Gemini" o "Groq" — mismo selector que el asistente de generación de formularios
22
+ // (ver ProveedorIAServicio en el backend).
23
+ this.proveedorSeleccionado = 'Gemini';
24
+ // Dictado por voz (Web Speech API) — sin soporte en Firefox, inconsistente en Safari.
25
+ this.escuchando = false;
26
+ // Preguntas ya verificadas como respondibles hoy (whitelist + contrato de la IA — ver
27
+ // ChatConsultaWhitelistServicio/ChatConsultaPromptServicio en el backend), mostradas como chips
28
+ // de sugerencia en el estado vacío del chat.
29
+ this.chipsSugeridos = [
30
+ '¿Cuántos formularios se diligenciaron hoy?',
31
+ '¿Cuántos formularios se diligenciaron esta semana?',
32
+ 'Muéstrame los últimos 10 formularios diligenciados',
33
+ ];
34
+ }
35
+ Object.defineProperty(AsistenteDatosComponent.prototype, "urlConsultar", {
36
+ // URL del POST de consulta. Se refleja en el api service (propiedad `url`), que es donde se usa.
37
+ set: function (valor) {
38
+ if (valor) {
39
+ this.asistenteDatosApiService.url = valor;
40
+ }
41
+ },
42
+ enumerable: true,
43
+ configurable: true
44
+ });
45
+ // El padre abre/cierra el panel; aquí solo se avisa que el usuario pidió cerrarlo (botón X).
46
+ AsistenteDatosComponent.prototype.cerrar = function () {
47
+ this.cerrarChange.emit();
48
+ };
49
+ Object.defineProperty(AsistenteDatosComponent.prototype, "filasBorrador", {
50
+ // Caja del mensaje compacta (1 fila, como era el chat originalmente) ↔ expandida (6 filas).
51
+ // El botón de expandir es el mismo patrón del "pedir cambios" del generador.
52
+ get: function () {
53
+ return this.borradorExpandido ? 6 : 1;
54
+ },
55
+ enumerable: true,
56
+ configurable: true
57
+ });
58
+ AsistenteDatosComponent.prototype.onClickExpandirBorrador = function () {
59
+ this.borradorExpandido = !this.borradorExpandido;
60
+ };
61
+ Object.defineProperty(AsistenteDatosComponent.prototype, "micDisponible", {
62
+ get: function () {
63
+ return this.reconocimientoVoz.estaSoportado();
64
+ },
65
+ enumerable: true,
66
+ configurable: true
67
+ });
68
+ AsistenteDatosComponent.prototype.onClickMicrofono = function () {
69
+ var _this = this;
70
+ if (this.escuchando) {
71
+ this.reconocimientoVoz.detener();
72
+ this.escuchando = false;
73
+ return;
74
+ }
75
+ if (!this.reconocimientoVoz.estaSoportado()) {
76
+ return;
77
+ }
78
+ // El resultado del reconocimiento no incluye lo que ya estaba escrito — se guarda antes de
79
+ // empezar y se antepone en cada actualización (que llega con la transcripción COMPLETA de
80
+ // esta sesión de escucha, no un incremento) para no perder lo que ya había en el campo.
81
+ var textoPrevio = this.borrador.trim();
82
+ this.escuchando = true;
83
+ this.reconocimientoVoz.iniciar(this.idioma, function (texto) { return (_this.borrador = textoPrevio ? textoPrevio + " " + texto : texto); }, function () { return (_this.escuchando = false); });
84
+ };
85
+ AsistenteDatosComponent.prototype.onClickEnviar = function (textoPreset) {
86
+ var _this = this;
87
+ var pregunta = ((textoPreset !== null && textoPreset !== void 0 ? textoPreset : this.borrador)).trim();
88
+ if (!pregunta || this.consultando) {
89
+ return;
90
+ }
91
+ this.mensajes.push({ deUsuario: true, texto: pregunta });
92
+ this.borrador = '';
93
+ // Sin url de consulta no se hace la petición: el usuario ve el mismo error genérico que
94
+ // cuando la API falla.
95
+ if (!this.asistenteDatosApiService.url) {
96
+ this.mensajes.push({
97
+ deUsuario: false,
98
+ texto: 'No se pudo procesar la consulta.',
99
+ esError: true,
100
+ });
101
+ this.scrollAlFinal();
102
+ return;
103
+ }
104
+ this.consultando = true;
105
+ this.scrollAlFinal();
106
+ this.asistenteDatosApiService.consultar(pregunta, this.proveedorSeleccionado).subscribe({
107
+ // El tipo (RespuestaAsistenteDatos) se infiere del Observable: importar la interfaz
108
+ // dejaba un import a un símbolo inexistente en el JS de la librería (aviso de rollup).
109
+ next: function (respuesta) {
110
+ var _a;
111
+ _this.consultando = false;
112
+ _this.mensajes.push({
113
+ deUsuario: false,
114
+ descripcion: respuesta.Descripcion,
115
+ resultado: (_a = respuesta.Resultado, (_a !== null && _a !== void 0 ? _a : [])),
116
+ proveedor: respuesta.Proveedor,
117
+ });
118
+ _this.scrollAlFinal();
119
+ },
120
+ error: function (error) {
121
+ var _a;
122
+ _this.consultando = false;
123
+ _this.mensajes.push({
124
+ deUsuario: false,
125
+ texto: ((_a = error) === null || _a === void 0 ? void 0 : _a.Mensaje) || 'No se pudo procesar la consulta.',
126
+ esError: true,
127
+ });
128
+ _this.scrollAlFinal();
129
+ },
130
+ });
131
+ };
132
+ // El nuevo mensaje recién se refleja en el DOM después del siguiente ciclo de detección de
133
+ // cambios — por eso el scrollTop se ajusta en un setTimeout(0), no inmediatamente después del
134
+ // push, para que scrollHeight ya incluya el mensaje agregado.
135
+ AsistenteDatosComponent.prototype.scrollAlFinal = function () {
136
+ var _this = this;
137
+ setTimeout(function () {
138
+ var _a;
139
+ var elemento = (_a = _this.mensajesContainer) === null || _a === void 0 ? void 0 : _a.nativeElement;
140
+ if (elemento) {
141
+ elemento.scrollTop = elemento.scrollHeight;
142
+ }
143
+ });
144
+ };
145
+ AsistenteDatosComponent.prototype.columnasDe = function (resultado) {
146
+ return resultado.length ? Object.keys(resultado[0]) : [];
147
+ };
148
+ // El backend devuelve un conteo (ChatConsultaIAServicio.EjecutarConteo) como una sola fila con
149
+ // una sola columna llamada literalmente "Resultado" — se muestra como número grande en vez de
150
+ // como tabla de una celda.
151
+ AsistenteDatosComponent.prototype.esConteo = function (resultado) {
152
+ var _a;
153
+ return ((_a = resultado) === null || _a === void 0 ? void 0 : _a.length) === 1 && Object.keys(resultado[0]).length === 1 && 'Resultado' in resultado[0];
154
+ };
155
+ // Listado con una sola columna (ej. una lista de nombres/ids) — se muestra como texto simple
156
+ // en vez de una tabla de una sola columna repetida.
157
+ AsistenteDatosComponent.prototype.esListaSimple = function (resultado) {
158
+ var _a;
159
+ return ((_a = resultado) === null || _a === void 0 ? void 0 : _a.length) > 0 && !this.esConteo(resultado) && this.columnasDe(resultado).length === 1;
160
+ };
161
+ AsistenteDatosComponent.prototype.textoListaSimple = function (resultado) {
162
+ var columna = this.columnasDe(resultado)[0];
163
+ return resultado.map(function (fila) { return fila[columna]; }).join(', ');
164
+ };
165
+ AsistenteDatosComponent.ctorParameters = function () { return [
166
+ { type: AsistenteDatosApiService },
167
+ { type: ReconocimientoVozService }
168
+ ]; };
169
+ __decorate([
170
+ ViewChild('mensajesContainer')
171
+ ], AsistenteDatosComponent.prototype, "mensajesContainer", void 0);
172
+ __decorate([
173
+ Input()
174
+ ], AsistenteDatosComponent.prototype, "abierto", void 0);
175
+ __decorate([
176
+ Input()
177
+ ], AsistenteDatosComponent.prototype, "urlConsultar", null);
178
+ __decorate([
179
+ Input()
180
+ ], AsistenteDatosComponent.prototype, "idioma", void 0);
181
+ __decorate([
182
+ Output()
183
+ ], AsistenteDatosComponent.prototype, "cerrarChange", void 0);
184
+ AsistenteDatosComponent = __decorate([
185
+ Component({
186
+ selector: 'wm-asistente-datos',
187
+ template: "<!-- Panel (abierto) -->\r\n<div class=\"chat-ia-panel\" *ngIf=\"abierto\">\r\n <div class=\"chat-ia-header\">\r\n <div class=\"chat-ia-header-info\">\r\n <div class=\"chat-ia-header-icono\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\">\r\n <path d=\"M4 5h16v10H9l-4 4V15H4z\"></path>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"chat-ia-titulo\">Preg\u00FAntale a tus Datos</div>\r\n <div class=\"chat-ia-subtitulo\">Consulta tus reportes en lenguaje natural</div>\r\n </div>\r\n </div>\r\n <div class=\"chat-ia-cerrar\" (click)=\"cerrar()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" stroke=\"#fff\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\">\r\n <path d=\"M6 6l12 12M18 6L6 18\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-mensajes\" #mensajesContainer>\r\n <div class=\"chat-ia-bienvenida-texto\">Hola, soy tu asistente de datos de Snap Forms. Preg\u00FAntame lo que quieras saber sobre tu operaci\u00F3n.</div>\r\n\r\n <div class=\"chat-ia-mensaje\" *ngFor=\"let mensaje of mensajes\" [class.chat-ia-mensaje-usuario]=\"mensaje.deUsuario\">\r\n <div class=\"chat-ia-burbuja\" [class.chat-ia-burbuja-error]=\"mensaje.esError\">\r\n <span *ngIf=\"mensaje.texto\">{{ mensaje.texto }}</span>\r\n\r\n <ng-container *ngIf=\"mensaje.resultado\">\r\n <div class=\"chat-ia-descripcion\" *ngIf=\"mensaje.descripcion\">{{ mensaje.descripcion }}</div>\r\n\r\n <div class=\"chat-ia-sin-resultados\" *ngIf=\"mensaje.resultado.length === 0\">La consulta no encontr\u00F3 resultados.</div>\r\n\r\n <div class=\"chat-ia-stat\" *ngIf=\"esConteo(mensaje.resultado)\">\r\n <div class=\"chat-ia-stat-valor\">{{ mensaje.resultado[0].Resultado | number }}</div>\r\n </div>\r\n\r\n <div class=\"chat-ia-lista-simple\" *ngIf=\"esListaSimple(mensaje.resultado)\">{{ textoListaSimple(mensaje.resultado) }}</div>\r\n\r\n <div class=\"chat-ia-tabla-resultado\" *ngIf=\"mensaje.resultado.length > 0 && !esConteo(mensaje.resultado) && !esListaSimple(mensaje.resultado)\">\r\n <table mat-table [dataSource]=\"mensaje.resultado\">\r\n <ng-container *ngFor=\"let columna of columnasDe(mensaje.resultado)\" [matColumnDef]=\"columna\">\r\n <th mat-header-cell *matHeaderCellDef>{{ columna }}</th>\r\n <td mat-cell *matCellDef=\"let fila\">{{ fila[columna] }}</td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"columnasDe(mensaje.resultado)\"></tr>\r\n <tr mat-row *matRowDef=\"let fila; columns: columnasDe(mensaje.resultado);\"></tr>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-pensando\" *ngIf=\"consultando\">\r\n <span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chips-chat-ia\">\r\n <span class=\"chip-chat-ia\" *ngFor=\"let chip of chipsSugeridos\"\r\n (click)=\"onClickEnviar(chip)\">{{ chip }}</span>\r\n </div>\r\n\r\n <div class=\"chat-ia-entrada\">\r\n <div class=\"chat-ia-caja-entrada\">\r\n <mat-icon class=\"chat-ia-expandir\" (click)=\"onClickExpandirBorrador()\">{{ borradorExpandido ? 'close_fullscreen' : 'open_in_full' }}</mat-icon>\r\n <textarea [rows]=\"filasBorrador\" [(ngModel)]=\"borrador\" (keydown.enter)=\"$event.preventDefault(); onClickEnviar()\"\r\n [class.chat-ia-textarea-expandido]=\"borradorExpandido\"\r\n placeholder=\"Escribe tu pregunta...\"></textarea>\r\n <div class=\"chat-ia-pie-entrada\">\r\n <button class=\"chat-ia-selector-modelo\" [matMenuTriggerFor]=\"menuModeloChatIA\" type=\"button\">\r\n <span *ngIf=\"proveedorSeleccionado === 'Gemini'\">Gemini</span>\r\n <span *ngIf=\"proveedorSeleccionado === 'Groq'\">Groq</span>\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M6 9l6 6 6-6\"></path>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-microfono\" [class.chat-ia-microfono-activo]=\"escuchando\" *ngIf=\"micDisponible\"\r\n (click)=\"onClickMicrofono()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path>\r\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path>\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-enviar\" [disabled]=\"!borrador.trim() || consultando\" (click)=\"onClickEnviar()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 19V6\"></path>\r\n <path d=\"M5 13l7-7 7 7\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-menu #menuModeloChatIA=\"matMenu\" class=\"menu-modelo-chat-ia\">\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Gemini'\"\r\n (click)=\"proveedorSeleccionado = 'Gemini'\">\r\n <span>Gemini</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Gemini'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Groq'\"\r\n (click)=\"proveedorSeleccionado = 'Groq'\">\r\n <span>Groq</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Groq'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n</mat-menu>\r\n",
188
+ styles: [":host{position:fixed;right:32px;bottom:32px;z-index:1000;font-family:Roboto,sans-serif}.chat-ia-panel{width:450px;height:650px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);background:#fff;border-radius:18px;box-shadow:0 24px 60px rgba(20,25,30,.28);display:flex;flex-direction:column;overflow:hidden}.chat-ia-header{background:linear-gradient(135deg,#7c5ce0,#5f42bd);padding:16px 18px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-ia-header-info{display:flex;align-items:center;gap:10px;min-width:0}.chat-ia-header-icono{width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex:none}.chat-ia-titulo{color:#fff;font-size:14px;font-weight:500}.chat-ia-subtitulo{color:rgba(255,255,255,.75);font-size:11px;margin-top:1px}.chat-ia-cerrar{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.85;flex:none}.chat-ia-cerrar:hover{opacity:1}.chat-ia-mensajes{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:16px;background:#fbfafc}.chat-ia-mensaje{display:flex}.chat-ia-mensaje .chat-ia-burbuja{max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chat-ia-mensaje .chat-ia-burbuja-error{background:#fdecea;color:#7a1f14}.chat-ia-mensaje.chat-ia-mensaje-usuario{justify-content:flex-end}.chat-ia-mensaje.chat-ia-mensaje-usuario .chat-ia-burbuja{background:#7c5ce0;color:#fff;border-radius:14px 14px 3px}.chat-ia-bienvenida-texto{align-self:flex-start;max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chips-chat-ia{flex:none;display:flex;flex-wrap:wrap;gap:6px;padding:0 16px 10px}.chip-chat-ia{border:1px solid #e7e2f5;background:#f2eefb;color:#5f42bd;border-radius:14px;padding:5px 10px;font-size:11px;cursor:pointer}.chip-chat-ia:hover{background:#e7ddfa}.chat-ia-descripcion{font-size:13px;line-height:1.5;margin-bottom:6px}.chat-ia-sin-resultados{color:#5a5a5a;font-style:italic}.chat-ia-stat{margin-top:4px}.chat-ia-stat-valor{font-size:30px;font-weight:600;color:#5f42bd;line-height:1.15;font-variant-numeric:proportional-nums}.chat-ia-lista-simple,.chat-ia-tabla-resultado{margin-top:4px;background:#fff;border-radius:10px;padding:8px 10px}.chat-ia-lista-simple{font-size:13px;line-height:1.5}.chat-ia-tabla-resultado{overflow-x:auto;max-width:100%;padding:4px 10px}.chat-ia-tabla-resultado table{font-size:12px;background:0 0}.chat-ia-tabla-resultado th.mat-header-cell{color:#6b6478;font-weight:600;padding:0 14px 5px 0;border-bottom:1px solid #f0edf7;white-space:nowrap}.chat-ia-tabla-resultado td.mat-cell{padding:7px 14px 0 0;white-space:nowrap;font-variant-numeric:tabular-nums}.chat-ia-pensando{align-self:flex-start;background:#f2eefb;padding:12px 16px;border-radius:14px 14px 14px 3px;display:flex;gap:5px;flex-shrink:0}.chat-ia-dot{width:6px;height:6px;border-radius:50%;background:#9a93ae;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}.chat-ia-dot:nth-child(2){-webkit-animation-delay:.15s;animation-delay:.15s}.chat-ia-dot:nth-child(3){-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}@keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}.chat-ia-entrada{padding:10px 14px 14px;border-top:1px solid #e9f2ee;flex-shrink:0}.chat-ia-caja-entrada{position:relative;background:#f2f7f5;border:1px solid #e6efea;border-radius:18px;padding:10px 12px 8px}.chat-ia-caja-entrada textarea{border:none;outline:0;background:0 0;width:100%;font:inherit;font-size:13.5px;color:#26313a;resize:none;line-height:1.45;max-height:110px;overflow-y:auto;display:block;padding:0 28px 0 0}.chat-ia-caja-entrada textarea.chat-ia-textarea-expandido{max-height:160px}.chat-ia-caja-entrada textarea::-webkit-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-moz-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea:-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::placeholder{color:#9a93ae}.chat-ia-expandir{position:absolute;top:8px;right:10px;font-size:17px;height:17px;width:17px;color:#9a9a9a;cursor:pointer}.chat-ia-pie-entrada{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.chat-ia-selector-modelo{display:inline-flex;align-items:center;gap:4px;border:none;background:0 0;color:#4e5d57;border-radius:14px;padding:5px 9px;font-size:11.5px;font-weight:600;cursor:pointer}.chat-ia-enviar{width:32px;height:32px;border-radius:50%;border:none;background:#7c5ce0;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-enviar:disabled{background:#dce6e1;color:#a9bab3;cursor:default}.chat-ia-microfono{width:28px;height:28px;border-radius:50%;border:none;background:0 0;color:#6b6478;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-microfono:hover{background:#f2eefb}.chat-ia-microfono.chat-ia-microfono-activo{color:#fff;background:#e05a5a;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}::ng-deep .mat-menu-panel.menu-modelo-chat-ia{min-width:132px;border:1px solid #e6efea;border-radius:10px;box-shadow:0 12px 26px rgba(20,25,30,.16)}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-content{padding:4px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item{display:flex;align-items:center;justify-content:space-between;gap:8px;height:auto;line-height:normal;padding:7px 10px;font-size:12px;color:#26313a;border-radius:7px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item.opcion-activa{background:#f2f7f5}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item .chat-ia-check{color:#7c5ce0}"]
189
+ })
190
+ ], AsistenteDatosComponent);
191
+ return AsistenteDatosComponent;
192
+ }());
193
+ export { AsistenteDatosComponent };
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3dtLW1lbnUvIiwic291cmNlcyI6WyJsaWIvd20tbWVudS9hc2lzdGVudGUtZGF0b3MvYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFnQnpFO0lBd0NJLGlDQUNZLHdCQUFrRCxFQUNsRCxpQkFBMkM7UUFEM0MsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBdkN2RCwwRkFBMEY7UUFDMUYscUZBQXFGO1FBQzVFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFTekIseURBQXlEO1FBQ2hELFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFaEIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTNDLGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsOEZBQThGO1FBQzlGLGtHQUFrRztRQUMzRixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDM0IsbUZBQW1GO1FBQ25GLDJDQUEyQztRQUNwQywwQkFBcUIsR0FBc0IsUUFBUSxDQUFDO1FBQzNELHNGQUFzRjtRQUMvRSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTFCLHNGQUFzRjtRQUN0RixnR0FBZ0c7UUFDaEcsNkNBQTZDO1FBQ3RDLG1CQUFjLEdBQWE7WUFDOUIsNENBQTRDO1lBQzVDLG9EQUFvRDtZQUNwRCxvREFBb0Q7U0FDdkQsQ0FBQztJQUtDLENBQUM7SUFuQ0ssc0JBQUksaURBQVk7UUFEekIsaUdBQWlHO2FBQ3hGLFVBQWlCLEtBQWE7WUFDbkMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDN0M7UUFDTCxDQUFDOzs7T0FBQTtJQWlDRCw2RkFBNkY7SUFDN0Ysd0NBQU0sR0FBTjtRQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUlELHNCQUFJLGtEQUFhO1FBRmpCLDRGQUE0RjtRQUM1Riw2RUFBNkU7YUFDN0U7WUFDSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BQUE7SUFFRCx5REFBdUIsR0FBdkI7UUFDSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDckQsQ0FBQztJQUVELHNCQUFJLGtEQUFhO2FBQWpCO1lBQ0ksT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEQsQ0FBQzs7O09BQUE7SUFFRCxrREFBZ0IsR0FBaEI7UUFBQSxpQkFxQkM7UUFwQkcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3pDLE9BQU87U0FDVjtRQUVELDJGQUEyRjtRQUMzRiwwRkFBMEY7UUFDMUYsd0ZBQXdGO1FBQ3hGLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDMUIsSUFBSSxDQUFDLE1BQU0sRUFDWCxVQUFDLEtBQUssSUFBSyxPQUFBLENBQUMsS0FBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFJLFdBQVcsU0FBSSxLQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFqRSxDQUFpRSxFQUM1RSxjQUFNLE9BQUEsQ0FBQyxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUF6QixDQUF5QixDQUNsQyxDQUFDO0lBQ04sQ0FBQztJQUVELCtDQUFhLEdBQWIsVUFBYyxXQUFvQjtRQUFsQyxpQkErQ0M7UUE5Q0csSUFBTSxRQUFRLEdBQUcsRUFBQyxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQy9CLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVuQix3RkFBd0Y7UUFDeEYsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNmLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixLQUFLLEVBQUUsa0NBQWtDO2dCQUN6QyxPQUFPLEVBQUUsSUFBSTthQUNoQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNwRixvRkFBb0Y7WUFDcEYsdUZBQXVGO1lBQ3ZGLElBQUksRUFBRSxVQUFDLFNBQVM7O2dCQUNaLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDZixTQUFTLEVBQUUsS0FBSztvQkFDaEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO29CQUNsQyxTQUFTLFFBQUUsU0FBUyxDQUFDLFNBQVMsdUNBQUksRUFBRSxFQUFBO29CQUNwQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7aUJBQ2pDLENBQUMsQ0FBQztnQkFDSCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxVQUFDLEtBQUs7O2dCQUNULEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDZixTQUFTLEVBQUUsS0FBSztvQkFDaEIsS0FBSyxFQUFFLE9BQUEsS0FBSywwQ0FBRSxPQUFPLEtBQUksa0NBQWtDO29CQUMzRCxPQUFPLEVBQUUsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDJGQUEyRjtJQUMzRiw4RkFBOEY7SUFDOUYsOERBQThEO0lBQ3RELCtDQUFhLEdBQXJCO1FBQUEsaUJBT0M7UUFORyxVQUFVLENBQUM7O1lBQ1AsSUFBTSxRQUFRLFNBQUcsS0FBSSxDQUFDLGlCQUFpQiwwQ0FBRSxhQUFhLENBQUM7WUFDdkQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO2FBQzlDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsNENBQVUsR0FBVixVQUFXLFNBQWdCO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsOEZBQThGO0lBQzlGLDJCQUEyQjtJQUMzQiwwQ0FBUSxHQUFSLFVBQVMsU0FBZ0I7O1FBQ3JCLE9BQU8sT0FBQSxTQUFTLDBDQUFFLE1BQU0sTUFBSyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixvREFBb0Q7SUFDcEQsK0NBQWEsR0FBYixVQUFjLFNBQWdCOztRQUMxQixPQUFPLE9BQUEsU0FBUywwQ0FBRSxNQUFNLElBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELGtEQUFnQixHQUFoQixVQUFpQixTQUFnQjtRQUM3QixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBYixDQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Z0JBL0hxQyx3QkFBd0I7Z0JBQy9CLHdCQUF3Qjs7SUF6Q3ZCO1FBQS9CLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztzRUFBd0Q7SUFJOUU7UUFBUixLQUFLLEVBQUU7NERBQWlCO0lBR2hCO1FBQVIsS0FBSyxFQUFFOytEQUlQO0lBR1E7UUFBUixLQUFLLEVBQUU7MkRBQWtCO0lBRWhCO1FBQVQsTUFBTSxFQUFFO2lFQUF5QztJQWpCekMsdUJBQXVCO1FBTG5DLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsMmxPQUErQzs7U0FFbEQsQ0FBQztPQUNXLHVCQUF1QixDQXlLbkM7SUFBRCw4QkFBQztDQUFBLEFBektELElBeUtDO1NBektZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVjb25vY2ltaWVudG9Wb3pTZXJ2aWNlIH0gZnJvbSAnLi9yZWNvbm9jaW1pZW50by12b3ouc2VydmljZSc7XHJcbmltcG9ydCB7IEFzaXN0ZW50ZURhdG9zQXBpU2VydmljZSB9IGZyb20gJy4vYXNpc3RlbnRlLWRhdG9zLWFwaS5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVuc2FqZUFzaXN0ZW50ZURhdG9zIHtcclxuICAgIGRlVXN1YXJpbzogYm9vbGVhbjtcclxuICAgIHRleHRvPzogc3RyaW5nO1xyXG4gICAgZGVzY3JpcGNpb24/OiBzdHJpbmc7XHJcbiAgICByZXN1bHRhZG8/OiBhbnlbXTtcclxuICAgIHByb3ZlZWRvcj86IHN0cmluZztcclxuICAgIGVzRXJyb3I/OiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnd20tYXNpc3RlbnRlLWRhdG9zJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hc2lzdGVudGUtZGF0b3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lzdGVudGVEYXRvc0NvbXBvbmVudCB7XHJcbiAgICBAVmlld0NoaWxkKCdtZW5zYWplc0NvbnRhaW5lcicpIHByaXZhdGUgbWVuc2FqZXNDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgICAvLyBMYSBhcGVydHVyYS9jaWVycmUgZGVsIHBhbmVsIGxhIGNvbnRyb2xhIGVsIHBhZHJlIChlbCBtZW7DuikuIEVsIHBhbmVsIHNvbG8gc2UgcmVuZGVyaXphXHJcbiAgICAvLyBjdWFuZG8gYGFiaWVydG9gIGVzIHRydWUgeSBhdmlzYSwgdsOtYSBgY2VycmFyQ2hhbmdlYCwgY3VhbmRvIGVsIHVzdWFyaW8gdG9jYSBsYSBYLlxyXG4gICAgQElucHV0KCkgYWJpZXJ0byA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFVSTCBkZWwgUE9TVCBkZSBjb25zdWx0YS4gU2UgcmVmbGVqYSBlbiBlbCBhcGkgc2VydmljZSAocHJvcGllZGFkIGB1cmxgKSwgcXVlIGVzIGRvbmRlIHNlIHVzYS5cclxuICAgIEBJbnB1dCgpIHNldCB1cmxDb25zdWx0YXIodmFsb3I6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWxvcikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaXN0ZW50ZURhdG9zQXBpU2VydmljZS51cmwgPSB2YWxvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWRpb21hIHBhcmEgZWwgcmVjb25vY2ltaWVudG8gZGUgdm96IChXZWIgU3BlZWNoIEFQSSkuXHJcbiAgICBASW5wdXQoKSBpZGlvbWEgPSAnZXMtQ08nO1xyXG5cclxuICAgIEBPdXRwdXQoKSBjZXJyYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHVibGljIG1lbnNhamVzOiBNZW5zYWplQXNpc3RlbnRlRGF0b3NbXSA9IFtdO1xyXG4gICAgcHVibGljIGJvcnJhZG9yID0gJyc7XHJcbiAgICAvLyBBbHRlcm5hIGVsIGFsdG8gZGUgbGEgY2FqYSBkZWwgbWVuc2FqZSAoY29tcGFjdGEg4oaUIGV4cGFuZGlkYSksIGlndWFsIHF1ZSBlbCBcInBlZGlyIGNhbWJpb3NcIlxyXG4gICAgLy8gZGVsIGFzaXN0ZW50ZSBkZSBJQSBkZWwgZ2VuZXJhZG9yIGRlIGZvcm11bGFyaW9zICh2ZXIgZmlsYXNCb3JyYWRvciAvIG9uQ2xpY2tFeHBhbmRpckJvcnJhZG9yKS5cclxuICAgIHB1YmxpYyBib3JyYWRvckV4cGFuZGlkbyA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbnN1bHRhbmRvID0gZmFsc2U7XHJcbiAgICAvLyBcIkdlbWluaVwiIG8gXCJHcm9xXCIg4oCUIG1pc21vIHNlbGVjdG9yIHF1ZSBlbCBhc2lzdGVudGUgZGUgZ2VuZXJhY2nDs24gZGUgZm9ybXVsYXJpb3NcclxuICAgIC8vICh2ZXIgUHJvdmVlZG9ySUFTZXJ2aWNpbyBlbiBlbCBiYWNrZW5kKS5cclxuICAgIHB1YmxpYyBwcm92ZWVkb3JTZWxlY2Npb25hZG86ICdHZW1pbmknIHwgJ0dyb3EnID0gJ0dlbWluaSc7XHJcbiAgICAvLyBEaWN0YWRvIHBvciB2b3ogKFdlYiBTcGVlY2ggQVBJKSDigJQgc2luIHNvcG9ydGUgZW4gRmlyZWZveCwgaW5jb25zaXN0ZW50ZSBlbiBTYWZhcmkuXHJcbiAgICBwdWJsaWMgZXNjdWNoYW5kbyA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFByZWd1bnRhcyB5YSB2ZXJpZmljYWRhcyBjb21vIHJlc3BvbmRpYmxlcyBob3kgKHdoaXRlbGlzdCArIGNvbnRyYXRvIGRlIGxhIElBIOKAlCB2ZXJcclxuICAgIC8vIENoYXRDb25zdWx0YVdoaXRlbGlzdFNlcnZpY2lvL0NoYXRDb25zdWx0YVByb21wdFNlcnZpY2lvIGVuIGVsIGJhY2tlbmQpLCBtb3N0cmFkYXMgY29tbyBjaGlwc1xyXG4gICAgLy8gZGUgc3VnZXJlbmNpYSBlbiBlbCBlc3RhZG8gdmFjw61vIGRlbCBjaGF0LlxyXG4gICAgcHVibGljIGNoaXBzU3VnZXJpZG9zOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICAnwr9DdcOhbnRvcyBmb3JtdWxhcmlvcyBzZSBkaWxpZ2VuY2lhcm9uIGhveT8nLFxyXG4gICAgICAgICfCv0N1w6FudG9zIGZvcm11bGFyaW9zIHNlIGRpbGlnZW5jaWFyb24gZXN0YSBzZW1hbmE/JyxcclxuICAgICAgICAnTXXDqXN0cmFtZSBsb3Mgw7psdGltb3MgMTAgZm9ybXVsYXJpb3MgZGlsaWdlbmNpYWRvcycsXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlOiBBc2lzdGVudGVEYXRvc0FwaVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWNvbm9jaW1pZW50b1ZvejogUmVjb25vY2ltaWVudG9Wb3pTZXJ2aWNlXHJcbiAgICApIHt9XHJcblxyXG4gICAgLy8gRWwgcGFkcmUgYWJyZS9jaWVycmEgZWwgcGFuZWw7IGFxdcOtIHNvbG8gc2UgYXZpc2EgcXVlIGVsIHVzdWFyaW8gcGlkacOzIGNlcnJhcmxvIChib3TDs24gWCkuXHJcbiAgICBjZXJyYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jZXJyYXJDaGFuZ2UuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhamEgZGVsIG1lbnNhamUgY29tcGFjdGEgKDEgZmlsYSwgY29tbyBlcmEgZWwgY2hhdCBvcmlnaW5hbG1lbnRlKSDihpQgZXhwYW5kaWRhICg2IGZpbGFzKS5cclxuICAgIC8vIEVsIGJvdMOzbiBkZSBleHBhbmRpciBlcyBlbCBtaXNtbyBwYXRyw7NuIGRlbCBcInBlZGlyIGNhbWJpb3NcIiBkZWwgZ2VuZXJhZG9yLlxyXG4gICAgZ2V0IGZpbGFzQm9ycmFkb3IoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ib3JyYWRvckV4cGFuZGlkbyA/IDYgOiAxO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tFeHBhbmRpckJvcnJhZG9yKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYm9ycmFkb3JFeHBhbmRpZG8gPSAhdGhpcy5ib3JyYWRvckV4cGFuZGlkbztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWljRGlzcG9uaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm9jaW1pZW50b1Zvei5lc3RhU29wb3J0YWRvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja01pY3JvZm9ubygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lc2N1Y2hhbmRvKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG9Wb3ouZGV0ZW5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLmVzY3VjaGFuZG8gPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnJlY29ub2NpbWllbnRvVm96LmVzdGFTb3BvcnRhZG8oKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbCByZXN1bHRhZG8gZGVsIHJlY29ub2NpbWllbnRvIG5vIGluY2x1eWUgbG8gcXVlIHlhIGVzdGFiYSBlc2NyaXRvIOKAlCBzZSBndWFyZGEgYW50ZXMgZGVcclxuICAgICAgICAvLyBlbXBlemFyIHkgc2UgYW50ZXBvbmUgZW4gY2FkYSBhY3R1YWxpemFjacOzbiAocXVlIGxsZWdhIGNvbiBsYSB0cmFuc2NyaXBjacOzbiBDT01QTEVUQSBkZVxyXG4gICAgICAgIC8vIGVzdGEgc2VzacOzbiBkZSBlc2N1Y2hhLCBubyB1biBpbmNyZW1lbnRvKSBwYXJhIG5vIHBlcmRlciBsbyBxdWUgeWEgaGFiw61hIGVuIGVsIGNhbXBvLlxyXG4gICAgICAgIGNvbnN0IHRleHRvUHJldmlvID0gdGhpcy5ib3JyYWRvci50cmltKCk7XHJcbiAgICAgICAgdGhpcy5lc2N1Y2hhbmRvID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvVm96LmluaWNpYXIoXHJcbiAgICAgICAgICAgIHRoaXMuaWRpb21hLFxyXG4gICAgICAgICAgICAodGV4dG8pID0+ICh0aGlzLmJvcnJhZG9yID0gdGV4dG9QcmV2aW8gPyBgJHt0ZXh0b1ByZXZpb30gJHt0ZXh0b31gIDogdGV4dG8pLFxyXG4gICAgICAgICAgICAoKSA9PiAodGhpcy5lc2N1Y2hhbmRvID0gZmFsc2UpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrRW52aWFyKHRleHRvUHJlc2V0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcHJlZ3VudGEgPSAodGV4dG9QcmVzZXQgPz8gdGhpcy5ib3JyYWRvcikudHJpbSgpO1xyXG4gICAgICAgIGlmICghcHJlZ3VudGEgfHwgdGhpcy5jb25zdWx0YW5kbykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1lbnNhamVzLnB1c2goeyBkZVVzdWFyaW86IHRydWUsIHRleHRvOiBwcmVndW50YSB9KTtcclxuICAgICAgICB0aGlzLmJvcnJhZG9yID0gJyc7XHJcblxyXG4gICAgICAgIC8vIFNpbiB1cmwgZGUgY29uc3VsdGEgbm8gc2UgaGFjZSBsYSBwZXRpY2nDs246IGVsIHVzdWFyaW8gdmUgZWwgbWlzbW8gZXJyb3IgZ2Vuw6lyaWNvIHF1ZVxyXG4gICAgICAgIC8vIGN1YW5kbyBsYSBBUEkgZmFsbGEuXHJcbiAgICAgICAgaWYgKCF0aGlzLmFzaXN0ZW50ZURhdG9zQXBpU2VydmljZS51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW5zYWplcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGRlVXN1YXJpbzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0ZXh0bzogJ05vIHNlIHB1ZG8gcHJvY2VzYXIgbGEgY29uc3VsdGEuJyxcclxuICAgICAgICAgICAgICAgIGVzRXJyb3I6IHRydWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFsRmluYWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25zdWx0YW5kbyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxBbEZpbmFsKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlLmNvbnN1bHRhcihwcmVndW50YSwgdGhpcy5wcm92ZWVkb3JTZWxlY2Npb25hZG8pLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIC8vIEVsIHRpcG8gKFJlc3B1ZXN0YUFzaXN0ZW50ZURhdG9zKSBzZSBpbmZpZXJlIGRlbCBPYnNlcnZhYmxlOiBpbXBvcnRhciBsYSBpbnRlcmZhelxyXG4gICAgICAgICAgICAvLyBkZWphYmEgdW4gaW1wb3J0IGEgdW4gc8OtbWJvbG8gaW5leGlzdGVudGUgZW4gZWwgSlMgZGUgbGEgbGlicmVyw61hIChhdmlzbyBkZSByb2xsdXApLlxyXG4gICAgICAgICAgICBuZXh0OiAocmVzcHVlc3RhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bHRhbmRvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnNhamVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlVXN1YXJpbzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246IHJlc3B1ZXN0YS5EZXNjcmlwY2lvbixcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG86IHJlc3B1ZXN0YS5SZXN1bHRhZG8gPz8gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmVlZG9yOiByZXNwdWVzdGEuUHJvdmVlZG9yLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFsRmluYWwoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdWx0YW5kbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW5zYWplcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBkZVVzdWFyaW86IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRvOiBlcnJvcj8uTWVuc2FqZSB8fCAnTm8gc2UgcHVkbyBwcm9jZXNhciBsYSBjb25zdWx0YS4nLFxyXG4gICAgICAgICAgICAgICAgICAgIGVzRXJyb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWxGaW5hbCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVsIG51ZXZvIG1lbnNhamUgcmVjacOpbiBzZSByZWZsZWphIGVuIGVsIERPTSBkZXNwdcOpcyBkZWwgc2lndWllbnRlIGNpY2xvIGRlIGRldGVjY2nDs24gZGVcclxuICAgIC8vIGNhbWJpb3Mg4oCUIHBvciBlc28gZWwgc2Nyb2xsVG9wIHNlIGFqdXN0YSBlbiB1biBzZXRUaW1lb3V0KDApLCBubyBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcyBkZWxcclxuICAgIC8vIHB1c2gsIHBhcmEgcXVlIHNjcm9sbEhlaWdodCB5YSBpbmNsdXlhIGVsIG1lbnNhamUgYWdyZWdhZG8uXHJcbiAgICBwcml2YXRlIHNjcm9sbEFsRmluYWwoKTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRvID0gdGhpcy5tZW5zYWplc0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50by5zY3JvbGxUb3AgPSBlbGVtZW50by5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb2x1bW5hc0RlKHJlc3VsdGFkbzogYW55W10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdGFkby5sZW5ndGggPyBPYmplY3Qua2V5cyhyZXN1bHRhZG9bMF0pIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRWwgYmFja2VuZCBkZXZ1ZWx2ZSB1biBjb250ZW8gKENoYXRDb25zdWx0YUlBU2VydmljaW8uRWplY3V0YXJDb250ZW8pIGNvbW8gdW5hIHNvbGEgZmlsYSBjb25cclxuICAgIC8vIHVuYSBzb2xhIGNvbHVtbmEgbGxhbWFkYSBsaXRlcmFsbWVudGUgXCJSZXN1bHRhZG9cIiDigJQgc2UgbXVlc3RyYSBjb21vIG7Dum1lcm8gZ3JhbmRlIGVuIHZleiBkZVxyXG4gICAgLy8gY29tbyB0YWJsYSBkZSB1bmEgY2VsZGEuXHJcbiAgICBlc0NvbnRlbyhyZXN1bHRhZG86IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdGFkbz8ubGVuZ3RoID09PSAxICYmIE9iamVjdC5rZXlzKHJlc3VsdGFkb1swXSkubGVuZ3RoID09PSAxICYmICdSZXN1bHRhZG8nIGluIHJlc3VsdGFkb1swXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBMaXN0YWRvIGNvbiB1bmEgc29sYSBjb2x1bW5hIChlai4gdW5hIGxpc3RhIGRlIG5vbWJyZXMvaWRzKSDigJQgc2UgbXVlc3RyYSBjb21vIHRleHRvIHNpbXBsZVxyXG4gICAgLy8gZW4gdmV6IGRlIHVuYSB0YWJsYSBkZSB1bmEgc29sYSBjb2x1bW5hIHJlcGV0aWRhLlxyXG4gICAgZXNMaXN0YVNpbXBsZShyZXN1bHRhZG86IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdGFkbz8ubGVuZ3RoID4gMCAmJiAhdGhpcy5lc0NvbnRlbyhyZXN1bHRhZG8pICYmIHRoaXMuY29sdW1uYXNEZShyZXN1bHRhZG8pLmxlbmd0aCA9PT0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0ZXh0b0xpc3RhU2ltcGxlKHJlc3VsdGFkbzogYW55W10pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbmEgPSB0aGlzLmNvbHVtbmFzRGUocmVzdWx0YWRvKVswXTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvLm1hcCgoZmlsYSkgPT4gZmlsYVtjb2x1bW5hXSkuam9pbignLCAnKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,79 @@
1
+ import { __decorate } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ // Envoltorio de la Web Speech API (SpeechRecognition) del navegador — dictado de voz a texto,
5
+ // 100% cliente, sin backend. Soportado en Chrome/Edge; SIN soporte en Firefox y de forma
6
+ // inconsistente en Safari (limitación real del navegador, no de esta implementación).
7
+ var ReconocimientoVozService = /** @class */ (function () {
8
+ function ReconocimientoVozService() {
9
+ this.reconocimiento = null;
10
+ }
11
+ ReconocimientoVozService.prototype.estaSoportado = function () {
12
+ return !!(this.obtenerConstructor());
13
+ };
14
+ // onResultado se llama con el texto reconocido hasta el momento (incluye resultados
15
+ // provisionales — interimResults: true — para que el cuadro de texto se vea llenar en vivo).
16
+ // onFin se llama cuando el reconocimiento termina, ya sea porque el navegador detectó una
17
+ // pausa (continuous: false) o porque se llamó a detener().
18
+ ReconocimientoVozService.prototype.iniciar = function (idioma, onResultado, onFin) {
19
+ var _this = this;
20
+ var SpeechRecognitionCtor = this.obtenerConstructor();
21
+ if (!SpeechRecognitionCtor) {
22
+ onFin();
23
+ return;
24
+ }
25
+ this.detener();
26
+ this.reconocimiento = new SpeechRecognitionCtor();
27
+ this.reconocimiento.lang = idioma;
28
+ this.reconocimiento.continuous = false;
29
+ this.reconocimiento.interimResults = true;
30
+ this.reconocimiento.onresult = function (evento) {
31
+ var texto = Array.from(evento.results)
32
+ .map(function (resultado) { return resultado[0].transcript; })
33
+ .join(' ');
34
+ onResultado(texto);
35
+ };
36
+ this.reconocimiento.onerror = function (evento) {
37
+ var _a;
38
+ // Motivos típicos (event.error de SpeechRecognitionErrorEvent): "not-allowed" (permiso de
39
+ // micrófono denegado o sitio sin HTTPS/localhost), "no-speech", "audio-capture" (sin
40
+ // micrófono), "network". Se deja en consola porque no hay backend que lo registre y el
41
+ // navegador no explica el motivo en la UI.
42
+ console.error('Reconocimiento de voz: error -', (_a = evento) === null || _a === void 0 ? void 0 : _a.error);
43
+ _this.reconocimiento = null;
44
+ onFin();
45
+ };
46
+ this.reconocimiento.onend = function () {
47
+ _this.reconocimiento = null;
48
+ onFin();
49
+ };
50
+ try {
51
+ this.reconocimiento.start();
52
+ }
53
+ catch (e) {
54
+ console.error('Reconocimiento de voz: no se pudo iniciar -', e);
55
+ this.reconocimiento = null;
56
+ onFin();
57
+ }
58
+ };
59
+ ReconocimientoVozService.prototype.detener = function () {
60
+ if (this.reconocimiento) {
61
+ this.reconocimiento.onend = null;
62
+ this.reconocimiento.onerror = null;
63
+ this.reconocimiento.stop();
64
+ this.reconocimiento = null;
65
+ }
66
+ };
67
+ ReconocimientoVozService.prototype.obtenerConstructor = function () {
68
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
69
+ };
70
+ ReconocimientoVozService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ReconocimientoVozService_Factory() { return new ReconocimientoVozService(); }, token: ReconocimientoVozService, providedIn: "root" });
71
+ ReconocimientoVozService = __decorate([
72
+ Injectable({
73
+ providedIn: 'root',
74
+ })
75
+ ], ReconocimientoVozService);
76
+ return ReconocimientoVozService;
77
+ }());
78
+ export { ReconocimientoVozService };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25vY2ltaWVudG8tdm96LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly93bS1tZW51LyIsInNvdXJjZXMiOlsibGliL3dtLW1lbnUvYXNpc3RlbnRlLWRhdG9zL3JlY29ub2NpbWllbnRvLXZvei5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQyw4RkFBOEY7QUFDOUYseUZBQXlGO0FBQ3pGLHNGQUFzRjtBQUl0RjtJQUFBO1FBQ1ksbUJBQWMsR0FBUSxJQUFJLENBQUM7S0FtRXRDO0lBakVHLGdEQUFhLEdBQWI7UUFDSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELG9GQUFvRjtJQUNwRiw2RkFBNkY7SUFDN0YsMEZBQTBGO0lBQzFGLDJEQUEyRDtJQUMzRCwwQ0FBTyxHQUFQLFVBQVEsTUFBYyxFQUFFLFdBQW9DLEVBQUUsS0FBaUI7UUFBL0UsaUJBMkNDO1FBMUNHLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hCLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsVUFBQyxNQUFXO1lBQ3ZDLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztpQkFDbkMsR0FBRyxDQUFDLFVBQUMsU0FBYyxJQUFLLE9BQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBdkIsQ0FBdUIsQ0FBQztpQkFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLFVBQUMsTUFBVzs7WUFDdEMsMEZBQTBGO1lBQzFGLHFGQUFxRjtZQUNyRix1RkFBdUY7WUFDdkYsMkNBQTJDO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFFBQUUsTUFBTSwwQ0FBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCxLQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixLQUFLLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHO1lBQ3hCLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLEtBQUssRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDO1FBRUYsSUFBSTtZQUNBLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsS0FBSyxFQUFFLENBQUM7U0FDWDtJQUNMLENBQUM7SUFFRCwwQ0FBTyxHQUFQO1FBQ0ksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFTyxxREFBa0IsR0FBMUI7UUFDSSxPQUFRLE1BQWMsQ0FBQyxpQkFBaUIsSUFBSyxNQUFjLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDO0lBQ2hHLENBQUM7O0lBbkVRLHdCQUF3QjtRQUhwQyxVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csd0JBQXdCLENBb0VwQzttQ0E1RUQ7Q0E0RUMsQUFwRUQsSUFvRUM7U0FwRVksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy8gRW52b2x0b3JpbyBkZSBsYSBXZWIgU3BlZWNoIEFQSSAoU3BlZWNoUmVjb2duaXRpb24pIGRlbCBuYXZlZ2Fkb3Ig4oCUIGRpY3RhZG8gZGUgdm96IGEgdGV4dG8sXHJcbi8vIDEwMCUgY2xpZW50ZSwgc2luIGJhY2tlbmQuIFNvcG9ydGFkbyBlbiBDaHJvbWUvRWRnZTsgU0lOIHNvcG9ydGUgZW4gRmlyZWZveCB5IGRlIGZvcm1hXHJcbi8vIGluY29uc2lzdGVudGUgZW4gU2FmYXJpIChsaW1pdGFjacOzbiByZWFsIGRlbCBuYXZlZ2Fkb3IsIG5vIGRlIGVzdGEgaW1wbGVtZW50YWNpw7NuKS5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVjb25vY2ltaWVudG9Wb3pTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVjb25vY2ltaWVudG86IGFueSA9IG51bGw7XHJcblxyXG4gICAgZXN0YVNvcG9ydGFkbygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISEodGhpcy5vYnRlbmVyQ29uc3RydWN0b3IoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gb25SZXN1bHRhZG8gc2UgbGxhbWEgY29uIGVsIHRleHRvIHJlY29ub2NpZG8gaGFzdGEgZWwgbW9tZW50byAoaW5jbHV5ZSByZXN1bHRhZG9zXHJcbiAgICAvLyBwcm92aXNpb25hbGVzIOKAlCBpbnRlcmltUmVzdWx0czogdHJ1ZSDigJQgcGFyYSBxdWUgZWwgY3VhZHJvIGRlIHRleHRvIHNlIHZlYSBsbGVuYXIgZW4gdml2bykuXHJcbiAgICAvLyBvbkZpbiBzZSBsbGFtYSBjdWFuZG8gZWwgcmVjb25vY2ltaWVudG8gdGVybWluYSwgeWEgc2VhIHBvcnF1ZSBlbCBuYXZlZ2Fkb3IgZGV0ZWN0w7MgdW5hXHJcbiAgICAvLyBwYXVzYSAoY29udGludW91czogZmFsc2UpIG8gcG9ycXVlIHNlIGxsYW3DsyBhIGRldGVuZXIoKS5cclxuICAgIGluaWNpYXIoaWRpb21hOiBzdHJpbmcsIG9uUmVzdWx0YWRvOiAodGV4dG86IHN0cmluZykgPT4gdm9pZCwgb25GaW46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkN0b3IgPSB0aGlzLm9idGVuZXJDb25zdHJ1Y3RvcigpO1xyXG4gICAgICAgIGlmICghU3BlZWNoUmVjb2duaXRpb25DdG9yKSB7XHJcbiAgICAgICAgICAgIG9uRmluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGV0ZW5lcigpO1xyXG5cclxuICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvID0gbmV3IFNwZWVjaFJlY29nbml0aW9uQ3RvcigpO1xyXG4gICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8ubGFuZyA9IGlkaW9tYTtcclxuICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvLmNvbnRpbnVvdXMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvLmludGVyaW1SZXN1bHRzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50by5vbnJlc3VsdCA9IChldmVudG86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0byA9IEFycmF5LmZyb20oZXZlbnRvLnJlc3VsdHMpXHJcbiAgICAgICAgICAgICAgICAubWFwKChyZXN1bHRhZG86IGFueSkgPT4gcmVzdWx0YWRvWzBdLnRyYW5zY3JpcHQpXHJcbiAgICAgICAgICAgICAgICAuam9pbignICcpO1xyXG4gICAgICAgICAgICBvblJlc3VsdGFkbyh0ZXh0byk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50by5vbmVycm9yID0gKGV2ZW50bzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIE1vdGl2b3MgdMOtcGljb3MgKGV2ZW50LmVycm9yIGRlIFNwZWVjaFJlY29nbml0aW9uRXJyb3JFdmVudCk6IFwibm90LWFsbG93ZWRcIiAocGVybWlzbyBkZVxyXG4gICAgICAgICAgICAvLyBtaWNyw7Nmb25vIGRlbmVnYWRvIG8gc2l0aW8gc2luIEhUVFBTL2xvY2FsaG9zdCksIFwibm8tc3BlZWNoXCIsIFwiYXVkaW8tY2FwdHVyZVwiIChzaW5cclxuICAgICAgICAgICAgLy8gbWljcsOzZm9ubyksIFwibmV0d29ya1wiLiBTZSBkZWphIGVuIGNvbnNvbGEgcG9ycXVlIG5vIGhheSBiYWNrZW5kIHF1ZSBsbyByZWdpc3RyZSB5IGVsXHJcbiAgICAgICAgICAgIC8vIG5hdmVnYWRvciBubyBleHBsaWNhIGVsIG1vdGl2byBlbiBsYSBVSS5cclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVjb25vY2ltaWVudG8gZGUgdm96OiBlcnJvciAtJywgZXZlbnRvPy5lcnJvcik7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8gPSBudWxsO1xyXG4gICAgICAgICAgICBvbkZpbigpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8ub25lbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8gPSBudWxsO1xyXG4gICAgICAgICAgICBvbkZpbigpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8uc3RhcnQoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlY29ub2NpbWllbnRvIGRlIHZvejogbm8gc2UgcHVkbyBpbmljaWFyIC0nLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50byA9IG51bGw7XHJcbiAgICAgICAgICAgIG9uRmluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRldGVuZXIoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVjb25vY2ltaWVudG8pIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50by5vbmVuZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8ub25lcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25vY2ltaWVudG8uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvYnRlbmVyQ29uc3RydWN0b3IoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLlNwZWVjaFJlY29nbml0aW9uIHx8ICh3aW5kb3cgYXMgYW55KS53ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiB8fCBudWxsO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -13,28 +13,23 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
13
13
  this.IdsAlertasPanicoActivas = new Set(); // Almacena los IDs de las alertas ya manejadas
14
14
  this.soundTimeout = null; // Controla el temporizador del sonido
15
15
  this.isRunning = false;
16
- console.log('WmMenuAlertaPanicoService inicializado.');
17
16
  }
18
17
  WmMenuAlertaPanicoService.prototype.iniciarProceso = function (intervalMs, callback, urlObtenerParametro, token, rutaAudio) {
19
18
  var _this = this;
20
- console.log('iniciarProceso llamado con parámetros:', { intervalMs: intervalMs, urlObtenerParametro: urlObtenerParametro, token: token, rutaAudio: rutaAudio });
21
19
  this.rutaAudio = rutaAudio;
22
20
  var iniciarConInteraccion = function () {
23
- console.log('iniciarConInteraccion ejecutado.');
24
21
  _this.wmMenuServicioService
25
22
  .menuApiObtener(urlObtenerParametro, null, token, 'ReporteAlertasPanico')
26
23
  .subscribe(function (resp) {
27
- console.log('Respuesta obtenida de menuApiObtener:', resp);
24
+ // validar si el parametro ReporteAlertasPanico esta encendido
28
25
  if (resp && resp.length > 0 && resp[0].Valor == 1) {
29
26
  if (_this.isRunning) {
30
- console.log('Proceso ya está corriendo.');
31
27
  return;
32
28
  }
29
+ // Inicializar la variable desde localStorage
33
30
  var storedIds = localStorage.getItem('ALERTAS_PANICO_ACTIVAS_WM');
34
31
  _this.IdsAlertasPanicoActivas = storedIds ? new Set(JSON.parse(storedIds)) : new Set();
35
- console.log('IdsAlertasPanicoActivas inicializado:', _this.IdsAlertasPanicoActivas);
36
32
  var ejecutarProceso_1 = function () {
37
- console.log('ejecutarProceso iniciado.');
38
33
  _this.isRunning = true;
39
34
  callback();
40
35
  setTimeout(function () {
@@ -47,49 +42,42 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
47
42
  });
48
43
  };
49
44
  ['drag', 'click'].forEach(function (evento) {
50
- console.log("Evento " + evento + " registrado para iniciar proceso.");
51
45
  document.addEventListener(evento, function () {
52
46
  iniciarConInteraccion();
53
47
  }, { once: true });
54
48
  });
55
49
  };
56
50
  WmMenuAlertaPanicoService.prototype.stopProcess = function () {
57
- console.log('stopProcess ejecutado.');
58
51
  this.isRunning = false;
59
52
  if (this.subscription) {
60
53
  this.subscription.unsubscribe();
61
54
  }
62
55
  };
63
56
  WmMenuAlertaPanicoService.prototype.ngOnDestroy = function () {
64
- console.log('ngOnDestroy ejecutado.');
65
57
  this.stopSound();
66
58
  this.stopFlashingTitle();
67
59
  };
68
60
  WmMenuAlertaPanicoService.prototype.playSound = function () {
69
61
  var _this = this;
70
- console.log('playSound llamado.');
71
62
  if (this.isPlaying)
72
63
  return; // Evita reproducir si ya está sonando
73
64
  this.isPlaying = true;
74
65
  if (!this.audio) {
75
66
  this.audio = new Audio(this.rutaAudio); // Ruta al archivo de sonido
76
67
  }
77
- console.log("Audio cargado: ", this.audio);
78
68
  this.audio.loop = true; // Reproducir en bucle
79
69
  this.audio.play()
80
70
  .then(function () {
81
- console.log('Sonido reproduciéndose.');
82
71
  // Detener el sonido después de 10 segundos
83
72
  _this.soundTimeout = setTimeout(function () {
84
73
  _this.stopSound();
85
74
  }, 10000); // Detener después de 10 segundos
86
75
  })
87
76
  .catch(function (error) {
88
- console.error('Error al reproducir el sonido:', error);
77
+ console.log('Error al reproducir el sonido:', error);
89
78
  });
90
79
  };
91
80
  WmMenuAlertaPanicoService.prototype.stopSound = function () {
92
- console.log('stopSound llamado.');
93
81
  if (this.audio) {
94
82
  this.audio.pause();
95
83
  this.audio.currentTime = 0; // Reinicia el sonido
@@ -102,7 +90,6 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
102
90
  };
103
91
  WmMenuAlertaPanicoService.prototype.startFlashingTitle = function () {
104
92
  var _this = this;
105
- console.log('startFlashingTitle llamado.');
106
93
  var toggle = false;
107
94
  // Almacenar el título original si aún no se ha guardado
108
95
  if (!this.originalTitle) {
@@ -117,7 +104,6 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
117
104
  }
118
105
  };
119
106
  WmMenuAlertaPanicoService.prototype.stopFlashingTitle = function () {
120
- console.log('stopFlashingTitle llamado.');
121
107
  if (this.intervalId) {
122
108
  clearInterval(this.intervalId);
123
109
  this.intervalId = null;
@@ -126,16 +112,13 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
126
112
  };
127
113
  WmMenuAlertaPanicoService.prototype.revisarAlertasPendientes = function (urlObtenerAlertasPanico, token) {
128
114
  var _this = this;
129
- console.log('revisarAlertasPendientes llamado con parámetros:', { urlObtenerAlertasPanico: urlObtenerAlertasPanico, token: token });
130
115
  var helper = new JwtHelperService();
131
116
  var decodedToken = helper.decodeToken(token);
132
117
  this.wmMenuServicioService
133
118
  .menuApiObtener(urlObtenerAlertasPanico, decodedToken['id_usuario'], token)
134
119
  .subscribe(function (resp) {
135
- console.log('Respuesta obtenida de revisarAlertasPendientes:', resp);
136
120
  if (resp && resp.length > 0) {
137
121
  var alertasIds_1 = resp.map(function (alerta) { return alerta.IdAlertaPanico; });
138
- console.log('IDs de alertas obtenidas:', alertasIds_1);
139
122
  // Eliminar IDs que no están en la respuesta del servicio
140
123
  _this.IdsAlertasPanicoActivas.forEach(function (id) {
141
124
  if (!alertasIds_1.includes(id)) {
@@ -175,4 +158,4 @@ var WmMenuAlertaPanicoService = /** @class */ (function () {
175
158
  return WmMenuAlertaPanicoService;
176
159
  }());
177
160
  export { WmMenuAlertaPanicoService };
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid20tbWVudS1hbGVydGEtcGFuaWNvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly93bS1tZW51LyIsInNvdXJjZXMiOlsibGliL3dtLW1lbnUvc2VydmljZXMvd20tbWVudS1hbGVydGEtcGFuaWNvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUtuRTtJQVdFLG1DQUFvQixxQkFBNEM7UUFBNUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQVJ4RCxtQkFBYyxHQUFHLDJCQUEyQixDQUFDO1FBRTdDLFVBQUssR0FBNEIsSUFBSSxDQUFDO1FBQ3RDLGNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxnREFBZ0Q7UUFFbkUsNEJBQXVCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDakcsaUJBQVksR0FBUSxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7UUFPaEUsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUpqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUtELGtEQUFjLEdBQWQsVUFDRSxVQUFrQixFQUNsQixRQUFvQixFQUNwQixtQkFBMkIsRUFDM0IsS0FBYSxFQUNiLFNBQWlCO1FBTG5CLGlCQW1EQztRQTVDQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsVUFBVSxZQUFBLEVBQUUsbUJBQW1CLHFCQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsU0FBUyxXQUFBLEVBQUUsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRTNCLElBQU0scUJBQXFCLEdBQUc7WUFDNUIsT0FB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QUFFO29CQUN6QyxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztpQkFDM0I7Z0JBQ0QscURBQXFEO2dCQUNyRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN4QixLQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2xCO2FBQ0Y7aUJBQU07Z0JBQ0wsc0RBQXNEO2dCQUN0RCxLQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JDLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzFCO1lBQ0QsOENBQThDO1lBQzlDLFlBQVksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O2dCQWhMMEMscUJBQXFCOzs7SUFYckQseUJBQXlCO1FBSHJDLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7T0FDVyx5QkFBeUIsQ0E2THJDO29DQXBNRDtDQW9NQyxBQTdMRCxJQTZMQztTQTdMWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEp3dEhlbHBlclNlcnZpY2UgfSBmcm9tICdAYXV0aDAvYW5ndWxhci1qd3QnO1xyXG5pbXBvcnQgeyBXbU1lbnVTZXJ2aWNpb1NlcnZpY2UgfSBmcm9tICcuL3dtLW1lbnUtc2VydmljaW8uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXbU1lbnVBbGVydGFQYW5pY29TZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBpbnRlcnZhbElkOiBhbnk7XHJcbiAgcHJpdmF0ZSBhbHRlcm5hdGVUaXRsZSA9ICdBbGVydGEgZGUgUMOhbmljbyBSZWNpYmlkYSc7XHJcbiAgcHJpdmF0ZSBvcmlnaW5hbFRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBhdWRpbzogSFRNTEF1ZGlvRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaXNQbGF5aW5nID0gZmFsc2U7IC8vIENvbnRyb2xhIHNpIGVsIHNvbmlkbyB5YSBlc3TDoSByZXByb2R1Y2nDqW5kb3NlXHJcbiAgcHVibGljIGZvcm11bGFyaW86IGFueTtcclxuICBwcml2YXRlIElkc0FsZXJ0YXNQYW5pY29BY3RpdmFzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTsgLy8gQWxtYWNlbmEgbG9zIElEcyBkZSBsYXMgYWxlcnRhcyB5YSBtYW5lamFkYXNcclxuICBwcml2YXRlIHNvdW5kVGltZW91dDogYW55ID0gbnVsbDsgLy8gQ29udHJvbGEgZWwgdGVtcG9yaXphZG9yIGRlbCBzb25pZG9cclxuICBwcml2YXRlIHJ1dGFBdWRpbzogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd21NZW51U2VydmljaW9TZXJ2aWNlOiBXbU1lbnVTZXJ2aWNpb1NlcnZpY2UpIHsgXHJcbiAgICBjb25zb2xlLmxvZygnV21NZW51QWxlcnRhUGFuaWNvU2VydmljZSBpbmljaWFsaXphZG8uJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogYW55O1xyXG4gIHByaXZhdGUgaXNSdW5uaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGluaWNpYXJQcm9jZXNvKFxyXG4gICAgaW50ZXJ2YWxNczogbnVtYmVyLFxyXG4gICAgY2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICB1cmxPYnRlbmVyUGFyYW1ldHJvOiBzdHJpbmcsXHJcbiAgICB0b2tlbjogc3RyaW5nLFxyXG4gICAgcnV0YUF1ZGlvOiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdpbmljaWFyUHJvY2VzbyBsbGFtYWRvIGNvbiBwYXLDoW1ldHJvczonLCB7IGludGVydmFsTXMsIHVybE9idGVuZXJQYXJhbWV0cm8sIHRva2VuLCBydXRhQXVkaW8gfSk7XHJcbiAgICB0aGlzLnJ1dGFBdWRpbyA9IHJ1dGFBdWRpbztcclxuXHJcbiAgICBjb25zdCBpbmljaWFyQ29uSW50ZXJhY2Npb24gPSAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdpbmljaWFyQ29uSW50ZXJhY2Npb24gZWplY3V0YWRvLicpO1xyXG4gICAgICB0aGlzLndtTWVudVNlcnZpY2lvU2VydmljZVxyXG4gICAgICAgIC5tZW51QXBpT2J0ZW5lcih1cmxPYnRlbmVyUGFyYW1ldHJvLCBudWxsLCB0b2tlbiwgJ1JlcG9ydGVBbGVydGFzUGFuaWNvJylcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnUmVzcHVlc3RhIG9idGVuaWRhIGRlIG1lbnVBcGlPYnRlbmVyOicsIHJlc3ApO1xyXG4gICAgICAgICAgaWYgKHJlc3AgJiYgcmVzcC5sZW5ndGggPiAwICYmIHJlc3BbMF0uVmFsb3IgPT0gMSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUHJvY2VzbyB5YSBlc3TDoSBjb3JyaWVuZG8uJyk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRJZHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQUxFUlRBU19QQU5JQ09fQUNUSVZBU19XTScpO1xyXG4gICAgICAgICAgICB0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzID0gc3RvcmVkSWRzID8gbmV3IFNldChKU09OLnBhcnNlKHN0b3JlZElkcykpIDogbmV3IFNldCgpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSWRzQWxlcnRhc1Bhbmljb0FjdGl2YXMgaW5pY2lhbGl6YWRvOicsIHRoaXMuSWRzQWxlcnRhc1Bhbmljb0FjdGl2YXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZWplY3V0YXJQcm9jZXNvID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlamVjdXRhclByb2Nlc28gaW5pY2lhZG8uJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWplY3V0YXJQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgfSwgaW50ZXJ2YWxNcyk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBlamVjdXRhclByb2Nlc28oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgWydkcmFnJywgJ2NsaWNrJ10uZm9yRWFjaChldmVudG8gPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhgRXZlbnRvICR7ZXZlbnRvfSByZWdpc3RyYWRvIHBhcmEgaW5pY2lhciBwcm9jZXNvLmApO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgIGV2ZW50byxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICBpbmljaWFyQ29uSW50ZXJhY2Npb24oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3BQcm9jZXNzKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ3N0b3BQcm9jZXNzIGVqZWN1dGFkby4nKTtcclxuICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ25nT25EZXN0cm95IGVqZWN1dGFkby4nKTtcclxuICAgIHRoaXMuc3RvcFNvdW5kKCk7XHJcbiAgICB0aGlzLnN0b3BGbGFzaGluZ1RpdGxlKCk7XHJcbiAgfVxyXG5cclxuICBwbGF5U291bmQoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygncGxheVNvdW5kIGxsYW1hZG8uJyk7XHJcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHJldHVybjsgLy8gRXZpdGEgcmVwcm9kdWNpciBzaSB5YSBlc3TDoSBzb25hbmRvXHJcbiAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMuYXVkaW8pIHtcclxuICAgICAgdGhpcy5hdWRpbyA9IG5ldyBBdWRpbyh0aGlzLnJ1dGFBdWRpbyk7IC8vIFJ1dGEgYWwgYXJjaGl2byBkZSBzb25pZG9cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKFwiQXVkaW8gY2FyZ2FkbzogXCIsIHRoaXMuYXVkaW8pXHJcbiAgICB0aGlzLmF1ZGlvLmxvb3AgPSB0cnVlOyAvLyBSZXByb2R1Y2lyIGVuIGJ1Y2xlXHJcbiAgICB0aGlzLmF1ZGlvLnBsYXkoKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1NvbmlkbyByZXByb2R1Y2nDqW5kb3NlLicpO1xyXG4gICAgICAgIC8vIERldGVuZXIgZWwgc29uaWRvIGRlc3B1w6lzIGRlIDEwIHNlZ3VuZG9zXHJcbiAgICAgICAgdGhpcy5zb3VuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcFNvdW5kKCk7XHJcbiAgICAgICAgfSwgMTAwMDApOyAvLyBEZXRlbmVyIGRlc3B1w6lzIGRlIDEwIHNlZ3VuZG9zXHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWwgcmVwcm9kdWNpciBlbCBzb25pZG86JywgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3BTb3VuZCgpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdzdG9wU291bmQgbGxhbWFkby4nKTtcclxuICAgIGlmICh0aGlzLmF1ZGlvKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgdGhpcy5hdWRpby5jdXJyZW50VGltZSA9IDA7IC8vIFJlaW5pY2lhIGVsIHNvbmlkb1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsgLy8gUmVzdGFibGVjZSBsYSBiYW5kZXJhXHJcbiAgICBpZiAodGhpcy5zb3VuZFRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc291bmRUaW1lb3V0KTsgLy8gQXNlZ3VyYSBxdWUgZWwgdGVtcG9yaXphZG9yIHNlIGJvcnJlXHJcbiAgICAgIHRoaXMuc291bmRUaW1lb3V0ID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0Rmxhc2hpbmdUaXRsZSgpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdzdGFydEZsYXNoaW5nVGl0bGUgbGxhbWFkby4nKTtcclxuICAgIGxldCB0b2dnbGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBBbG1hY2VuYXIgZWwgdMOtdHVsbyBvcmlnaW5hbCBzaSBhw7puIG5vIHNlIGhhIGd1YXJkYWRvXHJcbiAgICBpZiAoIXRoaXMub3JpZ2luYWxUaXRsZSkge1xyXG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSBkb2N1bWVudC50aXRsZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaW50ZXJ2YWxJZCkge1xyXG4gICAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgLy8gQWx0ZXJuYXIgZW50cmUgZWwgdMOtdHVsbyBhbHRlcm5hdGl2byB5IGVsIHTDrXR1bG8gb3JpZ2luYWxcclxuICAgICAgICBkb2N1bWVudC50aXRsZSA9IHRvZ2dsZSA/IHRoaXMuYWx0ZXJuYXRlVGl0bGUgOiB0aGlzLm9yaWdpbmFsVGl0bGU7XHJcbiAgICAgICAgdG9nZ2xlID0gIXRvZ2dsZTtcclxuICAgICAgfSwgMTAwMCk7IC8vIENhbWJpYSBlbCB0w610dWxvIGNhZGEgc2VndW5kb1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcEZsYXNoaW5nVGl0bGUoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnc3RvcEZsYXNoaW5nVGl0bGUgbGxhbWFkby4nKTtcclxuICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgICB0aGlzLmludGVydmFsSWQgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC50aXRsZSA9IHRoaXMub3JpZ2luYWxUaXRsZTsgLy8gUmVzdGF1cmEgYSB2YWPDrW9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldmlzYXJBbGVydGFzUGVuZGllbnRlcyh1cmxPYnRlbmVyQWxlcnRhc1Bhbmljbzogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygncmV2aXNhckFsZXJ0YXNQZW5kaWVudGVzIGxsYW1hZG8gY29uIHBhcsOhbWV0cm9zOicsIHsgdXJsT2J0ZW5lckFsZXJ0YXNQYW5pY28sIHRva2VuIH0pO1xyXG4gICAgY29uc3QgaGVscGVyID0gbmV3IEp3dEhlbHBlclNlcnZpY2UoKTtcclxuICAgIGNvbnN0IGRlY29kZWRUb2tlbiA9IGhlbHBlci5kZWNvZGVUb2tlbih0b2tlbik7XHJcbiAgICB0aGlzLndtTWVudVNlcnZpY2lvU2VydmljZVxyXG4gICAgICAubWVudUFwaU9idGVuZXIodXJsT2J0ZW5lckFsZXJ0YXNQYW5pY28sIGRlY29kZWRUb2tlblsnaWRfdXN1YXJpbyddLCB0b2tlbilcclxuICAgICAgLnN1YnNjcmliZSgocmVzcCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXNwdWVzdGEgb2J0ZW5pZGEgZGUgcmV2aXNhckFsZXJ0YXNQZW5kaWVudGVzOicsIHJlc3ApO1xyXG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgIGNvbnN0IGFsZXJ0YXNJZHMgPSByZXNwLm1hcChhbGVydGEgPT4gYWxlcnRhLklkQWxlcnRhUGFuaWNvKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdJRHMgZGUgYWxlcnRhcyBvYnRlbmlkYXM6JywgYWxlcnRhc0lkcyk7XHJcblxyXG4gICAgICAgICAgLy8gRWxpbWluYXIgSURzIHF1ZSBubyBlc3TDoW4gZW4gbGEgcmVzcHVlc3RhIGRlbCBzZXJ2aWNpb1xyXG4gICAgICAgICAgdGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWFsZXJ0YXNJZHMuaW5jbHVkZXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyBGaWx0cmFyIGFsZXJ0YXMgbnVldmFzXHJcbiAgICAgICAgICBjb25zdCBuZXdBbGVydHMgPSByZXNwLmZpbHRlcihhbGVydGEgPT4gIXRoaXMuSWRzQWxlcnRhc1Bhbmljb0FjdGl2YXMuaGFzKGFsZXJ0YS5JZEFsZXJ0YVBhbmljbykpO1xyXG5cclxuICAgICAgICAgIC8vIEFncmVnYXIgbGFzIG51ZXZhcyBhbGVydGFzIGEgbGEgbGlzdGEgYWN0aXZhXHJcbiAgICAgICAgICBuZXdBbGVydHMuZm9yRWFjaChhbGVydGEgPT4gdGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5hZGQoYWxlcnRhLklkQWxlcnRhUGFuaWNvKSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5zaXplID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0Rmxhc2hpbmdUaXRsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gU2kgaGF5IG51ZXZhcyBhbGVydGFzLCBkaXNwYXJhIG5vdGlmaWNhY2lvbiBzb25vcmFcclxuICAgICAgICAgIGlmIChuZXdBbGVydHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlTb3VuZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBTaSBubyBoYXkgYWxlcnRhcyBlbiBsYSByZXNwdWVzdGEsIGxpbXBpYXIgbGEgbGlzdGFcclxuICAgICAgICAgIHRoaXMuSWRzQWxlcnRhc1Bhbmljb0FjdGl2YXMuY2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMuc3RvcEZsYXNoaW5nVGl0bGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWN0dWFsaXphciBsb2NhbFN0b3JhZ2UgY29uIGxvcyBJRHMgYWN0aXZvc1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdBTEVSVEFTX1BBTklDT19BQ1RJVkFTX1dNJywgSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzKSkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid20tbWVudS1hbGVydGEtcGFuaWNvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly93bS1tZW51LyIsInNvdXJjZXMiOlsibGliL3dtLW1lbnUvc2VydmljZXMvd20tbWVudS1hbGVydGEtcGFuaWNvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUtuRTtJQVdFLG1DQUFvQixxQkFBNEM7UUFBNUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQVJ4RCxtQkFBYyxHQUFHLDJCQUEyQixDQUFDO1FBRTdDLFVBQUssR0FBNEIsSUFBSSxDQUFDO1FBQ3RDLGNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxnREFBZ0Q7UUFFbkUsNEJBQXVCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDakcsaUJBQVksR0FBUSxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7UUFLaEUsY0FBUyxHQUFZLEtBQUssQ0FBQztJQUhpQyxDQUFDO0lBS3JFLGtEQUFjLEdBQWQsVUFDRSxVQUFrQixFQUNsQixRQUFvQixFQUNwQixtQkFBMkIsRUFDM0IsS0FBYSxFQUNiLFNBQWlCO1FBTG5CLGlCQThDQztRQXZDQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUUzQixJQUFNLHFCQUFxQixHQUFHO1lBQzVCLEtBQUksQ0FBQyxxQkFBcUI7aUJBQ3ZCLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixDQUFDO2lCQUN4RSxTQUFTLENBQUMsVUFBQyxJQUFJO2dCQUNkLDhEQUE4RDtnQkFDOUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxD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QUMsRUFBRTtvQkFDeEIsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUNsQjthQUNGO2lCQUFNO2dCQUNMLHNEQUFzRDtnQkFDdEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUMxQjtZQUNELDhDQUE4QztZQUM5QyxZQUFZLENBQUMsT0FBTyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztnQkFqSzBDLHFCQUFxQjs7O0lBWHJELHlCQUF5QjtRQUhyQyxVQUFVLENBQUM7WUFDVixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO09BQ1cseUJBQXlCLENBOEtyQztvQ0FyTEQ7Q0FxTEMsQUE5S0QsSUE4S0M7U0E5S1kseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuaW1wb3J0IHsgV21NZW51U2VydmljaW9TZXJ2aWNlIH0gZnJvbSAnLi93bS1tZW51LXNlcnZpY2lvLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV21NZW51QWxlcnRhUGFuaWNvU2VydmljZSB7XHJcblxyXG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xyXG4gIHByaXZhdGUgYWx0ZXJuYXRlVGl0bGUgPSAnQWxlcnRhIGRlIFDDoW5pY28gUmVjaWJpZGEnO1xyXG4gIHByaXZhdGUgb3JpZ2luYWxUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgYXVkaW86IEhUTUxBdWRpb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGlzUGxheWluZyA9IGZhbHNlOyAvLyBDb250cm9sYSBzaSBlbCBzb25pZG8geWEgZXN0w6EgcmVwcm9kdWNpw6luZG9zZVxyXG4gIHB1YmxpYyBmb3JtdWxhcmlvOiBhbnk7XHJcbiAgcHJpdmF0ZSBJZHNBbGVydGFzUGFuaWNvQWN0aXZhczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7IC8vIEFsbWFjZW5hIGxvcyBJRHMgZGUgbGFzIGFsZXJ0YXMgeWEgbWFuZWphZGFzXHJcbiAgcHJpdmF0ZSBzb3VuZFRpbWVvdXQ6IGFueSA9IG51bGw7IC8vIENvbnRyb2xhIGVsIHRlbXBvcml6YWRvciBkZWwgc29uaWRvXHJcbiAgcHJpdmF0ZSBydXRhQXVkaW86IHN0cmluZztcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdtTWVudVNlcnZpY2lvU2VydmljZTogV21NZW51U2VydmljaW9TZXJ2aWNlKSB7IH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IGFueTtcclxuICBwcml2YXRlIGlzUnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpbmljaWFyUHJvY2VzbyhcclxuICAgIGludGVydmFsTXM6IG51bWJlcixcclxuICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgdXJsT2J0ZW5lclBhcmFtZXRybzogc3RyaW5nLFxyXG4gICAgdG9rZW46IHN0cmluZyxcclxuICAgIHJ1dGFBdWRpbzogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnJ1dGFBdWRpbyA9IHJ1dGFBdWRpbztcclxuICBcclxuICAgIGNvbnN0IGluaWNpYXJDb25JbnRlcmFjY2lvbiA9ICgpID0+IHtcclxuICAgICAgdGhpcy53bU1lbnVTZXJ2aWNpb1NlcnZpY2VcclxuICAgICAgICAubWVudUFwaU9idGVuZXIodXJsT2J0ZW5lclBhcmFtZXRybywgbnVsbCwgdG9rZW4sICdSZXBvcnRlQWxlcnRhc1BhbmljbycpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgLy8gdmFsaWRhciBzaSBlbCBwYXJhbWV0cm8gUmVwb3J0ZUFsZXJ0YXNQYW5pY28gZXN0YSBlbmNlbmRpZG9cclxuICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AubGVuZ3RoID4gMCAmJiByZXNwWzBdLlZhbG9yID09IDEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEluaWNpYWxpemFyIGxhIHZhcmlhYmxlIGRlc2RlIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRJZHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQUxFUlRBU19QQU5JQ09fQUNUSVZBU19XTScpO1xyXG4gICAgICAgICAgICB0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzID0gc3RvcmVkSWRzID8gbmV3IFNldChKU09OLnBhcnNlKHN0b3JlZElkcykpIDogbmV3IFNldCgpO1xyXG4gIFxyXG4gICAgICAgICAgICBjb25zdCBlamVjdXRhclByb2Nlc28gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWplY3V0YXJQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgfSwgaW50ZXJ2YWxNcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgXHJcbiAgICAgICAgICAgIGVqZWN1dGFyUHJvY2VzbygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICBcclxuICAgIFsnZHJhZycsICdjbGljayddLmZvckVhY2goZXZlbnRvID0+IHtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICBldmVudG8sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgaW5pY2lhckNvbkludGVyYWNjaW9uKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IG9uY2U6IHRydWUgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuICBcclxuXHJcbiAgc3RvcFByb2Nlc3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcFNvdW5kKCk7XHJcbiAgICB0aGlzLnN0b3BGbGFzaGluZ1RpdGxlKCk7XHJcbiAgfVxyXG5cclxuICBwbGF5U291bmQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHJldHVybjsgLy8gRXZpdGEgcmVwcm9kdWNpciBzaSB5YSBlc3TDoSBzb25hbmRvXHJcblxyXG4gICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLmF1ZGlvKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8gPSBuZXcgQXVkaW8odGhpcy5ydXRhQXVkaW8pOyAvLyBSdXRhIGFsIGFyY2hpdm8gZGUgc29uaWRvXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdWRpby5sb29wID0gdHJ1ZTsgLy8gUmVwcm9kdWNpciBlbiBidWNsZVxyXG4gICAgdGhpcy5hdWRpby5wbGF5KClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIC8vIERldGVuZXIgZWwgc29uaWRvIGRlc3B1w6lzIGRlIDEwIHNlZ3VuZG9zXHJcbiAgICAgICAgdGhpcy5zb3VuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcFNvdW5kKCk7XHJcbiAgICAgICAgfSwgMTAwMDApOyAvLyBEZXRlbmVyIGRlc3B1w6lzIGRlIDEwIHNlZ3VuZG9zXHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGFsIHJlcHJvZHVjaXIgZWwgc29uaWRvOicsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdG9wU291bmQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdWRpbykge1xyXG4gICAgICB0aGlzLmF1ZGlvLnBhdXNlKCk7XHJcbiAgICAgIHRoaXMuYXVkaW8uY3VycmVudFRpbWUgPSAwOyAvLyBSZWluaWNpYSBlbCBzb25pZG9cclxuICAgIH1cclxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7IC8vIFJlc3RhYmxlY2UgbGEgYmFuZGVyYVxyXG4gICAgaWYgKHRoaXMuc291bmRUaW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNvdW5kVGltZW91dCk7IC8vIEFzZWd1cmEgcXVlIGVsIHRlbXBvcml6YWRvciBzZSBib3JyZVxyXG4gICAgICB0aGlzLnNvdW5kVGltZW91dCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydEZsYXNoaW5nVGl0bGUoKTogdm9pZCB7XHJcbiAgICBsZXQgdG9nZ2xlID0gZmFsc2U7XHJcbiAgXHJcbiAgICAvLyBBbG1hY2VuYXIgZWwgdMOtdHVsbyBvcmlnaW5hbCBzaSBhw7puIG5vIHNlIGhhIGd1YXJkYWRvXHJcbiAgICBpZiAoIXRoaXMub3JpZ2luYWxUaXRsZSkge1xyXG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSBkb2N1bWVudC50aXRsZTtcclxuICAgIH1cclxuICBcclxuICAgIGlmICghdGhpcy5pbnRlcnZhbElkKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvLyBBbHRlcm5hciBlbnRyZSBlbCB0w610dWxvIGFsdGVybmF0aXZvIHkgZWwgdMOtdHVsbyBvcmlnaW5hbFxyXG4gICAgICAgIGRvY3VtZW50LnRpdGxlID0gdG9nZ2xlID8gdGhpcy5hbHRlcm5hdGVUaXRsZSA6IHRoaXMub3JpZ2luYWxUaXRsZTtcclxuICAgICAgICB0b2dnbGUgPSAhdG9nZ2xlO1xyXG4gICAgICB9LCAxMDAwKTsgLy8gQ2FtYmlhIGVsIHTDrXR1bG8gY2FkYSBzZWd1bmRvXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wRmxhc2hpbmdUaXRsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgICB0aGlzLmludGVydmFsSWQgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC50aXRsZSA9IHRoaXMub3JpZ2luYWxUaXRsZTsgLy8gUmVzdGF1cmEgYSB2YWPDrW9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldmlzYXJBbGVydGFzUGVuZGllbnRlcyh1cmxPYnRlbmVyQWxlcnRhc1Bhbmljbzogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWxwZXIgPSBuZXcgSnd0SGVscGVyU2VydmljZSgpO1xyXG4gICAgY29uc3QgZGVjb2RlZFRva2VuID0gaGVscGVyLmRlY29kZVRva2VuKHRva2VuKTtcclxuICAgIHRoaXMud21NZW51U2VydmljaW9TZXJ2aWNlXHJcbiAgICAgIC5tZW51QXBpT2J0ZW5lcih1cmxPYnRlbmVyQWxlcnRhc1BhbmljbywgZGVjb2RlZFRva2VuWydpZF91c3VhcmlvJ10sIHRva2VuKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3AgJiYgcmVzcC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGFsZXJ0YXNJZHMgPSByZXNwLm1hcChhbGVydGEgPT4gYWxlcnRhLklkQWxlcnRhUGFuaWNvKTtcclxuXHJcbiAgICAgICAgICAvLyBFbGltaW5hciBJRHMgcXVlIG5vIGVzdMOhbiBlbiBsYSByZXNwdWVzdGEgZGVsIHNlcnZpY2lvXHJcbiAgICAgICAgICB0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYWxlcnRhc0lkcy5pbmNsdWRlcyhpZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIEZpbHRyYXIgYWxlcnRhcyBudWV2YXNcclxuICAgICAgICAgIGNvbnN0IG5ld0FsZXJ0cyA9IHJlc3AuZmlsdGVyKGFsZXJ0YSA9PiAhdGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5oYXMoYWxlcnRhLklkQWxlcnRhUGFuaWNvKSk7XHJcblxyXG4gICAgICAgICAgLy8gQWdyZWdhciBsYXMgbnVldmFzIGFsZXJ0YXMgYSBsYSBsaXN0YSBhY3RpdmFcclxuICAgICAgICAgIG5ld0FsZXJ0cy5mb3JFYWNoKGFsZXJ0YSA9PiB0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzLmFkZChhbGVydGEuSWRBbGVydGFQYW5pY28pKTtcclxuICAgICAgICAgIGlmICh0aGlzLklkc0FsZXJ0YXNQYW5pY29BY3RpdmFzLnNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGbGFzaGluZ1RpdGxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBTaSBoYXkgbnVldmFzIGFsZXJ0YXMsIGRpc3BhcmEgbm90aWZpY2FjaW9uIHNvbm9yYVxyXG4gICAgICAgICAgaWYgKG5ld0FsZXJ0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGxheVNvdW5kKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFNpIG5vIGhheSBhbGVydGFzIGVuIGxhIHJlc3B1ZXN0YSwgbGltcGlhciBsYSBsaXN0YVxyXG4gICAgICAgICAgdGhpcy5JZHNBbGVydGFzUGFuaWNvQWN0aXZhcy5jbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy5zdG9wRmxhc2hpbmdUaXRsZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBY3R1YWxpemFyIGxvY2FsU3RvcmFnZSBjb24gbG9zIElEcyBhY3Rpdm9zXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0FMRVJUQVNfUEFOSUNPX0FDVElWQVNfV00nLCBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHRoaXMuSWRzQWxlcnRhc1Bhbmljb0FjdGl2YXMpKSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuIl19