@nauth-toolkit/client-angular 0.1.58 → 0.1.60

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.
@@ -1,777 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
3
- import { filter } from 'rxjs/operators';
4
- import { NAUTH_CLIENT_CONFIG } from './tokens';
5
- import { NAuthClient, } from '@nauth-toolkit/client';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./http-adapter";
8
- /**
9
- * Angular wrapper around NAuthClient that provides promise-based auth methods and reactive state.
10
- *
11
- * This service provides:
12
- * - Reactive state (currentUser$, isAuthenticated$, challenge$)
13
- * - All core auth methods as Promises (login, signup, logout, refresh)
14
- * - Profile management (getProfile, updateProfile, changePassword)
15
- * - Challenge flow methods (respondToChallenge, resendCode)
16
- * - MFA management (getMfaStatus, setupMfaDevice, etc.)
17
- * - Social authentication and account linking
18
- * - Device trust management
19
- * - Audit history
20
- *
21
- * @example
22
- * ```typescript
23
- * constructor(private auth: AuthService) {}
24
- *
25
- * // Reactive state
26
- * this.auth.currentUser$.subscribe(user => ...);
27
- * this.auth.isAuthenticated$.subscribe(isAuth => ...);
28
- *
29
- * // Auth operations with async/await
30
- * const response = await this.auth.login(email, password);
31
- *
32
- * // Profile management
33
- * await this.auth.changePassword(oldPassword, newPassword);
34
- * const user = await this.auth.updateProfile({ firstName: 'John' });
35
- *
36
- * // MFA operations
37
- * const status = await this.auth.getMfaStatus();
38
- * ```
39
- */
40
- export class AuthService {
41
- client;
42
- config;
43
- currentUserSubject = new BehaviorSubject(null);
44
- isAuthenticatedSubject = new BehaviorSubject(false);
45
- challengeSubject = new BehaviorSubject(null);
46
- authEventsSubject = new Subject();
47
- initialized = false;
48
- /**
49
- * @param config - Injected client configuration (required)
50
- * @param httpAdapter - Angular HTTP adapter for making requests (required)
51
- */
52
- constructor(config, httpAdapter) {
53
- this.config = config;
54
- // Use provided httpAdapter (from config or injected)
55
- const adapter = config.httpAdapter ?? httpAdapter;
56
- if (!adapter) {
57
- throw new Error('HttpAdapter not found. Either provide httpAdapter in NAUTH_CLIENT_CONFIG or ensure HttpClient is available.');
58
- }
59
- this.client = new NAuthClient({
60
- ...config,
61
- httpAdapter: adapter,
62
- onAuthStateChange: (user) => {
63
- this.currentUserSubject.next(user);
64
- this.isAuthenticatedSubject.next(Boolean(user));
65
- config.onAuthStateChange?.(user);
66
- },
67
- });
68
- // Forward all client events to Observable stream
69
- this.client.on('*', (event) => {
70
- this.authEventsSubject.next(event);
71
- });
72
- // Auto-initialize on construction (hydrate from storage)
73
- this.initialize();
74
- }
75
- // ============================================================================
76
- // Reactive State Observables
77
- // ============================================================================
78
- /**
79
- * Current user observable.
80
- */
81
- get currentUser$() {
82
- return this.currentUserSubject.asObservable();
83
- }
84
- /**
85
- * Authenticated state observable.
86
- */
87
- get isAuthenticated$() {
88
- return this.isAuthenticatedSubject.asObservable();
89
- }
90
- /**
91
- * Current challenge observable (for reactive challenge navigation).
92
- */
93
- get challenge$() {
94
- return this.challengeSubject.asObservable();
95
- }
96
- /**
97
- * Authentication events stream.
98
- * Emits all auth lifecycle events for custom logic, analytics, or UI updates.
99
- */
100
- get authEvents$() {
101
- return this.authEventsSubject.asObservable();
102
- }
103
- /**
104
- * Successful authentication events stream.
105
- * Emits when user successfully authenticates (login, signup, social auth).
106
- */
107
- get authSuccess$() {
108
- return this.authEventsSubject.pipe(filter((e) => e.type === 'auth:success'));
109
- }
110
- /**
111
- * Authentication error events stream.
112
- * Emits when authentication fails (login error, OAuth error, etc.).
113
- */
114
- get authError$() {
115
- return this.authEventsSubject.pipe(filter((e) => e.type === 'auth:error' || e.type === 'oauth:error'));
116
- }
117
- // ============================================================================
118
- // Sync State Accessors (for guards, templates)
119
- // ============================================================================
120
- /**
121
- * Check if authenticated (sync, uses cached state).
122
- */
123
- isAuthenticated() {
124
- return this.client.isAuthenticatedSync();
125
- }
126
- /**
127
- * Get current user (sync, uses cached state).
128
- */
129
- getCurrentUser() {
130
- return this.client.getCurrentUser();
131
- }
132
- /**
133
- * Get current challenge (sync).
134
- */
135
- getCurrentChallenge() {
136
- return this.challengeSubject.value;
137
- }
138
- // ============================================================================
139
- // Core Auth Methods
140
- // ============================================================================
141
- /**
142
- * Login with identifier and password.
143
- *
144
- * @param identifier - User email or username
145
- * @param password - User password
146
- * @returns Promise with auth response or challenge
147
- *
148
- * @example
149
- * ```typescript
150
- * const response = await this.auth.login('user@example.com', 'password');
151
- * if (response.challengeName) {
152
- * // Handle challenge
153
- * } else {
154
- * // Login successful
155
- * }
156
- * ```
157
- */
158
- async login(identifier, password) {
159
- const res = await this.client.login(identifier, password);
160
- return this.updateChallengeState(res);
161
- }
162
- /**
163
- * Signup with credentials.
164
- *
165
- * @param payload - Signup request payload
166
- * @returns Promise with auth response or challenge
167
- *
168
- * @example
169
- * ```typescript
170
- * const response = await this.auth.signup({
171
- * email: 'new@example.com',
172
- * password: 'SecurePass123!',
173
- * firstName: 'John',
174
- * });
175
- * ```
176
- */
177
- async signup(payload) {
178
- const res = await this.client.signup(payload);
179
- return this.updateChallengeState(res);
180
- }
181
- /**
182
- * Logout current session.
183
- *
184
- * @param forgetDevice - If true, removes device trust
185
- *
186
- * @example
187
- * ```typescript
188
- * await this.auth.logout();
189
- * ```
190
- */
191
- async logout(forgetDevice) {
192
- await this.client.logout(forgetDevice);
193
- this.challengeSubject.next(null);
194
- // Explicitly update auth state after logout
195
- this.currentUserSubject.next(null);
196
- this.isAuthenticatedSubject.next(false);
197
- // Clear CSRF token cookie if in cookies mode
198
- // Note: Backend should clear httpOnly cookies, but we clear non-httpOnly ones
199
- if (this.config.tokenDelivery === 'cookies' && typeof document !== 'undefined') {
200
- const csrfCookieName = this.config.csrf?.cookieName ?? 'nauth_csrf_token';
201
- // Extract domain from baseUrl if possible
202
- try {
203
- const url = new URL(this.config.baseUrl);
204
- document.cookie = `${csrfCookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${url.hostname}`;
205
- // Also try without domain (for localhost)
206
- document.cookie = `${csrfCookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
207
- }
208
- catch {
209
- // Fallback if baseUrl parsing fails
210
- document.cookie = `${csrfCookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
211
- }
212
- }
213
- }
214
- /**
215
- * Logout all sessions.
216
- *
217
- * Revokes all active sessions for the current user across all devices.
218
- * Optionally revokes all trusted devices if forgetDevices is true.
219
- *
220
- * @param forgetDevices - If true, also revokes all trusted devices (default: false)
221
- * @returns Promise with number of sessions revoked
222
- *
223
- * @example
224
- * ```typescript
225
- * const result = await this.auth.logoutAll();
226
- * console.log(`Revoked ${result.revokedCount} sessions`);
227
- * ```
228
- */
229
- async logoutAll(forgetDevices) {
230
- const res = await this.client.logoutAll(forgetDevices);
231
- this.challengeSubject.next(null);
232
- // Explicitly update auth state after logout
233
- this.currentUserSubject.next(null);
234
- this.isAuthenticatedSubject.next(false);
235
- return res;
236
- }
237
- /**
238
- * Refresh tokens.
239
- *
240
- * @returns Promise with new tokens
241
- *
242
- * @example
243
- * ```typescript
244
- * const tokens = await this.auth.refresh();
245
- * ```
246
- */
247
- async refresh() {
248
- return this.client.refreshTokens();
249
- }
250
- // ============================================================================
251
- // Account Recovery (Forgot Password)
252
- // ============================================================================
253
- /**
254
- * Request a password reset code (forgot password).
255
- *
256
- * @param identifier - User email, username, or phone
257
- * @returns Promise with password reset response
258
- *
259
- * @example
260
- * ```typescript
261
- * await this.auth.forgotPassword('user@example.com');
262
- * ```
263
- */
264
- async forgotPassword(identifier) {
265
- return this.client.forgotPassword(identifier);
266
- }
267
- /**
268
- * Confirm a password reset code and set a new password.
269
- *
270
- * @param identifier - User email, username, or phone
271
- * @param code - One-time reset code
272
- * @param newPassword - New password
273
- * @returns Promise with confirmation response
274
- *
275
- * @example
276
- * ```typescript
277
- * await this.auth.confirmForgotPassword('user@example.com', '123456', 'NewPass123!');
278
- * ```
279
- */
280
- async confirmForgotPassword(identifier, code, newPassword) {
281
- return this.client.confirmForgotPassword(identifier, code, newPassword);
282
- }
283
- /**
284
- * Change user password (requires current password).
285
- *
286
- * @param oldPassword - Current password
287
- * @param newPassword - New password (must meet requirements)
288
- * @returns Promise that resolves when password is changed
289
- *
290
- * @example
291
- * ```typescript
292
- * await this.auth.changePassword('oldPassword123', 'newSecurePassword456!');
293
- * ```
294
- */
295
- async changePassword(oldPassword, newPassword) {
296
- return this.client.changePassword(oldPassword, newPassword);
297
- }
298
- /**
299
- * Request password change (must change on next login).
300
- *
301
- * @returns Promise that resolves when request is sent
302
- *
303
- * @example
304
- * ```typescript
305
- * await this.auth.requestPasswordChange();
306
- * ```
307
- */
308
- async requestPasswordChange() {
309
- return this.client.requestPasswordChange();
310
- }
311
- // ============================================================================
312
- // Profile Management
313
- // ============================================================================
314
- /**
315
- * Get current user profile.
316
- *
317
- * @returns Promise of current user profile
318
- *
319
- * @example
320
- * ```typescript
321
- * const user = await this.auth.getProfile();
322
- * console.log('User profile:', user);
323
- * ```
324
- */
325
- async getProfile() {
326
- const user = await this.client.getProfile();
327
- // Update local state when profile is fetched
328
- this.currentUserSubject.next(user);
329
- return user;
330
- }
331
- /**
332
- * Update user profile.
333
- *
334
- * @param updates - Profile fields to update
335
- * @returns Promise of updated user profile
336
- *
337
- * @example
338
- * ```typescript
339
- * const user = await this.auth.updateProfile({ firstName: 'John', lastName: 'Doe' });
340
- * console.log('Profile updated:', user);
341
- * ```
342
- */
343
- async updateProfile(updates) {
344
- const user = await this.client.updateProfile(updates);
345
- // Update local state when profile is updated
346
- this.currentUserSubject.next(user);
347
- return user;
348
- }
349
- // ============================================================================
350
- // Challenge Flow Methods (Essential for any auth flow)
351
- // ============================================================================
352
- /**
353
- * Respond to a challenge (VERIFY_EMAIL, VERIFY_PHONE, MFA_REQUIRED, etc.).
354
- *
355
- * @param response - Challenge response data
356
- * @returns Promise with auth response or next challenge
357
- *
358
- * @example
359
- * ```typescript
360
- * const result = await this.auth.respondToChallenge({
361
- * session: challengeSession,
362
- * type: 'VERIFY_EMAIL',
363
- * code: '123456',
364
- * });
365
- * ```
366
- */
367
- async respondToChallenge(response) {
368
- const res = await this.client.respondToChallenge(response);
369
- return this.updateChallengeState(res);
370
- }
371
- /**
372
- * Resend challenge code.
373
- *
374
- * @param session - Challenge session token
375
- * @returns Promise with destination information
376
- *
377
- * @example
378
- * ```typescript
379
- * const result = await this.auth.resendCode(session);
380
- * console.log('Code sent to:', result.destination);
381
- * ```
382
- */
383
- async resendCode(session) {
384
- return this.client.resendCode(session);
385
- }
386
- /**
387
- * Get MFA setup data (for MFA_SETUP_REQUIRED challenge).
388
- *
389
- * Returns method-specific setup information:
390
- * - TOTP: { secret, qrCode, manualEntryKey }
391
- * - SMS: { maskedPhone }
392
- * - Email: { maskedEmail }
393
- * - Passkey: WebAuthn registration options
394
- *
395
- * @param session - Challenge session token
396
- * @param method - MFA method to set up
397
- * @returns Promise of setup data response
398
- *
399
- * @example
400
- * ```typescript
401
- * const setupData = await this.auth.getSetupData(session, 'totp');
402
- * console.log('QR Code:', setupData.setupData.qrCode);
403
- * ```
404
- */
405
- async getSetupData(session, method) {
406
- return this.client.getSetupData(session, method);
407
- }
408
- /**
409
- * Get MFA challenge data (for MFA_REQUIRED challenge - e.g., passkey options).
410
- *
411
- * @param session - Challenge session token
412
- * @param method - Challenge method
413
- * @returns Promise of challenge data response
414
- *
415
- * @example
416
- * ```typescript
417
- * const challengeData = await this.auth.getChallengeData(session, 'passkey');
418
- * ```
419
- */
420
- async getChallengeData(session, method) {
421
- return this.client.getChallengeData(session, method);
422
- }
423
- /**
424
- * Clear stored challenge (when navigating away from challenge flow).
425
- *
426
- * @returns Promise that resolves when challenge is cleared
427
- *
428
- * @example
429
- * ```typescript
430
- * await this.auth.clearChallenge();
431
- * ```
432
- */
433
- async clearChallenge() {
434
- await this.client.clearStoredChallenge();
435
- this.challengeSubject.next(null);
436
- }
437
- // ============================================================================
438
- // Social Authentication
439
- // ============================================================================
440
- /**
441
- * Initiate social OAuth login flow.
442
- * Redirects the browser to backend `/auth/social/:provider/redirect`.
443
- *
444
- * @param provider - Social provider ('google', 'apple', 'facebook')
445
- * @param options - Optional redirect options
446
- * @returns Promise that resolves when redirect starts
447
- *
448
- * @example
449
- * ```typescript
450
- * await this.auth.loginWithSocial('google', { returnTo: '/auth/callback' });
451
- * ```
452
- */
453
- async loginWithSocial(provider, options) {
454
- return this.client.loginWithSocial(provider, options);
455
- }
456
- /**
457
- * Exchange an exchangeToken (from redirect callback URL) into an AuthResponse.
458
- *
459
- * Used for `tokenDelivery: 'json'` or hybrid flows where the backend redirects back
460
- * with `exchangeToken` instead of setting cookies.
461
- *
462
- * @param exchangeToken - One-time exchange token from the callback URL
463
- * @returns Promise of AuthResponse
464
- *
465
- * @example
466
- * ```typescript
467
- * const response = await this.auth.exchangeSocialRedirect(exchangeToken);
468
- * ```
469
- */
470
- async exchangeSocialRedirect(exchangeToken) {
471
- const res = await this.client.exchangeSocialRedirect(exchangeToken);
472
- return this.updateChallengeState(res);
473
- }
474
- /**
475
- * Verify native social token (mobile).
476
- *
477
- * @param request - Social verification request with provider and token
478
- * @returns Promise of AuthResponse
479
- *
480
- * @example
481
- * ```typescript
482
- * const result = await this.auth.verifyNativeSocial({
483
- * provider: 'google',
484
- * idToken: nativeIdToken,
485
- * });
486
- * ```
487
- */
488
- async verifyNativeSocial(request) {
489
- const res = await this.client.verifyNativeSocial(request);
490
- return this.updateChallengeState(res);
491
- }
492
- /**
493
- * Get linked social accounts.
494
- *
495
- * @returns Promise of linked accounts response
496
- *
497
- * @example
498
- * ```typescript
499
- * const accounts = await this.auth.getLinkedAccounts();
500
- * console.log('Linked providers:', accounts.providers);
501
- * ```
502
- */
503
- async getLinkedAccounts() {
504
- return this.client.getLinkedAccounts();
505
- }
506
- /**
507
- * Link social account.
508
- *
509
- * @param provider - Social provider to link
510
- * @param code - OAuth authorization code
511
- * @param state - OAuth state parameter
512
- * @returns Promise with success message
513
- *
514
- * @example
515
- * ```typescript
516
- * await this.auth.linkSocialAccount('google', code, state);
517
- * ```
518
- */
519
- async linkSocialAccount(provider, code, state) {
520
- return this.client.linkSocialAccount(provider, code, state);
521
- }
522
- /**
523
- * Unlink social account.
524
- *
525
- * @param provider - Social provider to unlink
526
- * @returns Promise with success message
527
- *
528
- * @example
529
- * ```typescript
530
- * await this.auth.unlinkSocialAccount('google');
531
- * ```
532
- */
533
- async unlinkSocialAccount(provider) {
534
- return this.client.unlinkSocialAccount(provider);
535
- }
536
- // ============================================================================
537
- // MFA Management
538
- // ============================================================================
539
- /**
540
- * Get MFA status for the current user.
541
- *
542
- * @returns Promise of MFA status
543
- *
544
- * @example
545
- * ```typescript
546
- * const status = await this.auth.getMfaStatus();
547
- * console.log('MFA enabled:', status.enabled);
548
- * ```
549
- */
550
- async getMfaStatus() {
551
- return this.client.getMfaStatus();
552
- }
553
- /**
554
- * Get MFA devices for the current user.
555
- *
556
- * @returns Promise of MFA devices array
557
- *
558
- * @example
559
- * ```typescript
560
- * const devices = await this.auth.getMfaDevices();
561
- * ```
562
- */
563
- async getMfaDevices() {
564
- return this.client.getMfaDevices();
565
- }
566
- /**
567
- * Setup MFA device (authenticated user).
568
- *
569
- * @param method - MFA method to set up
570
- * @returns Promise of setup data
571
- *
572
- * @example
573
- * ```typescript
574
- * const setupData = await this.auth.setupMfaDevice('totp');
575
- * ```
576
- */
577
- async setupMfaDevice(method) {
578
- return this.client.setupMfaDevice(method);
579
- }
580
- /**
581
- * Verify MFA setup (authenticated user).
582
- *
583
- * @param method - MFA method
584
- * @param setupData - Setup data from setupMfaDevice
585
- * @param deviceName - Optional device name
586
- * @returns Promise with device ID
587
- *
588
- * @example
589
- * ```typescript
590
- * const result = await this.auth.verifyMfaSetup('totp', { code: '123456' }, 'My Phone');
591
- * ```
592
- */
593
- async verifyMfaSetup(method, setupData, deviceName) {
594
- return this.client.verifyMfaSetup(method, setupData, deviceName);
595
- }
596
- /**
597
- * Remove MFA device.
598
- *
599
- * @param method - MFA method to remove
600
- * @returns Promise with success message
601
- *
602
- * @example
603
- * ```typescript
604
- * await this.auth.removeMfaDevice('sms');
605
- * ```
606
- */
607
- async removeMfaDevice(method) {
608
- return this.client.removeMfaDevice(method);
609
- }
610
- /**
611
- * Set preferred MFA method.
612
- *
613
- * @param method - Device method to set as preferred ('totp', 'sms', 'email', or 'passkey')
614
- * @returns Promise with success message
615
- *
616
- * @example
617
- * ```typescript
618
- * await this.auth.setPreferredMfaMethod('totp');
619
- * ```
620
- */
621
- async setPreferredMfaMethod(method) {
622
- return this.client.setPreferredMfaMethod(method);
623
- }
624
- /**
625
- * Generate backup codes.
626
- *
627
- * @returns Promise of backup codes array
628
- *
629
- * @example
630
- * ```typescript
631
- * const codes = await this.auth.generateBackupCodes();
632
- * console.log('Backup codes:', codes);
633
- * ```
634
- */
635
- async generateBackupCodes() {
636
- return this.client.generateBackupCodes();
637
- }
638
- /**
639
- * Set MFA exemption (admin/test scenarios).
640
- *
641
- * @param exempt - Whether to exempt user from MFA
642
- * @param reason - Optional reason for exemption
643
- * @returns Promise that resolves when exemption is set
644
- *
645
- * @example
646
- * ```typescript
647
- * await this.auth.setMfaExemption(true, 'Test account');
648
- * ```
649
- */
650
- async setMfaExemption(exempt, reason) {
651
- return this.client.setMfaExemption(exempt, reason);
652
- }
653
- // ============================================================================
654
- // Device Trust
655
- // ============================================================================
656
- /**
657
- * Trust current device.
658
- *
659
- * @returns Promise with device token
660
- *
661
- * @example
662
- * ```typescript
663
- * const result = await this.auth.trustDevice();
664
- * console.log('Device trusted:', result.deviceToken);
665
- * ```
666
- */
667
- async trustDevice() {
668
- return this.client.trustDevice();
669
- }
670
- /**
671
- * Check if the current device is trusted.
672
- *
673
- * @returns Promise with trusted status
674
- *
675
- * @example
676
- * ```typescript
677
- * const result = await this.auth.isTrustedDevice();
678
- * if (result.trusted) {
679
- * console.log('This device is trusted');
680
- * }
681
- * ```
682
- */
683
- async isTrustedDevice() {
684
- return this.client.isTrustedDevice();
685
- }
686
- // ============================================================================
687
- // Audit History
688
- // ============================================================================
689
- /**
690
- * Get paginated audit history for the current user.
691
- *
692
- * @param params - Query parameters for filtering and pagination
693
- * @returns Promise of audit history response
694
- *
695
- * @example
696
- * ```typescript
697
- * const history = await this.auth.getAuditHistory({
698
- * page: 1,
699
- * limit: 20,
700
- * eventType: 'LOGIN_SUCCESS'
701
- * });
702
- * console.log('Audit history:', history);
703
- * ```
704
- */
705
- async getAuditHistory(params) {
706
- return this.client.getAuditHistory(params);
707
- }
708
- // ============================================================================
709
- // Escape Hatch
710
- // ============================================================================
711
- /**
712
- * Expose underlying NAuthClient for advanced scenarios.
713
- *
714
- * @deprecated All core functionality is now exposed directly on AuthService as Promises.
715
- * Use the direct methods on AuthService instead (e.g., `auth.changePassword()` instead of `auth.getClient().changePassword()`).
716
- * This method is kept for backward compatibility only and may be removed in a future version.
717
- *
718
- * @returns The underlying NAuthClient instance
719
- *
720
- * @example
721
- * ```typescript
722
- * // Deprecated - use direct methods instead
723
- * const status = await this.auth.getClient().getMfaStatus();
724
- *
725
- * // Preferred - use direct methods
726
- * const status = await this.auth.getMfaStatus();
727
- * ```
728
- */
729
- getClient() {
730
- return this.client;
731
- }
732
- // ============================================================================
733
- // Internal Methods
734
- // ============================================================================
735
- /**
736
- * Initialize by hydrating state from storage.
737
- * Called automatically on construction.
738
- */
739
- async initialize() {
740
- if (this.initialized)
741
- return;
742
- this.initialized = true;
743
- await this.client.initialize();
744
- // Hydrate challenge state
745
- const storedChallenge = await this.client.getStoredChallenge();
746
- if (storedChallenge) {
747
- this.challengeSubject.next(storedChallenge);
748
- }
749
- // Update subjects from client state
750
- const user = this.client.getCurrentUser();
751
- if (user) {
752
- this.currentUserSubject.next(user);
753
- this.isAuthenticatedSubject.next(true);
754
- }
755
- }
756
- /**
757
- * Update challenge state after auth response.
758
- */
759
- updateChallengeState(response) {
760
- if (response.challengeName) {
761
- this.challengeSubject.next(response);
762
- }
763
- else {
764
- this.challengeSubject.next(null);
765
- }
766
- return response;
767
- }
768
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: NAUTH_CLIENT_CONFIG }, { token: i1.AngularHttpAdapter }], target: i0.ɵɵFactoryTarget.Injectable });
769
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService });
770
- }
771
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
772
- type: Injectable
773
- }], ctorParameters: () => [{ type: undefined, decorators: [{
774
- type: Inject,
775
- args: [NAUTH_CLIENT_CONFIG]
776
- }] }, { type: i1.AngularHttpAdapter }] });
777
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3RhbmRhbG9uZS9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsV0FBVyxHQW1CWixNQUFNLHVCQUF1QixDQUFDOzs7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQUNMLE1BQU0sQ0FBYztJQUNwQixNQUFNLENBQW9CO0lBQzFCLGtCQUFrQixHQUFHLElBQUksZUFBZSxDQUFrQixJQUFJLENBQUMsQ0FBQztJQUNoRSxzQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUM3RCxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFDbEUsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQWEsQ0FBQztJQUN0RCxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRTVCOzs7T0FHRztJQUNILFlBQytCLE1BQXlCLEVBQ3RELFdBQStCO1FBRS9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLHFEQUFxRDtRQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUNiLDZHQUE2RyxDQUM5RyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUks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QUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7d0dBbnlCVSxXQUFXLGtCQWNaLG1CQUFtQjs0R0FkbEIsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVTs7MEJBZU4sTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5BVVRIX0NMSUVOVF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBBbmd1bGFySHR0cEFkYXB0ZXIgfSBmcm9tICcuL2h0dHAtYWRhcHRlcic7XG5pbXBvcnQge1xuICBOQXV0aENsaWVudCxcbiAgTkF1dGhDbGllbnRDb25maWcsXG4gIENoYWxsZW5nZVJlc3BvbnNlLFxuICBBdXRoUmVzcG9uc2UsXG4gIFRva2VuUmVzcG9uc2UsXG4gIEF1dGhVc2VyLFxuICBDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIE1GQVN0YXR1cyxcbiAgTUZBRGV2aWNlLFxuICBBdXRoRXZlbnQsXG4gIFNvY2lhbFByb3ZpZGVyLFxuICBTb2NpYWxMb2dpbk9wdGlvbnMsXG4gIExpbmtlZEFjY291bnRzUmVzcG9uc2UsXG4gIFNvY2lhbFZlcmlmeVJlcXVlc3QsXG4gIEF1ZGl0SGlzdG9yeVJlc3BvbnNlLFxufSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBhcm91bmQgTkF1dGhDbGllbnQgdGhhdCBwcm92aWRlcyBwcm9taXNlLWJhc2VkIGF1dGggbWV0aG9kcyBhbmQgcmVhY3RpdmUgc3RhdGUuXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzOlxuICogLSBSZWFjdGl2ZSBzdGF0ZSAoY3VycmVudFVzZXIkLCBpc0F1dGhlbnRpY2F0ZWQkLCBjaGFsbGVuZ2UkKVxuICogLSBBbGwgY29yZSBhdXRoIG1ldGhvZHMgYXMgUHJvbWlzZXMgKGxvZ2luLCBzaWdudXAsIGxvZ291dCwgcmVmcmVzaClcbiAqIC0gUHJvZmlsZSBtYW5hZ2VtZW50IChnZXRQcm9maWxlLCB1cGRhdGVQcm9maWxlLCBjaGFuZ2VQYXNzd29yZClcbiAqIC0gQ2hhbGxlbmdlIGZsb3cgbWV0aG9kcyAocmVzcG9uZFRvQ2hhbGxlbmdlLCByZXNlbmRDb2RlKVxuICogLSBNRkEgbWFuYWdlbWVudCAoZ2V0TWZhU3RhdHVzLCBzZXR1cE1mYURldmljZSwgZXRjLilcbiAqIC0gU29jaWFsIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2NvdW50IGxpbmtpbmdcbiAqIC0gRGV2aWNlIHRydXN0IG1hbmFnZW1lbnRcbiAqIC0gQXVkaXQgaGlzdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFJlYWN0aXZlIHN0YXRlXG4gKiB0aGlzLmF1dGguY3VycmVudFVzZXIkLnN1YnNjcmliZSh1c2VyID0+IC4uLik7XG4gKiB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkJC5zdWJzY3JpYmUoaXNBdXRoID0+IC4uLik7XG4gKlxuICogLy8gQXV0aCBvcGVyYXRpb25zIHdpdGggYXN5bmMvYXdhaXRcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gKlxuICogLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nIH0pO1xuICpcbiAqIC8vIE1GQSBvcGVyYXRpb25zXG4gKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IE5BdXRoQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkF1dGhDbGllbnRDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFsbGVuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoRXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEF1dGhFdmVudD4oKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gSW5qZWN0ZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gaHR0cEFkYXB0ZXIgLSBBbmd1bGFyIEhUVFAgYWRhcHRlciBmb3IgbWFraW5nIHJlcXVlc3RzIChyZXF1aXJlZClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICApIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBodHRwQWRhcHRlciAoZnJvbSBjb25maWcgb3IgaW5qZWN0ZWQpXG4gICAgY29uc3QgYWRhcHRlciA9IGNvbmZpZy5odHRwQWRhcHRlciA/PyBodHRwQWRhcHRlcjtcbiAgICBpZiAoIWFkYXB0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0h0dHBBZGFwdGVyIG5vdCBmb3VuZC4gRWl0aGVyIHByb3ZpZGUgaHR0cEFkYXB0ZXIgaW4gTkFVVEhfQ0xJRU5UX0NPTkZJRyBvciBlbnN1cmUgSHR0cENsaWVudCBpcyBhdmFpbGFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBvbkF1dGhTdGF0ZUNoYW5nZTogKHVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoQm9vbGVhbih1c2VyKSk7XG4gICAgICAgIGNvbmZpZy5vbkF1dGhTdGF0ZUNoYW5nZT8uKHVzZXIpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEZvcndhcmQgYWxsIGNsaWVudCBldmVudHMgdG8gT2JzZXJ2YWJsZSBzdHJlYW1cbiAgICB0aGlzLmNsaWVudC5vbignKicsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvcmUgQXV0aCBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTG9naW4gd2l0aCBpZGVudGlmaWVyIGFuZCBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oJ3VzZXJAZXhhbXBsZS5jb20nLCAncGFzc3dvcmQnKTtcbiAgICogaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICogICAvLyBIYW5kbGUgY2hhbGxlbmdlXG4gICAqIH0gZWxzZSB7XG4gICAqICAgLy8gTG9naW4gc3VjY2Vzc2Z1bFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW4oaWRlbnRpZmllcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dpbihpZGVudGlmaWVyLCBwYXNzd29yZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWdudXAgd2l0aCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgLSBTaWdudXAgcmVxdWVzdCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zaWdudXAocGF5bG9hZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgY3VycmVudCBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlIC0gSWYgdHJ1ZSwgcmVtb3ZlcyBkZXZpY2UgdHJ1c3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9nb3V0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KGZvcmdldERldmljZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXQoZm9yZ2V0RGV2aWNlKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgQ1NSRiB0b2tlbiBjb29raWUgaWYgaW4gY29va2llcyBtb2RlXG4gICAgLy8gTm90ZTogQmFja2VuZCBzaG91bGQgY2xlYXIgaHR0cE9ubHkgY29va2llcywgYnV0IHdlIGNsZWFyIG5vbi1odHRwT25seSBvbmVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IHRoaXMuY29uZmlnLmNzcmY/LmNvb2tpZU5hbWUgPz8gJ25hdXRoX2NzcmZfdG9rZW4nO1xuICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBiYXNlVXJsIGlmIHBvc3NpYmxlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgICAgICAvLyBBbHNvIHRyeSB3aXRob3V0IGRvbWFpbiAoZm9yIGxvY2FsaG9zdClcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiBiYXNlVXJsIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGFsbCBzZXNzaW9ucy5cbiAgICpcbiAgICogUmV2b2tlcyBhbGwgYWN0aXZlIHNlc3Npb25zIGZvciB0aGUgY3VycmVudCB1c2VyIGFjcm9zcyBhbGwgZGV2aWNlcy5cbiAgICogT3B0aW9uYWxseSByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgaWYgZm9yZ2V0RGV2aWNlcyBpcyB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlcyAtIElmIHRydWUsIGFsc28gcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIChkZWZhdWx0OiBmYWxzZSlcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG51bWJlciBvZiBzZXNzaW9ucyByZXZva2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmxvZ291dEFsbCgpO1xuICAgKiBjb25zb2xlLmxvZyhgUmV2b2tlZCAke3Jlc3VsdC5yZXZva2VkQ291bnR9IHNlc3Npb25zYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QWxsKGZvcmdldERldmljZXM/OiBib29sZWFuKTogUHJvbWlzZTx7IHJldm9rZWRDb3VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcyk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMuYXV0aC5yZWZyZXNoKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVmcmVzaFRva2VucygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBY2NvdW50IFJlY292ZXJ5IChGb3Jnb3QgUGFzc3dvcmQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgKGZvcmdvdCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXNzd29yZCByZXNldCByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5mb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5mb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIGEgcGFzc3dvcmQgcmVzZXQgY29kZSBhbmQgc2V0IGEgbmV3IHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcGFyYW0gY29kZSAtIE9uZS10aW1lIHJlc2V0IGNvZGVcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBjb25maXJtYXRpb24gcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY29uZmlybUZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNvbmZpcm1Gb3Jnb3RQYXNzd29yZChcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY29uZmlybUZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIsIGNvZGUsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdXNlciBwYXNzd29yZCAocmVxdWlyZXMgY3VycmVudCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCAtIEN1cnJlbnQgcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkIChtdXN0IG1lZXQgcmVxdWlyZW1lbnRzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwYXNzd29yZCBpcyBjaGFuZ2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKCdvbGRQYXNzd29yZDEyMycsICduZXdTZWN1cmVQYXNzd29yZDQ1NiEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBwYXNzd29yZCBjaGFuZ2UgKG11c3QgY2hhbmdlIG9uIG5leHQgbG9naW4pLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZXF1ZXN0IGlzIHNlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJvZmlsZSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGN1cnJlbnQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5nZXRQcm9maWxlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdVc2VyIHByb2ZpbGU6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UHJvZmlsZSgpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFByb2ZpbGUoKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIGZldGNoZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUHJvZmlsZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgdXBkYXRlZCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnIH0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJvZmlsZSB1cGRhdGVkOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVByb2ZpbGUodXBkYXRlczogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LnVwZGF0ZVByb2ZpbGUodXBkYXRlcyk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhbGxlbmdlIEZsb3cgTWV0aG9kcyAoRXNzZW50aWFsIGZvciBhbnkgYXV0aCBmbG93KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgdG8gYSBjaGFsbGVuZ2UgKFZFUklGWV9FTUFJTCwgVkVSSUZZX1BIT05FLCBNRkFfUkVRVUlSRUQsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBDaGFsbGVuZ2UgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBuZXh0IGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNwb25kVG9DaGFsbGVuZ2Uoe1xuICAgKiAgIHNlc3Npb246IGNoYWxsZW5nZVNlc3Npb24sXG4gICAqICAgdHlwZTogJ1ZFUklGWV9FTUFJTCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZTogQ2hhbGxlbmdlUmVzcG9uc2UpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgY2hhbGxlbmdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gICAqIGNvbnNvbGUubG9nKCdDb2RlIHNlbnQgdG86JywgcmVzdWx0LmRlc3RpbmF0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNlbmRDb2RlKHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBkZXN0aW5hdGlvbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHNldHVwIGRhdGEgKGZvciBNRkFfU0VUVVBfUkVRVUlSRUQgY2hhbGxlbmdlKS5cbiAgICpcbiAgICogUmV0dXJucyBtZXRob2Qtc3BlY2lmaWMgc2V0dXAgaW5mb3JtYXRpb246XG4gICAqIC0gVE9UUDogeyBzZWNyZXQsIHFyQ29kZSwgbWFudWFsRW50cnlLZXkgfVxuICAgKiAtIFNNUzogeyBtYXNrZWRQaG9uZSB9XG4gICAqIC0gRW1haWw6IHsgbWFza2VkRW1haWwgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6Jywgc2V0dXBEYXRhLnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFNldHVwRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldFNldHVwRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBjaGFsbGVuZ2UgZGF0YSAoZm9yIE1GQV9SRVFVSVJFRCBjaGFsbGVuZ2UgLSBlLmcuLCBwYXNza2V5IG9wdGlvbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBDaGFsbGVuZ2UgbWV0aG9kXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY2hhbGxlbmdlIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjaGFsbGVuZ2VEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgJ3Bhc3NrZXknKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldENoYWxsZW5nZURhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRDaGFsbGVuZ2VEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgY2hhbGxlbmdlICh3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGNoYWxsZW5nZSBmbG93KS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbGxlbmdlIGlzIGNsZWFyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2xlYXJDaGFsbGVuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjbGVhckNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbGVhclN0b3JlZENoYWxsZW5nZSgpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTb2NpYWwgQXV0aGVudGljYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBzb2NpYWwgT0F1dGggbG9naW4gZmxvdy5cbiAgICogUmVkaXJlY3RzIHRoZSBicm93c2VyIHRvIGJhY2tlbmQgYC9hdXRoL3NvY2lhbC86cHJvdmlkZXIvcmVkaXJlY3RgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgKCdnb29nbGUnLCAnYXBwbGUnLCAnZmFjZWJvb2snKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHJlZGlyZWN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVkaXJlY3Qgc3RhcnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ2luV2l0aFNvY2lhbCgnZ29vZ2xlJywgeyByZXR1cm5UbzogJy9hdXRoL2NhbGxiYWNrJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbldpdGhTb2NpYWwocHJvdmlkZXI6IFNvY2lhbFByb3ZpZGVyLCBvcHRpb25zPzogU29jaWFsTG9naW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxvZ2luV2l0aFNvY2lhbChwcm92aWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhjaGFuZ2UgYW4gZXhjaGFuZ2VUb2tlbiAoZnJvbSByZWRpcmVjdCBjYWxsYmFjayBVUkwpIGludG8gYW4gQXV0aFJlc3BvbnNlLlxuICAgKlxuICAgKiBVc2VkIGZvciBgdG9rZW5EZWxpdmVyeTogJ2pzb24nYCBvciBoeWJyaWQgZmxvd3Mgd2hlcmUgdGhlIGJhY2tlbmQgcmVkaXJlY3RzIGJhY2tcbiAgICogd2l0aCBgZXhjaGFuZ2VUb2tlbmAgaW5zdGVhZCBvZiBzZXR0aW5nIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBleGNoYW5nZVRva2VuIC0gT25lLXRpbWUgZXhjaGFuZ2UgdG9rZW4gZnJvbSB0aGUgY2FsbGJhY2sgVVJMXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW46IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBuYXRpdmUgc29jaWFsIHRva2VuIChtb2JpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFNvY2lhbCB2ZXJpZmljYXRpb24gcmVxdWVzdCB3aXRoIHByb3ZpZGVyIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlOYXRpdmVTb2NpYWwoe1xuICAgKiAgIHByb3ZpZGVyOiAnZ29vZ2xlJyxcbiAgICogICBpZFRva2VuOiBuYXRpdmVJZFRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdDogU29jaWFsVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQudmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3QpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpbmtlZCBzb2NpYWwgYWNjb3VudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgbGlua2VkIGFjY291bnRzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgICogY29uc29sZS5sb2coJ0xpbmtlZCBwcm92aWRlcnM6JywgYWNjb3VudHMucHJvdmlkZXJzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMaW5rZWRBY2NvdW50cygpOiBQcm9taXNlPExpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gbGlua1xuICAgKiBAcGFyYW0gY29kZSAtIE9BdXRoIGF1dGhvcml6YXRpb24gY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgLSBPQXV0aCBzdGF0ZSBwYXJhbWV0ZXJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJywgY29kZSwgc3RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5saW5rU29jaWFsQWNjb3VudChwcm92aWRlciwgY29kZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIHVubGlua1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnVubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC51bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgTUZBIGV4ZW1wdGlvbiAoYWRtaW4vdGVzdCBzY2VuYXJpb3MpLlxuICAgKlxuICAgKiBAcGFyYW0gZXhlbXB0IC0gV2hldGhlciB0byBleGVtcHQgdXNlciBmcm9tIE1GQVxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgcmVhc29uIGZvciBleGVtcHRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlbXB0aW9uIGlzIHNldFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRNZmFFeGVtcHRpb24odHJ1ZSwgJ1Rlc3QgYWNjb3VudCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldE1mYUV4ZW1wdGlvbihleGVtcHQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRNZmFFeGVtcHRpb24oZXhlbXB0LCByZWFzb24pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGU6ICdMT0dJTl9TVUNDRVNTJ1xuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgQWxsIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBub3cgZXhwb3NlZCBkaXJlY3RseSBvbiBBdXRoU2VydmljZSBhcyBQcm9taXNlcy5cbiAgICogVXNlIHRoZSBkaXJlY3QgbWV0aG9kcyBvbiBBdXRoU2VydmljZSBpbnN0ZWFkIChlLmcuLCBgYXV0aC5jaGFuZ2VQYXNzd29yZCgpYCBpbnN0ZWFkIG9mIGBhdXRoLmdldENsaWVudCgpLmNoYW5nZVBhc3N3b3JkKClgKS5cbiAgICogVGhpcyBtZXRob2QgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuIl19