@seniorsistemas/components-ai 1.3.0-master-e23db6ad → 1.3.0-master-07986db4

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.
@@ -0,0 +1,237 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, BehaviorSubject, filter, share, takeUntil } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./auth.service";
5
+ import * as i2 from "./cookie.service";
6
+ export class WebSocketService {
7
+ authService;
8
+ cookieService;
9
+ socket = null;
10
+ destroy$ = new Subject();
11
+ messages$ = new Subject();
12
+ connectionState$ = new BehaviorSubject('disconnected');
13
+ subscriptions = new Map();
14
+ subscriptionCounter = 0;
15
+ reconnectAttempts = 0;
16
+ maxReconnectAttempts = 5;
17
+ reconnectTimeout;
18
+ pendingSubscriptions = [];
19
+ constructor(authService, cookieService) {
20
+ this.authService = authService;
21
+ this.cookieService = cookieService;
22
+ }
23
+ /** Estado atual da conexão */
24
+ get state$() {
25
+ return this.connectionState$.asObservable();
26
+ }
27
+ /** Conecta ao WebSocket usando a URL base do cookie */
28
+ connect() {
29
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
30
+ return;
31
+ }
32
+ const wsUrl = this.buildWebSocketUrl();
33
+ if (!wsUrl) {
34
+ console.error('[WebSocketService] Não foi possível construir a URL do WebSocket. Cookie de URL base não encontrado.');
35
+ this.connectionState$.next('error');
36
+ return;
37
+ }
38
+ this.connectionState$.next('connecting');
39
+ try {
40
+ this.socket = new WebSocket(wsUrl);
41
+ this.socket.onopen = () => this.onOpen();
42
+ this.socket.onmessage = (event) => this.onMessage(event);
43
+ this.socket.onclose = (event) => this.onClose(event);
44
+ this.socket.onerror = () => this.onError();
45
+ }
46
+ catch (error) {
47
+ console.error('[WebSocketService] Erro ao criar WebSocket:', error);
48
+ this.connectionState$.next('error');
49
+ }
50
+ }
51
+ /** Desconecta do WebSocket */
52
+ disconnect() {
53
+ this.clearReconnect();
54
+ this.reconnectAttempts = 0;
55
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
56
+ // Enviar DISCONNECT STOMP
57
+ this.sendFrame('DISCONNECT', {}, '');
58
+ this.socket.close();
59
+ }
60
+ this.socket = null;
61
+ this.subscriptions.clear();
62
+ this.pendingSubscriptions = [];
63
+ this.connectionState$.next('disconnected');
64
+ }
65
+ /**
66
+ * Inscreve-se em um tópico baseado na configuração.
67
+ * Padrão do bind: /topic/{token}/{domain}/{service}/{primitive}
68
+ */
69
+ subscribe(config) {
70
+ const destination = this.buildDestination(config);
71
+ const subId = `sub-${this.subscriptionCounter++}`;
72
+ // Se já conectado, envia SUBSCRIBE imediatamente
73
+ if (this.socket && this.socket.readyState === WebSocket.OPEN && this.connectionState$.value === 'connected') {
74
+ this.sendSubscribe(destination, subId);
75
+ }
76
+ else {
77
+ // Guarda para enviar após conexão
78
+ this.pendingSubscriptions.push({ destination, id: subId });
79
+ // Auto-conecta se não estiver conectado
80
+ if (this.connectionState$.value === 'disconnected') {
81
+ this.connect();
82
+ }
83
+ }
84
+ this.subscriptions.set(subId, destination);
85
+ return this.messages$.pipe(filter(msg => msg.destination === destination), takeUntil(this.destroy$), share());
86
+ }
87
+ /** Remove a inscrição de um tópico */
88
+ unsubscribe(config) {
89
+ const destination = this.buildDestination(config);
90
+ const entry = [...this.subscriptions.entries()].find(([, dest]) => dest === destination);
91
+ if (entry) {
92
+ const [subId] = entry;
93
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
94
+ this.sendFrame('UNSUBSCRIBE', { id: subId }, '');
95
+ }
96
+ this.subscriptions.delete(subId);
97
+ }
98
+ }
99
+ ngOnDestroy() {
100
+ this.disconnect();
101
+ this.destroy$.next();
102
+ this.destroy$.complete();
103
+ }
104
+ // ── Privados ──────────────────────────────────────────────
105
+ buildWebSocketUrl() {
106
+ const baseUrl = this.cookieService.getCookie('com.senior.base.url');
107
+ if (!baseUrl) {
108
+ return null;
109
+ }
110
+ // Converte http(s) para ws(s)
111
+ const wsUrl = baseUrl
112
+ .replace(/\/$/, '')
113
+ .replace(/^http/, 'ws');
114
+ return `${wsUrl}/websocket/subscription`;
115
+ }
116
+ buildDestination(config) {
117
+ const parts = ['/topic'];
118
+ if (config.userScoped) {
119
+ const token = this.authService.getAccessToken();
120
+ if (token) {
121
+ parts.push(token);
122
+ }
123
+ }
124
+ parts.push(config.domain, config.service, config.primitive);
125
+ return parts.join('/');
126
+ }
127
+ onOpen() {
128
+ this.reconnectAttempts = 0;
129
+ // Enviar CONNECT STOMP
130
+ const headers = { 'accept-version': '1.2', 'heart-beat': '10000,10000' };
131
+ const token = this.authService.getAccessToken();
132
+ if (token) {
133
+ headers['Authorization'] = `Bearer ${token}`;
134
+ }
135
+ this.sendFrame('CONNECT', headers, '');
136
+ }
137
+ onMessage(event) {
138
+ const frame = this.parseFrame(event.data);
139
+ if (!frame)
140
+ return;
141
+ switch (frame.command) {
142
+ case 'CONNECTED':
143
+ this.connectionState$.next('connected');
144
+ this.resubscribeAll();
145
+ break;
146
+ case 'MESSAGE': {
147
+ const destination = frame.headers['destination'] || '';
148
+ let body = frame.body;
149
+ try {
150
+ body = JSON.parse(frame.body);
151
+ }
152
+ catch { /* mantém como string */ }
153
+ this.messages$.next({ destination, body, headers: frame.headers });
154
+ break;
155
+ }
156
+ case 'ERROR':
157
+ console.error('[WebSocketService] STOMP ERROR:', frame.body);
158
+ break;
159
+ }
160
+ }
161
+ onClose(event) {
162
+ this.connectionState$.next('disconnected');
163
+ if (!event.wasClean && this.reconnectAttempts < this.maxReconnectAttempts) {
164
+ this.scheduleReconnect();
165
+ }
166
+ }
167
+ onError() {
168
+ this.connectionState$.next('error');
169
+ }
170
+ scheduleReconnect() {
171
+ this.clearReconnect();
172
+ const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
173
+ this.reconnectAttempts++;
174
+ console.log(`[WebSocketService] Reconectando em ${delay}ms (tentativa ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
175
+ this.reconnectTimeout = setTimeout(() => this.connect(), delay);
176
+ }
177
+ clearReconnect() {
178
+ if (this.reconnectTimeout) {
179
+ clearTimeout(this.reconnectTimeout);
180
+ this.reconnectTimeout = null;
181
+ }
182
+ }
183
+ resubscribeAll() {
184
+ // Re-inscreve subscriptions existentes
185
+ for (const [id, destination] of this.subscriptions.entries()) {
186
+ this.sendSubscribe(destination, id);
187
+ }
188
+ // Envia pendentes
189
+ for (const pending of this.pendingSubscriptions) {
190
+ this.sendSubscribe(pending.destination, pending.id);
191
+ }
192
+ this.pendingSubscriptions = [];
193
+ }
194
+ sendSubscribe(destination, id) {
195
+ this.sendFrame('SUBSCRIBE', { id, destination }, '');
196
+ }
197
+ // ── STOMP Frame helpers ───────────────────────────────────
198
+ sendFrame(command, headers, body) {
199
+ if (!this.socket || this.socket.readyState !== WebSocket.OPEN)
200
+ return;
201
+ let frame = `${command}\n`;
202
+ for (const [key, value] of Object.entries(headers)) {
203
+ frame += `${key}:${value}\n`;
204
+ }
205
+ frame += `\n${body}\0`;
206
+ this.socket.send(frame);
207
+ }
208
+ parseFrame(data) {
209
+ // Heartbeat
210
+ if (data === '\n' || data === '\r\n' || data.trim() === '')
211
+ return null;
212
+ const lines = data.split('\n');
213
+ const command = lines[0].replace('\r', '');
214
+ const headers = {};
215
+ let i = 1;
216
+ for (; i < lines.length; i++) {
217
+ const line = lines[i].replace('\r', '');
218
+ if (line === '')
219
+ break;
220
+ const colonIndex = line.indexOf(':');
221
+ if (colonIndex > 0) {
222
+ headers[line.substring(0, colonIndex)] = line.substring(colonIndex + 1);
223
+ }
224
+ }
225
+ const body = lines.slice(i + 1).join('\n').replace(/\0$/, '');
226
+ return { command, headers, body };
227
+ }
228
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, deps: [{ token: i1.AuthService }, { token: i2.CookieService }], target: i0.ɵɵFactoryTarget.Injectable });
229
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, providedIn: 'root' });
230
+ }
231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, decorators: [{
232
+ type: Injectable,
233
+ args: [{
234
+ providedIn: 'root'
235
+ }]
236
+ }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.CookieService }] });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvc2VydmljZXMvd2Vic29ja2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQTJCdEYsTUFBTSxPQUFPLGdCQUFnQjtJQWFqQjtJQUNBO0lBYkYsTUFBTSxHQUFxQixJQUFJLENBQUM7SUFDdkIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO0lBQ3hDLGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFrQixjQUFjLENBQUMsQ0FBQztJQUNqRixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDMUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUNiLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUNsQyxnQkFBZ0IsQ0FBTTtJQUN0QixvQkFBb0IsR0FBK0MsRUFBRSxDQUFDO0lBRTlFLFlBQ1UsV0FBd0IsRUFDeEIsYUFBNEI7UUFENUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDbkMsQ0FBQztJQUVKLDhCQUE4QjtJQUM5QixJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFV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LENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7d0dBbFFVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnLi9jb29raWUuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIGZpbHRlciwgc2hhcmUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldENvbmZpZyB7XG4gIC8qKiBEb23DrW5pbyBkbyBzZXJ2acOnbyAoZXg6ICdjcm14JykgKi9cbiAgZG9tYWluOiBzdHJpbmc7XG4gIC8qKiBOb21lIGRvIHNlcnZpw6dvIChleDogJ3NjaGVkdWxlJykgKi9cbiAgc2VydmljZTogc3RyaW5nO1xuICAvKiogUHJpbWl0aXZhL2VudGlkYWRlIChleDogJ2FwcG9pbnRtZW50JykgKi9cbiAgcHJpbWl0aXZlOiBzdHJpbmc7XG4gIC8qKiBTZSB0cnVlLCBpbmNsdWkgbyB0b2tlbiBkbyB1c3XDoXJpbyBubyBiaW5kIHBhcmEgcmVjZWJlciBtZW5zYWdlbnMgZXNwZWPDrWZpY2FzIGRvIHVzdcOhcmlvICovXG4gIHVzZXJTY29wZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b21wTWVzc2FnZTxUID0gYW55PiB7XG4gIC8qKiBEZXN0aW5vL3TDs3BpY28gZGEgbWVuc2FnZW0gKi9cbiAgZGVzdGluYXRpb246IHN0cmluZztcbiAgLyoqIENvcnBvIGRhIG1lbnNhZ2VtIHBhcnNlYWRvICovXG4gIGJvZHk6IFQ7XG4gIC8qKiBIZWFkZXJzIGRhIG1lbnNhZ2VtIFNUT01QICovXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbnR5cGUgQ29ubmVjdGlvblN0YXRlID0gJ2Rpc2Nvbm5lY3RlZCcgfCAnY29ubmVjdGluZycgfCAnY29ubmVjdGVkJyB8ICdlcnJvcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHNvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VzJCA9IG5ldyBTdWJqZWN0PFN0b21wTWVzc2FnZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb25uZWN0aW9uU3RhdGU+KCdkaXNjb25uZWN0ZWQnKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25Db3VudGVyID0gMDtcbiAgcHJpdmF0ZSByZWNvbm5lY3RBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4UmVjb25uZWN0QXR0ZW1wdHMgPSA1O1xuICBwcml2YXRlIHJlY29ubmVjdFRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBwZW5kaW5nU3Vic2NyaXB0aW9uczogQXJyYXk8eyBkZXN0aW5hdGlvbjogc3RyaW5nOyBpZDogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlXG4gICkge31cblxuICAvKiogRXN0YWRvIGF0dWFsIGRhIGNvbmV4w6NvICovXG4gIGdldCBzdGF0ZSQoKTogT2JzZXJ2YWJsZTxDb25uZWN0aW9uU3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIENvbmVjdGEgYW8gV2ViU29ja2V0IHVzYW5kbyBhIFVSTCBiYXNlIGRvIGNvb2tpZSAqL1xuICBjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdzVXJsID0gdGhpcy5idWlsZFdlYlNvY2tldFVybCgpO1xuICAgIGlmICghd3NVcmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXZWJTb2NrZXRTZXJ2aWNlXSBOw6NvIGZvaSBwb3Nzw612ZWwgY29uc3RydWlyIGEgVVJMIGRvIFdlYlNvY2tldC4gQ29va2llIGRlIFVSTCBiYXNlIG7Do28gZW5jb250cmFkby4nKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlJC5uZXh0KCdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvblN0YXRlJC5uZXh0KCdjb25uZWN0aW5nJyk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHRoaXMub25PcGVuKCk7XG4gICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHRoaXMub25NZXNzYWdlKGV2ZW50KTtcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZXZlbnQpID0+IHRoaXMub25DbG9zZShldmVudCk7XG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKCkgPT4gdGhpcy5vbkVycm9yKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXZWJTb2NrZXRTZXJ2aWNlXSBFcnJvIGFvIGNyaWFyIFdlYlNvY2tldDonLCBlcnJvcik7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSQubmV4dCgnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGVzY29uZWN0YSBkbyBXZWJTb2NrZXQgKi9cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUmVjb25uZWN0KCk7XG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0cyA9IDA7XG5cbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIC8vIEVudmlhciBESVNDT05ORUNUIFNUT01QXG4gICAgICB0aGlzLnNlbmRGcmFtZSgnRElTQ09OTkVDVCcsIHt9LCAnJyk7XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdGUkLm5leHQoJ2Rpc2Nvbm5lY3RlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2NyZXZlLXNlIGVtIHVtIHTDs3BpY28gYmFzZWFkbyBuYSBjb25maWd1cmHDp8Ojby5cbiAgICogUGFkcsOjbyBkbyBiaW5kOiAvdG9waWMve3Rva2VufS97ZG9tYWlufS97c2VydmljZX0ve3ByaW1pdGl2ZX1cbiAgICovXG4gIHN1YnNjcmliZTxUID0gYW55Pihjb25maWc6IFdlYlNvY2tldENvbmZpZyk6IE9ic2VydmFibGU8U3RvbXBNZXNzYWdlPFQ+PiB7XG4gICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmJ1aWxkRGVzdGluYXRpb24oY29uZmlnKTtcbiAgICBjb25zdCBzdWJJZCA9IGBzdWItJHt0aGlzLnN1YnNjcmlwdGlvbkNvdW50ZXIrK31gO1xuXG4gICAgLy8gU2UgasOhIGNvbmVjdGFkbywgZW52aWEgU1VCU0NSSUJFIGltZWRpYXRhbWVudGVcbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5jb25uZWN0aW9uU3RhdGUkLnZhbHVlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgdGhpcy5zZW5kU3Vic2NyaWJlKGRlc3RpbmF0aW9uLCBzdWJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEd1YXJkYSBwYXJhIGVudmlhciBhcMOzcyBjb25leMOjb1xuICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5wdXNoKHsgZGVzdGluYXRpb24sIGlkOiBzdWJJZCB9KTtcbiAgICAgIC8vIEF1dG8tY29uZWN0YSBzZSBuw6NvIGVzdGl2ZXIgY29uZWN0YWRvXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGUkLnZhbHVlID09PSAnZGlzY29ubmVjdGVkJykge1xuICAgICAgICB0aGlzLmNvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KHN1YklkLCBkZXN0aW5hdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyQucGlwZShcbiAgICAgIGZpbHRlcihtc2cgPT4gbXNnLmRlc3RpbmF0aW9uID09PSBkZXN0aW5hdGlvbiksXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBzaGFyZSgpXG4gICAgKSBhcyBPYnNlcnZhYmxlPFN0b21wTWVzc2FnZTxUPj47XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgaW5zY3Jpw6fDo28gZGUgdW0gdMOzcGljbyAqL1xuICB1bnN1YnNjcmliZShjb25maWc6IFdlYlNvY2tldENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5idWlsZERlc3RpbmF0aW9uKGNvbmZpZyk7XG4gICAgY29uc3QgZW50cnkgPSBbLi4udGhpcy5zdWJzY3JpcHRpb25zLmVudHJpZXMoKV0uZmluZCgoWywgZGVzdF0pID0+IGRlc3QgPT09IGRlc3RpbmF0aW9uKTtcblxuICAgIGlmIChlbnRyeSkge1xuICAgICAgY29uc3QgW3N1YklkXSA9IGVudHJ5O1xuICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHRoaXMuc2VuZEZyYW1lKCdVTlNVQlNDUklCRScsIHsgaWQ6IHN1YklkIH0sICcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3ViSWQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YWRvcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGJ1aWxkV2ViU29ja2V0VXJsKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0Q29va2llKCdjb20uc2VuaW9yLmJhc2UudXJsJyk7XG4gICAgaWYgKCFiYXNlVXJsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ZSBodHRwKHMpIHBhcmEgd3MocylcbiAgICBjb25zdCB3c1VybCA9IGJhc2VVcmxcbiAgICAgIC5yZXBsYWNlKC9cXC8kLywgJycpXG4gICAgICAucmVwbGFjZSgvXmh0dHAvLCAnd3MnKTtcblxuICAgIHJldHVybiBgJHt3c1VybH0vd2Vic29ja2V0L3N1YnNjcmlwdGlvbmA7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVzdGluYXRpb24oY29uZmlnOiBXZWJTb2NrZXRDb25maWcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gWycvdG9waWMnXTtcblxuICAgIGlmIChjb25maWcudXNlclNjb3BlZCkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcGFydHMucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChjb25maWcuZG9tYWluLCBjb25maWcuc2VydmljZSwgY29uZmlnLnByaW1pdGl2ZSk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJy8nKTtcbiAgfVxuXG4gIHByaXZhdGUgb25PcGVuKCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdHMgPSAwO1xuICAgIC8vIEVudmlhciBDT05ORUNUIFNUT01QXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ2FjY2VwdC12ZXJzaW9uJzogJzEuMicsICdoZWFydC1iZWF0JzogJzEwMDAwLDEwMDAwJyB9O1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5hdXRoU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfVxuICAgIHRoaXMuc2VuZEZyYW1lKCdDT05ORUNUJywgaGVhZGVycywgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5wYXJzZUZyYW1lKGV2ZW50LmRhdGEgYXMgc3RyaW5nKTtcbiAgICBpZiAoIWZyYW1lKSByZXR1cm47XG5cbiAgICBzd2l0Y2ggKGZyYW1lLmNvbW1hbmQpIHtcbiAgICAgIGNhc2UgJ0NPTk5FQ1RFRCc6XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlJC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5yZXN1YnNjcmliZUFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnTUVTU0FHRSc6IHtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBmcmFtZS5oZWFkZXJzWydkZXN0aW5hdGlvbiddIHx8ICcnO1xuICAgICAgICBsZXQgYm9keTogYW55ID0gZnJhbWUuYm9keTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShmcmFtZS5ib2R5KTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIG1hbnTDqW0gY29tbyBzdHJpbmcgKi8gfVxuXG4gICAgICAgIHRoaXMubWVzc2FnZXMkLm5leHQoeyBkZXN0aW5hdGlvbiwgYm9keSwgaGVhZGVyczogZnJhbWUuaGVhZGVycyB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgY29uc29sZS5lcnJvcignW1dlYlNvY2tldFNlcnZpY2VdIFNUT01QIEVSUk9SOicsIGZyYW1lLmJvZHkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQ2xvc2UoZXZlbnQ6IENsb3NlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSQubmV4dCgnZGlzY29ubmVjdGVkJyk7XG4gICAgaWYgKCFldmVudC53YXNDbGVhbiAmJiB0aGlzLnJlY29ubmVjdEF0dGVtcHRzIDwgdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cykge1xuICAgICAgdGhpcy5zY2hlZHVsZVJlY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25FcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSQubmV4dCgnZXJyb3InKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZWNvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlY29ubmVjdCgpO1xuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4oMTAwMCAqIE1hdGgucG93KDIsIHRoaXMucmVjb25uZWN0QXR0ZW1wdHMpLCAzMDAwMCk7XG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0cysrO1xuICAgIGNvbnNvbGUubG9nKGBbV2ViU29ja2V0U2VydmljZV0gUmVjb25lY3RhbmRvIGVtICR7ZGVsYXl9bXMgKHRlbnRhdGl2YSAke3RoaXMucmVjb25uZWN0QXR0ZW1wdHN9LyR7dGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0c30pYCk7XG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lb3V0KTtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN1YnNjcmliZUFsbCgpOiB2b2lkIHtcbiAgICAvLyBSZS1pbnNjcmV2ZSBzdWJzY3JpcHRpb25zIGV4aXN0ZW50ZXNcbiAgICBmb3IgKGNvbnN0IFtpZCwgZGVzdGluYXRpb25dIG9mIHRoaXMuc3Vic2NyaXB0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICAgIHRoaXMuc2VuZFN1YnNjcmliZShkZXN0aW5hdGlvbiwgaWQpO1xuICAgIH1cbiAgICAvLyBFbnZpYSBwZW5kZW50ZXNcbiAgICBmb3IgKGNvbnN0IHBlbmRpbmcgb2YgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5zZW5kU3Vic2NyaWJlKHBlbmRpbmcuZGVzdGluYXRpb24sIHBlbmRpbmcuaWQpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zID0gW107XG4gIH1cblxuICBwcml2YXRlIHNlbmRTdWJzY3JpYmUoZGVzdGluYXRpb246IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VuZEZyYW1lKCdTVUJTQ1JJQkUnLCB7IGlkLCBkZXN0aW5hdGlvbiB9LCAnJyk7XG4gIH1cblxuICAvLyDilIDilIAgU1RPTVAgRnJhbWUgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNlbmRGcmFtZShjb21tYW5kOiBzdHJpbmcsIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGJvZHk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zb2NrZXQgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHJldHVybjtcblxuICAgIGxldCBmcmFtZSA9IGAke2NvbW1hbmR9XFxuYDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgICAgZnJhbWUgKz0gYCR7a2V5fToke3ZhbHVlfVxcbmA7XG4gICAgfVxuICAgIGZyYW1lICs9IGBcXG4ke2JvZHl9XFwwYDtcbiAgICB0aGlzLnNvY2tldC5zZW5kKGZyYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGcmFtZShkYXRhOiBzdHJpbmcpOiB7IGNvbW1hbmQ6IHN0cmluZzsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYm9keTogc3RyaW5nIH0gfCBudWxsIHtcbiAgICAvLyBIZWFydGJlYXRcbiAgICBpZiAoZGF0YSA9PT0gJ1xcbicgfHwgZGF0YSA9PT0gJ1xcclxcbicgfHwgZGF0YS50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmVzID0gZGF0YS5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgY29tbWFuZCA9IGxpbmVzWzBdLnJlcGxhY2UoJ1xccicsICcnKTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgbGV0IGkgPSAxO1xuXG4gICAgZm9yICg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldLnJlcGxhY2UoJ1xccicsICcnKTtcbiAgICAgIGlmIChsaW5lID09PSAnJykgYnJlYWs7XG4gICAgICBjb25zdCBjb2xvbkluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb25JbmRleCA+IDApIHtcbiAgICAgICAgaGVhZGVyc1tsaW5lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KV0gPSBsaW5lLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGxpbmVzLnNsaWNlKGkgKyAxKS5qb2luKCdcXG4nKS5yZXBsYWNlKC9cXDAkLywgJycpO1xuICAgIHJldHVybiB7IGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkgfTtcbiAgfVxufVxuIl19
@@ -20,6 +20,7 @@ export { ThemeService } from './lib/services/theme.service';
20
20
  export { TranslationService } from './lib/services/translation.service';
21
21
  export { MaskService } from './lib/services/mask.service';
22
22
  export { LocaleService } from './lib/services/locale.service';
23
+ export { WebSocketService } from './lib/services/websocket.service';
23
24
  // ============================================================================
24
25
  // COMPONENTS
25
26
  // ============================================================================
@@ -105,4 +106,4 @@ export { FieldType, mergeUnique, getTypeInformation, isValidFilter, getProp, set
105
106
  // export * from './lib/i18n/translation.config';
106
107
  // export * from './lib/i18n/locale.config';
107
108
  // export * from './lib/i18n/fallback';
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFDL0UsU0FBUztBQUNULCtFQUErRTtBQUMvRSxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELCtFQUErRTtBQUMvRSxXQUFXO0FBQ1gsK0VBQStFO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQW9JLE1BQU0sK0JBQStCLENBQUM7QUFDaE0sT0FBTyxFQUFFLFdBQVcsRUFBa0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFpSSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JNLE9BQU8sRUFBRSxrQkFBa0IsRUFBd0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFrRCxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsK0VBQStFO0FBQy9FLGFBQWE7QUFDYiwrRUFBK0U7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFxQixNQUFNLHdEQUF3RCxDQUFDO0FBQ2xILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlEQUFpRCxD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cUM7QUFFckMsT0FBTztBQUNQLGlEQUFpRDtBQUNqRCw0Q0FBNEM7QUFDNUMsdUNBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAc2VuaW9yc2lzdGVtYXMvY29tcG9uZW50cy1haVxuICogXG4gKiBFc3RlIGFycXVpdm8gc2Vyw6EgcG9wdWxhZG8gY29uZm9ybWUgb3MgY29tcG9uZW50ZXMgZm9yZW0gbWlncmFkb3MuXG4gKiBQb3IgZW5xdWFudG8sIGV4cG9ydGEgYXBlbmFzIG8gbcOzZHVsbyBwcmluY2lwYWwuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTU9EVUxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hbmd1bGFyLWNvbXBvbmVudHMubW9kdWxlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU0VSVklDRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB7IEVudGl0eVNlcnZpY2UsIHR5cGUgU29ydE1ldGEsIHR5cGUgTGlzdFBhcmFtcywgdHlwZSBCb2R5UGFyYW1zLCB0eXBlIEVudGl0eUxpc3RSZXNwb25zZSwgdHlwZSBUcmFuc2xhdGlvblNlcnZpY2UgYXMgVHJhbnNsYXRpb25TZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvZW50aXR5LnNlcnZpY2UnO1xuZXhwb3J0IHsgQXV0aFNlcnZpY2UsIHR5cGUgVXNlclRva2VuIH0gZnJvbSAnLi9saWIvc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmV4cG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy9jb29raWUuc2VydmljZSc7XG5leHBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSwgdHlwZSBQZXJtaXNzaW9uUmVxdWVzdCwgdHlwZSBQZXJtaXNzaW9uUmVzcG9uc2UsIHR5cGUgQ2hlY2tBY2Nlc3NSZXF1ZXN0LCB0eXBlIENoZWNrQWNjZXNzUmVzcG9uc2UsIHR5cGUgQXV0aFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuZXhwb3J0IHsgU2VuaW9yVG9rZW5TZXJ2aWNlLCB0eXBlIFNlbmlvclRva2VuRGF0YSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL3Nlbmlvci10b2tlbi5zZXJ2aWNlJztcbmV4cG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UnO1xuZXhwb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlLCB0eXBlIFN1cHBvcnRlZExhbmd1YWdlLCB0eXBlIFRyYW5zbGF0aW9uTG9hZGVyIH0gZnJvbSAnLi9saWIvc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5leHBvcnQgeyBNYXNrU2VydmljZSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL21hc2suc2VydmljZSc7XG5leHBvcnQgeyBMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvbG9jYWxlLnNlcnZpY2UnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT01QT05FTlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgeyBFeHBvcnREaWFsb2dDb21wb25lbnQsIHR5cGUgQ29sdW1uT3B0aW9uIH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9leHBvcnQtZGlhbG9nL2V4cG9ydC1kaWFsb2cuY29tcG9uZW50JztcbmV4cG9ydCB7IEJ1bGtEZWxldGVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2J1bGstZGVsZXRlLWRpYWxvZy9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50JztcbmV4cG9ydCB7IEJyZWFkY3J1bWJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQnO1xuZXhwb3J0IHsgTG9hZGluZ0NvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvbG9hZGluZy9sb2FkaW5nLmNvbXBvbmVudCc7XG5leHBvcnQgeyBJYXNzaXN0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvbG9hZGluZy9pYXNzaXN0LWljb24uY29tcG9uZW50JztcbmV4cG9ydCB7IEVudGl0eUxpc3RCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9iYXNlL2VudGl0eS1saXN0LWJhc2UuY29tcG9uZW50JztcblxuLy8gRHluYW1pYyBGb3JtXG5leHBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vbW9kZWxzL2R5bmFtaWMtZm9ybS5tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vZmllbGRzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTU9ERUxTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgdHlwZSB7IEJhc2VFbnRpdHkgfSBmcm9tICcuL2xpYi9tb2RlbHMvYmFzZS1lbnRpdHkuaW50ZXJmYWNlJztcbmV4cG9ydCB0eXBlIHsgXG4gIFRhYmxlQ29sdW1uLCBcbiAgRm9ybUZpZWxkIGFzIEVudGl0eUZvcm1GaWVsZCwgXG4gIEZpbHRlckZpZWxkLCBcbiAgRXhwb3J0RmllbGQsIFxuICBFbnRpdHlDb25maWcgXG59IGZyb20gJy4vbGliL21vZGVscy9lbnRpdHktY29uZmlnLmludGVyZmFjZSc7XG5leHBvcnQgdHlwZSB7IFxuICBDb2x1bW5Db25maWcsIFxuICBMb29rdXBDb2x1bW4sIFxuICBGaWx0ZXJGaWVsZFNpemUsIFxuICBGaWx0ZXJTZWN0aW9uLCBcbiAgRmlsdGVyQ29uZmlnLCBcbiAgRm9ybUZpZWxkQ29uZmlnIGFzIEVudGl0eUZvcm1GaWVsZENvbmZpZywgXG4gIEVudGl0eUxpc3RDb25maWcgXG59IGZyb20gJy4vbGliL21vZGVscy9lbnRpdHktbGlzdC5jb25maWcnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT05GSUdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB7IFRSQU5TTEFUSU9OX0NPTkZJRywgU1VQUE9SVEVEX0xBTkdVQUdFUywgREVGQVVMVF9MQU5HVUFHRSwgbWFwVG9rZW5Mb2NhbGVUb0xhbmd1YWdlLCBnZXRMYW5ndWFnZUluZm8sIHR5cGUgTGFuZ3VhZ2VDb25maWcgfSBmcm9tICcuL2xpYi9jb25maWcvdHJhbnNsYXRpb24uY29uZmlnJztcbmV4cG9ydCB7IHByb3ZpZGVTZW5pb3JQcmltZU5HLCBTZW5pb3JQcmVzZXQsIHR5cGUgU2VuaW9yUHJpbWVOR0NvbmZpZyB9IGZyb20gJy4vbGliL2NvbmZpZy9wcmltZW5nLmNvbmZpZyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVSQ0VQVE9SU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHsgYXBpSW50ZXJjZXB0b3IgfSBmcm9tICcuL2xpYi9pbnRlcmNlcHRvcnMvYXBpLmludGVyY2VwdG9yJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTk9UQTogT3MgZXhwb3J0cyBhYmFpeG8gc2Vyw6NvIGRlc2NvbWVudGFkb3MgY29uZm9ybWUgb3MgYXJxdWl2b3MgZm9yZW0gbWlncmFkb3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ09NUE9ORU5UUyAtIEJBU0Vcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmFzZS9lbnRpdHktbGlzdC1iYXNlL2VudGl0eS1saXN0LWJhc2UuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmFzZS9lbnRpdHktZm9ybS1iYXNlL2VudGl0eS1mb3JtLWJhc2UuY29tcG9uZW50JztcblxuLy8gQ09NUE9ORU5UUyAtIEZPUk1TXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Zvcm1zL2VudGl0eS1mb3JtLWZpZWxkcy9lbnRpdHktZm9ybS1maWVsZHMuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZm9ybXMvZW50aXR5LWZvcm0tZGlhbG9nL2VudGl0eS1mb3JtLWRpYWxvZy5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mb3Jtcy9lbnRpdHktZm9ybS1kcmF3ZXIvZW50aXR5LWZvcm0tZHJhd2VyLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Zvcm1zL3N1Yi1yZXNvdXJjZS1mb3JtLWRpYWxvZy9zdWItcmVzb3VyY2UtZm9ybS1kaWFsb2cuY29tcG9uZW50JztcblxuLy8gQ09NUE9ORU5UUyAtIExJU1RTXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2xpc3RzL2Zvcm0tZmlsdGVyL2Zvcm0tZmlsdGVyLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2xpc3RzL2V4cG9ydC1kaWFsb2cvZXhwb3J0LWRpYWxvZy5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9saXN0cy9idWxrLWRlbGV0ZS1kaWFsb2cvYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudCc7XG5cbi8vIENPTVBPTkVOVFMgLSBVSVxuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy91aS9icmVhZGNydW1iL2JyZWFkY3J1bWIuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvdWkvZWRpdC1pbmxpbmUvZWRpdC1pbmxpbmUuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvdWkvbG9va3VwLWZpZWxkL2xvb2t1cC1maWVsZC5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy91aS9rYW5iYW4tYm9hcmQva2FuYmFuLWJvYXJkLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VpL3RoZW1lLXRvZ2dsZS90aGVtZS10b2dnbGUuY29tcG9uZW50JztcblxuLy8gU0VSVklDRVNcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2VudGl0eS5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcGVybWlzc2lvbi5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2Nvb2tpZS5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3Nlbmlvci10b2tlbi5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL21hc2suc2VydmljZSc7XG5cbi8vIERJUkVDVElWRVNcbmV4cG9ydCB7IFBvc3RhbENvZGVNYXNrRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9wb3N0YWwtY29kZS1tYXNrLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBEb2N1bWVudE1hc2tEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2RvY3VtZW50LW1hc2suZGlyZWN0aXZlJztcbmV4cG9ydCB7IFBob25lTWFza0RpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcGhvbmUtbWFzay5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgTW9uZXlNYXNrRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9tb25leS1tYXNrLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBUYWJsZUxvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL3RhYmxlLWxvYWRpbmcvdGFibGUtbG9hZGluZy5kaXJlY3RpdmUnO1xuXG4vLyBQSVBFU1xuZXhwb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4vbGliL3BpcGVzL3RyYW5zbGF0ZS5waXBlJztcbmV4cG9ydCB7IENwZlBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9jcGYucGlwZSc7XG5leHBvcnQgeyBDbnBqUGlwZSB9IGZyb20gJy4vbGliL3BpcGVzL2NucGoucGlwZSc7XG5leHBvcnQgeyBEb2N1bWVudFBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9kb2N1bWVudC5waXBlJztcbmV4cG9ydCB7IFBob25lUGlwZSB9IGZyb20gJy4vbGliL3BpcGVzL3Bob25lLnBpcGUnO1xuZXhwb3J0IHsgUG9zdGFsQ29kZVBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9wb3N0YWwtY29kZS5waXBlJztcbmV4cG9ydCB7IE1vbmV5UGlwZSB9IGZyb20gJy4vbGliL3BpcGVzL21vbmV5LnBpcGUnO1xuZXhwb3J0IHsgRGF0ZUZvcm1hdFBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9kYXRlLWZvcm1hdC5waXBlJztcblxuLy8gVVRJTFNcbmV4cG9ydCB7IFRyYW5zbGF0aW9uSGVscGVyIH0gZnJvbSAnLi9saWIvdXRpbHMvdHJhbnNsYXRpb24uaGVscGVyJztcbmV4cG9ydCB7IFxuICBGaWVsZFR5cGUsXG4gIHR5cGUgRm9ybUZpZWxkIGFzIFV0aWxzRm9ybUZpZWxkLFxuICB0eXBlIE9wdGlvbixcbiAgdHlwZSBGaWx0ZXJUb2tlbixcbiAgbWVyZ2VVbmlxdWUsXG4gIGdldFR5cGVJbmZvcm1hdGlvbixcbiAgaXNWYWxpZEZpbHRlcixcbiAgZ2V0UHJvcCxcbiAgc2V0UHJvcCxcbiAgZ2V0TGFiZWxWYWx1ZVJlcXVlc3QsXG4gIGdldFN1Z2dlc3Rpb25WYWx1ZSxcbiAgZ2V0RW51bVF1ZXJ5LFxuICBlc2NhcGVGaWx0ZXJWYWx1ZSxcbiAgY3JlYXRlRmlsdGVyU3RyaW5nLFxuICBjcmVhdGVGaWx0ZXJUb2tlbnMsXG4gIHJlc29sdmVSZWZzLFxuICBkZWVwQ2xvbmUsXG4gIGRlZXBFcXVhbCxcbiAgZGVib3VuY2UsXG4gIHRocm90dGxlXG59IGZyb20gJy4vbGliL3V0aWxzL3V0aWxzJztcblxuLy8gSU5URVJDRVBUT1JTXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmNlcHRvcnMvYXBpLmludGVyY2VwdG9yJztcblxuLy8gTU9ERUxTIC0gSU5URVJGQUNFU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ludGVyZmFjZXMvYmFzZS1lbnRpdHkuaW50ZXJmYWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9pbnRlcmZhY2VzL2VudGl0eS1jb25maWcuaW50ZXJmYWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9pbnRlcmZhY2VzL2VudGl0eS1saXN0LmNvbmZpZyc7XG5cbi8vIE1PREVMUyAtIEVOVU1TXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZW51bXMvc3RhdHVzLmVudW0nO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2VudW1zL3R5cGUtcGVyc29uLmVudW0nO1xuXG4vLyBVVElMU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvdXRpbHMnO1xuXG4vLyBJMThOXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9pMThuL3RyYW5zbGF0aW9uLmNvbmZpZyc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9pMThuL2xvY2FsZS5jb25maWcnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvaTE4bi9mYWxsYmFjayc7XG4iXX0=
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFDL0UsU0FBUztBQUNULCtFQUErRTtBQUMvRSxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELCtFQUErRTtBQUMvRSxXQUFXO0FBQ1gsK0VBQStFO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQW9JLE1BQU0sK0JBQStCLENBQUM7QUFDaE0sT0FBTyxFQUFFLFdBQVcsRUFBa0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFpSSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JNLE9BQU8sRUFBRSxrQkFBa0IsRUFBd0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFrRCxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUEyQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTdHLCtFQUErRTtBQUMvRSxhQUFhO0FBQ2IsK0VBQStFO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBcUIsTUFBTSx3REFBd0QsQ0FBQztBQUNsSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUM3RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMs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QUFDakIsa0RBQWtEO0FBQ2xELHVEQUF1RDtBQUV2RCxRQUFRO0FBQ1IscUNBQXFDO0FBRXJDLE9BQU87QUFDUCxpREFBaUQ7QUFDakQsNENBQTRDO0FBQzVDLHVDQUF1QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQHNlbmlvcnNpc3RlbWFzL2NvbXBvbmVudHMtYWlcbiAqIFxuICogRXN0ZSBhcnF1aXZvIHNlcsOhIHBvcHVsYWRvIGNvbmZvcm1lIG9zIGNvbXBvbmVudGVzIGZvcmVtIG1pZ3JhZG9zLlxuICogUG9yIGVucXVhbnRvLCBleHBvcnRhIGFwZW5hcyBvIG3Ds2R1bG8gcHJpbmNpcGFsLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1PRFVMRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0ICogZnJvbSAnLi9saWIvYW5ndWxhci1jb21wb25lbnRzLm1vZHVsZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNFUlZJQ0VTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgeyBFbnRpdHlTZXJ2aWNlLCB0eXBlIFNvcnRNZXRhLCB0eXBlIExpc3RQYXJhbXMsIHR5cGUgQm9keVBhcmFtcywgdHlwZSBFbnRpdHlMaXN0UmVzcG9uc2UsIHR5cGUgVHJhbnNsYXRpb25TZXJ2aWNlIGFzIFRyYW5zbGF0aW9uU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL2VudGl0eS5zZXJ2aWNlJztcbmV4cG9ydCB7IEF1dGhTZXJ2aWNlLCB0eXBlIFVzZXJUb2tlbiB9IGZyb20gJy4vbGliL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5leHBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvY29va2llLnNlcnZpY2UnO1xuZXhwb3J0IHsgUGVybWlzc2lvblNlcnZpY2UsIHR5cGUgUGVybWlzc2lvblJlcXVlc3QsIHR5cGUgUGVybWlzc2lvblJlc3BvbnNlLCB0eXBlIENoZWNrQWNjZXNzUmVxdWVzdCwgdHlwZSBDaGVja0FjY2Vzc1Jlc3BvbnNlLCB0eXBlIEF1dGhTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvcGVybWlzc2lvbi5zZXJ2aWNlJztcbmV4cG9ydCB7IFNlbmlvclRva2VuU2VydmljZSwgdHlwZSBTZW5pb3JUb2tlbkRhdGEgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy9zZW5pb3ItdG9rZW4uc2VydmljZSc7XG5leHBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlJztcbmV4cG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSwgdHlwZSBTdXBwb3J0ZWRMYW5ndWFnZSwgdHlwZSBUcmFuc2xhdGlvbkxvYWRlciB9IGZyb20gJy4vbGliL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuZXhwb3J0IHsgTWFza1NlcnZpY2UgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy9tYXNrLnNlcnZpY2UnO1xuZXhwb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmV4cG9ydCB7IFdlYlNvY2tldFNlcnZpY2UsIHR5cGUgV2ViU29ja2V0Q29uZmlnLCB0eXBlIFN0b21wTWVzc2FnZSB9IGZyb20gJy4vbGliL3NlcnZpY2VzL3dlYnNvY2tldC5zZXJ2aWNlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09NUE9ORU5UU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHsgRXhwb3J0RGlhbG9nQ29tcG9uZW50LCB0eXBlIENvbHVtbk9wdGlvbiB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvZXhwb3J0LWRpYWxvZy9leHBvcnQtZGlhbG9nLmNvbXBvbmVudCc7XG5leHBvcnQgeyBCdWxrRGVsZXRlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9idWxrLWRlbGV0ZS1kaWFsb2cvYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudCc7XG5leHBvcnQgeyBCcmVhZGNydW1iQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9icmVhZGNydW1iL2JyZWFkY3J1bWIuY29tcG9uZW50JztcbmV4cG9ydCB7IExvYWRpbmdDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2xvYWRpbmcvbG9hZGluZy5jb21wb25lbnQnO1xuZXhwb3J0IHsgSWFzc2lzdEljb25Db21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2xvYWRpbmcvaWFzc2lzdC1pY29uLmNvbXBvbmVudCc7XG5leHBvcnQgeyBFbnRpdHlMaXN0QmFzZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmFzZS9lbnRpdHktbGlzdC1iYXNlLmNvbXBvbmVudCc7XG5cbi8vIER5bmFtaWMgRm9ybVxuZXhwb3J0IHsgRHluYW1pY0Zvcm1Db21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL21vZGVscy9keW5hbWljLWZvcm0ubW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2ZpZWxkcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1PREVMU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHR5cGUgeyBCYXNlRW50aXR5IH0gZnJvbSAnLi9saWIvbW9kZWxzL2Jhc2UtZW50aXR5LmludGVyZmFjZSc7XG5leHBvcnQgdHlwZSB7IFxuICBUYWJsZUNvbHVtbiwgXG4gIEZvcm1GaWVsZCBhcyBFbnRpdHlGb3JtRmllbGQsIFxuICBGaWx0ZXJGaWVsZCwgXG4gIEV4cG9ydEZpZWxkLCBcbiAgRW50aXR5Q29uZmlnIFxufSBmcm9tICcuL2xpYi9tb2RlbHMvZW50aXR5LWNvbmZpZy5pbnRlcmZhY2UnO1xuZXhwb3J0IHR5cGUgeyBcbiAgQ29sdW1uQ29uZmlnLCBcbiAgTG9va3VwQ29sdW1uLCBcbiAgRmlsdGVyRmllbGRTaXplLCBcbiAgRmlsdGVyU2VjdGlvbiwgXG4gIEZpbHRlckNvbmZpZywgXG4gIEZvcm1GaWVsZENvbmZpZyBhcyBFbnRpdHlGb3JtRmllbGRDb25maWcsIFxuICBFbnRpdHlMaXN0Q29uZmlnIFxufSBmcm9tICcuL2xpYi9tb2RlbHMvZW50aXR5LWxpc3QuY29uZmlnJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09ORklHXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgeyBUUkFOU0xBVElPTl9DT05GSUcsIFNVUFBPUlRFRF9MQU5HVUFHRVMsIERFRkFVTFRfTEFOR1VBR0UsIG1hcFRva2VuTG9jYWxlVG9MYW5ndWFnZSwgZ2V0TGFuZ3VhZ2VJbmZvLCB0eXBlIExhbmd1YWdlQ29uZmlnIH0gZnJvbSAnLi9saWIvY29uZmlnL3RyYW5zbGF0aW9uLmNvbmZpZyc7XG5leHBvcnQgeyBwcm92aWRlU2VuaW9yUHJpbWVORywgU2VuaW9yUHJlc2V0LCB0eXBlIFNlbmlvclByaW1lTkdDb25maWcgfSBmcm9tICcuL2xpYi9jb25maWcvcHJpbWVuZy5jb25maWcnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFUkNFUFRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB7IGFwaUludGVyY2VwdG9yIH0gZnJvbSAnLi9saWIvaW50ZXJjZXB0b3JzL2FwaS5pbnRlcmNlcHRvcic7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE5PVEE6IE9zIGV4cG9ydHMgYWJhaXhvIHNlcsOjbyBkZXNjb21lbnRhZG9zIGNvbmZvcm1lIG9zIGFycXVpdm9zIGZvcmVtIG1pZ3JhZG9zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENPTVBPTkVOVFMgLSBCQVNFXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jhc2UvZW50aXR5LWxpc3QtYmFzZS9lbnRpdHktbGlzdC1iYXNlLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jhc2UvZW50aXR5LWZvcm0tYmFzZS9lbnRpdHktZm9ybS1iYXNlLmNvbXBvbmVudCc7XG5cbi8vIENPTVBPTkVOVFMgLSBGT1JNU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mb3Jtcy9lbnRpdHktZm9ybS1maWVsZHMvZW50aXR5LWZvcm0tZmllbGRzLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Zvcm1zL2VudGl0eS1mb3JtLWRpYWxvZy9lbnRpdHktZm9ybS1kaWFsb2cuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZm9ybXMvZW50aXR5LWZvcm0tZHJhd2VyL2VudGl0eS1mb3JtLWRyYXdlci5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mb3Jtcy9zdWItcmVzb3VyY2UtZm9ybS1kaWFsb2cvc3ViLXJlc291cmNlLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbi8vIENPTVBPTkVOVFMgLSBMSVNUU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9saXN0cy9mb3JtLWZpbHRlci9mb3JtLWZpbHRlci5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9saXN0cy9leHBvcnQtZGlhbG9nL2V4cG9ydC1kaWFsb2cuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvbGlzdHMvYnVsay1kZWxldGUtZGlhbG9nL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQnO1xuXG4vLyBDT01QT05FTlRTIC0gVUlcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvdWkvYnJlYWRjcnVtYi9icmVhZGNydW1iLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VpL2VkaXQtaW5saW5lL2VkaXQtaW5saW5lLmNvbXBvbmVudCc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VpL2xvb2t1cC1maWVsZC9sb29rdXAtZmllbGQuY29tcG9uZW50Jztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvdWkva2FuYmFuLWJvYXJkL2thbmJhbi1ib2FyZC5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy91aS90aGVtZS10b2dnbGUvdGhlbWUtdG9nZ2xlLmNvbXBvbmVudCc7XG5cbi8vIFNFUlZJQ0VTXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9lbnRpdHkuc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9jb29raWUuc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9zZW5pb3ItdG9rZW4uc2VydmljZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9tYXNrLnNlcnZpY2UnO1xuXG4vLyBESVJFQ1RJVkVTXG5leHBvcnQgeyBQb3N0YWxDb2RlTWFza0RpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcG9zdGFsLWNvZGUtbWFzay5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgRG9jdW1lbnRNYXNrRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9kb2N1bWVudC1tYXNrLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBQaG9uZU1hc2tEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL3Bob25lLW1hc2suZGlyZWN0aXZlJztcbmV4cG9ydCB7IE1vbmV5TWFza0RpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvbW9uZXktbWFzay5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgVGFibGVMb2FkaW5nRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy90YWJsZS1sb2FkaW5nL3RhYmxlLWxvYWRpbmcuZGlyZWN0aXZlJztcblxuLy8gUElQRVNcbmV4cG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy90cmFuc2xhdGUucGlwZSc7XG5leHBvcnQgeyBDcGZQaXBlIH0gZnJvbSAnLi9saWIvcGlwZXMvY3BmLnBpcGUnO1xuZXhwb3J0IHsgQ25walBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9jbnBqLnBpcGUnO1xuZXhwb3J0IHsgRG9jdW1lbnRQaXBlIH0gZnJvbSAnLi9saWIvcGlwZXMvZG9jdW1lbnQucGlwZSc7XG5leHBvcnQgeyBQaG9uZVBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9waG9uZS5waXBlJztcbmV4cG9ydCB7IFBvc3RhbENvZGVQaXBlIH0gZnJvbSAnLi9saWIvcGlwZXMvcG9zdGFsLWNvZGUucGlwZSc7XG5leHBvcnQgeyBNb25leVBpcGUgfSBmcm9tICcuL2xpYi9waXBlcy9tb25leS5waXBlJztcbmV4cG9ydCB7IERhdGVGb3JtYXRQaXBlIH0gZnJvbSAnLi9saWIvcGlwZXMvZGF0ZS1mb3JtYXQucGlwZSc7XG5cbi8vIFVUSUxTXG5leHBvcnQgeyBUcmFuc2xhdGlvbkhlbHBlciB9IGZyb20gJy4vbGliL3V0aWxzL3RyYW5zbGF0aW9uLmhlbHBlcic7XG5leHBvcnQgeyBcbiAgRmllbGRUeXBlLFxuICB0eXBlIEZvcm1GaWVsZCBhcyBVdGlsc0Zvcm1GaWVsZCxcbiAgdHlwZSBPcHRpb24sXG4gIHR5cGUgRmlsdGVyVG9rZW4sXG4gIG1lcmdlVW5pcXVlLFxuICBnZXRUeXBlSW5mb3JtYXRpb24sXG4gIGlzVmFsaWRGaWx0ZXIsXG4gIGdldFByb3AsXG4gIHNldFByb3AsXG4gIGdldExhYmVsVmFsdWVSZXF1ZXN0LFxuICBnZXRTdWdnZXN0aW9uVmFsdWUsXG4gIGdldEVudW1RdWVyeSxcbiAgZXNjYXBlRmlsdGVyVmFsdWUsXG4gIGNyZWF0ZUZpbHRlclN0cmluZyxcbiAgY3JlYXRlRmlsdGVyVG9rZW5zLFxuICByZXNvbHZlUmVmcyxcbiAgZGVlcENsb25lLFxuICBkZWVwRXF1YWwsXG4gIGRlYm91bmNlLFxuICB0aHJvdHRsZVxufSBmcm9tICcuL2xpYi91dGlscy91dGlscyc7XG5cbi8vIElOVEVSQ0VQVE9SU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJjZXB0b3JzL2FwaS5pbnRlcmNlcHRvcic7XG5cbi8vIE1PREVMUyAtIElOVEVSRkFDRVNcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9pbnRlcmZhY2VzL2Jhc2UtZW50aXR5LmludGVyZmFjZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvaW50ZXJmYWNlcy9lbnRpdHktY29uZmlnLmludGVyZmFjZSc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvaW50ZXJmYWNlcy9lbnRpdHktbGlzdC5jb25maWcnO1xuXG4vLyBNT0RFTFMgLSBFTlVNU1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2VudW1zL3N0YXR1cy5lbnVtJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9lbnVtcy90eXBlLXBlcnNvbi5lbnVtJztcblxuLy8gVVRJTFNcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3V0aWxzJztcblxuLy8gSTE4TlxuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvaTE4bi90cmFuc2xhdGlvbi5jb25maWcnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvaTE4bi9sb2NhbGUuY29uZmlnJztcbi8vIGV4cG9ydCAqIGZyb20gJy4vbGliL2kxOG4vZmFsbGJhY2snO1xuIl19
@@ -4,8 +4,8 @@ import * as i2 from '@angular/common';
4
4
  import { CommonModule, DOCUMENT } from '@angular/common';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpParams } from '@angular/common/http';
7
- import { throwError, BehaviorSubject, of, from, concatMap, catchError as catchError$1 } from 'rxjs';
8
- import { map, catchError, filter } from 'rxjs/operators';
7
+ import { throwError, BehaviorSubject, of, Subject, filter, takeUntil, share, from, concatMap, catchError as catchError$1 } from 'rxjs';
8
+ import { map, catchError, filter as filter$1 } from 'rxjs/operators';
9
9
  import * as i1$1 from 'primeng/config';
10
10
  import { providePrimeNG } from 'primeng/config';
11
11
  import * as i2$1 from '@angular/forms';
@@ -1963,6 +1963,238 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1963
1963
  }]
1964
1964
  }], ctorParameters: () => [{ type: i1$1.PrimeNG }, { type: TranslationService }] });
1965
1965
 
1966
+ class WebSocketService {
1967
+ authService;
1968
+ cookieService;
1969
+ socket = null;
1970
+ destroy$ = new Subject();
1971
+ messages$ = new Subject();
1972
+ connectionState$ = new BehaviorSubject('disconnected');
1973
+ subscriptions = new Map();
1974
+ subscriptionCounter = 0;
1975
+ reconnectAttempts = 0;
1976
+ maxReconnectAttempts = 5;
1977
+ reconnectTimeout;
1978
+ pendingSubscriptions = [];
1979
+ constructor(authService, cookieService) {
1980
+ this.authService = authService;
1981
+ this.cookieService = cookieService;
1982
+ }
1983
+ /** Estado atual da conexão */
1984
+ get state$() {
1985
+ return this.connectionState$.asObservable();
1986
+ }
1987
+ /** Conecta ao WebSocket usando a URL base do cookie */
1988
+ connect() {
1989
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
1990
+ return;
1991
+ }
1992
+ const wsUrl = this.buildWebSocketUrl();
1993
+ if (!wsUrl) {
1994
+ console.error('[WebSocketService] Não foi possível construir a URL do WebSocket. Cookie de URL base não encontrado.');
1995
+ this.connectionState$.next('error');
1996
+ return;
1997
+ }
1998
+ this.connectionState$.next('connecting');
1999
+ try {
2000
+ this.socket = new WebSocket(wsUrl);
2001
+ this.socket.onopen = () => this.onOpen();
2002
+ this.socket.onmessage = (event) => this.onMessage(event);
2003
+ this.socket.onclose = (event) => this.onClose(event);
2004
+ this.socket.onerror = () => this.onError();
2005
+ }
2006
+ catch (error) {
2007
+ console.error('[WebSocketService] Erro ao criar WebSocket:', error);
2008
+ this.connectionState$.next('error');
2009
+ }
2010
+ }
2011
+ /** Desconecta do WebSocket */
2012
+ disconnect() {
2013
+ this.clearReconnect();
2014
+ this.reconnectAttempts = 0;
2015
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
2016
+ // Enviar DISCONNECT STOMP
2017
+ this.sendFrame('DISCONNECT', {}, '');
2018
+ this.socket.close();
2019
+ }
2020
+ this.socket = null;
2021
+ this.subscriptions.clear();
2022
+ this.pendingSubscriptions = [];
2023
+ this.connectionState$.next('disconnected');
2024
+ }
2025
+ /**
2026
+ * Inscreve-se em um tópico baseado na configuração.
2027
+ * Padrão do bind: /topic/{token}/{domain}/{service}/{primitive}
2028
+ */
2029
+ subscribe(config) {
2030
+ const destination = this.buildDestination(config);
2031
+ const subId = `sub-${this.subscriptionCounter++}`;
2032
+ // Se já conectado, envia SUBSCRIBE imediatamente
2033
+ if (this.socket && this.socket.readyState === WebSocket.OPEN && this.connectionState$.value === 'connected') {
2034
+ this.sendSubscribe(destination, subId);
2035
+ }
2036
+ else {
2037
+ // Guarda para enviar após conexão
2038
+ this.pendingSubscriptions.push({ destination, id: subId });
2039
+ // Auto-conecta se não estiver conectado
2040
+ if (this.connectionState$.value === 'disconnected') {
2041
+ this.connect();
2042
+ }
2043
+ }
2044
+ this.subscriptions.set(subId, destination);
2045
+ return this.messages$.pipe(filter(msg => msg.destination === destination), takeUntil(this.destroy$), share());
2046
+ }
2047
+ /** Remove a inscrição de um tópico */
2048
+ unsubscribe(config) {
2049
+ const destination = this.buildDestination(config);
2050
+ const entry = [...this.subscriptions.entries()].find(([, dest]) => dest === destination);
2051
+ if (entry) {
2052
+ const [subId] = entry;
2053
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
2054
+ this.sendFrame('UNSUBSCRIBE', { id: subId }, '');
2055
+ }
2056
+ this.subscriptions.delete(subId);
2057
+ }
2058
+ }
2059
+ ngOnDestroy() {
2060
+ this.disconnect();
2061
+ this.destroy$.next();
2062
+ this.destroy$.complete();
2063
+ }
2064
+ // ── Privados ──────────────────────────────────────────────
2065
+ buildWebSocketUrl() {
2066
+ const baseUrl = this.cookieService.getCookie('com.senior.base.url');
2067
+ if (!baseUrl) {
2068
+ return null;
2069
+ }
2070
+ // Converte http(s) para ws(s)
2071
+ const wsUrl = baseUrl
2072
+ .replace(/\/$/, '')
2073
+ .replace(/^http/, 'ws');
2074
+ return `${wsUrl}/websocket/subscription`;
2075
+ }
2076
+ buildDestination(config) {
2077
+ const parts = ['/topic'];
2078
+ if (config.userScoped) {
2079
+ const token = this.authService.getAccessToken();
2080
+ if (token) {
2081
+ parts.push(token);
2082
+ }
2083
+ }
2084
+ parts.push(config.domain, config.service, config.primitive);
2085
+ return parts.join('/');
2086
+ }
2087
+ onOpen() {
2088
+ this.reconnectAttempts = 0;
2089
+ // Enviar CONNECT STOMP
2090
+ const headers = { 'accept-version': '1.2', 'heart-beat': '10000,10000' };
2091
+ const token = this.authService.getAccessToken();
2092
+ if (token) {
2093
+ headers['Authorization'] = `Bearer ${token}`;
2094
+ }
2095
+ this.sendFrame('CONNECT', headers, '');
2096
+ }
2097
+ onMessage(event) {
2098
+ const frame = this.parseFrame(event.data);
2099
+ if (!frame)
2100
+ return;
2101
+ switch (frame.command) {
2102
+ case 'CONNECTED':
2103
+ this.connectionState$.next('connected');
2104
+ this.resubscribeAll();
2105
+ break;
2106
+ case 'MESSAGE': {
2107
+ const destination = frame.headers['destination'] || '';
2108
+ let body = frame.body;
2109
+ try {
2110
+ body = JSON.parse(frame.body);
2111
+ }
2112
+ catch { /* mantém como string */ }
2113
+ this.messages$.next({ destination, body, headers: frame.headers });
2114
+ break;
2115
+ }
2116
+ case 'ERROR':
2117
+ console.error('[WebSocketService] STOMP ERROR:', frame.body);
2118
+ break;
2119
+ }
2120
+ }
2121
+ onClose(event) {
2122
+ this.connectionState$.next('disconnected');
2123
+ if (!event.wasClean && this.reconnectAttempts < this.maxReconnectAttempts) {
2124
+ this.scheduleReconnect();
2125
+ }
2126
+ }
2127
+ onError() {
2128
+ this.connectionState$.next('error');
2129
+ }
2130
+ scheduleReconnect() {
2131
+ this.clearReconnect();
2132
+ const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
2133
+ this.reconnectAttempts++;
2134
+ console.log(`[WebSocketService] Reconectando em ${delay}ms (tentativa ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
2135
+ this.reconnectTimeout = setTimeout(() => this.connect(), delay);
2136
+ }
2137
+ clearReconnect() {
2138
+ if (this.reconnectTimeout) {
2139
+ clearTimeout(this.reconnectTimeout);
2140
+ this.reconnectTimeout = null;
2141
+ }
2142
+ }
2143
+ resubscribeAll() {
2144
+ // Re-inscreve subscriptions existentes
2145
+ for (const [id, destination] of this.subscriptions.entries()) {
2146
+ this.sendSubscribe(destination, id);
2147
+ }
2148
+ // Envia pendentes
2149
+ for (const pending of this.pendingSubscriptions) {
2150
+ this.sendSubscribe(pending.destination, pending.id);
2151
+ }
2152
+ this.pendingSubscriptions = [];
2153
+ }
2154
+ sendSubscribe(destination, id) {
2155
+ this.sendFrame('SUBSCRIBE', { id, destination }, '');
2156
+ }
2157
+ // ── STOMP Frame helpers ───────────────────────────────────
2158
+ sendFrame(command, headers, body) {
2159
+ if (!this.socket || this.socket.readyState !== WebSocket.OPEN)
2160
+ return;
2161
+ let frame = `${command}\n`;
2162
+ for (const [key, value] of Object.entries(headers)) {
2163
+ frame += `${key}:${value}\n`;
2164
+ }
2165
+ frame += `\n${body}\0`;
2166
+ this.socket.send(frame);
2167
+ }
2168
+ parseFrame(data) {
2169
+ // Heartbeat
2170
+ if (data === '\n' || data === '\r\n' || data.trim() === '')
2171
+ return null;
2172
+ const lines = data.split('\n');
2173
+ const command = lines[0].replace('\r', '');
2174
+ const headers = {};
2175
+ let i = 1;
2176
+ for (; i < lines.length; i++) {
2177
+ const line = lines[i].replace('\r', '');
2178
+ if (line === '')
2179
+ break;
2180
+ const colonIndex = line.indexOf(':');
2181
+ if (colonIndex > 0) {
2182
+ headers[line.substring(0, colonIndex)] = line.substring(colonIndex + 1);
2183
+ }
2184
+ }
2185
+ const body = lines.slice(i + 1).join('\n').replace(/\0$/, '');
2186
+ return { command, headers, body };
2187
+ }
2188
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, deps: [{ token: AuthService }, { token: CookieService }], target: i0.ɵɵFactoryTarget.Injectable });
2189
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, providedIn: 'root' });
2190
+ }
2191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSocketService, decorators: [{
2192
+ type: Injectable,
2193
+ args: [{
2194
+ providedIn: 'root'
2195
+ }]
2196
+ }], ctorParameters: () => [{ type: AuthService }, { type: CookieService }] });
2197
+
1966
2198
  class TranslatePipe {
1967
2199
  translationService;
1968
2200
  cdr;
@@ -2387,7 +2619,7 @@ class BreadcrumbComponent {
2387
2619
  this.buildBreadcrumbs();
2388
2620
  // Atualiza breadcrumbs quando a navegação muda
2389
2621
  this.router.events
2390
- .pipe(filter(event => event instanceof NavigationEnd))
2622
+ .pipe(filter$1(event => event instanceof NavigationEnd))
2391
2623
  .subscribe(() => this.buildBreadcrumbs());
2392
2624
  }
2393
2625
  updateHomeItem() {
@@ -6680,5 +6912,5 @@ const throttle = (func, limit) => {
6680
6912
  * Generated bundle index. Do not edit.
6681
6913
  */
6682
6914
 
6683
- export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DateFormatPipe, DocumentMaskDirective, DocumentPipe, DynamicFieldCheckboxComponent, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldImageComponent, DynamicFieldLookupComponent, DynamicFieldMultiselectComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldTimeComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, IassistIconComponent, LoadingComponent, LocaleService, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, TableLoadingDirective, ThemeService, TranslatePipe, TranslationHelper, TranslationService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
6915
+ export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DateFormatPipe, DocumentMaskDirective, DocumentPipe, DynamicFieldCheckboxComponent, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldImageComponent, DynamicFieldLookupComponent, DynamicFieldMultiselectComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldTimeComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, IassistIconComponent, LoadingComponent, LocaleService, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, TableLoadingDirective, ThemeService, TranslatePipe, TranslationHelper, TranslationService, WebSocketService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
6684
6916
  //# sourceMappingURL=seniorsistemas-components-ai.mjs.map