valtech-components 2.0.445 → 2.0.447
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/services/firebase/firestore-collection.mjs +1 -1
- package/esm2022/public-api.mjs +9 -6
- package/fesm2022/valtech-components.mjs +5 -3237
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +0 -5
- package/esm2022/lib/components/molecules/feedback-form/feedback-form.component.mjs +0 -352
- package/esm2022/lib/components/molecules/feedback-form/types.mjs +0 -2
- package/esm2022/lib/services/auth/auth-state.service.mjs +0 -173
- package/esm2022/lib/services/auth/auth.service.mjs +0 -454
- package/esm2022/lib/services/auth/config.mjs +0 -76
- package/esm2022/lib/services/auth/guards.mjs +0 -194
- package/esm2022/lib/services/auth/index.mjs +0 -70
- package/esm2022/lib/services/auth/interceptor.mjs +0 -98
- package/esm2022/lib/services/auth/storage.service.mjs +0 -138
- package/esm2022/lib/services/auth/sync.service.mjs +0 -146
- package/esm2022/lib/services/auth/token.service.mjs +0 -113
- package/esm2022/lib/services/auth/types.mjs +0 -29
- package/esm2022/lib/services/content/content-types/blog.mjs +0 -275
- package/esm2022/lib/services/content/content-types/documentation.mjs +0 -303
- package/esm2022/lib/services/content/content-types/news.mjs +0 -277
- package/esm2022/lib/services/content/index.mjs +0 -51
- package/esm2022/lib/services/content/transformer.mjs +0 -265
- package/esm2022/lib/services/content/types.mjs +0 -41
- package/esm2022/lib/services/feedback/config.mjs +0 -49
- package/esm2022/lib/services/feedback/feedback.service.mjs +0 -174
- package/esm2022/lib/services/feedback/index.mjs +0 -44
- package/esm2022/lib/services/feedback/types.mjs +0 -30
- package/lib/components/molecules/feedback-form/feedback-form.component.d.ts +0 -56
- package/lib/components/molecules/feedback-form/types.d.ts +0 -54
- package/lib/services/auth/auth-state.service.d.ts +0 -85
- package/lib/services/auth/auth.service.d.ts +0 -146
- package/lib/services/auth/config.d.ts +0 -38
- package/lib/services/auth/guards.d.ts +0 -123
- package/lib/services/auth/index.d.ts +0 -63
- package/lib/services/auth/interceptor.d.ts +0 -22
- package/lib/services/auth/storage.service.d.ts +0 -48
- package/lib/services/auth/sync.service.d.ts +0 -49
- package/lib/services/auth/token.service.d.ts +0 -51
- package/lib/services/auth/types.d.ts +0 -315
- package/lib/services/content/content-types/blog.d.ts +0 -148
- package/lib/services/content/content-types/documentation.d.ts +0 -183
- package/lib/services/content/content-types/news.d.ts +0 -162
- package/lib/services/content/index.d.ts +0 -49
- package/lib/services/content/transformer.d.ts +0 -96
- package/lib/services/content/types.d.ts +0 -220
- package/lib/services/feedback/config.d.ts +0 -35
- package/lib/services/feedback/feedback.service.d.ts +0 -76
- package/lib/services/feedback/index.d.ts +0 -40
- package/lib/services/feedback/types.d.ts +0 -107
|
@@ -1,454 +0,0 @@
|
|
|
1
|
-
import { Injectable, Inject } from '@angular/core';
|
|
2
|
-
import { throwError, of, firstValueFrom } from 'rxjs';
|
|
3
|
-
import { tap, catchError } from 'rxjs/operators';
|
|
4
|
-
import { VALTECH_AUTH_CONFIG } from './config';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
import * as i2 from "@angular/router";
|
|
8
|
-
import * as i3 from "./auth-state.service";
|
|
9
|
-
import * as i4 from "./token.service";
|
|
10
|
-
import * as i5 from "./storage.service";
|
|
11
|
-
import * as i6 from "./sync.service";
|
|
12
|
-
import * as i7 from "../firebase";
|
|
13
|
-
/**
|
|
14
|
-
* Servicio principal de autenticación.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* import { AuthService } from 'valtech-components';
|
|
19
|
-
*
|
|
20
|
-
* @Component({...})
|
|
21
|
-
* export class LoginComponent {
|
|
22
|
-
* private auth = inject(AuthService);
|
|
23
|
-
*
|
|
24
|
-
* async login() {
|
|
25
|
-
* await firstValueFrom(this.auth.signin({ email, password }));
|
|
26
|
-
* if (this.auth.mfaPending().required) {
|
|
27
|
-
* // Mostrar UI de MFA
|
|
28
|
-
* } else {
|
|
29
|
-
* this.router.navigate(['/']);
|
|
30
|
-
* }
|
|
31
|
-
* }
|
|
32
|
-
* }
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export class AuthService {
|
|
36
|
-
constructor(config, http, router, stateService, tokenService, storageService, syncService, firebaseService) {
|
|
37
|
-
this.config = config;
|
|
38
|
-
this.http = http;
|
|
39
|
-
this.router = router;
|
|
40
|
-
this.stateService = stateService;
|
|
41
|
-
this.tokenService = tokenService;
|
|
42
|
-
this.storageService = storageService;
|
|
43
|
-
this.syncService = syncService;
|
|
44
|
-
this.firebaseService = firebaseService;
|
|
45
|
-
// Timer para refresh proactivo
|
|
46
|
-
this.refreshTimerId = null;
|
|
47
|
-
this.syncSubscription = null;
|
|
48
|
-
// =============================================
|
|
49
|
-
// ESTADO PÚBLICO (Signals readonly)
|
|
50
|
-
// =============================================
|
|
51
|
-
/** Estado completo de autenticación */
|
|
52
|
-
this.state = this.stateService.state;
|
|
53
|
-
/** Usuario está autenticado */
|
|
54
|
-
this.isAuthenticated = this.stateService.isAuthenticated;
|
|
55
|
-
/** Estado de carga */
|
|
56
|
-
this.isLoading = this.stateService.isLoading;
|
|
57
|
-
/** Información del usuario */
|
|
58
|
-
this.user = this.stateService.user;
|
|
59
|
-
/** Token de acceso */
|
|
60
|
-
this.accessToken = this.stateService.accessToken;
|
|
61
|
-
/** Roles del usuario */
|
|
62
|
-
this.roles = this.stateService.roles;
|
|
63
|
-
/** Permisos del usuario */
|
|
64
|
-
this.permissions = this.stateService.permissions;
|
|
65
|
-
/** Usuario es super admin */
|
|
66
|
-
this.isSuperAdmin = this.stateService.isSuperAdmin;
|
|
67
|
-
/** Estado de MFA pendiente */
|
|
68
|
-
this.mfaPending = this.stateService.mfaPending;
|
|
69
|
-
/** Error actual */
|
|
70
|
-
this.error = this.stateService.error;
|
|
71
|
-
}
|
|
72
|
-
// =============================================
|
|
73
|
-
// INICIALIZACIÓN
|
|
74
|
-
// =============================================
|
|
75
|
-
/**
|
|
76
|
-
* Inicializa el servicio de autenticación.
|
|
77
|
-
* Llamado automáticamente por provideValtechAuth.
|
|
78
|
-
*/
|
|
79
|
-
async initialize() {
|
|
80
|
-
// 1. Cargar estado desde storage
|
|
81
|
-
const storedState = this.storageService.loadState();
|
|
82
|
-
if (storedState.accessToken) {
|
|
83
|
-
// 2. Verificar si token es válido
|
|
84
|
-
if (this.tokenService.isTokenValid(storedState.accessToken)) {
|
|
85
|
-
this.stateService.restoreFromStorage(storedState);
|
|
86
|
-
// Extraer info del token
|
|
87
|
-
const claims = this.tokenService.parseToken(storedState.accessToken);
|
|
88
|
-
if (claims) {
|
|
89
|
-
this.stateService.updateUserInfo(claims.uid, claims.email);
|
|
90
|
-
}
|
|
91
|
-
// 3. Iniciar timer de refresco proactivo
|
|
92
|
-
this.startRefreshTimer();
|
|
93
|
-
}
|
|
94
|
-
else if (storedState.refreshToken) {
|
|
95
|
-
// 4. Token expirado pero hay refresh token - intentar refrescar
|
|
96
|
-
try {
|
|
97
|
-
await firstValueFrom(this.refreshAccessToken());
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
this.clearState();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
this.clearState();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// 5. Iniciar sincronización entre pestañas
|
|
108
|
-
if (this.config.enableTabSync) {
|
|
109
|
-
this.syncService.start();
|
|
110
|
-
this.syncSubscription = this.syncService.onEvent$.subscribe(event => this.handleSyncEvent(event));
|
|
111
|
-
}
|
|
112
|
-
this.stateService.setLoading(false);
|
|
113
|
-
}
|
|
114
|
-
ngOnDestroy() {
|
|
115
|
-
this.stopRefreshTimer();
|
|
116
|
-
this.syncSubscription?.unsubscribe();
|
|
117
|
-
}
|
|
118
|
-
// =============================================
|
|
119
|
-
// AUTENTICACIÓN
|
|
120
|
-
// =============================================
|
|
121
|
-
/**
|
|
122
|
-
* Inicia sesión con email y contraseña.
|
|
123
|
-
*/
|
|
124
|
-
signin(request) {
|
|
125
|
-
this.stateService.clearError();
|
|
126
|
-
return this.http.post(`${this.baseUrl}/signin`, request).pipe(tap(response => {
|
|
127
|
-
if (response.mfaRequired) {
|
|
128
|
-
// MFA requerido - guardar estado temporal
|
|
129
|
-
this.stateService.setMFAPending({
|
|
130
|
-
required: true,
|
|
131
|
-
mfaToken: response.mfaToken,
|
|
132
|
-
method: response.mfaMethod,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
else if (response.accessToken) {
|
|
136
|
-
// Login exitoso sin MFA
|
|
137
|
-
this.handleSuccessfulAuth(response);
|
|
138
|
-
}
|
|
139
|
-
}), catchError(error => this.handleAuthError(error)));
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Registra un nuevo usuario.
|
|
143
|
-
* El usuario queda en estado PENDING hasta verificar su email.
|
|
144
|
-
*/
|
|
145
|
-
signup(request) {
|
|
146
|
-
this.stateService.clearError();
|
|
147
|
-
return this.http
|
|
148
|
-
.post(`${this.baseUrl}/signup`, request)
|
|
149
|
-
.pipe(catchError(error => this.handleAuthError(error)));
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Verifica email con código de 6 dígitos.
|
|
153
|
-
* Si es exitoso, hace auto-login y retorna tokens.
|
|
154
|
-
*/
|
|
155
|
-
verifyEmail(request) {
|
|
156
|
-
this.stateService.clearError();
|
|
157
|
-
return this.http.post(`${this.baseUrl}/verify-email`, request).pipe(tap(response => {
|
|
158
|
-
if (response.verified && response.accessToken) {
|
|
159
|
-
// Auto-login: guardar tokens y actualizar estado
|
|
160
|
-
this.handleSuccessfulAuth(response);
|
|
161
|
-
}
|
|
162
|
-
}), catchError(error => this.handleAuthError(error)));
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Reenvía código de verificación al email.
|
|
166
|
-
*/
|
|
167
|
-
resendCode(request) {
|
|
168
|
-
return this.http
|
|
169
|
-
.post(`${this.baseUrl}/resend-code`, request)
|
|
170
|
-
.pipe(catchError(error => this.handleAuthError(error)));
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Verifica código MFA.
|
|
174
|
-
*/
|
|
175
|
-
verifyMFA(code) {
|
|
176
|
-
const mfaState = this.mfaPending();
|
|
177
|
-
if (!mfaState.mfaToken) {
|
|
178
|
-
return throwError(() => ({
|
|
179
|
-
code: 'MFA_NOT_PENDING',
|
|
180
|
-
message: 'No hay verificación MFA pendiente',
|
|
181
|
-
}));
|
|
182
|
-
}
|
|
183
|
-
return this.http
|
|
184
|
-
.post(`${this.baseUrl}/mfa/verify`, {
|
|
185
|
-
mfaToken: mfaState.mfaToken,
|
|
186
|
-
code,
|
|
187
|
-
})
|
|
188
|
-
.pipe(tap(response => {
|
|
189
|
-
this.stateService.clearMFAPending();
|
|
190
|
-
this.handleSuccessfulAuth(response);
|
|
191
|
-
}), catchError(error => this.handleAuthError(error)));
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Refresca el token de acceso.
|
|
195
|
-
*/
|
|
196
|
-
refreshAccessToken() {
|
|
197
|
-
const refreshToken = this.state().refreshToken;
|
|
198
|
-
if (!refreshToken) {
|
|
199
|
-
return throwError(() => ({
|
|
200
|
-
code: 'NO_REFRESH_TOKEN',
|
|
201
|
-
message: 'No hay token de refresco',
|
|
202
|
-
}));
|
|
203
|
-
}
|
|
204
|
-
return this.http.post(`${this.baseUrl}/refresh`, { refreshToken }).pipe(tap(response => {
|
|
205
|
-
const expiresAt = Date.now() + response.expiresIn * 1000;
|
|
206
|
-
this.stateService.updateAccessToken(response.accessToken, response.expiresIn);
|
|
207
|
-
this.storageService.saveAccessToken(response.accessToken, expiresAt);
|
|
208
|
-
this.startRefreshTimer();
|
|
209
|
-
this.syncService.broadcast({
|
|
210
|
-
type: 'TOKEN_REFRESH',
|
|
211
|
-
payload: { accessToken: response.accessToken, expiresAt },
|
|
212
|
-
});
|
|
213
|
-
}), catchError(error => {
|
|
214
|
-
this.logout();
|
|
215
|
-
return throwError(() => error);
|
|
216
|
-
}));
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Cierra sesión.
|
|
220
|
-
*/
|
|
221
|
-
logout() {
|
|
222
|
-
const refreshToken = this.state().refreshToken;
|
|
223
|
-
// Notificar al backend (fire and forget)
|
|
224
|
-
if (refreshToken) {
|
|
225
|
-
this.http
|
|
226
|
-
.post(`${this.baseUrl}/logout`, { refreshToken })
|
|
227
|
-
.pipe(catchError(() => of(null)))
|
|
228
|
-
.subscribe();
|
|
229
|
-
}
|
|
230
|
-
// Cerrar sesión de Firebase si está integrado
|
|
231
|
-
this.signOutFirebase();
|
|
232
|
-
this.clearState();
|
|
233
|
-
this.syncService.broadcast({ type: 'LOGOUT' });
|
|
234
|
-
this.router.navigate([this.config.loginRoute]);
|
|
235
|
-
}
|
|
236
|
-
// =============================================
|
|
237
|
-
// MFA SETUP (usuario autenticado)
|
|
238
|
-
// =============================================
|
|
239
|
-
/**
|
|
240
|
-
* Configura MFA para el usuario.
|
|
241
|
-
*/
|
|
242
|
-
setupMFA(method, phone) {
|
|
243
|
-
return this.http
|
|
244
|
-
.post(`${this.baseUrl}/mfa/setup`, { method, phone })
|
|
245
|
-
.pipe(catchError(error => this.handleAuthError(error)));
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Confirma la configuración de MFA.
|
|
249
|
-
*/
|
|
250
|
-
confirmMFA(code) {
|
|
251
|
-
return this.http
|
|
252
|
-
.post(`${this.baseUrl}/mfa/confirm`, { code })
|
|
253
|
-
.pipe(catchError(error => this.handleAuthError(error)));
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Deshabilita MFA.
|
|
257
|
-
*/
|
|
258
|
-
disableMFA(password) {
|
|
259
|
-
return this.http
|
|
260
|
-
.post(`${this.baseUrl}/mfa/disable`, { password })
|
|
261
|
-
.pipe(catchError(error => this.handleAuthError(error)));
|
|
262
|
-
}
|
|
263
|
-
// =============================================
|
|
264
|
-
// PERMISOS
|
|
265
|
-
// =============================================
|
|
266
|
-
/**
|
|
267
|
-
* Obtiene los permisos actualizados del backend.
|
|
268
|
-
*/
|
|
269
|
-
fetchPermissions() {
|
|
270
|
-
return this.http.get(`${this.baseUrl}/permissions`).pipe(tap(response => {
|
|
271
|
-
this.stateService.updatePermissions(response.roles, response.permissions, response.isSuperAdmin);
|
|
272
|
-
this.storageService.savePermissions(response);
|
|
273
|
-
this.syncService.broadcast({ type: 'PERMISSIONS_UPDATE' });
|
|
274
|
-
}), catchError(error => this.handleAuthError(error)));
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Verifica si el usuario tiene un permiso específico.
|
|
278
|
-
* Formato: "resource:action" (ej: "templates:edit")
|
|
279
|
-
*/
|
|
280
|
-
hasPermission(permission) {
|
|
281
|
-
if (this.isSuperAdmin())
|
|
282
|
-
return true;
|
|
283
|
-
const [resource, action] = permission.split(':');
|
|
284
|
-
return this.permissions().some(p => {
|
|
285
|
-
const [pResource, pAction] = p.split(':');
|
|
286
|
-
return ((pResource === '*' || pResource === resource) && (pAction === '*' || pAction === action));
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Verifica si el usuario tiene alguno de los permisos dados.
|
|
291
|
-
*/
|
|
292
|
-
hasAnyPermission(permissions) {
|
|
293
|
-
return permissions.some(p => this.hasPermission(p));
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Verifica si el usuario tiene todos los permisos dados.
|
|
297
|
-
*/
|
|
298
|
-
hasAllPermissions(permissions) {
|
|
299
|
-
return permissions.every(p => this.hasPermission(p));
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Verifica si el usuario tiene un rol específico.
|
|
303
|
-
*/
|
|
304
|
-
hasRole(role) {
|
|
305
|
-
return this.roles().some(r => r.toLowerCase() === role.toLowerCase());
|
|
306
|
-
}
|
|
307
|
-
// =============================================
|
|
308
|
-
// PRIVATE METHODS
|
|
309
|
-
// =============================================
|
|
310
|
-
get baseUrl() {
|
|
311
|
-
return `${this.config.apiUrl}${this.config.authPrefix}`;
|
|
312
|
-
}
|
|
313
|
-
handleSuccessfulAuth(response) {
|
|
314
|
-
const expiresAt = Date.now() + response.expiresIn * 1000;
|
|
315
|
-
const tokenData = this.tokenService.parseToken(response.accessToken);
|
|
316
|
-
this.stateService.setAuthenticated({
|
|
317
|
-
accessToken: response.accessToken,
|
|
318
|
-
refreshToken: response.refreshToken,
|
|
319
|
-
userId: tokenData?.uid,
|
|
320
|
-
email: tokenData?.email,
|
|
321
|
-
roles: response.roles || [],
|
|
322
|
-
permissions: response.permissions || [],
|
|
323
|
-
isSuperAdmin: response.permissions?.includes('*:*') || false,
|
|
324
|
-
expiresAt,
|
|
325
|
-
});
|
|
326
|
-
this.storageService.saveState({
|
|
327
|
-
accessToken: response.accessToken,
|
|
328
|
-
refreshToken: response.refreshToken,
|
|
329
|
-
roles: response.roles || [],
|
|
330
|
-
permissions: response.permissions || [],
|
|
331
|
-
isSuperAdmin: response.permissions?.includes('*:*') || false,
|
|
332
|
-
expiresAt,
|
|
333
|
-
});
|
|
334
|
-
this.startRefreshTimer();
|
|
335
|
-
this.syncService.broadcast({ type: 'LOGIN' });
|
|
336
|
-
// Integración con Firebase
|
|
337
|
-
if (this.config.enableFirebaseIntegration &&
|
|
338
|
-
'firebaseToken' in response &&
|
|
339
|
-
response.firebaseToken) {
|
|
340
|
-
this.signInWithFirebase(response.firebaseToken);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
clearState() {
|
|
344
|
-
this.stopRefreshTimer();
|
|
345
|
-
this.stateService.reset();
|
|
346
|
-
this.storageService.clear();
|
|
347
|
-
}
|
|
348
|
-
startRefreshTimer() {
|
|
349
|
-
this.stopRefreshTimer();
|
|
350
|
-
const state = this.stateService.state();
|
|
351
|
-
if (!state.expiresAt)
|
|
352
|
-
return;
|
|
353
|
-
const refreshBeforeMs = (this.config.refreshBeforeExpiry || 60) * 1000;
|
|
354
|
-
const refreshAt = state.expiresAt - refreshBeforeMs;
|
|
355
|
-
const delay = refreshAt - Date.now();
|
|
356
|
-
if (delay > 0) {
|
|
357
|
-
this.refreshTimerId = setTimeout(() => {
|
|
358
|
-
this.refreshAccessToken().subscribe({
|
|
359
|
-
error: () => this.logout(),
|
|
360
|
-
});
|
|
361
|
-
}, delay);
|
|
362
|
-
}
|
|
363
|
-
else if (state.refreshToken) {
|
|
364
|
-
// Token ya debería refrescarse, intentar ahora
|
|
365
|
-
this.refreshAccessToken().subscribe({
|
|
366
|
-
error: () => this.logout(),
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
stopRefreshTimer() {
|
|
371
|
-
if (this.refreshTimerId) {
|
|
372
|
-
clearTimeout(this.refreshTimerId);
|
|
373
|
-
this.refreshTimerId = null;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
handleSyncEvent(event) {
|
|
377
|
-
switch (event.type) {
|
|
378
|
-
case 'LOGIN':
|
|
379
|
-
case 'TOKEN_REFRESH': {
|
|
380
|
-
// Recargar estado desde storage
|
|
381
|
-
const state = this.storageService.loadState();
|
|
382
|
-
if (state.accessToken) {
|
|
383
|
-
this.stateService.restoreFromStorage(state);
|
|
384
|
-
const claims = this.tokenService.parseToken(state.accessToken);
|
|
385
|
-
if (claims) {
|
|
386
|
-
this.stateService.updateUserInfo(claims.uid, claims.email);
|
|
387
|
-
}
|
|
388
|
-
this.startRefreshTimer();
|
|
389
|
-
}
|
|
390
|
-
break;
|
|
391
|
-
}
|
|
392
|
-
case 'LOGOUT':
|
|
393
|
-
this.stateService.reset();
|
|
394
|
-
this.stopRefreshTimer();
|
|
395
|
-
this.router.navigate([this.config.loginRoute]);
|
|
396
|
-
break;
|
|
397
|
-
case 'PERMISSIONS_UPDATE': {
|
|
398
|
-
const perms = this.storageService.loadPermissions();
|
|
399
|
-
this.stateService.updatePermissions(perms.roles, perms.permissions, perms.isSuperAdmin);
|
|
400
|
-
break;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
handleAuthError(error) {
|
|
405
|
-
const authError = {
|
|
406
|
-
code: error.error?.code || 'UNKNOWN_ERROR',
|
|
407
|
-
message: error.error?.message || 'Error de autenticación desconocido',
|
|
408
|
-
};
|
|
409
|
-
this.stateService.setError(authError);
|
|
410
|
-
return throwError(() => authError);
|
|
411
|
-
}
|
|
412
|
-
// =============================================
|
|
413
|
-
// FIREBASE INTEGRATION
|
|
414
|
-
// =============================================
|
|
415
|
-
async signInWithFirebase(firebaseToken) {
|
|
416
|
-
try {
|
|
417
|
-
if (this.firebaseService) {
|
|
418
|
-
await this.firebaseService.signInWithCustomToken(firebaseToken);
|
|
419
|
-
console.log('[ValtechAuth] Firebase signin successful');
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
console.warn('[ValtechAuth] FirebaseService not provided. Add provideValtechFirebase() to your providers.');
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
catch (error) {
|
|
426
|
-
// No bloquear el login principal si Firebase falla
|
|
427
|
-
console.error('[ValtechAuth] Firebase signin failed:', error);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
async signOutFirebase() {
|
|
431
|
-
if (!this.config.enableFirebaseIntegration)
|
|
432
|
-
return;
|
|
433
|
-
try {
|
|
434
|
-
if (this.firebaseService) {
|
|
435
|
-
await this.firebaseService.signOut();
|
|
436
|
-
console.log('[ValtechAuth] Firebase signout successful');
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
catch (error) {
|
|
440
|
-
// Ignorar errores de Firebase signout
|
|
441
|
-
console.warn('[ValtechAuth] Firebase signout failed:', error);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1.HttpClient }, { token: i2.Router }, { token: i3.AuthStateService }, { token: i4.TokenService }, { token: i5.AuthStorageService }, { token: i6.AuthSyncService }, { token: i7.FirebaseService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
445
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, providedIn: 'root' }); }
|
|
446
|
-
}
|
|
447
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, decorators: [{
|
|
448
|
-
type: Injectable,
|
|
449
|
-
args: [{ providedIn: 'root' }]
|
|
450
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
451
|
-
type: Inject,
|
|
452
|
-
args: [VALTECH_AUTH_CONFIG]
|
|
453
|
-
}] }, { type: i1.HttpClient }, { type: i2.Router }, { type: i3.AuthStateService }, { type: i4.TokenService }, { type: i5.AuthStorageService }, { type: i6.AuthSyncService }, { type: i7.FirebaseService }] });
|
|
454
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFHeEUsT0FBTyxFQUFjLFVBQVUsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRixPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7O0FBNEIvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFLdEIsWUFDdUMsTUFBeUIsRUFDdEQsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFlBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGNBQWtDLEVBQ2xDLFdBQTRCLEVBQzVCLGVBQWdDO1FBUEgsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDdEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFvQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBWjFDLCtCQUErQjtRQUN2QixtQkFBYyxHQUF5QyxJQUFJLENBQUM7UUFDNUQscUJBQWdCLEdBQXdCLElBQUksQ0FBQztRQWFyRCxnREFBZ0Q7UUFDaEQsb0NBQW9DO1FBQ3BDLGdEQUFnRDtRQUVoRCx1Q0FBdUM7UUFDOUIsVUFBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFD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LEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7K0dBMWVVLFdBQVcsa0JBTVosbUJBQW1CO21IQU5sQixXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPN0IsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9uRGVzdHJveSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIG9mLCBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTeW5jU2VydmljZSB9IGZyb20gJy4vc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFNpZ25pblJlcXVlc3QsXG4gIFNpZ25pblJlc3BvbnNlLFxuICBTaWdudXBSZXF1ZXN0LFxuICBTaWdudXBSZXNwb25zZSxcbiAgVmVyaWZ5RW1haWxSZXF1ZXN0LFxuICBWZXJpZnlFbWFpbFJlc3BvbnNlLFxuICBSZXNlbmRDb2RlUmVxdWVzdCxcbiAgUmVzZW5kQ29kZVJlc3BvbnNlLFxuICBNRkFWZXJpZnlSZXNwb25zZSxcbiAgUmVmcmVzaFJlc3BvbnNlLFxuICBHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxuICBNRkFTZXR1cFJlc3BvbnNlLFxuICBNRkFDb25maXJtUmVzcG9uc2UsXG4gIE1GQURpc2FibGVSZXNwb25zZSxcbiAgTUZBTWV0aG9kLFxuICBBdXRoRXJyb3IsXG4gIEF1dGhTeW5jRXZlbnQsXG4gIFZhbHRlY2hBdXRoQ29uZmlnLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcblxuXG4vKipcbiAqIFNlcnZpY2lvIHByaW5jaXBhbCBkZSBhdXRlbnRpY2FjacOzbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgbG9naW4oKSB7XG4gKiAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnNpZ25pbih7IGVtYWlsLCBwYXNzd29yZCB9KSk7XG4gKiAgICAgaWYgKHRoaXMuYXV0aC5tZmFQZW5kaW5nKCkucmVxdWlyZWQpIHtcbiAqICAgICAgIC8vIE1vc3RyYXIgVUkgZGUgTUZBXG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gVGltZXIgcGFyYSByZWZyZXNoIHByb2FjdGl2b1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN5bmNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVkFMVEVDSF9BVVRIX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hBdXRoQ29uZmlnLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBBdXRoU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogQXV0aFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IEF1dGhTeW5jU2VydmljZSxcbiAgICBwcml2YXRlIGZpcmViYXNlU2VydmljZTogRmlyZWJhc2VTZXJ2aWNlLFxuICApIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBQw5pCTElDTyAoU2lnbmFscyByZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzQXV0aGVudGljYXRlZDtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzTG9hZGluZztcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSB0aGlzLnN0YXRlU2VydmljZS51c2VyO1xuXG4gIC8qKiBUb2tlbiBkZSBhY2Nlc28gKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbjtcblxuICAvKiogUm9sZXMgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcm9sZXMgPSB0aGlzLnN0YXRlU2VydmljZS5yb2xlcztcblxuICAvKiogUGVybWlzb3MgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnMgPSB0aGlzLnN0YXRlU2VydmljZS5wZXJtaXNzaW9ucztcblxuICAvKiogVXN1YXJpbyBlcyBzdXBlciBhZG1pbiAqL1xuICByZWFkb25seSBpc1N1cGVyQWRtaW4gPSB0aGlzLnN0YXRlU2VydmljZS5pc1N1cGVyQWRtaW47XG5cbiAgLyoqIEVzdGFkbyBkZSBNRkEgcGVuZGllbnRlICovXG4gIHJlYWRvbmx5IG1mYVBlbmRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5tZmFQZW5kaW5nO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSB0aGlzLnN0YXRlU2VydmljZS5lcnJvcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKiBMbGFtYWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aC5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4gQ2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgY29uc3Qgc3RvcmVkU3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyAyLiBWZXJpZmljYXIgc2kgdG9rZW4gZXMgdsOhbGlkb1xuICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLmlzVG9rZW5WYWxpZChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICAvLyBFeHRyYWVyIGluZm8gZGVsIHRva2VuXG4gICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEluaWNpYXIgdGltZXIgZGUgcmVmcmVzY28gcHJvYWN0aXZvXG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RvcmVkU3RhdGUucmVmcmVzaFRva2VuKSB7XG4gICAgICAgIC8vIDQuIFRva2VuIGV4cGlyYWRvIHBlcm8gaGF5IHJlZnJlc2ggdG9rZW4gLSBpbnRlbnRhciByZWZyZXNjYXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIEluaWNpYXIgc2luY3Jvbml6YWNpw7NuIGVudHJlIHBlc3Rhw7Fhc1xuICAgIGlmICh0aGlzLmNvbmZpZy5lbmFibGVUYWJTeW5jKSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLnN5bmNTZXJ2aWNlLm9uRXZlbnQkLnN1YnNjcmliZShldmVudCA9PlxuICAgICAgICB0aGlzLmhhbmRsZVN5bmNFdmVudChldmVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQVVURU5USUNBQ0nDk05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBlbWFpbCB5IGNvbnRyYXNlw7FhLlxuICAgKi9cbiAgc2lnbmluKHJlcXVlc3Q6IFNpZ25pblJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNpZ25pblJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ25pbmAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICAvLyBNRkEgcmVxdWVyaWRvIC0gZ3VhcmRhciBlc3RhZG8gdGVtcG9yYWxcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3BvbnNlLm1mYVRva2VuISxcbiAgICAgICAgICAgIG1ldGhvZDogcmVzcG9uc2UubWZhTWV0aG9kISxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIC8vIExvZ2luIGV4aXRvc28gc2luIE1GQVxuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgdW4gbnVldm8gdXN1YXJpby5cbiAgICogRWwgdXN1YXJpbyBxdWVkYSBlbiBlc3RhZG8gUEVORElORyBoYXN0YSB2ZXJpZmljYXIgc3UgZW1haWwuXG4gICAqL1xuICBzaWdudXAocmVxdWVzdDogU2lnbnVwUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbnVwUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWdudXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWdudXBgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBlbWFpbCBjb24gY8OzZGlnbyBkZSA2IGTDrWdpdG9zLlxuICAgKiBTaSBlcyBleGl0b3NvLCBoYWNlIGF1dG8tbG9naW4geSByZXRvcm5hIHRva2Vucy5cbiAgICovXG4gIHZlcmlmeUVtYWlsKHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdCk6IE9ic2VydmFibGU8VmVyaWZ5RW1haWxSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxWZXJpZnlFbWFpbFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3ZlcmlmeS1lbWFpbGAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UudmVyaWZpZWQgJiYgcmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAvLyBBdXRvLWxvZ2luOiBndWFyZGFyIHRva2VucyB5IGFjdHVhbGl6YXIgZXN0YWRvXG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZW52w61hIGPDs2RpZ28gZGUgdmVyaWZpY2FjacOzbiBhbCBlbWFpbC5cbiAgICovXG4gIHJlc2VuZENvZGUocmVxdWVzdDogUmVzZW5kQ29kZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc2VuZENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlc2VuZENvZGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZXNlbmQtY29kZWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGPDs2RpZ28gTUZBLlxuICAgKi9cbiAgdmVyaWZ5TUZBKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8TUZBVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICBjb25zdCBtZmFTdGF0ZSA9IHRoaXMubWZhUGVuZGluZygpO1xuICAgIGlmICghbWZhU3RhdGUubWZhVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgIGNvZGU6ICdNRkFfTk9UX1BFTkRJTkcnLFxuICAgICAgICBtZXNzYWdlOiAnTm8gaGF5IHZlcmlmaWNhY2nDs24gTUZBIHBlbmRpZW50ZScsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBVmVyaWZ5UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3ZlcmlmeWAsIHtcbiAgICAgICAgbWZhVG9rZW46IG1mYVN0YXRlLm1mYVRva2VuLFxuICAgICAgICBjb2RlLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2NhIGVsIHRva2VuIGRlIGFjY2Vzby5cbiAgICovXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW47XG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgIGNvZGU6ICdOT19SRUZSRVNIX1RPS0VOJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB0b2tlbiBkZSByZWZyZXNjbycsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgeyByZWZyZXNoVG9rZW4gfSkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwb25zZS5leHBpcmVzSW4gKiAxMDAwO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiwgcmVzcG9uc2UuZXhwaXJlc0luKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3Qoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9SRUZSRVNIJyxcbiAgICAgICAgICBwYXlsb2FkOiB7IGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiwgZXhwaXJlc0F0IH0sXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENpZXJyYSBzZXNpw7NuLlxuICAgKi9cbiAgbG9nb3V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW47XG5cbiAgICAvLyBOb3RpZmljYXIgYWwgYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIHsgcmVmcmVzaFRva2VuIH0pXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2VycmFyIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2kgZXN0w6EgaW50ZWdyYWRvXG4gICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcblxuICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnLmxvZ2luUm91dGVdKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLlxuICAgKi9cbiAgZGlzYWJsZU1GQShwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCB7IHBhc3N3b3JkIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUk1JU09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBhY3R1YWxpemFkb3MgZGVsIGJhY2tlbmQuXG4gICAqL1xuICBmZXRjaFBlcm1pc3Npb25zKCk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFBlcm1pc3Npb25zUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcGVybWlzc2lvbnNgKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgICAgcmVzcG9uc2Uucm9sZXMsXG4gICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnMsXG4gICAgICAgICAgcmVzcG9uc2UuaXNTdXBlckFkbWluXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnUEVSTUlTU0lPTlNfVVBEQVRFJyB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28uXG4gICAqIEZvcm1hdG86IFwicmVzb3VyY2U6YWN0aW9uXCIgKGVqOiBcInRlbXBsYXRlczplZGl0XCIpXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbigpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZSwgYWN0aW9uXSA9IHBlcm1pc3Npb24uc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucygpLnNvbWUocCA9PiB7XG4gICAgICBjb25zdCBbcFJlc291cmNlLCBwQWN0aW9uXSA9IHAuc3BsaXQoJzonKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwUmVzb3VyY2UgPT09ICcqJyB8fCBwUmVzb3VyY2UgPT09IHJlc291cmNlKSAmJiAocEFjdGlvbiA9PT0gJyonIHx8IHBBY3Rpb24gPT09IGFjdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBhbGd1bm8gZGUgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQW55UGVybWlzc2lvbihwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB0b2RvcyBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbGxQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuZXZlcnkocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKi9cbiAgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcygpLnNvbWUociA9PiByLnRvTG93ZXJDYXNlKCkgPT09IHJvbGUudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXBpVXJsfSR7dGhpcy5jb25maWcuYXV0aFByZWZpeH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZTogU2lnbmluUmVzcG9uc2UgfCBNRkFWZXJpZnlSZXNwb25zZSk6IHZvaWQge1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwb25zZS5leHBpcmVzSW4hICogMTAwMDtcbiAgICBjb25zdCB0b2tlbkRhdGEgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuISk7XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICB1c2VySWQ6IHRva2VuRGF0YT8udWlkLFxuICAgICAgZW1haWw6IHRva2VuRGF0YT8uZW1haWwsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgZmFsc2UsXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVTdGF0ZSh7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVzcG9uc2UuYWNjZXNzVG9rZW4hLFxuICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4hLFxuICAgICAgcm9sZXM6IHJlc3BvbnNlLnJvbGVzIHx8IFtdLFxuICAgICAgcGVybWlzc2lvbnM6IHJlc3BvbnNlLnBlcm1pc3Npb25zIHx8IFtdLFxuICAgICAgaXNTdXBlckFkbWluOiByZXNwb25zZS5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IGZhbHNlLFxuICAgICAgZXhwaXJlc0F0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR0lOJyB9KTtcblxuICAgIC8vIEludGVncmFjacOzbiBjb24gRmlyZWJhc2VcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmXG4gICAgICAnZmlyZWJhc2VUb2tlbicgaW4gcmVzcG9uc2UgJiZcbiAgICAgIHJlc3BvbnNlLmZpcmViYXNlVG9rZW5cbiAgICApIHtcbiAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCk7XG4gICAgaWYgKCFzdGF0ZS5leHBpcmVzQXQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlZnJlc2hCZWZvcmVNcyA9ICh0aGlzLmNvbmZpZy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOlxuICAgICAgY2FzZSAnVE9LRU5fUkVGUkVTSCc6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xPR09VVCc6XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcubG9naW5Sb3V0ZV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BFUk1JU1NJT05TX1VQREFURSc6IHtcbiAgICAgICAgY29uc3QgcGVybXMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhwZXJtcy5yb2xlcywgcGVybXMucGVybWlzc2lvbnMsIHBlcm1zLmlzU3VwZXJBZG1pbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXV0aEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgIGNvZGU6IGVycm9yLmVycm9yPy5jb2RlIHx8ICdVTktOT1dOX0VSUk9SJyxcbiAgICAgIG1lc3NhZ2U6IGVycm9yLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBkZXNjb25vY2lkbycsXG4gICAgfTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklSRUJBU0UgSU5URUdSQVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduSW5XaXRoRmlyZWJhc2UoZmlyZWJhc2VUb2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZpcmViYXNlU2VydmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlU2VydmljZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4oZmlyZWJhc2VUb2tlbik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBzdWNjZXNzZnVsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2VTZXJ2aWNlIG5vdCBwcm92aWRlZC4gQWRkIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2UoKSB0byB5b3VyIHByb3ZpZGVycy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGVsIGxvZ2luIHByaW5jaXBhbCBzaSBGaXJlYmFzZSBmYWxsYVxuICAgICAgY29uc29sZS5lcnJvcignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25PdXRGaXJlYmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, } from '@angular/core';
|
|
2
|
-
import { provideHttpClient, withInterceptors } from '@angular/common/http';
|
|
3
|
-
import { authInterceptor } from './interceptor';
|
|
4
|
-
import { AuthService } from './auth.service';
|
|
5
|
-
/**
|
|
6
|
-
* Token de inyección para la configuración de Auth.
|
|
7
|
-
*/
|
|
8
|
-
export const VALTECH_AUTH_CONFIG = new InjectionToken('ValtechAuthConfig');
|
|
9
|
-
/**
|
|
10
|
-
* Configuración por defecto.
|
|
11
|
-
*/
|
|
12
|
-
export const DEFAULT_AUTH_CONFIG = {
|
|
13
|
-
authPrefix: '/v2/auth',
|
|
14
|
-
storagePrefix: 'valtech_auth_',
|
|
15
|
-
refreshBeforeExpiry: 60,
|
|
16
|
-
enableTabSync: true,
|
|
17
|
-
loginRoute: '/login',
|
|
18
|
-
homeRoute: '/',
|
|
19
|
-
unauthorizedRoute: '/unauthorized',
|
|
20
|
-
enableFirebaseIntegration: false,
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Factory para inicializar el AuthService.
|
|
24
|
-
*/
|
|
25
|
-
function initializeAuth(authService) {
|
|
26
|
-
return () => authService.initialize();
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Provee el servicio de autenticación a la aplicación Angular.
|
|
30
|
-
*
|
|
31
|
-
* @param config - Configuración de autenticación
|
|
32
|
-
* @returns EnvironmentProviders para usar en bootstrapApplication
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // main.ts
|
|
37
|
-
* import { bootstrapApplication } from '@angular/platform-browser';
|
|
38
|
-
* import { provideValtechAuth } from 'valtech-components';
|
|
39
|
-
* import { environment } from './environments/environment';
|
|
40
|
-
*
|
|
41
|
-
* bootstrapApplication(AppComponent, {
|
|
42
|
-
* providers: [
|
|
43
|
-
* provideValtechAuth({
|
|
44
|
-
* apiUrl: environment.apiUrl,
|
|
45
|
-
* enableFirebaseIntegration: true,
|
|
46
|
-
* }),
|
|
47
|
-
* ],
|
|
48
|
-
* });
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export function provideValtechAuth(config) {
|
|
52
|
-
const mergedConfig = {
|
|
53
|
-
...DEFAULT_AUTH_CONFIG,
|
|
54
|
-
...config,
|
|
55
|
-
};
|
|
56
|
-
return makeEnvironmentProviders([
|
|
57
|
-
{ provide: VALTECH_AUTH_CONFIG, useValue: mergedConfig },
|
|
58
|
-
provideHttpClient(withInterceptors([authInterceptor])),
|
|
59
|
-
// Inicializar AuthService al arrancar la app
|
|
60
|
-
{
|
|
61
|
-
provide: APP_INITIALIZER,
|
|
62
|
-
useFactory: initializeAuth,
|
|
63
|
-
deps: [AuthService],
|
|
64
|
-
multi: true,
|
|
65
|
-
},
|
|
66
|
-
]);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Provee solo el interceptor (para apps que ya tienen AuthService configurado manualmente).
|
|
70
|
-
*/
|
|
71
|
-
export function provideValtechAuthInterceptor() {
|
|
72
|
-
return makeEnvironmentProviders([
|
|
73
|
-
provideHttpClient(withInterceptors([authInterceptor])),
|
|
74
|
-
]);
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixlQUFlLEdBRWhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQ25ELG1CQUFtQixDQUNwQixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBK0I7SUFDN0QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QixhQUFhLEVBQUUsSUFBSTtJQUNuQixVQUFVLEVBQUUsUUFBUTtJQUNwQixTQUFTLEVBQUUsR0FBRztJQUNkLGlCQUFpQixFQUFFLGVBQWU7SUFDbEMseUJBQXlCLEVBQUUsS0FBSztDQUNqQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxXQUF3QjtJQUM5QyxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE1BQXlCO0lBRXpCLE1BQU0sWUFBWSxHQUFzQjtRQUN0QyxHQUFHLG1CQUFtQjtRQUN0QixHQUFHLE1BQU07S0FDVixDQUFDO0lBRUYsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO1FBQ3hELGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUN0RCw2Q0FBNkM7UUFDN0M7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsY0FBYztZQUMxQixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDbkIsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7S0FDdkQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuICBBUFBfSU5JVElBTElaRVIsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBwcm92aWRlSHR0cENsaWVudCwgd2l0aEludGVyY2VwdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFZhbHRlY2hBdXRoQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBhdXRoSW50ZXJjZXB0b3IgfSBmcm9tICcuL2ludGVyY2VwdG9yJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRva2VuIGRlIGlueWVjY2nDs24gcGFyYSBsYSBjb25maWd1cmFjacOzbiBkZSBBdXRoLlxuICovXG5leHBvcnQgY29uc3QgVkFMVEVDSF9BVVRIX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWYWx0ZWNoQXV0aENvbmZpZz4oXG4gICdWYWx0ZWNoQXV0aENvbmZpZydcbik7XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gcG9yIGRlZmVjdG8uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FVVEhfQ09ORklHOiBQYXJ0aWFsPFZhbHRlY2hBdXRoQ29uZmlnPiA9IHtcbiAgYXV0aFByZWZpeDogJy92Mi9hdXRoJyxcbiAgc3RvcmFnZVByZWZpeDogJ3ZhbHRlY2hfYXV0aF8nLFxuICByZWZyZXNoQmVmb3JlRXhwaXJ5OiA2MCxcbiAgZW5hYmxlVGFiU3luYzogdHJ1ZSxcbiAgbG9naW5Sb3V0ZTogJy9sb2dpbicsXG4gIGhvbWVSb3V0ZTogJy8nLFxuICB1bmF1dGhvcml6ZWRSb3V0ZTogJy91bmF1dGhvcml6ZWQnLFxuICBlbmFibGVGaXJlYmFzZUludGVncmF0aW9uOiBmYWxzZSxcbn07XG5cbi8qKlxuICogRmFjdG9yeSBwYXJhIGluaWNpYWxpemFyIGVsIEF1dGhTZXJ2aWNlLlxuICovXG5mdW5jdGlvbiBpbml0aWFsaXplQXV0aChhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuICgpID0+IGF1dGhTZXJ2aWNlLmluaXRpYWxpemUoKTtcbn1cblxuLyoqXG4gKiBQcm92ZWUgZWwgc2VydmljaW8gZGUgYXV0ZW50aWNhY2nDs24gYSBsYSBhcGxpY2FjacOzbiBBbmd1bGFyLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmFjacOzbiBkZSBhdXRlbnRpY2FjacOzblxuICogQHJldHVybnMgRW52aXJvbm1lbnRQcm92aWRlcnMgcGFyYSB1c2FyIGVuIGJvb3RzdHJhcEFwcGxpY2F0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIG1haW4udHNcbiAqIGltcG9ydCB7IGJvb3RzdHJhcEFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaEF1dGggfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICogaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG4gKlxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVWYWx0ZWNoQXV0aCh7XG4gKiAgICAgICBhcGlVcmw6IGVudmlyb25tZW50LmFwaVVybCxcbiAqICAgICAgIGVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb246IHRydWUsXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVZhbHRlY2hBdXRoKFxuICBjb25maWc6IFZhbHRlY2hBdXRoQ29uZmlnXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIGNvbnN0IG1lcmdlZENvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgPSB7XG4gICAgLi4uREVGQVVMVF9BVVRIX0NPTkZJRyxcbiAgICAuLi5jb25maWcsXG4gIH07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgeyBwcm92aWRlOiBWQUxURUNIX0FVVEhfQ09ORklHLCB1c2VWYWx1ZTogbWVyZ2VkQ29uZmlnIH0sXG4gICAgcHJvdmlkZUh0dHBDbGllbnQod2l0aEludGVyY2VwdG9ycyhbYXV0aEludGVyY2VwdG9yXSkpLFxuICAgIC8vIEluaWNpYWxpemFyIEF1dGhTZXJ2aWNlIGFsIGFycmFuY2FyIGxhIGFwcFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6IGluaXRpYWxpemVBdXRoLFxuICAgICAgZGVwczogW0F1dGhTZXJ2aWNlXSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuXG4vKipcbiAqIFByb3ZlZSBzb2xvIGVsIGludGVyY2VwdG9yIChwYXJhIGFwcHMgcXVlIHlhIHRpZW5lbiBBdXRoU2VydmljZSBjb25maWd1cmFkbyBtYW51YWxtZW50ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaEF1dGhJbnRlcmNlcHRvcigpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHByb3ZpZGVIdHRwQ2xpZW50KHdpdGhJbnRlcmNlcHRvcnMoW2F1dGhJbnRlcmNlcHRvcl0pKSxcbiAgXSk7XG59XG4iXX0=
|