@odx/auth 14.0.0 → 15.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/esm2022/lib/auth.component.mjs +9 -4
  3. package/esm2022/lib/auth.config.mjs +38 -1
  4. package/esm2022/lib/auth.directive.mjs +14 -4
  5. package/esm2022/lib/auth.guard.mjs +9 -1
  6. package/esm2022/lib/auth.interceptor.mjs +8 -1
  7. package/esm2022/lib/auth.module.mjs +4 -4
  8. package/esm2022/lib/auth.providers.mjs +35 -1
  9. package/esm2022/lib/auth.service.mjs +162 -4
  10. package/esm2022/lib/components/auth-actions/auth-actions.component.mjs +13 -4
  11. package/esm2022/lib/components/auth-loading-screen/auth-loading-screen.component.mjs +18 -6
  12. package/esm2022/lib/directives/auth-action.directive.mjs +10 -4
  13. package/esm2022/lib/directives/sign-in.directive.mjs +23 -4
  14. package/esm2022/lib/directives/sign-out.directive.mjs +23 -4
  15. package/esm2022/lib/helpers/create-auth-host-url.mjs +13 -1
  16. package/esm2022/lib/helpers/create-inititals.mjs +18 -1
  17. package/esm2022/lib/helpers/handle-auth-error.mjs +13 -3
  18. package/esm2022/lib/helpers/handle-oauth-event.mjs +9 -1
  19. package/esm2022/lib/helpers/resolve-email.mjs +21 -1
  20. package/esm2022/lib/helpers/resolve-username.mjs +22 -1
  21. package/esm2022/lib/helpers/set-http-auth-header.mjs +10 -1
  22. package/esm2022/lib/helpers/user-language-loader.mjs +8 -1
  23. package/esm2022/lib/models/auth-plugin-manager.mjs +3 -3
  24. package/esm2022/lib/plugins/core-debug.plugin.mjs +10 -1
  25. package/esm2022/lib/plugins/core-identity.plugin.mjs +8 -1
  26. package/esm2022/lib/plugins/user-profile-link.plugin.mjs +10 -1
  27. package/esm2022/lib/unauth.guard.mjs +9 -1
  28. package/esm2022/plugins/service-connect/lib/helpers/build-service-connect-url.mjs +8 -1
  29. package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.mjs +8 -1
  30. package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights.mjs +8 -1
  31. package/esm2022/plugins/service-connect/lib/helpers/service-connect-plugin-factory.mjs +7 -1
  32. package/esm2022/plugins/service-connect/lib/service-connect-rights.directive.mjs +16 -4
  33. package/esm2022/plugins/service-connect/lib/service-connect-rights.guard.mjs +9 -1
  34. package/esm2022/plugins/service-connect/lib/service-connect-rights.plugin.mjs +9 -1
  35. package/esm2022/plugins/service-connect/lib/service-connect-user-language.plugin.mjs +15 -1
  36. package/esm2022/plugins/service-connect/lib/service-connect-user-profile.plugin.mjs +9 -1
  37. package/fesm2022/odx-auth-plugins-service-connect.mjs +80 -3
  38. package/fesm2022/odx-auth-plugins-service-connect.mjs.map +1 -1
  39. package/fesm2022/odx-auth.mjs +497 -36
  40. package/fesm2022/odx-auth.mjs.map +1 -1
  41. package/lib/auth.component.d.ts +5 -0
  42. package/lib/auth.config.d.ts +43 -1
  43. package/lib/auth.directive.d.ts +10 -0
  44. package/lib/auth.guard.d.ts +8 -0
  45. package/lib/auth.interceptor.d.ts +7 -0
  46. package/lib/auth.providers.d.ts +34 -0
  47. package/lib/auth.service.d.ts +156 -0
  48. package/lib/components/auth-actions/auth-actions.component.d.ts +9 -0
  49. package/lib/components/auth-loading-screen/auth-loading-screen.component.d.ts +13 -0
  50. package/lib/directives/auth-action.directive.d.ts +6 -0
  51. package/lib/directives/sign-in.directive.d.ts +19 -0
  52. package/lib/directives/sign-out.directive.d.ts +19 -0
  53. package/lib/helpers/create-auth-host-url.d.ts +12 -0
  54. package/lib/helpers/create-inititals.d.ts +17 -0
  55. package/lib/helpers/handle-auth-error.d.ts +10 -0
  56. package/lib/helpers/handle-oauth-event.d.ts +8 -0
  57. package/lib/helpers/resolve-email.d.ts +20 -0
  58. package/lib/helpers/resolve-username.d.ts +21 -0
  59. package/lib/helpers/set-http-auth-header.d.ts +9 -0
  60. package/lib/helpers/user-language-loader.d.ts +7 -0
  61. package/lib/plugins/core-debug.plugin.d.ts +9 -0
  62. package/lib/plugins/core-identity.plugin.d.ts +7 -0
  63. package/lib/plugins/user-profile-link.plugin.d.ts +9 -0
  64. package/lib/unauth.guard.d.ts +8 -0
  65. package/package.json +2 -2
  66. package/plugins/service-connect/lib/helpers/build-service-connect-url.d.ts +7 -0
  67. package/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.d.ts +7 -0
  68. package/plugins/service-connect/lib/helpers/has-roles-or-rights.d.ts +7 -0
  69. package/plugins/service-connect/lib/helpers/service-connect-plugin-factory.d.ts +6 -0
  70. package/plugins/service-connect/lib/service-connect-rights.directive.d.ts +12 -0
  71. package/plugins/service-connect/lib/service-connect-rights.guard.d.ts +8 -0
  72. package/plugins/service-connect/lib/service-connect-rights.plugin.d.ts +8 -0
  73. package/plugins/service-connect/lib/service-connect-user-language.plugin.d.ts +14 -0
  74. package/plugins/service-connect/lib/service-connect-user-profile.plugin.d.ts +8 -0
@@ -9,7 +9,40 @@ import { injectAuthConfig } from './auth.config';
9
9
  import { setHttpAuthHeader } from './helpers';
10
10
  import { AuthPluginManager } from './models';
11
11
  import * as i0 from "@angular/core";
12
+ /**
13
+ * The `AuthService` class provides authentication functionality for an Angular application.
14
+ * It handles OAuth2/OIDC authentication, token management, and user identity claims.
15
+ *
16
+ * Key responsibilities include:
17
+ * - Initializing authentication with a provided configuration.
18
+ * - Managing tokens (access, refresh, and ID tokens).
19
+ * - Checking and emitting authentication and authorization states.
20
+ * - Handling user login and logout flows.
21
+ * - Supporting silent refresh and offline authentication scenarios.
22
+ * - Integrating authentication plugins via `AuthPluginManager`.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // Injecting the AuthService
27
+ * constructor(private authService: AuthService) {}
28
+ *
29
+ * // Using the AuthService to initialize authentication
30
+ * async ngOnInit() {
31
+ * const config: AuthConfig = { clientId: 'your-client-id', discoveryUrl: 'https://example.com/.well-known/openid-configuration' };
32
+ * await this.authService.initialize(config);
33
+ * }
34
+ * ```
35
+ */
12
36
  export class AuthService {
37
+ /**
38
+ * Emits whenever the `access_token` in local storage is updated or cleared.
39
+ * Provides an observable for tracking token updates.
40
+ *
41
+ * @type {Observable<StorageEvent | null>}
42
+ */
43
+ get accessTokenUpdate$() {
44
+ return this.onAccessTokenUpdate$;
45
+ }
13
46
  constructor() {
14
47
  this.authConfig = injectAuthConfig();
15
48
  this.authPluginManager = inject(AuthPluginManager);
@@ -21,16 +54,62 @@ export class AuthService {
21
54
  this.onAccessTokenUpdate$ = fromEvent(this.windowRef.nativeWindow, 'storage').pipe(filter(({ key }) => key === 'access_token' || key === null), startWith(null), share());
22
55
  this.silentRefreshHandler$ = this.isInitialized$$.pipe(filter(Boolean), switchMap(() => this.windowRef.isOnline$), tap((isOnline) => this.updateSilentRefresh(isOnline)));
23
56
  this.onAuthStateChange$ = combineLatest([this.oauthService.events.pipe(startWith(null)), this.windowRef.isOnline$, this.onAccessTokenUpdate$]);
57
+ /**
58
+ * Emits `true` when the service has completed initialization.
59
+ * Emits `false` until the initialization is complete.
60
+ *
61
+ * @type {Observable<boolean>}
62
+ */
24
63
  this.isInitialized$ = this.isInitialized$$.pipe(filter(Boolean), distinctUntilChanged());
64
+ /**
65
+ * Emits `true` when the user is being redirected to the login page.
66
+ * Emits `false` when there is no redirection in progress.
67
+ *
68
+ * @type {Observable<boolean>}
69
+ */
25
70
  this.isRedirecting$ = this.isRedirecting$$.pipe(distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
71
+ /**
72
+ * Emits `true` when the application is in a loading state (e.g., during redirection or plugin initialization).
73
+ * Emits `false` when there is no ongoing loading activity.
74
+ *
75
+ * @type {Observable<boolean>}
76
+ */
26
77
  this.isLoading$ = merge(this.isRedirecting$, this.authPluginManager.pluginsLoading$).pipe(distinctUntilChanged());
78
+ /**
79
+ * Emits `true` when the user is authenticated.
80
+ * Emits `false` when the user is not authenticated.
81
+ *
82
+ * @type {Observable<boolean>}
83
+ */
27
84
  this.isAuthenticated$ = this.isInitialized$.pipe(switchMap(() => this.authPluginManager.pluginsReady$), switchMap(() => this.onAuthStateChange$), map(() => this.isAuthenticated()), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
85
+ /**
86
+ * Emits the identity claims of the authenticated user.
87
+ * If the user is not authenticated, emits `null`.
88
+ *
89
+ * @type {Observable<OdxAuth.IdentityClaims | null>}
90
+ */
28
91
  this.identityClaims$ = this.isAuthenticated$.pipe(map(() => this.getIdentityClaims()), shareReplay({ bufferSize: 1, refCount: true }));
92
+ /**
93
+ * Emits OAuth error events.
94
+ *
95
+ * @type {Observable<OAuthErrorEvent>}
96
+ */
29
97
  this.errors$ = this.oauthService.events.pipe(filter((event) => event instanceof OAuthErrorEvent), share());
98
+ /**
99
+ * Emits events when an OAuth token is successfully received.
100
+ *
101
+ * @type {Observable<Event>}
102
+ */
30
103
  this.onTokenReceived$ = this.oauthService.events.pipe(filter((event) => event.type === 'token_received'), share());
31
104
  this.runPlugins();
32
105
  this.silentRefreshHandler$.subscribe();
33
106
  }
107
+ /**
108
+ * Initializes the authentication service with the provided configuration.
109
+ *
110
+ * @param {AuthConfig} config - The authentication configuration object.
111
+ * @returns {Promise<void>} Resolves when initialization is complete.
112
+ */
34
113
  async initialize(config) {
35
114
  this.assertAudience(config.clientId);
36
115
  this.oauthService.configure({ ...config, openUri: this.redirectToLogin.bind(this) });
@@ -57,57 +136,136 @@ export class AuthService {
57
136
  await this.tryLoadUserProfile();
58
137
  await this.routeToRequestedUrl();
59
138
  }
139
+ /**
140
+ * Runs all authentication plugins registered in the `AuthPluginManager`.
141
+ */
60
142
  runPlugins() {
61
143
  this.authPluginManager.runPlugins(this).subscribe();
62
144
  }
145
+ /**
146
+ * Returns the issuer URL for the OAuth server.
147
+ *
148
+ * @returns {URL} The issuer URL.
149
+ */
63
150
  getIssuer() {
64
151
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
65
152
  return new URL(this.oauthService.issuer);
66
153
  }
154
+ /**
155
+ * Initiates the login flow for the user. Redirects to the login page.
156
+ *
157
+ * @param {string} [url] - The URL to redirect back to after login.
158
+ */
67
159
  signIn(url) {
68
160
  this.oauthService.initLoginFlow(url);
69
161
  }
162
+ /**
163
+ * Logs the user out and clears their tokens.
164
+ *
165
+ * @param {boolean} [noRedirect] - If `true`, no redirection occurs after logout.
166
+ */
70
167
  signOut(noRedirect) {
71
168
  this.oauthService.logOut(noRedirect || !this.getAccessToken());
72
169
  }
170
+ /**
171
+ * Attempts to refresh the user's tokens.
172
+ *
173
+ * @returns {Promise<TokenResponse>} Resolves with the new token response.
174
+ */
73
175
  async refreshTokens() {
74
176
  return this.oauthService.refreshToken();
75
177
  }
178
+ /**
179
+ * Retrieves the current access token, if available.
180
+ *
181
+ * @returns {string | null} The access token, or `null` if not available.
182
+ */
76
183
  getAccessToken() {
77
184
  return this.oauthService.getAccessToken() ?? null;
78
185
  }
186
+ /**
187
+ * Retrieves the current refresh token, if available.
188
+ *
189
+ * @returns {string | null} The refresh token, or `null` if not available.
190
+ */
79
191
  getRefreshToken() {
80
192
  return this.oauthService.getRefreshToken() ?? null;
81
193
  }
194
+ /**
195
+ * Retrieves the current ID token, if available.
196
+ *
197
+ * @returns {string | null} The ID token, or `null` if not available.
198
+ */
82
199
  getIdToken() {
83
200
  return this.oauthService.getIdToken() ?? null;
84
201
  }
202
+ /**
203
+ * Retrieves the identity claims of the authenticated user.
204
+ *
205
+ * @returns {OdxAuth.IdentityClaims | null} The identity claims, or `null` if not available.
206
+ */
85
207
  getIdentityClaims() {
86
208
  if (!this.getIdToken())
87
209
  return null;
88
210
  return deepmerge(this.oauthService.getIdentityClaims(), this.authPluginManager.getResult());
89
211
  }
212
+ /**
213
+ * Retrieves the raw identity claims of the authenticated user.
214
+ *
215
+ * @returns {OdxAuth.RawIdentityClaims | null} The raw identity claims, or `null` if not available.
216
+ */
90
217
  getRawIdentityClaims() {
91
218
  if (!this.getIdToken())
92
219
  return null;
93
220
  return this.oauthService.getIdentityClaims();
94
221
  }
222
+ /**
223
+ * Checks if the user is currently authenticated.
224
+ *
225
+ * @returns {boolean} `true` if authenticated, otherwise `false`.
226
+ */
95
227
  isAuthenticated() {
96
228
  if (this.windowRef.isOnline()) {
97
229
  return this.oauthService.hasValidAccessToken() && this.oauthService.hasValidIdToken();
98
230
  }
99
231
  return this.hasValidOfflineToken();
100
232
  }
233
+ /**
234
+ * Checks if the user is authorized based on the provided handler.
235
+ *
236
+ * @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
237
+ * @returns {boolean} `true` if authorized, otherwise `false`.
238
+ */
101
239
  isAuthorized(authorizedHandler) {
102
240
  const handler = authorizedHandler ?? this.authConfig.defaultAuthorizedHandler;
103
241
  return this.isAuthenticated() && (handler?.(this.getIdentityClaims(), this, this.router) ?? true);
104
242
  }
243
+ /**
244
+ * Emits whether the user is authorized based on the provided handler.
245
+ *
246
+ * @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
247
+ * @returns {Observable<boolean>} An observable emitting the authorization status.
248
+ */
105
249
  isAuthorized$(authorizedHandler) {
106
250
  return this.isAuthenticated$.pipe(map(() => this.isAuthorized(authorizedHandler)));
107
251
  }
252
+ /**
253
+ * Prepares an HTTP request by adding the access token to its headers.
254
+ *
255
+ * @param {HttpRequest<T> | Request} req - The HTTP request to prepare.
256
+ * @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
257
+ * @returns {Observable<R>} An observable emitting the prepared request.
258
+ * @template R, T
259
+ */
108
260
  prepareAuthRequest$(req, requireSignIn = false) {
109
261
  return this.waitForAccessToken$(requireSignIn).pipe(map((token) => setHttpAuthHeader(req, token)));
110
262
  }
263
+ /**
264
+ * Waits for a valid access token to become available.
265
+ *
266
+ * @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
267
+ * @returns {Observable<string | null>} An observable emitting the access token.
268
+ */
111
269
  waitForAccessToken$(requireSignIn) {
112
270
  const accessToken$ = of(this.getAccessToken()).pipe(filter((token) => !!token && this.isAuthenticated()));
113
271
  const waitForAccessToken$ = this.onTokenReceived$.pipe(timeout(this.authConfig.waitForTokenInMs ?? 0), catchError(async () => this.tryRefreshToken().catch(() => null)));
@@ -150,11 +308,11 @@ export class AuthService {
150
308
  this.oauthService.stopAutomaticRefresh();
151
309
  }
152
310
  }
153
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
154
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
311
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
312
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
155
313
  }
156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthService, decorators: [{
157
315
  type: Injectable,
158
316
  args: [{ providedIn: 'root' }]
159
317
  }], ctorParameters: () => [] });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBYyxlQUFlLEVBQUUsWUFBWSxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFFZixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFxQixNQUFNLFVBQVUsQ0FBQzs7QUFHaEUsTUFBTSxPQUFPLFdBQVc7SUE0Q3RCO1FBM0NpQixlQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QyxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLHlCQUFvQixHQUFHLFNBQVMsQ0FBZSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxjQUFjLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxFQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ2YsS0FBSyxFQUFFLENBQ1IsQ0FBQztRQUNlLDBCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUNoRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQ2YsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQ3pDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3RELENBQUM7UUFDZSx1QkFBa0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztRQUUzSSxtQkFBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDcEYsbUJBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuSCxlQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDN0cscUJBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3pELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFDeEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUNqQyxvQkFBb0IsRUFBRSxFQUN0QixXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUMvQyxDQUFDO1FBQ2Msb0JBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUMxRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFDbkMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztRQUNjLFlBQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JELE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBNEIsRUFBRSxDQUFDLEtBQUssWUFBWSxlQUFlLENBQUMsRUFDN0UsS0FBSyxFQUFFLENBQ1IsQ0FBQztRQUNjLHFCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDOUQsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEVBQ2xELEtBQUssRUFBRSxDQUNSLENBQUM7UUFHQSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWtCO1FBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1RSxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLFlBQVksZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixJQUFJLENBQUMsS0FBSyxZQUFZLGlCQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25JLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRU0sU0FBUztRQUNkLG9FQUFvRTtRQUNwRSxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFZO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxPQUFPLENBQUMsVUFBb0I7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDO0lBQ3BELENBQUM7SUFFTSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUEwQixDQUFDO0lBQ3ZILENBQUM7SUFFTSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hGLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxZQUFZLENBQUMsaUJBQTRDO1FBQzlELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7UUFFOUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTSxhQUFhLENBQUMsaUJBQTRDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU0sbUJBQW1CLENBQXdDLEdBQU0sRUFBRSxhQUFhLEdBQUcsS0FBSztRQUM3RixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxhQUFzQjtRQUMvQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEVBQzlDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDakUsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzdCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUMsRUFDekQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsRUFDaEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN6RixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUFFLE9BQU87UUFDakYsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXBELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9FLENBQUM7SUFFTyxlQUFlLENBQUMsR0FBVztRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUFFLE9BQU87UUFDeEUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFBRSxPQUFPO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQXdCO1FBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsS0FBSyxhQUFhO1lBQUUsT0FBTztRQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFnQjtRQUMxQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOytHQWhNVSxXQUFXO21IQUFYLFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQXV0aENvbmZpZywgT0F1dGhFcnJvckV2ZW50LCBPQXV0aFNlcnZpY2UsIFRva2VuUmVzcG9uc2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IGRlZXBtZXJnZSB9IGZyb20gJ2RlZXBtZXJnZS10cyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBzaGFyZVJlcGxheSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGltZW91dCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbmplY3RBdXRoQ29uZmlnIH0gZnJvbSAnLi9hdXRoLmNvbmZpZyc7XG5pbXBvcnQgeyBzZXRIdHRwQXV0aEhlYWRlciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBBdXRoUGx1Z2luTWFuYWdlciwgQXV0aG9yaXplZEhhbmRsZXIgfSBmcm9tICcuL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhDb25maWcgPSBpbmplY3RBdXRoQ29uZmlnKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aFBsdWdpbk1hbmFnZXIgPSBpbmplY3QoQXV0aFBsdWdpbk1hbmFnZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9hdXRoU2VydmljZSA9IGluamVjdChPQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1JlZiA9IGluamVjdChXaW5kb3dSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNJbml0aWFsaXplZCQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNSZWRpcmVjdGluZyQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BY2Nlc3NUb2tlblVwZGF0ZSQgPSBmcm9tRXZlbnQ8U3RvcmFnZUV2ZW50Pih0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3csICdzdG9yYWdlJykucGlwZShcbiAgICBmaWx0ZXIoKHsga2V5IH0pID0+IGtleSA9PT0gJ2FjY2Vzc190b2tlbicgfHwga2V5ID09PSBudWxsKSxcbiAgICBzdGFydFdpdGgobnVsbCksXG4gICAgc2hhcmUoKSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWxlbnRSZWZyZXNoSGFuZGxlciQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5waXBlKFxuICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy53aW5kb3dSZWYuaXNPbmxpbmUkKSxcbiAgICB0YXAoKGlzT25saW5lKSA9PiB0aGlzLnVwZGF0ZVNpbGVudFJlZnJlc2goaXNPbmxpbmUpKSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkF1dGhTdGF0ZUNoYW5nZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9hdXRoU2VydmljZS5ldmVudHMucGlwZShzdGFydFdpdGgobnVsbCkpLCB0aGlzLndpbmRvd1JlZi5pc09ubGluZSQsIHRoaXMub25BY2Nlc3NUb2tlblVwZGF0ZSRdKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNJbml0aWFsaXplZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5waXBlKGZpbHRlcihCb29sZWFuKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBpc1JlZGlyZWN0aW5nJCA9IHRoaXMuaXNSZWRpcmVjdGluZyQkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSk7XG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmckID0gbWVyZ2UodGhpcy5pc1JlZGlyZWN0aW5nJCwgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5wbHVnaW5zTG9hZGluZyQpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5pc0luaXRpYWxpemVkJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmF1dGhQbHVnaW5NYW5hZ2VyLnBsdWdpbnNSZWFkeSQpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9uQXV0aFN0YXRlQ2hhbmdlJCksXG4gICAgbWFwKCgpID0+IHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aXR5Q2xhaW1zJCA9IHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgIG1hcCgoKSA9PiB0aGlzLmdldElkZW50aXR5Q2xhaW1zKCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnMkID0gdGhpcy5vYXV0aFNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKChldmVudCk6IGV2ZW50IGlzIE9BdXRoRXJyb3JFdmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE9BdXRoRXJyb3JFdmVudCksXG4gICAgc2hhcmUoKSxcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uVG9rZW5SZWNlaXZlZCQgPSB0aGlzLm9hdXRoU2VydmljZS5ldmVudHMucGlwZShcbiAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC50eXBlID09PSAndG9rZW5fcmVjZWl2ZWQnKSxcbiAgICBzaGFyZSgpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucnVuUGx1Z2lucygpO1xuICAgIHRoaXMuc2lsZW50UmVmcmVzaEhhbmRsZXIkLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoY29uZmlnOiBBdXRoQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRBdWRpZW5jZShjb25maWcuY2xpZW50SWQpO1xuICAgIHRoaXMub2F1dGhTZXJ2aWNlLmNvbmZpZ3VyZSh7IC4uLmNvbmZpZywgb3BlblVyaTogdGhpcy5yZWRpcmVjdFRvTG9naW4uYmluZCh0aGlzKSB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UubG9hZERpc2NvdmVyeURvY3VtZW50KHRoaXMuYXV0aENvbmZpZy5kaXNjb3ZlcnlVcmwpO1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UudHJ5TG9naW4oKTtcbiAgICAgIGlmICh0aGlzLmF1dGhDb25maWcucmVmcmVzaFRva2VuT25Jbml0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMudHJ5UmVmcmVzaFRva2VuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgfHwgZXJyb3IgaW5zdGFuY2VvZiBPQXV0aEVycm9yRXZlbnQpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICd0b2tlbl9yZWZyZXNoX2Vycm9yJyB8fCAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiAoZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDApKSkge1xuICAgICAgICB0aGlzLnNpZ25PdXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2lnbkluKHRoaXMud2luZG93UmVmLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pc0luaXRpYWxpemVkJCQubmV4dCh0cnVlKTtcbiAgICBpZiAodGhpcy5hdXRoQ29uZmlnLnJlcXVpcmVTaWduSW4gJiYgIXRoaXMuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgIHRoaXMuc2lnbkluKHRoaXMud2luZG93UmVmLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50cnlMb2FkVXNlclByb2ZpbGUoKTtcbiAgICBhd2FpdCB0aGlzLnJvdXRlVG9SZXF1ZXN0ZWRVcmwoKTtcbiAgfVxuXG4gIHB1YmxpYyBydW5QbHVnaW5zKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucnVuUGx1Z2lucyh0aGlzKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc3N1ZXIoKTogVVJMIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIHJldHVybiBuZXcgVVJMKHRoaXMub2F1dGhTZXJ2aWNlLmlzc3VlciEpO1xuICB9XG5cbiAgcHVibGljIHNpZ25Jbih1cmw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9hdXRoU2VydmljZS5pbml0TG9naW5GbG93KHVybCk7XG4gIH1cblxuICBwdWJsaWMgc2lnbk91dChub1JlZGlyZWN0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub2F1dGhTZXJ2aWNlLmxvZ091dChub1JlZGlyZWN0IHx8ICF0aGlzLmdldEFjY2Vzc1Rva2VuKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpO1xuICB9XG5cbiAgcHVibGljIGdldEFjY2Vzc1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVmcmVzaFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRSZWZyZXNoVG9rZW4oKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldElkVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldElkVG9rZW4oKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldElkZW50aXR5Q2xhaW1zKCk6IE9keEF1dGguSWRlbnRpeUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBkZWVwbWVyZ2UodGhpcy5vYXV0aFNlcnZpY2UuZ2V0SWRlbnRpdHlDbGFpbXMoKSwgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5nZXRSZXN1bHQoKSkgYXMgT2R4QXV0aC5JZGVudGl5Q2xhaW1zO1xuICB9XG5cbiAgcHVibGljIGdldFJhd0lkZW50aXR5Q2xhaW1zKCk6IE9keEF1dGguUmF3SWRlbnRpdHlDbGFpbXMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZ2V0SWRUb2tlbigpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0SWRlbnRpdHlDbGFpbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud2luZG93UmVmLmlzT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkgJiYgdGhpcy5vYXV0aFNlcnZpY2UuaGFzVmFsaWRJZFRva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc1ZhbGlkT2ZmbGluZVRva2VuKCk7XG4gIH1cblxuICBwdWJsaWMgaXNBdXRob3JpemVkKGF1dGhvcml6ZWRIYW5kbGVyPzogQXV0aG9yaXplZEhhbmRsZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFuZGxlciA9IGF1dGhvcml6ZWRIYW5kbGVyID8/IHRoaXMuYXV0aENvbmZpZy5kZWZhdWx0QXV0aG9yaXplZEhhbmRsZXI7XG5cbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSAmJiAoaGFuZGxlcj8uKHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKSwgdGhpcywgdGhpcy5yb3V0ZXIpID8/IHRydWUpO1xuICB9XG5cbiAgcHVibGljIGlzQXV0aG9yaXplZCQoYXV0aG9yaXplZEhhbmRsZXI/OiBBdXRob3JpemVkSGFuZGxlciB8IG51bGwpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQkLnBpcGUobWFwKCgpID0+IHRoaXMuaXNBdXRob3JpemVkKGF1dGhvcml6ZWRIYW5kbGVyKSkpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBdXRoUmVxdWVzdCQ8UiBleHRlbmRzIEh0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdCwgVD4ocmVxOiBSLCByZXF1aXJlU2lnbkluID0gZmFsc2UpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQWNjZXNzVG9rZW4kKHJlcXVpcmVTaWduSW4pLnBpcGUobWFwKCh0b2tlbikgPT4gc2V0SHR0cEF1dGhIZWFkZXIocmVxLCB0b2tlbikpKTtcbiAgfVxuXG4gIHB1YmxpYyB3YWl0Rm9yQWNjZXNzVG9rZW4kKHJlcXVpcmVTaWduSW46IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBhY2Nlc3NUb2tlbiQgPSBvZih0aGlzLmdldEFjY2Vzc1Rva2VuKCkpLnBpcGUoZmlsdGVyKCh0b2tlbikgPT4gISF0b2tlbiAmJiB0aGlzLmlzQXV0aGVudGljYXRlZCgpKSk7XG4gICAgY29uc3Qgd2FpdEZvckFjY2Vzc1Rva2VuJCA9IHRoaXMub25Ub2tlblJlY2VpdmVkJC5waXBlKFxuICAgICAgdGltZW91dCh0aGlzLmF1dGhDb25maWcud2FpdEZvclRva2VuSW5NcyA/PyAwKSxcbiAgICAgIGNhdGNoRXJyb3IoYXN5bmMgKCkgPT4gdGhpcy50cnlSZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiBudWxsKSksXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gbWVyZ2UoYWNjZXNzVG9rZW4kLCB3YWl0Rm9yQWNjZXNzVG9rZW4kKSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwKCgpID0+IHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSksXG4gICAgICB0YXAoKHRva2VuKSA9PiAhdG9rZW4gJiYgcmVxdWlyZVNpZ25JbiAmJiB0aGlzLnNpZ25Jbih0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5wYXRobmFtZSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlVG9SZXF1ZXN0ZWRVcmwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9hdXRoU2VydmljZS5zdGF0ZSB8fCAhdGhpcy5vYXV0aFNlcnZpY2UuaGFzVmFsaWRBY2Nlc3NUb2tlbigpKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChkZWNvZGVVUklDb21wb25lbnQodGhpcy5vYXV0aFNlcnZpY2Uuc3RhdGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzVmFsaWRPZmZsaW5lVG9rZW4oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNzdWVkQXQgPSB0aGlzLmdldElkZW50aXR5Q2xhaW1zKCk/LmlhdCA/PyAwO1xuXG4gICAgcmV0dXJuIERhdGUubm93KCkgLSBpc3N1ZWRBdCAqIDEwMDAgPD0gdGhpcy5hdXRoQ29uZmlnLm1heE9mZmxpbmVUaW1lICogMTAwMDtcbiAgfVxuXG4gIHByaXZhdGUgcmVkaXJlY3RUb0xvZ2luKHVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53aW5kb3dSZWYubG9jYXRpb24uYXNzaWduKHVyaSk7XG4gICAgdGhpcy5pc1JlZGlyZWN0aW5nJCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJ5TG9hZFVzZXJQcm9maWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hdXRoQ29uZmlnLmxvYWRVc2VyUHJvZmlsZSB8fCAhdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMub2F1dGhTZXJ2aWNlLmxvYWRVc2VyUHJvZmlsZSgpLmNhdGNoKCgpID0+IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlSZWZyZXNoVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmdldFJlZnJlc2hUb2tlbigpKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UucmVmcmVzaFRva2VuKCk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydEF1ZGllbmNlKGNsaWVudElkPzogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHRva2VuQ2xpZW50SWQgPSB0aGlzLmdldElkZW50aXR5Q2xhaW1zKCk/LmF1ZDtcbiAgICBpZiAoIWNsaWVudElkIHx8ICF0b2tlbkNsaWVudElkIHx8IGNsaWVudElkID09PSB0b2tlbkNsaWVudElkKSByZXR1cm47XG4gICAgdGhpcy5zaWduT3V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaWxlbnRSZWZyZXNoKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgdGhpcy5vYXV0aFNlcnZpY2Uuc2V0dXBBdXRvbWF0aWNTaWxlbnRSZWZyZXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2F1dGhTZXJ2aWNlLnN0b3BBdXRvbWF0aWNSZWZyZXNoKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBYyxlQUFlLEVBQUUsWUFBWSxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFFZixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFxQixNQUFNLFVBQVUsQ0FBQzs7QUFFaEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUEwRnRCOzs7OztPQUtHO0lBQ0gsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEO1FBbkdpQixlQUFVLEdBQUcsZ0JBQWdCLEVB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RSxDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOytHQTdVVSxXQUFXO21IQUFYLFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQXV0aENvbmZpZywgT0F1dGhFcnJvckV2ZW50LCBPQXV0aFNlcnZpY2UsIFRva2VuUmVzcG9uc2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IGRlZXBtZXJnZSB9IGZyb20gJ2RlZXBtZXJnZS10cyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBzaGFyZVJlcGxheSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGltZW91dCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbmplY3RBdXRoQ29uZmlnIH0gZnJvbSAnLi9hdXRoLmNvbmZpZyc7XG5pbXBvcnQgeyBzZXRIdHRwQXV0aEhlYWRlciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBBdXRoUGx1Z2luTWFuYWdlciwgQXV0aG9yaXplZEhhbmRsZXIgfSBmcm9tICcuL21vZGVscyc7XG5cbi8qKlxuICogVGhlIGBBdXRoU2VydmljZWAgY2xhc3MgcHJvdmlkZXMgYXV0aGVudGljYXRpb24gZnVuY3Rpb25hbGl0eSBmb3IgYW4gQW5ndWxhciBhcHBsaWNhdGlvbi5cbiAqIEl0IGhhbmRsZXMgT0F1dGgyL09JREMgYXV0aGVudGljYXRpb24sIHRva2VuIG1hbmFnZW1lbnQsIGFuZCB1c2VyIGlkZW50aXR5IGNsYWltcy5cbiAqXG4gKiBLZXkgcmVzcG9uc2liaWxpdGllcyBpbmNsdWRlOlxuICogLSBJbml0aWFsaXppbmcgYXV0aGVudGljYXRpb24gd2l0aCBhIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE1hbmFnaW5nIHRva2VucyAoYWNjZXNzLCByZWZyZXNoLCBhbmQgSUQgdG9rZW5zKS5cbiAqIC0gQ2hlY2tpbmcgYW5kIGVtaXR0aW5nIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIHN0YXRlcy5cbiAqIC0gSGFuZGxpbmcgdXNlciBsb2dpbiBhbmQgbG9nb3V0IGZsb3dzLlxuICogLSBTdXBwb3J0aW5nIHNpbGVudCByZWZyZXNoIGFuZCBvZmZsaW5lIGF1dGhlbnRpY2F0aW9uIHNjZW5hcmlvcy5cbiAqIC0gSW50ZWdyYXRpbmcgYXV0aGVudGljYXRpb24gcGx1Z2lucyB2aWEgYEF1dGhQbHVnaW5NYW5hZ2VyYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5qZWN0aW5nIHRoZSBBdXRoU2VydmljZVxuICogY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpIHt9XG4gKlxuICogLy8gVXNpbmcgdGhlIEF1dGhTZXJ2aWNlIHRvIGluaXRpYWxpemUgYXV0aGVudGljYXRpb25cbiAqIGFzeW5jIG5nT25Jbml0KCkge1xuICogICBjb25zdCBjb25maWc6IEF1dGhDb25maWcgPSB7IGNsaWVudElkOiAneW91ci1jbGllbnQtaWQnLCBkaXNjb3ZlcnlVcmw6ICdodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJyB9O1xuICogICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLmluaXRpYWxpemUoY29uZmlnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoQ29uZmlnID0gaW5qZWN0QXV0aENvbmZpZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhQbHVnaW5NYW5hZ2VyID0gaW5qZWN0KEF1dGhQbHVnaW5NYW5hZ2VyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvYXV0aFNlcnZpY2UgPSBpbmplY3QoT0F1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dSZWYgPSBpbmplY3QoV2luZG93UmVmKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWQkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzUmVkaXJlY3RpbmckJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQWNjZXNzVG9rZW5VcGRhdGUkID0gZnJvbUV2ZW50PFN0b3JhZ2VFdmVudD4odGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LCAnc3RvcmFnZScpLnBpcGUoXG4gICAgZmlsdGVyKCh7IGtleSB9KSA9PiBrZXkgPT09ICdhY2Nlc3NfdG9rZW4nIHx8IGtleSA9PT0gbnVsbCksXG4gICAgc3RhcnRXaXRoKG51bGwpLFxuICAgIHNoYXJlKCksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lsZW50UmVmcmVzaEhhbmRsZXIkID0gdGhpcy5pc0luaXRpYWxpemVkJCQucGlwZShcbiAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMud2luZG93UmVmLmlzT25saW5lJCksXG4gICAgdGFwKChpc09ubGluZSkgPT4gdGhpcy51cGRhdGVTaWxlbnRSZWZyZXNoKGlzT25saW5lKSksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BdXRoU3RhdGVDaGFuZ2UkID0gY29tYmluZUxhdGVzdChbdGhpcy5vYXV0aFNlcnZpY2UuZXZlbnRzLnBpcGUoc3RhcnRXaXRoKG51bGwpKSwgdGhpcy53aW5kb3dSZWYuaXNPbmxpbmUkLCB0aGlzLm9uQWNjZXNzVG9rZW5VcGRhdGUkXSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHRoZSBzZXJ2aWNlIGhhcyBjb21wbGV0ZWQgaW5pdGlhbGl6YXRpb24uXG4gICAqIEVtaXRzIGBmYWxzZWAgdW50aWwgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAdHlwZSB7T2JzZXJ2YWJsZTxib29sZWFuPn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0luaXRpYWxpemVkJCA9IHRoaXMuaXNJbml0aWFsaXplZCQkLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAvKipcbiAgICogRW1pdHMgYHRydWVgIHdoZW4gdGhlIHVzZXIgaXMgYmVpbmcgcmVkaXJlY3RlZCB0byB0aGUgbG9naW4gcGFnZS5cbiAgICogRW1pdHMgYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vIHJlZGlyZWN0aW9uIGluIHByb2dyZXNzLlxuICAgKlxuICAgKiBAdHlwZSB7T2JzZXJ2YWJsZTxib29sZWFuPn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1JlZGlyZWN0aW5nJCA9IHRoaXMuaXNSZWRpcmVjdGluZyQkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbiBhIGxvYWRpbmcgc3RhdGUgKGUuZy4sIGR1cmluZyByZWRpcmVjdGlvbiBvciBwbHVnaW4gaW5pdGlhbGl6YXRpb24pLlxuICAgKiBFbWl0cyBgZmFsc2VgIHdoZW4gdGhlcmUgaXMgbm8gb25nb2luZyBsb2FkaW5nIGFjdGl2aXR5LlxuICAgKlxuICAgKiBAdHlwZSB7T2JzZXJ2YWJsZTxib29sZWFuPn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmckID0gbWVyZ2UodGhpcy5pc1JlZGlyZWN0aW5nJCwgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5wbHVnaW5zTG9hZGluZyQpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqIEVtaXRzIGBmYWxzZWAgd2hlbiB0aGUgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkJCA9IHRoaXMuaXNJbml0aWFsaXplZCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5wbHVnaW5zUmVhZHkkKSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5vbkF1dGhTdGF0ZUNoYW5nZSQpLFxuICAgIG1hcCgoKSA9PiB0aGlzLmlzQXV0aGVudGljYXRlZCgpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBpZGVudGl0eSBjbGFpbXMgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICogSWYgdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQsIGVtaXRzIGBudWxsYC5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8T2R4QXV0aC5JZGVudGl0eUNsYWltcyB8IG51bGw+fVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aXR5Q2xhaW1zJCA9IHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgIG1hcCgoKSA9PiB0aGlzLmdldElkZW50aXR5Q2xhaW1zKCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIE9BdXRoIGVycm9yIGV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8T0F1dGhFcnJvckV2ZW50Pn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnMkID0gdGhpcy5vYXV0aFNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKChldmVudCk6IGV2ZW50IGlzIE9BdXRoRXJyb3JFdmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE9BdXRoRXJyb3JFdmVudCksXG4gICAgc2hhcmUoKSxcbiAgKTtcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnRzIHdoZW4gYW4gT0F1dGggdG9rZW4gaXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkLlxuICAgKlxuICAgKiBAdHlwZSB7T2JzZXJ2YWJsZTxFdmVudD59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb25Ub2tlblJlY2VpdmVkJCA9IHRoaXMub2F1dGhTZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LnR5cGUgPT09ICd0b2tlbl9yZWNlaXZlZCcpLFxuICAgIHNoYXJlKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBgYWNjZXNzX3Rva2VuYCBpbiBsb2NhbCBzdG9yYWdlIGlzIHVwZGF0ZWQgb3IgY2xlYXJlZC5cbiAgICogUHJvdmlkZXMgYW4gb2JzZXJ2YWJsZSBmb3IgdHJhY2tpbmcgdG9rZW4gdXBkYXRlcy5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8U3RvcmFnZUV2ZW50IHwgbnVsbD59XG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjY2Vzc1Rva2VuVXBkYXRlJCgpOiBPYnNlcnZhYmxlPFN0b3JhZ2VFdmVudCB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5vbkFjY2Vzc1Rva2VuVXBkYXRlJDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucnVuUGx1Z2lucygpO1xuICAgIHRoaXMuc2lsZW50UmVmcmVzaEhhbmRsZXIkLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlIHdpdGggdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aENvbmZpZ30gY29uZmlnIC0gVGhlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbmZpZzogQXV0aENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0QXVkaWVuY2UoY29uZmlnLmNsaWVudElkKTtcbiAgICB0aGlzLm9hdXRoU2VydmljZS5jb25maWd1cmUoeyAuLi5jb25maWcsIG9wZW5Vcmk6IHRoaXMucmVkaXJlY3RUb0xvZ2luLmJpbmQodGhpcykgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudCh0aGlzLmF1dGhDb25maWcuZGlzY292ZXJ5VXJsKTtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhTZXJ2aWNlLnRyeUxvZ2luKCk7XG4gICAgICBpZiAodGhpcy5hdXRoQ29uZmlnLnJlZnJlc2hUb2tlbk9uSW5pdCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRyeVJlZnJlc2hUb2tlbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlIHx8IGVycm9yIGluc3RhbmNlb2YgT0F1dGhFcnJvckV2ZW50KSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvci50eXBlID09PSAndG9rZW5fcmVmcmVzaF9lcnJvcicgfHwgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgJiYgKGVycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yLnN0YXR1cyA9PT0gNDAwKSkpIHtcbiAgICAgICAgdGhpcy5zaWduT3V0KHRydWUpO1xuICAgICAgICB0aGlzLnNpZ25Jbih0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNJbml0aWFsaXplZCQkLm5leHQodHJ1ZSk7XG4gICAgaWYgKHRoaXMuYXV0aENvbmZpZy5yZXF1aXJlU2lnbkluICYmICF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICB0aGlzLnNpZ25Jbih0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudHJ5TG9hZFVzZXJQcm9maWxlKCk7XG4gICAgYXdhaXQgdGhpcy5yb3V0ZVRvUmVxdWVzdGVkVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbGwgYXV0aGVudGljYXRpb24gcGx1Z2lucyByZWdpc3RlcmVkIGluIHRoZSBgQXV0aFBsdWdpbk1hbmFnZXJgLlxuICAgKi9cbiAgcHVibGljIHJ1blBsdWdpbnMoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5ydW5QbHVnaW5zKHRoaXMpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlzc3VlciBVUkwgZm9yIHRoZSBPQXV0aCBzZXJ2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtVUkx9IFRoZSBpc3N1ZXIgVVJMLlxuICAgKi9cbiAgcHVibGljIGdldElzc3VlcigpOiBVUkwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIG5ldyBVUkwodGhpcy5vYXV0aFNlcnZpY2UuaXNzdWVyISk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIHRoZSBsb2dpbiBmbG93IGZvciB0aGUgdXNlci4gUmVkaXJlY3RzIHRvIHRoZSBsb2dpbiBwYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIHJlZGlyZWN0IGJhY2sgdG8gYWZ0ZXIgbG9naW4uXG4gICAqL1xuICBwdWJsaWMgc2lnbkluKHVybD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub2F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3codXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSB1c2VyIG91dCBhbmQgY2xlYXJzIHRoZWlyIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbm9SZWRpcmVjdF0gLSBJZiBgdHJ1ZWAsIG5vIHJlZGlyZWN0aW9uIG9jY3VycyBhZnRlciBsb2dvdXQuXG4gICAqL1xuICBwdWJsaWMgc2lnbk91dChub1JlZGlyZWN0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub2F1dGhTZXJ2aWNlLmxvZ091dChub1JlZGlyZWN0IHx8ICF0aGlzLmdldEFjY2Vzc1Rva2VuKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlZnJlc2ggdGhlIHVzZXIncyB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSBSZXNvbHZlcyB3aXRoIHRoZSBuZXcgdG9rZW4gcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VucygpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UucmVmcmVzaFRva2VuKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGFjY2VzcyB0b2tlbiwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gVGhlIGFjY2VzcyB0b2tlbiwgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWNjZXNzVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgcmVmcmVzaCB0b2tlbiwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gVGhlIHJlZnJlc2ggdG9rZW4sIG9yIGBudWxsYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldFJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0UmVmcmVzaFRva2VuKCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgSUQgdG9rZW4sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSBJRCB0b2tlbiwgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SWRUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0SWRUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBpZGVudGl0eSBjbGFpbXMgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge09keEF1dGguSWRlbnRpdHlDbGFpbXMgfCBudWxsfSBUaGUgaWRlbnRpdHkgY2xhaW1zLCBvciBgbnVsbGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJZGVudGl0eUNsYWltcygpOiBPZHhBdXRoLklkZW50aXlDbGFpbXMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZ2V0SWRUb2tlbigpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVlcG1lcmdlKHRoaXMub2F1dGhTZXJ2aWNlLmdldElkZW50aXR5Q2xhaW1zKCksIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIuZ2V0UmVzdWx0KCkpIGFzIE9keEF1dGguSWRlbnRpeUNsYWltcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJhdyBpZGVudGl0eSBjbGFpbXMgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge09keEF1dGguUmF3SWRlbnRpdHlDbGFpbXMgfCBudWxsfSBUaGUgcmF3IGlkZW50aXR5IGNsYWltcywgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmF3SWRlbnRpdHlDbGFpbXMoKTogT2R4QXV0aC5SYXdJZGVudGl0eUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRJZGVudGl0eUNsYWltcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBjdXJyZW50bHkgYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhdXRoZW50aWNhdGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud2luZG93UmVmLmlzT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkgJiYgdGhpcy5vYXV0aFNlcnZpY2UuaGFzVmFsaWRJZFRva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc1ZhbGlkT2ZmbGluZVRva2VuKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGF1dGhvcml6ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGlzQXV0aG9yaXplZChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBhdXRob3JpemVkSGFuZGxlciA/PyB0aGlzLmF1dGhDb25maWcuZGVmYXVsdEF1dGhvcml6ZWRIYW5kbGVyO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkgJiYgKGhhbmRsZXI/Lih0aGlzLmdldElkZW50aXR5Q2xhaW1zKCksIHRoaXMsIHRoaXMucm91dGVyKSA/PyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGV0aGVyIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYXV0aG9yaXphdGlvbiBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgaXNBdXRob3JpemVkJChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZCQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0F1dGhvcml6ZWQoYXV0aG9yaXplZEhhbmRsZXIpKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW4gSFRUUCByZXF1ZXN0IGJ5IGFkZGluZyB0aGUgYWNjZXNzIHRva2VuIHRvIGl0cyBoZWFkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdH0gcmVxIC0gVGhlIEhUVFAgcmVxdWVzdCB0byBwcmVwYXJlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVTaWduSW4gLSBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIHVzZXIgdG8gc2lnbiBpbiBpZiBubyB0b2tlbiBpcyBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFI+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwcmVwYXJlZCByZXF1ZXN0LlxuICAgKiBAdGVtcGxhdGUgUiwgVFxuICAgKi9cbiAgcHVibGljIHByZXBhcmVBdXRoUmVxdWVzdCQ8UiBleHRlbmRzIEh0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdCwgVD4ocmVxOiBSLCByZXF1aXJlU2lnbkluID0gZmFsc2UpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQWNjZXNzVG9rZW4kKHJlcXVpcmVTaWduSW4pLnBpcGUobWFwKCh0b2tlbikgPT4gc2V0SHR0cEF1dGhIZWFkZXIocmVxLCB0b2tlbikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSB2YWxpZCBhY2Nlc3MgdG9rZW4gdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlU2lnbkluIC0gV2hldGhlciB0byByZXF1aXJlIHRoZSB1c2VyIHRvIHNpZ24gaW4gaWYgbm8gdG9rZW4gaXMgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHdhaXRGb3JBY2Nlc3NUb2tlbiQocmVxdWlyZVNpZ25JbjogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuJCA9IG9mKHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSkucGlwZShmaWx0ZXIoKHRva2VuKSA9PiAhIXRva2VuICYmIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpKTtcbiAgICBjb25zdCB3YWl0Rm9yQWNjZXNzVG9rZW4kID0gdGhpcy5vblRva2VuUmVjZWl2ZWQkLnBpcGUoXG4gICAgICB0aW1lb3V0KHRoaXMuYXV0aENvbmZpZy53YWl0Rm9yVG9rZW5Jbk1zID8/IDApLFxuICAgICAgY2F0Y2hFcnJvcihhc3luYyAoKSA9PiB0aGlzLnRyeVJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IG51bGwpKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNJbml0aWFsaXplZCQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBtZXJnZShhY2Nlc3NUb2tlbiQsIHdhaXRGb3JBY2Nlc3NUb2tlbiQpKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5nZXRBY2Nlc3NUb2tlbigpKSxcbiAgICAgIHRhcCgodG9rZW4pID0+ICF0b2tlbiAmJiByZXF1aXJlU2lnbkluICYmIHRoaXMuc2lnbkluKHRoaXMud2luZG93UmVmLmxvY2F0aW9uLnBhdGhuYW1lKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcm91dGVUb1JlcXVlc3RlZFVybCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2F1dGhTZXJ2aWNlLnN0YXRlIHx8ICF0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLm9hdXRoU2VydmljZS5zdGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWxpZE9mZmxpbmVUb2tlbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc3N1ZWRBdCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uaWF0ID8/IDA7XG5cbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGlzc3VlZEF0ICogMTAwMCA8PSB0aGlzLmF1dGhDb25maWcubWF4T2ZmbGluZVRpbWUgKiAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdFRvTG9naW4odXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5hc3NpZ24odXJpKTtcbiAgICB0aGlzLmlzUmVkaXJlY3RpbmckJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlMb2FkVXNlclByb2ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhDb25maWcubG9hZFVzZXJQcm9maWxlIHx8ICF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UubG9hZFVzZXJQcm9maWxlKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeVJlZnJlc2hUb2tlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZ2V0UmVmcmVzaFRva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS5yZWZyZXNoVG9rZW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0QXVkaWVuY2UoY2xpZW50SWQ/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW5DbGllbnRJZCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uYXVkO1xuICAgIGlmICghY2xpZW50SWQgfHwgIXRva2VuQ2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRva2VuQ2xpZW50SWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25PdXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNpbGVudFJlZnJlc2goZW5hYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICB0aGlzLm9hdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vYXV0aFNlcnZpY2Uuc3RvcEF1dG9tYXRpY1JlZnJlc2goKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -9,22 +9,31 @@ import * as i0 from "@angular/core";
9
9
  import * as i1 from "@angular/common";
10
10
  import * as i2 from "@odx/angular/components/list";
11
11
  import * as i3 from "@odx/angular/components/icon";
12
+ /**
13
+ * Displays authentication actions.
14
+ */
12
15
  let AuthActionsComponent = class AuthActionsComponent {
13
16
  constructor() {
14
17
  this.element = injectElement();
18
+ /**
19
+ * The identity claims.
20
+ *
21
+ * @type {OdxAuth.IdentiyClaims | null}
22
+ * @default null
23
+ */
15
24
  this.claims = null;
16
25
  }
17
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AuthActionsComponent, isStandalone: true, selector: "odx-auth-actions", inputs: { claims: "claims" }, ngImport: i0, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a data-testid=\"odx-auth-user-profile-link\" odxListItem [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n <odx-icon name=\"link-external\" iconSet=\"core\" size=\"small\" odxListItemSuffix />\n </a>\n }\n</odx-list>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i2.ListComponent, selector: "odx-list" }, { kind: "component", type: i2.ListItemComponent, selector: "odx-list-item, [odxListItem]", inputs: ["danger", "variant", "muted", "selected"] }, { kind: "component", type: i3.IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "pipe", type: TranslatePipe, name: "odxTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: AuthActionsComponent, isStandalone: true, selector: "odx-auth-actions", inputs: { claims: "claims" }, ngImport: i0, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a data-testid=\"odx-auth-user-profile-link\" odxListItem [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n <odx-icon name=\"link-external\" iconSet=\"core\" size=\"small\" odxListItemSuffix />\n </a>\n }\n</odx-list>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i2.ListComponent, selector: "odx-list" }, { kind: "component", type: i2.ListItemComponent, selector: "odx-list-item, [odxListItem]", inputs: ["danger", "variant", "muted", "selected"] }, { kind: "component", type: i3.IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "pipe", type: TranslatePipe, name: "odxTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19
28
  };
20
29
  AuthActionsComponent = __decorate([
21
30
  CSSComponent('auth-actions')
22
31
  ], AuthActionsComponent);
23
32
  export { AuthActionsComponent };
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthActionsComponent, decorators: [{
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthActionsComponent, decorators: [{
25
34
  type: Component,
26
35
  args: [{ standalone: true, selector: 'odx-auth-actions', imports: [CoreModule, ListModule, TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a data-testid=\"odx-auth-user-profile-link\" odxListItem [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n <odx-icon name=\"link-external\" iconSet=\"core\" size=\"small\" odxListItemSuffix />\n </a>\n }\n</odx-list>\n" }]
27
36
  }], propDecorators: { claims: [{
28
37
  type: Input
29
38
  }] } });
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1hY3Rpb25zL2F1dGgtYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtYWN0aW9ucy9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQVc1QyxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFvQjtJQUExQjtRQUNXLFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUduQyxXQUFNLEdBQWlDLElBQUksQ0FBQztLQUNwRDsrR0FMWSxvQkFBb0I7bUdBQXBCLG9CQUFvQiwwR0NoQmpDLDZhQVNBLDJDREVZLFVBQVUsbUZBQUUsVUFBVSxrWEFBRSxhQUFhOztBQUtwQyxvQkFBb0I7SUFUaEMsWUFBWSxDQUFDLGNBQWMsQ0FBQztHQVNoQixvQkFBb0IsQ0FLaEM7OzRGQUxZLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sa0JBQWtCLFdBQ25CLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsbUJBRS9CLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OEJBTTlCLE1BQU07c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBMaXN0TW9kdWxlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbGlzdCc7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbC90cmFuc2xhdGUnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5cbkBDU1NDb21wb25lbnQoJ2F1dGgtYWN0aW9ucycpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtYXV0aC1hY3Rpb25zJyxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIExpc3RNb2R1bGUsIFRyYW5zbGF0ZVBpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhBY3Rpb25zQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3RFbGVtZW50KCk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNsYWltczogT2R4QXV0aC5JZGVudGl5Q2xhaW1zIHwgbnVsbCA9IG51bGw7XG59XG4iLCI8b2R4LWxpc3Q+XG4gIEBpZiAoY2xhaW1zPy51c2VyUHJvZmlsZVVybDsgYXMgdXJsKSB7XG4gICAgPGEgZGF0YS10ZXN0aWQ9XCJvZHgtYXV0aC11c2VyLXByb2ZpbGUtbGlua1wiIG9keExpc3RJdGVtIFtocmVmXT1cInVybFwiIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8b2R4LWljb24gbmFtZT1cInVzZXItYWRtaW5pc3RyYXRpb25cIiBpY29uU2V0PVwiY29yZVwiIG9keExpc3RJdGVtUHJlZml4IC8+XG4gICAgICB7eyAndXNlclByb2ZpbGVMaW5rJyB8IG9keFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICA8b2R4LWljb24gbmFtZT1cImxpbmstZXh0ZXJuYWxcIiBpY29uU2V0PVwiY29yZVwiIHNpemU9XCJzbWFsbFwiIG9keExpc3RJdGVtU3VmZml4IC8+XG4gICAgPC9hPlxuICB9XG48L29keC1saXN0PlxuIl19
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1hY3Rpb25zL2F1dGgtYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtYWN0aW9ucy9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQUVuRDs7R0FFRztBQVVJLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBQTFCO1FBQ1csWUFBTyxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRTFDOzs7OztXQUtHO1FBRUksV0FBTSxHQUFpQyxJQUFJLENBQUM7S0FDcEQ7K0dBWFksb0JBQW9CO21HQUFwQixvQkFBb0IsMEdDbkJqQyw2YUFTQSwyQ0RLWSxVQUFVLG1GQUFFLFVBQVUsa1hBQUUsYUFBYTs7QUFLcEMsb0JBQW9CO0lBVGhDLFlBQVksQ0FBQyxjQUFjLENBQUM7R0FTaEIsb0JBQW9CLENBV2hDOzs0RkFYWSxvQkFBb0I7a0JBUmhDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGtCQUFrQixXQUNuQixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLG1CQUUvQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJOzhCQVk5QixNQUFNO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcmVNb2R1bGUgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2xpc3QnO1xuaW1wb3J0IHsgQ1NTQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2ludGVybmFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwvdHJhbnNsYXRlJztcbmltcG9ydCB7IGluamVjdEVsZW1lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuXG4vKipcbiAqIERpc3BsYXlzIGF1dGhlbnRpY2F0aW9uIGFjdGlvbnMuXG4gKi9cbkBDU1NDb21wb25lbnQoJ2F1dGgtYWN0aW9ucycpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtYXV0aC1hY3Rpb25zJyxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIExpc3RNb2R1bGUsIFRyYW5zbGF0ZVBpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhBY3Rpb25zQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3RFbGVtZW50KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGl0eSBjbGFpbXMuXG4gICAqXG4gICAqIEB0eXBlIHtPZHhBdXRoLklkZW50aXlDbGFpbXMgfCBudWxsfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2xhaW1zOiBPZHhBdXRoLklkZW50aXlDbGFpbXMgfCBudWxsID0gbnVsbDtcbn1cbiIsIjxvZHgtbGlzdD5cbiAgQGlmIChjbGFpbXM/LnVzZXJQcm9maWxlVXJsOyBhcyB1cmwpIHtcbiAgICA8YSBkYXRhLXRlc3RpZD1cIm9keC1hdXRoLXVzZXItcHJvZmlsZS1saW5rXCIgb2R4TGlzdEl0ZW0gW2hyZWZdPVwidXJsXCIgcmVsPVwibm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxvZHgtaWNvbiBuYW1lPVwidXNlci1hZG1pbmlzdHJhdGlvblwiIGljb25TZXQ9XCJjb3JlXCIgb2R4TGlzdEl0ZW1QcmVmaXggLz5cbiAgICAgIHt7ICd1c2VyUHJvZmlsZUxpbmsnIHwgb2R4VHJhbnNsYXRlIHwgYXN5bmMgfX1cbiAgICAgIDxvZHgtaWNvbiBuYW1lPVwibGluay1leHRlcm5hbFwiIGljb25TZXQ9XCJjb3JlXCIgc2l6ZT1cInNtYWxsXCIgb2R4TGlzdEl0ZW1TdWZmaXggLz5cbiAgICA8L2E+XG4gIH1cbjwvb2R4LWxpc3Q+XG4iXX0=
@@ -3,7 +3,6 @@ import { CommonModule } from '@angular/common';
3
3
  import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';
4
4
  import { fadeOut } from '@odx/angular/animations';
5
5
  import { DynamicViewDirective } from '@odx/angular/cdk/dynamic-view';
6
- import { ButtonComponent } from '@odx/angular/components/button';
7
6
  import { CircularProgressComponent } from '@odx/angular/components/circular-progress';
8
7
  import { IconComponent } from '@odx/angular/components/icon';
9
8
  import { LogoDirective } from '@odx/angular/components/logo';
@@ -12,12 +11,25 @@ import { injectAuthConfig } from '../../auth.config';
12
11
  import { AuthService } from '../../auth.service';
13
12
  import * as i0 from "@angular/core";
14
13
  import * as i1 from "@angular/common";
14
+ /**
15
+ * Authentication loading screen.
16
+ *
17
+ * This component displays a loading screen with animations and dynamic content
18
+ * based on the authentication state.
19
+ */
15
20
  export class AuthLoadingScreenComponent {
16
21
  constructor() {
17
22
  this.authConfig = injectAuthConfig();
18
23
  this.icon$ = inject(AuthService).isRedirecting$.pipe(map((isRedirecting) => (isRedirecting ? 'link-external' : 'user')));
19
24
  }
20
25
  static { this.instance = null; }
26
+ /**
27
+ * Initializes the authentication loading screen.
28
+ *
29
+ * @param {AuthService} authService - The authentication service.
30
+ * @param {DynamicViewService} dynamicViewService - The dynamic view service used to create the loading screen.
31
+ * @static
32
+ */
21
33
  static initialize(authService, dynamicViewService) {
22
34
  authService.isLoading$.subscribe((isLoading) => {
23
35
  if (isLoading) {
@@ -29,13 +41,13 @@ export class AuthLoadingScreenComponent {
29
41
  }
30
42
  });
31
43
  }
32
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthLoadingScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AuthLoadingScreenComponent, isStandalone: true, selector: "div.odx-auth-loading-screen", host: { properties: { "@hostAnimation": "true" } }, ngImport: i0, template: "<div class=\"odx-auth-loading-screen__content\" odxLayout=\"grid 12 horizontal-center vertical-center gap-small\">\n <odx-logo size=\"large\" />\n <odx-circular-progress class=\"odx-auth-loading-screen__spinner\" value=\"-1\" size=\"medium\" stroke=\"3\">\n <odx-icon [name]=\"icon$ | async\" iconSet=\"core\" />\n </odx-circular-progress>\n @if (authConfig.loadingScreenMessage; as content) {\n <p class=\"odx-auth-loading-screen__message\">\n <ng-template [odxDynamicView]=\"content\" />\n </p>\n }\n</div>\n", styles: ["@keyframes odx-auth-loading-screen-animation{0%{opacity:0;transform:translate(-50%,-50%) scale(.9)}to{opacity:1;transform:translate(-50%,-50%)}}.odx-auth-loading-screen{--odx-c-highlight: var(--odx-c-primary);background-color:var(--odx-c-background-content);inset:0;position:fixed;z-index:var(--odx-v-layer-6)}.odx-auth-loading-screen__content{animation:odx-auth-loading-screen-animation .75s ease;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.odx-auth-loading-screen__message{text-align:center}.odx-auth-loading-screen__spinner{position:relative}.odx-auth-loading-screen__spinner .odx-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: LogoDirective, selector: "odx-logo", inputs: ["size", "variant"] }, { kind: "component", type: CircularProgressComponent, selector: "odx-circular-progress", inputs: ["stroke", "size", "value"] }, { kind: "directive", type: DynamicViewDirective, selector: "ng-template[odxDynamicView]", inputs: ["odxDynamicView", "odxDynamicViewInjector", "odxDynamicViewContext"] }], animations: [trigger('hostAnimation', [transition(':leave', useAnimation(fadeOut()))])], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthLoadingScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: AuthLoadingScreenComponent, isStandalone: true, selector: "div.odx-auth-loading-screen", host: { properties: { "@hostAnimation": "true" } }, ngImport: i0, template: "<div class=\"odx-auth-loading-screen__content\" odxLayout=\"grid 12 horizontal-center vertical-center gap-small\">\n <odx-logo size=\"large\" />\n <odx-circular-progress class=\"odx-auth-loading-screen__spinner\" value=\"-1\" size=\"medium\" stroke=\"3\">\n <odx-icon [name]=\"icon$ | async\" iconSet=\"core\" />\n </odx-circular-progress>\n @if (authConfig.loadingScreenMessage; as content) {\n <p class=\"odx-auth-loading-screen__message\">\n <ng-template [odxDynamicView]=\"content\" />\n </p>\n }\n</div>\n", styles: ["@keyframes odx-auth-loading-screen-animation{0%{opacity:0;transform:translate(-50%,-50%) scale(.9)}to{opacity:1;transform:translate(-50%,-50%)}}.odx-auth-loading-screen{--odx-c-highlight: var(--odx-c-primary);background-color:var(--odx-c-background-content);inset:0;position:fixed;z-index:var(--odx-v-layer-6)}.odx-auth-loading-screen__content{animation:odx-auth-loading-screen-animation .75s ease;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.odx-auth-loading-screen__message{text-align:center}.odx-auth-loading-screen__spinner{position:relative}.odx-auth-loading-screen__spinner .odx-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: LogoDirective, selector: "odx-logo", inputs: ["size", "variant"] }, { kind: "component", type: CircularProgressComponent, selector: "odx-circular-progress", inputs: ["stroke", "size", "value"] }, { kind: "directive", type: DynamicViewDirective, selector: "ng-template[odxDynamicView]", inputs: ["odxDynamicView", "odxDynamicViewInjector", "odxDynamicViewContext"] }], animations: [trigger('hostAnimation', [transition(':leave', useAnimation(fadeOut()))])], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
34
46
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthLoadingScreenComponent, decorators: [{
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthLoadingScreenComponent, decorators: [{
36
48
  type: Component,
37
- args: [{ standalone: true, selector: 'div.odx-auth-loading-screen', imports: [CommonModule, ButtonComponent, IconComponent, LogoDirective, CircularProgressComponent, DynamicViewDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
49
+ args: [{ standalone: true, selector: 'div.odx-auth-loading-screen', imports: [CommonModule, IconComponent, LogoDirective, CircularProgressComponent, DynamicViewDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
38
50
  '[@hostAnimation]': 'true',
39
51
  }, animations: [trigger('hostAnimation', [transition(':leave', useAnimation(fadeOut()))])], template: "<div class=\"odx-auth-loading-screen__content\" odxLayout=\"grid 12 horizontal-center vertical-center gap-small\">\n <odx-logo size=\"large\" />\n <odx-circular-progress class=\"odx-auth-loading-screen__spinner\" value=\"-1\" size=\"medium\" stroke=\"3\">\n <odx-icon [name]=\"icon$ | async\" iconSet=\"core\" />\n </odx-circular-progress>\n @if (authConfig.loadingScreenMessage; as content) {\n <p class=\"odx-auth-loading-screen__message\">\n <ng-template [odxDynamicView]=\"content\" />\n </p>\n }\n</div>\n", styles: ["@keyframes odx-auth-loading-screen-animation{0%{opacity:0;transform:translate(-50%,-50%) scale(.9)}to{opacity:1;transform:translate(-50%,-50%)}}.odx-auth-loading-screen{--odx-c-highlight: var(--odx-c-primary);background-color:var(--odx-c-background-content);inset:0;position:fixed;z-index:var(--odx-v-layer-6)}.odx-auth-loading-screen__content{animation:odx-auth-loading-screen-animation .75s ease;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.odx-auth-loading-screen__message{text-align:center}.odx-auth-loading-screen__spinner{position:relative}.odx-auth-loading-screen__spinner .odx-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}\n"] }]
40
52
  }] });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtbG9hZGluZy1zY3JlZW4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtbG9hZGluZy1zY3JlZW4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBc0MsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBZ0JqRCxNQUFNLE9BQU8sMEJBQTBCO0lBZHZDO1FBaUJxQixlQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoQyxVQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FZeEk7YUFmZ0IsYUFBUSxHQUE2RCxJQUFJLEFBQWpFLENBQWtFO0lBS2xGLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBd0IsRUFBRSxrQkFBc0M7UUFDdkYsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLDBCQUEwQixDQUFDLFFBQVEsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUNwRyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEJBQTBCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMvQywwQkFBMEIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBZlUsMEJBQTBCO21HQUExQiwwQkFBMEIsMklDM0J2QyxtaEJBV0EsaXVCRE1ZLFlBQVksb0ZBQW1CLGFBQWEsa0hBQUUsYUFBYSxrRkFBRSx5QkFBeUIsdUdBQUUsb0JBQW9CLHlJQVExRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs0RkFFNUUsMEJBQTBCO2tCQWR0QyxTQUFTO2lDQUNJLElBQUksWUFFTiw2QkFBNkIsV0FDOUIsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUseUJBQXlCLEVBQUUsb0JBQW9CLENBQUMsbUJBR3RHLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osa0JBQWtCLEVBQUUsTUFBTTtxQkFDM0IsY0FDVyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHJhbnNpdGlvbiwgdHJpZ2dlciwgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmFkZU91dCB9IGZyb20gJ0BvZHgvYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IER5bmFtaWNWaWV3RGlyZWN0aXZlLCBEeW5hbWljVmlld1JlZiwgRHluYW1pY1ZpZXdTZXJ2aWNlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9keW5hbWljLXZpZXcnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IENpcmN1bGFyUHJvZ3Jlc3NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9jaXJjdWxhci1wcm9ncmVzcyc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQgeyBMb2dvRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbG9nbyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGluamVjdEF1dGhDb25maWcgfSBmcm9tICcuLi8uLi9hdXRoLmNvbmZpZyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2F1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2Rpdi5vZHgtYXV0aC1sb2FkaW5nLXNjcmVlbicsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgSWNvbkNvbXBvbmVudCwgTG9nb0RpcmVjdGl2ZSwgQ2lyY3VsYXJQcm9ncmVzc0NvbXBvbmVudCwgRHluYW1pY1ZpZXdEaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dGgtbG9hZGluZy1zY3JlZW4uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW0Bob3N0QW5pbWF0aW9uXSc6ICd0cnVlJyxcbiAgfSxcbiAgYW5pbWF0aW9uczogW3RyaWdnZXIoJ2hvc3RBbmltYXRpb24nLCBbdHJhbnNpdGlvbignOmxlYXZlJywgdXNlQW5pbWF0aW9uKGZhZGVPdXQoKSkpXSldLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudCB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBEeW5hbWljVmlld1JlZjx0eXBlb2YgQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF1dGhDb25maWcgPSBpbmplY3RBdXRoQ29uZmlnKCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpY29uJCA9IGluamVjdChBdXRoU2VydmljZSkuaXNSZWRpcmVjdGluZyQucGlwZShtYXAoKGlzUmVkaXJlY3RpbmcpID0+IChpc1JlZGlyZWN0aW5nID8gJ2xpbmstZXh0ZXJuYWwnIDogJ3VzZXInKSkpO1xuXG4gIHB1YmxpYyBzdGF0aWMgaW5pdGlhbGl6ZShhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIGR5bmFtaWNWaWV3U2VydmljZTogRHluYW1pY1ZpZXdTZXJ2aWNlKTogdm9pZCB7XG4gICAgYXV0aFNlcnZpY2UuaXNMb2FkaW5nJC5zdWJzY3JpYmUoKGlzTG9hZGluZykgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudC5pbnN0YW5jZSA/Pz0gZHluYW1pY1ZpZXdTZXJ2aWNlLmNyZWF0ZVZpZXcoQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQuaW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgICAgQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQuaW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib2R4LWF1dGgtbG9hZGluZy1zY3JlZW5fX2NvbnRlbnRcIiBvZHhMYXlvdXQ9XCJncmlkIDEyIGhvcml6b250YWwtY2VudGVyIHZlcnRpY2FsLWNlbnRlciBnYXAtc21hbGxcIj5cbiAgPG9keC1sb2dvIHNpemU9XCJsYXJnZVwiIC8+XG4gIDxvZHgtY2lyY3VsYXItcHJvZ3Jlc3MgY2xhc3M9XCJvZHgtYXV0aC1sb2FkaW5nLXNjcmVlbl9fc3Bpbm5lclwiIHZhbHVlPVwiLTFcIiBzaXplPVwibWVkaXVtXCIgc3Ryb2tlPVwiM1wiPlxuICAgIDxvZHgtaWNvbiBbbmFtZV09XCJpY29uJCB8IGFzeW5jXCIgaWNvblNldD1cImNvcmVcIiAvPlxuICA8L29keC1jaXJjdWxhci1wcm9ncmVzcz5cbiAgQGlmIChhdXRoQ29uZmlnLmxvYWRpbmdTY3JlZW5NZXNzYWdlOyBhcyBjb250ZW50KSB7XG4gICAgPHAgY2xhc3M9XCJvZHgtYXV0aC1sb2FkaW5nLXNjcmVlbl9fbWVzc2FnZVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtvZHhEeW5hbWljVmlld109XCJjb250ZW50XCIgLz5cbiAgICA8L3A+XG4gIH1cbjwvZGl2PlxuIl19
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtbG9hZGluZy1zY3JlZW4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtbG9hZGluZy1zY3JlZW4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBc0MsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFFakQ7Ozs7O0dBS0c7QUFlSCxNQUFNLE9BQU8sMEJBQTBCO0lBZHZDO1FBaUJxQixlQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoQyxVQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FtQnhJO2FBdEJnQixhQUFRLEdBQTZELElBQUksQUFBakUsQ0FBa0U7SUFLekY7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUF3QixFQUFFLGtCQUFzQztRQUN2RixXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzdDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsMEJBQTBCLENBQUMsUUFBUSxLQUFLLGtCQUFrQixDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQy9DLDBCQUEwQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0QlUsMEJBQTBCO21HQUExQiwwQkFBMEIsMklDaEN2QyxtaEJBV0EsaXVCRFdZLFlBQVksb0ZBQUUsYUFBYSxrSEFBRSxhQUFhLGtGQUFFLHlCQUF5Qix1R0FBRSxvQkFBb0IseUlBUXpGLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OzRGQUU1RSwwQkFBMEI7a0JBZHRDLFNBQVM7aUNBQ0ksSUFBSSxZQUVOLDZCQUE2QixXQUM5QixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLG1CQUdyRix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLGtCQUFrQixFQUFFLE1BQU07cUJBQzNCLGNBQ1csQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRyYW5zaXRpb24sIHRyaWdnZXIsIHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZhZGVPdXQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBEeW5hbWljVmlld0RpcmVjdGl2ZSwgRHluYW1pY1ZpZXdSZWYsIER5bmFtaWNWaWV3U2VydmljZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvZHluYW1pYy12aWV3JztcbmltcG9ydCB7IENpcmN1bGFyUHJvZ3Jlc3NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9jaXJjdWxhci1wcm9ncmVzcyc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQgeyBMb2dvRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbG9nbyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGluamVjdEF1dGhDb25maWcgfSBmcm9tICcuLi8uLi9hdXRoLmNvbmZpZyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2F1dGguc2VydmljZSc7XG5cbi8qKlxuICogQXV0aGVudGljYXRpb24gbG9hZGluZyBzY3JlZW4uXG4gKlxuICogVGhpcyBjb21wb25lbnQgZGlzcGxheXMgYSBsb2FkaW5nIHNjcmVlbiB3aXRoIGFuaW1hdGlvbnMgYW5kIGR5bmFtaWMgY29udGVudFxuICogYmFzZWQgb24gdGhlIGF1dGhlbnRpY2F0aW9uIHN0YXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkaXYub2R4LWF1dGgtbG9hZGluZy1zY3JlZW4nLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50LCBMb2dvRGlyZWN0aXZlLCBDaXJjdWxhclByb2dyZXNzQ29tcG9uZW50LCBEeW5hbWljVmlld0RpcmVjdGl2ZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRoLWxvYWRpbmctc2NyZWVuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0aC1sb2FkaW5nLXNjcmVlbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbQGhvc3RBbmltYXRpb25dJzogJ3RydWUnLFxuICB9LFxuICBhbmltYXRpb25zOiBbdHJpZ2dlcignaG9zdEFuaW1hdGlvbicsIFt0cmFuc2l0aW9uKCc6bGVhdmUnLCB1c2VBbmltYXRpb24oZmFkZU91dCgpKSldKV0sXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhMb2FkaW5nU2NyZWVuQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IER5bmFtaWNWaWV3UmVmPHR5cGVvZiBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXV0aENvbmZpZyA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb24kID0gaW5qZWN0KEF1dGhTZXJ2aWNlKS5pc1JlZGlyZWN0aW5nJC5waXBlKG1hcCgoaXNSZWRpcmVjdGluZykgPT4gKGlzUmVkaXJlY3RpbmcgPyAnbGluay1leHRlcm5hbCcgOiAndXNlcicpKSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBhdXRoZW50aWNhdGlvbiBsb2FkaW5nIHNjcmVlbi5cbiAgICpcbiAgICogQHBhcmFtIHtBdXRoU2VydmljZX0gYXV0aFNlcnZpY2UgLSBUaGUgYXV0aGVudGljYXRpb24gc2VydmljZS5cbiAgICogQHBhcmFtIHtEeW5hbWljVmlld1NlcnZpY2V9IGR5bmFtaWNWaWV3U2VydmljZSAtIFRoZSBkeW5hbWljIHZpZXcgc2VydmljZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbG9hZGluZyBzY3JlZW4uXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5pdGlhbGl6ZShhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIGR5bmFtaWNWaWV3U2VydmljZTogRHluYW1pY1ZpZXdTZXJ2aWNlKTogdm9pZCB7XG4gICAgYXV0aFNlcnZpY2UuaXNMb2FkaW5nJC5zdWJzY3JpYmUoKGlzTG9hZGluZykgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudC5pbnN0YW5jZSA/Pz0gZHluYW1pY1ZpZXdTZXJ2aWNlLmNyZWF0ZVZpZXcoQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQuaW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgICAgQXV0aExvYWRpbmdTY3JlZW5Db21wb25lbnQuaW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib2R4LWF1dGgtbG9hZGluZy1zY3JlZW5fX2NvbnRlbnRcIiBvZHhMYXlvdXQ9XCJncmlkIDEyIGhvcml6b250YWwtY2VudGVyIHZlcnRpY2FsLWNlbnRlciBnYXAtc21hbGxcIj5cbiAgPG9keC1sb2dvIHNpemU9XCJsYXJnZVwiIC8+XG4gIDxvZHgtY2lyY3VsYXItcHJvZ3Jlc3MgY2xhc3M9XCJvZHgtYXV0aC1sb2FkaW5nLXNjcmVlbl9fc3Bpbm5lclwiIHZhbHVlPVwiLTFcIiBzaXplPVwibWVkaXVtXCIgc3Ryb2tlPVwiM1wiPlxuICAgIDxvZHgtaWNvbiBbbmFtZV09XCJpY29uJCB8IGFzeW5jXCIgaWNvblNldD1cImNvcmVcIiAvPlxuICA8L29keC1jaXJjdWxhci1wcm9ncmVzcz5cbiAgQGlmIChhdXRoQ29uZmlnLmxvYWRpbmdTY3JlZW5NZXNzYWdlOyBhcyBjb250ZW50KSB7XG4gICAgPHAgY2xhc3M9XCJvZHgtYXV0aC1sb2FkaW5nLXNjcmVlbl9fbWVzc2FnZVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtvZHhEeW5hbWljVmlld109XCJjb250ZW50XCIgLz5cbiAgICA8L3A+XG4gIH1cbjwvZGl2PlxuIl19
@@ -3,6 +3,12 @@ import { LoadingSpinnerDirective } from '@odx/angular/components/loading-spinner
3
3
  import { untilDestroyed } from '@odx/angular/utils';
4
4
  import { AuthService } from '../auth.service';
5
5
  import * as i0 from "@angular/core";
6
+ /**
7
+ * An abstract directive that integrates with the `LoadingSpinnerDirective` and `AuthService` to manage loading states based on authentication redirection.
8
+ *
9
+ * This directive automatically sets the `autoColor` property of the `LoadingSpinnerDirective` to `true` and subscribes to the `isRedirecting$` observable from the `AuthService`.
10
+ * When `isRedirecting$` emits a value, it updates the `isLoading` property of the `LoadingSpinnerDirective`.
11
+ */
6
12
  export class AuthActionDirective {
7
13
  constructor() {
8
14
  this.takeUntilDestroyed = untilDestroyed();
@@ -15,10 +21,10 @@ export class AuthActionDirective {
15
21
  this.loadingSpinnerDirective.isLoading = isRedirecting;
16
22
  });
17
23
  }
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthActionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AuthActionDirective, ngImport: i0 }); }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthActionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
25
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: AuthActionDirective, ngImport: i0 }); }
20
26
  }
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthActionDirective, decorators: [{
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuthActionDirective, decorators: [{
22
28
  type: Directive
23
29
  }] });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvZGlyZWN0aXZlcy9hdXRoLWFjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRzlDLE1BQU0sT0FBZ0IsbUJBQW1CO0lBRHpDO1FBRW1CLHVCQUFrQixHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBVXREO0lBUlEsZUFBZTtRQUNwQixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUMxRixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBVm1CLG1CQUFtQjttR0FBbkIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUR4QyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvYWRpbmdTcGlubmVyRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbG9hZGluZy1zcGlubmVyJztcbmltcG9ydCB7IHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aC5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aEFjdGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NwaW5uZXJEaXJlY3RpdmUgPSBpbmplY3QoTG9hZGluZ1NwaW5uZXJEaXJlY3RpdmUsIHsgc2VsZjogdHJ1ZSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZ1NwaW5uZXJEaXJlY3RpdmUuYXV0b0NvbG9yID0gdHJ1ZTtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzUmVkaXJlY3RpbmckLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKChpc1JlZGlyZWN0aW5nKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdTcGlubmVyRGlyZWN0aXZlLmlzTG9hZGluZyA9IGlzUmVkaXJlY3Rpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaGFuZGxlQ2xpY2soKTogdm9pZDtcbn1cbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvZGlyZWN0aXZlcy9hdXRoLWFjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRTlDOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFnQixtQkFBbUI7SUFEekM7UUFFbUIsdUJBQWtCLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDdEMsNEJBQXVCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7S0FVdEQ7SUFSUSxlQUFlO1FBQ3BCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQzFGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FWbUIsbUJBQW1CO21HQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBRHhDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9hZGluZ1NwaW5uZXJEaXJlY3RpdmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9sb2FkaW5nLXNwaW5uZXInO1xuaW1wb3J0IHsgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoLnNlcnZpY2UnO1xuXG4vKipcbiAqIEFuIGFic3RyYWN0IGRpcmVjdGl2ZSB0aGF0IGludGVncmF0ZXMgd2l0aCB0aGUgYExvYWRpbmdTcGlubmVyRGlyZWN0aXZlYCBhbmQgYEF1dGhTZXJ2aWNlYCB0byBtYW5hZ2UgbG9hZGluZyBzdGF0ZXMgYmFzZWQgb24gYXV0aGVudGljYXRpb24gcmVkaXJlY3Rpb24uXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgYXV0b21hdGljYWxseSBzZXRzIHRoZSBgYXV0b0NvbG9yYCBwcm9wZXJ0eSBvZiB0aGUgYExvYWRpbmdTcGlubmVyRGlyZWN0aXZlYCB0byBgdHJ1ZWAgYW5kIHN1YnNjcmliZXMgdG8gdGhlIGBpc1JlZGlyZWN0aW5nJGAgb2JzZXJ2YWJsZSBmcm9tIHRoZSBgQXV0aFNlcnZpY2VgLlxuICogV2hlbiBgaXNSZWRpcmVjdGluZyRgIGVtaXRzIGEgdmFsdWUsIGl0IHVwZGF0ZXMgdGhlIGBpc0xvYWRpbmdgIHByb3BlcnR5IG9mIHRoZSBgTG9hZGluZ1NwaW5uZXJEaXJlY3RpdmVgLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRoQWN0aW9uRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFrZVVudGlsRGVzdHJveWVkID0gdW50aWxEZXN0cm95ZWQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZSA9IGluamVjdChMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZS5hdXRvQ29sb3IgPSB0cnVlO1xuICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNSZWRpcmVjdGluZyQucGlwZSh0aGlzLnRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKGlzUmVkaXJlY3RpbmcpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1NwaW5uZXJEaXJlY3RpdmUuaXNMb2FkaW5nID0gaXNSZWRpcmVjdGluZztcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBoYW5kbGVDbGljaygpOiB2b2lkO1xufVxuIl19
@@ -1,3 +1,17 @@
1
+ /**
2
+ * A directive that handles the sign-in action for a button element.
3
+ *
4
+ * This directive extends the `AuthActionDirective` and uses the `LoadingSpinnerDirective`
5
+ * to show a loading spinner during the sign-in process.
6
+ *
7
+ * @see {AuthActionDirective}
8
+ * @see {LoadingSpinnerDirective}
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <button odxButton odxAuthSignIn (odxAuthSignIn)="onSignIn()">Sign In</button>
13
+ * ```
14
+ */
1
15
  import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
2
16
  import { LoadingSpinnerDirective } from '@odx/angular/components/loading-spinner';
3
17
  import { AuthActionDirective } from './auth-action.directive';
@@ -6,6 +20,11 @@ import * as i1 from "@odx/angular/components/loading-spinner";
6
20
  export class SignInDirective extends AuthActionDirective {
7
21
  constructor() {
8
22
  super(...arguments);
23
+ /**
24
+ * Emits an event after the sign-in action is completed.
25
+ *
26
+ * @type {EventEmitter<void>}
27
+ */
9
28
  // eslint-disable-next-line @angular-eslint/no-output-rename
10
29
  this.afterSignIn = new EventEmitter();
11
30
  }
@@ -13,10 +32,10 @@ export class SignInDirective extends AuthActionDirective {
13
32
  this.authService.signIn();
14
33
  this.afterSignIn.next();
15
34
  }
16
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignInDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SignInDirective, isStandalone: true, selector: "[odxButton][odxAuthSignIn]", outputs: { afterSignIn: "odxAuthSignIn" }, host: { listeners: { "click": "handleClick()" } }, usesInheritance: true, hostDirectives: [{ directive: i1.LoadingSpinnerDirective }], ngImport: i0 }); }
35
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SignInDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
36
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: SignInDirective, isStandalone: true, selector: "[odxButton][odxAuthSignIn]", outputs: { afterSignIn: "odxAuthSignIn" }, host: { listeners: { "click": "handleClick()" } }, usesInheritance: true, hostDirectives: [{ directive: i1.LoadingSpinnerDirective }], ngImport: i0 }); }
18
37
  }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignInDirective, decorators: [{
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SignInDirective, decorators: [{
20
39
  type: Directive,
21
40
  args: [{
22
41
  standalone: true,
@@ -30,4 +49,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
30
49
  type: HostListener,
31
50
  args: ['click']
32
51
  }] } });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9kaXJlY3RpdmVzL3NpZ24taW4uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQU85RCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxtQkFBbUI7SUFMeEQ7O1FBTUUsNERBQTREO1FBRXJELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQU8vQztJQUpvQixXQUFXO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDOytHQVRVLGVBQWU7bUdBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFMM0IsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsY0FBYyxFQUFFLENBQUMsdUJBQXVCLENBQUM7aUJBQzFDOzhCQUlRLFdBQVc7c0JBRGpCLE1BQU07dUJBQUMsZUFBZTtnQkFJSixXQUFXO3NCQUQ3QixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvYWRpbmdTcGlubmVyRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbG9hZGluZy1zcGlubmVyJztcbmltcG9ydCB7IEF1dGhBY3Rpb25EaXJlY3RpdmUgfSBmcm9tICcuL2F1dGgtYWN0aW9uLmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tvZHhCdXR0b25dW29keEF1dGhTaWduSW5dJyxcbiAgaG9zdERpcmVjdGl2ZXM6IFtMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNpZ25JbkRpcmVjdGl2ZSBleHRlbmRzIEF1dGhBY3Rpb25EaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgQE91dHB1dCgnb2R4QXV0aFNpZ25JbicpXG4gIHB1YmxpYyBhZnRlclNpZ25JbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHByb3RlY3RlZCBvdmVycmlkZSBoYW5kbGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnNpZ25JbigpO1xuICAgIHRoaXMuYWZ0ZXJTaWduSW4ubmV4dCgpO1xuICB9XG59XG4iXX0=
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9kaXJlY3RpdmVzL3NpZ24taW4uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7QUFPOUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsbUJBQW1CO0lBTHhEOztRQU1FOzs7O1dBSUc7UUFDSCw0REFBNEQ7UUFFckQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBTy9DO0lBSm9CLFdBQVc7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7K0dBZFUsZUFBZTttR0FBZixlQUFlOzs0RkFBZixlQUFlO2tCQUwzQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxjQUFjLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDMUM7OEJBU1EsV0FBVztzQkFEakIsTUFBTTt1QkFBQyxlQUFlO2dCQUlKLFdBQVc7c0JBRDdCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBoYW5kbGVzIHRoZSBzaWduLWluIGFjdGlvbiBmb3IgYSBidXR0b24gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBleHRlbmRzIHRoZSBgQXV0aEFjdGlvbkRpcmVjdGl2ZWAgYW5kIHVzZXMgdGhlIGBMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZWBcbiAqIHRvIHNob3cgYSBsb2FkaW5nIHNwaW5uZXIgZHVyaW5nIHRoZSBzaWduLWluIHByb2Nlc3MuXG4gKlxuICogQHNlZSB7QXV0aEFjdGlvbkRpcmVjdGl2ZX1cbiAqIEBzZWUge0xvYWRpbmdTcGlubmVyRGlyZWN0aXZlfVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8YnV0dG9uIG9keEJ1dHRvbiBvZHhBdXRoU2lnbkluIChvZHhBdXRoU2lnbkluKT1cIm9uU2lnbkluKClcIj5TaWduIEluPC9idXR0b24+XG4gKiBgYGBcbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQgeyBBdXRoQWN0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9hdXRoLWFjdGlvbi5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbb2R4QnV0dG9uXVtvZHhBdXRoU2lnbkluXScsXG4gIGhvc3REaXJlY3RpdmVzOiBbTG9hZGluZ1NwaW5uZXJEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduSW5EaXJlY3RpdmUgZXh0ZW5kcyBBdXRoQWN0aW9uRGlyZWN0aXZlIHtcbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IGFmdGVyIHRoZSBzaWduLWluIGFjdGlvbiBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8dm9pZD59XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgQE91dHB1dCgnb2R4QXV0aFNpZ25JbicpXG4gIHB1YmxpYyBhZnRlclNpZ25JbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHByb3RlY3RlZCBvdmVycmlkZSBoYW5kbGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnNpZ25JbigpO1xuICAgIHRoaXMuYWZ0ZXJTaWduSW4ubmV4dCgpO1xuICB9XG59XG4iXX0=