valtech-components 4.0.25 → 4.0.26

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 (22) hide show
  1. package/README.md +31 -262
  2. package/esm2022/lib/components/molecules/modal-shell/modal-shell.component.mjs +3 -3
  3. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +5 -5
  4. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +5 -5
  5. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +4 -3
  6. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +5 -5
  7. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +7 -5
  8. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +6 -5
  9. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +37 -48
  10. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +8 -2
  11. package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +15 -3
  12. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +3 -3
  13. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +7 -7
  14. package/esm2022/lib/services/firebase/messaging.service.mjs +2 -2
  15. package/esm2022/lib/services/refreshable-stream/refreshable-stream.mjs +2 -2
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/fesm2022/valtech-components.mjs +96 -85
  18. package/fesm2022/valtech-components.mjs.map +1 -1
  19. package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +12 -1
  20. package/lib/version.d.ts +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  <img style="margin-bottom: 20px;" src="https://myvaltech.s3.us-east-2.amazonaws.com/logo-terminal-rounded.png" width="60px" />
2
2
 
3
- # valtech-components
3
+ # Valtech Components
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/valtech-components.svg)](https://www.npmjs.com/package/valtech-components)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
- Component library for Angular 18 + Ionic 8 apps. 145+ components and 23+ services covering auth, Firebase, i18n, theming, and more.
8
+ Component library for Angular + Ionic + Capacitor apps. **145 components** and **23+ services** for auth, Firebase, i18n, and more.
9
9
 
10
- **[Full docs → ui.myvaltech.com](https://ui.myvaltech.com)**
10
+ **[Full documentation → ui.myvaltech.com](https://ui.myvaltech.com)**
11
11
 
12
12
  ---
13
13
 
@@ -23,11 +23,11 @@ npm install valtech-components
23
23
  npm install @angular/common @angular/core @ionic/angular ionicons rxjs
24
24
  ```
25
25
 
26
- **Optional — only install if you use these features:**
26
+ **Optional — only if you use these features:**
27
27
 
28
28
  ```bash
29
29
  npm install @angular/fire firebase # Firebase services
30
- npm install @capacitor/app @capacitor/clipboard # Native (Capacitor) features
30
+ npm install @capacitor/app @capacitor/clipboard # Native features
31
31
  npm install qr-code-styling # QR code component
32
32
  npm install prismjs # Code highlighting
33
33
  npm install swiper # Carousel component
@@ -35,11 +35,11 @@ npm install swiper # Carousel component
35
35
 
36
36
  ---
37
37
 
38
- ## Quick start
38
+ ## Usage
39
39
 
40
- ### UI only (no backend required)
40
+ ### UI only (no backend needed)
41
41
 
42
- 144 of 145 components work standalone:
42
+ 144 of 145 components work standalone — no Firebase, no backend:
43
43
 
44
44
  ```typescript
45
45
  import { ButtonComponent, CardComponent, TextComponent } from 'valtech-components';
@@ -50,7 +50,7 @@ import { ButtonComponent, CardComponent, TextComponent } from 'valtech-component
50
50
  template: `
51
51
  <val-card [props]="{ title: 'My Card' }">
52
52
  <val-text [props]="{ content: 'Hello World' }" />
53
- <val-button preset="primary-round" [props]="{ text: 'Click me' }" />
53
+ <val-button [props]="{ text: 'Click me', color: 'primary' }" />
54
54
  </val-card>
55
55
  `
56
56
  })
@@ -59,156 +59,49 @@ export class MyComponent {}
59
59
 
60
60
  ### Full integration (auth + Firebase + i18n)
61
61
 
62
- Wire providers in `main.ts`:
62
+ Add providers in `main.ts`:
63
63
 
64
64
  ```typescript
65
65
  import {
66
66
  provideValtechFirebase,
67
67
  provideValtechAuth,
68
68
  provideValtechI18n,
69
- provideValtechErrorHandling,
70
- provideValtechSkeleton,
71
- provideValtechPresets,
72
- HandoffService,
69
+ createFirebaseConfig,
73
70
  } from 'valtech-components';
74
- import { APP_INITIALIZER } from '@angular/core';
71
+ import firebaseConfig from './config/firebase.config.json';
75
72
 
76
73
  bootstrapApplication(AppComponent, {
77
74
  providers: [
78
- provideValtechFirebase(environment.valtechFirebase),
79
-
80
- // Auth must come before provideValtechErrorHandling
81
- provideValtechAuth({
82
- apiUrl: environment.apiUrl,
83
- appId: 'my-app',
84
- loginRoute: '/login',
85
- homeRoute: '/app',
86
- enableFirebaseIntegration: true,
87
- enableTabSync: true,
88
- }),
89
-
90
- // HTTP error observability — always after provideValtechAuth
91
- provideValtechErrorHandling(),
92
-
93
- // Cross-app session handoff — always after provideValtechAuth
94
- {
95
- provide: APP_INITIALIZER,
96
- multi: true,
97
- deps: [HandoffService],
98
- useFactory: (h: HandoffService) => () => h.detectAndExchangeHandoff(),
99
- },
100
-
101
- provideValtechI18n({
102
- defaultLanguage: 'es',
103
- supportedLanguages: ['es', 'en'],
104
- content: APP_I18N_CONTENT,
105
- }),
106
-
107
- provideValtechPresets(APP_PRESETS),
108
- provideValtechSkeleton({ animated: true }),
75
+ provideValtechFirebase(createFirebaseConfig(firebaseConfig)),
76
+ provideValtechAuth({ apiUrl: 'https://api.yourapp.com' }),
77
+ provideValtechI18n({ defaultLang: 'en', supportedLangs: ['en', 'es', 'pt'] }),
109
78
  ],
110
79
  });
111
80
  ```
112
81
 
113
- **Provider order matters:**
114
-
115
- ```
116
- provideHttpClient
117
-
118
- provideValtechFirebase (initializes Firebase app)
119
-
120
- provideValtechAuth (registers auth HTTP interceptor)
121
-
122
- provideValtechErrorHandling (registers error interceptor — composes with auth)
123
-
124
- APP_INITIALIZER handoff (depends on AuthService being configured)
125
- ```
126
-
127
82
  ---
128
83
 
129
84
  ## Components
130
85
 
131
86
  | Category | Count | Includes |
132
87
  |----------|------:|---------|
133
- | Atoms | ~24 | `val-button`, `val-text`, `val-icon`, `val-avatar`, `val-image`, `val-badge`, `val-skeleton`, `val-progress-bar`, `val-qr-code`, `val-page-waves` |
134
- | Molecules | ~81 | `val-card`, `val-input`, `val-select`, `val-date-picker`, `val-tabs`, `val-accordion`, `val-searchbar`, `val-empty-state`, `val-ticket-card`, `val-field-list`, `val-stats-bar`, `val-article-card` |
135
- | Organisms | ~31 | `val-form`, `val-data-table`, `val-bottom-nav`, `val-toolbar`, `val-menu`, `val-login`, `val-comment-section`, `val-qr-scanner`, `val-search-header`, `val-share-profile-modal`, `val-fun-modal` |
136
- | Templates | ~9 | `val-page-wrapper`, `val-page-content`, `val-auth-background`, `val-maintenance-page`, `val-docs-shell` |
137
-
138
- Components requiring a backend API: `val-login`, `val-content-reaction`.
139
-
140
- ### Buttons — presets, not factories
141
-
142
- ```html
143
- <!-- Declarative (preferred) -->
144
- <val-button preset="primary-round" [props]="{ text: 'Save' }" />
145
- <val-button preset="secondary" [props]="{ text: 'Cancel' }" />
146
- <val-button preset="danger-round" [props]="{ text: 'Delete' }" />
147
- ```
148
-
149
- Built-in presets: `primary`, `primary-round`, `primary-block`, `primary-full`, `secondary`, `secondary-round`, `solid`, `solid-round`, `solid-block`, `outline`, `outline-round`, `clear`, `clear-round`, `danger`, `danger-round`.
150
-
151
- ### Date picker
152
-
153
- Use `val-date-picker` instead of `val-date-input` or `ion-datetime` (ion-datetime has a known bug with empty day grids in modals):
154
-
155
- ```html
156
- <val-date-picker
157
- [props]="{
158
- control: myControl,
159
- label: 'Date',
160
- placeholder: 'Select date',
161
- locale: 'es-CL',
162
- firstWeekday: 1
163
- }"
164
- (valueChange)="onDate($event)"
165
- />
166
- ```
167
-
168
- Value format: `YYYY-MM-DD` (local date string, no timezone shift). If the backend returns ISO timestamps, slice to 10 chars: `value.slice(0, 10)`.
169
-
170
- ### Field list (editable repeating items)
171
-
172
- ```html
173
- <val-field-list
174
- [props]="{
175
- fields: [
176
- { name: 'name', label: 'Prize name', maxlength: 200 },
177
- { name: 'description', label: 'Description', maxlength: 300 }
178
- ],
179
- items: seedSignal(),
180
- itemLabel: 'Prize {n}',
181
- addLabel: 'Add prize'
182
- }"
183
- (itemsChange)="onItemsChange($event)"
184
- />
185
- ```
186
-
187
- Pass a **separate seed signal** for `items` — do not bind the editing signal directly (it re-seeds on every change).
188
-
189
- ### Empty / error state
88
+ | Atoms | 24 | avatar, button, icon, text, image, skeleton, progress-bar, qr-code |
89
+ | Molecules | 81 | inputs (text, email, phone, pin, date), cards, tabs, accordion, pagination… |
90
+ | Organisms | 31 | forms, data-table, menu, toolbar, login, comment-section, infinite-list… |
91
+ | Templates | 9 | page-wrapper, page-content, docs-shell, auth-background, maintenance-page |
92
+ | **Total** | **145** | |
190
93
 
191
- ```html
192
- @if (page.loading()) {
193
- <val-skeleton-layout [props]="{ preset: 'list', rows: 4 }" />
194
- } @else if (page.errorState(); as e) {
195
- <val-empty-state [props]="e" />
196
- } @else if (items().length === 0) {
197
- <val-empty-state [props]="{ variant: 'empty', title: t('emptyTitle') }" />
198
- } @else {
199
- <!-- content -->
200
- }
201
- ```
94
+ Components requiring a backend API: `LoginComponent`, `ContentReactionComponent`.
202
95
 
203
96
  ---
204
97
 
205
98
  ## Services
206
99
 
207
100
  **No setup required:**
208
- `ThemeService` · `ToastService` · `NavigationService` · `DownloadService` · `IconService` · `LocaleService` · `LocalStorageService` · `ModalService` · `ConfirmationDialogService` · `QrGeneratorService` · `PaginationService` · `SkeletonService`
101
+ `ThemeService` · `ToastService` · `NavigationService` · `DownloadService` · `IconsService` · `LocaleService` · `LocalStorageService` · `ModalService` · `ConfirmationDialogService` · `QrGeneratorService` · `PaginationService` · `SkeletonService`
209
102
 
210
103
  **Requires `provideValtechAuth`:**
211
- `AuthService` · `OAuthService` · `SessionService` · `TokenService` · `AuthStateService` · `DeviceService` · `HandoffService` · `OrgSwitchService`
104
+ `AuthService` · `OAuthService` · `SessionService` · `TokenService` · `AuthStateService` · `DeviceService`
212
105
 
213
106
  **Requires `provideValtechFirebase`:**
214
107
  `FirebaseService` · `AnalyticsService` · `FirestoreService` · `MessagingService` · `NotificationsService` · `FirebaseStorageService`
@@ -216,147 +109,23 @@ Pass a **separate seed signal** for `items` — do not bind the editing signal d
216
109
  **Requires `provideValtechI18n`:**
217
110
  `I18nService`
218
111
 
219
- **Requires `provideValtechErrorHandling`:**
220
- `ValtechErrorService`
221
-
222
112
  ---
223
113
 
224
- ## Common patterns
225
-
226
- ### Page loading state — `createPageState`
227
-
228
- Replaces ~15 lines of boilerplate (loading signal + error signal + try/catch + computed error state):
229
-
230
- ```typescript
231
- import { createPageState, connectPageRefresh } from 'valtech-components';
232
-
233
- export class MyPage {
234
- private svc = inject(MyService);
235
- private i18n = inject(I18nService);
236
- readonly items = signal<Item[]>([]);
237
-
238
- readonly page = createPageState(this.i18n, async () => {
239
- const res = await firstValueFrom(this.svc.getItems());
240
- this.items.set(res.items);
241
- });
242
-
243
- constructor() {
244
- connectPageRefresh(() => this.page.reload());
245
- }
246
- }
247
- ```
248
-
249
- `page.loading()` · `page.errorState()` · `page.reload()` — all signals/promises, ready to bind.
250
-
251
- ### Pull-to-refresh
252
-
253
- Every page that displays remote data must register a refresh handler. Use `connectPageRefresh` in the constructor — it registers and auto-cleans via `DestroyRef`:
254
-
255
- ```typescript
256
- import { connectPageRefresh, createRefreshableStream } from 'valtech-components';
257
-
258
- export class MyPage {
259
- private data = createRefreshableStream(() => this.svc.getItems());
260
- readonly items = this.data.data;
261
- readonly loading = this.data.loading;
262
-
263
- constructor() {
264
- connectPageRefresh(() => this.data.reload());
265
- }
266
- }
267
- ```
268
-
269
- ### Error handling in catch blocks
270
-
271
- ```typescript
272
- import { ValtechErrorService } from 'valtech-components';
273
-
274
- export class MyPage {
275
- private errors = inject(ValtechErrorService);
276
-
277
- async save() {
278
- try {
279
- await firstValueFrom(this.api.updateX(...));
280
- } catch (err) {
281
- this.errors.handle(err, {
282
- context: 'mypage.save',
283
- i18nMap: { BACKEND_CODE: 'i18nKey' },
284
- fallbackKey: 'saveError',
285
- i18nNamespace: 'MyNamespace',
286
- });
287
- }
288
- }
289
- }
290
- ```
291
-
292
- ### Cross-app session handoff
293
-
294
- Seamlessly transfer a logged-in session from one factory app to another:
295
-
296
- ```typescript
297
- // App A — create handoff and redirect
298
- const { url } = await handoff.createHandoff({ app: 'sigify', route: '/docs/123' });
299
- window.location.href = url;
300
-
301
- // App B — auto-handled in bootstrap via APP_INITIALIZER (see Full integration above)
302
- ```
303
-
304
- ### OAuth callback route
305
-
306
- Add this route to `app.routes.ts` if your app uses social login:
307
-
308
- ```typescript
309
- import { OAuthCallbackComponent } from 'valtech-components';
310
-
311
- { path: 'auth/oauth/callback', component: OAuthCallbackComponent }
312
- ```
313
-
314
- Without this route, post-login redirects to a 404.
315
-
316
- ### Toasts — always `color: 'dark'`
317
-
318
- ```typescript
319
- // All toasts use color: 'dark' regardless of message type
320
- this.toast.show({ message: 'Saved', color: 'dark', duration: 2000 });
321
- this.toast.show({ message: 'Error: ...', color: 'dark', duration: 3000 });
322
- ```
323
-
324
- ### Content reactions (feedback widget)
325
-
326
- ```html
327
- <val-content-reaction [props]="{
328
- entityRef: { entityType: 'blog', entityId: post.slug },
329
- question: 'Was this article helpful?',
330
- emojis: ['👎', '👍'],
331
- commentOnValues: ['negative'],
332
- allowAnonymous: true
333
- }" />
334
- ```
114
+ ## Technologies
335
115
 
336
- Requires `provideValtechFeedback({ apiUrl, appId })` in `main.ts`.
116
+ Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
337
117
 
338
118
  ---
339
119
 
340
- ## Styles
341
-
342
- Import fonts and base styles in your app's `variables.scss`:
343
-
344
- ```scss
345
- @import "valtech-components/styles/fonts.scss"; // Nunito Sans (default) + Khula (Bingo brand)
120
+ ## Development
346
121
 
347
- :root {
348
- --ion-font-family: "Nunito Sans", Arial, sans-serif;
349
- }
122
+ ```bash
123
+ npm install
124
+ npm run storybook # http://localhost:6006
125
+ npm run build # build library
126
+ npm run test # unit tests
350
127
  ```
351
128
 
352
- All `font-size` values in the lib use `rem` to respect the user's font size preference (`FontSizeService` scales the root `html` element).
353
-
354
- ---
355
-
356
- ## Technologies
357
-
358
- Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
359
-
360
129
  ---
361
130
 
362
131
  ## License
@@ -68,7 +68,7 @@ export class ModalShellComponent {
68
68
  <ion-toolbar>
69
69
  @if (showClose()) {
70
70
  <ion-buttons slot="end">
71
- <ion-button fill="clear" color="dark" (click)="onClose()">
71
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
72
72
  <strong>{{ resolvedCloseLabel() }}</strong>
73
73
  </ion-button>
74
74
  </ion-buttons>
@@ -93,7 +93,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
93
93
  <ion-toolbar>
94
94
  @if (showClose()) {
95
95
  <ion-buttons slot="end">
96
- <ion-button fill="clear" color="dark" (click)="onClose()">
96
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
97
97
  <strong>{{ resolvedCloseLabel() }}</strong>
98
98
  </ion-button>
99
99
  </ion-buttons>
@@ -111,4 +111,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
111
111
  </ion-content>
112
112
  `, styles: [":host{display:contents}\n"] }]
113
113
  }] });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc2hlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tb2RhbC1zaGVsbC9tb2RhbC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFtQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQWxDaEM7UUFtQ1UsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxpRkFBaUY7UUFDeEUsVUFBSyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUVuQyx1RUFBdUU7UUFDOUQsYUFBUSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXhDOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRTFDLCtEQUErRDtRQUN0RCxVQUFLLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEMsb0ZBQW9GO1FBQzNFLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztLQUtKO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzsrR0FsQ1UsbUJBQW1CO21HQUFuQixtQkFBbUIsd25CQTlCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCxtR0F0QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGdCQUFnQiwyRUFBRSxjQUFjOzs0RkErQnpGLG1CQUFtQjtrQkFsQy9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsWUFDM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25CdXR0b25zLCBJb25Db250ZW50LCBJb25IZWFkZXIsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcblxuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuLyoqXG4gKiBgdmFsLW1vZGFsLXNoZWxsYCDigJQgd3JhcHBlciBjYW7Ds25pY28gcGFyYSBtb2RhbGVzIGRlbCBmYWN0b3J5LlxuICpcbiAqIEltcGxlbWVudGEgZWwgcGF0csOzbiBvYmxpZ2F0b3JpbyBkZSBsYSBSZWdsYSAjNSAoYGZyb250ZW5kL0NMQVVERS5tZGApOlxuICogIC0gSGVhZGVyIHNpbiBgPGlvbi10aXRsZT5gLCBzb2xvIGJvdMOzbiBkZSBjaWVycmUgY29uIHRleHRvIGBDZXJyYXJgIGVuXG4gKiAgICBgc2xvdD1cImVuZFwiYC5cbiAqICAtIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCBlbiBlbCBCT0RZIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYFxuICogICAgKDMyLzI0IHB4KS5cbiAqICAtIFN1YnTDrXR1bG8gb3BjaW9uYWwgY29tbyBgdmFsLXRpdGxlIHNpemU9XCJsYXJnZVwiYCAoMjQvMTggcHgpLlxuICpcbiAqIEVsIGNvbnRlbmlkbyBkZWwgbW9kYWwgc2UgcHJveWVjdGEgdsOtYSBgPG5nLWNvbnRlbnQ+YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tb2RhbC1zaGVsbCBbdGl0bGVdPVwidGl0bGVcIiBbc3VidGl0bGVdPVwic3VidGl0bGVcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIDwhLS0gYm9keSBkZWwgbW9kYWwgLS0+XG4gKiAgIDxwPkNvbnRlbmlkby4uLjwvcD5cbiAqIDwvdmFsLW1vZGFsLXNoZWxsPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2luIHN1YnRpdGxlLCBjb24gbGFiZWwgZGUgY2llcnJlIGN1c3RvbTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtbW9kYWwtc2hlbGwgW3RpdGxlXT1cInRpdGxlXCIgW2Nsb3NlTGFiZWxdPVwiJ0ZlY2hhcidcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIC4uLlxuICogPC92YWwtbW9kYWwtc2hlbGw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1vZGFsLXNoZWxsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvbkhlYWRlciwgSW9uVG9vbGJhciwgSW9uQnV0dG9ucywgSW9uQnV0dG9uLCBJb25Db250ZW50LCBEaXNwbGF5Q29tcG9uZW50LCBUaXRsZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIEBpZiAoc2hvd0Nsb3NlKCkpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHJlc29sdmVkQ2xvc2VMYWJlbCgpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgICAgfVxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIEBpZiAodGl0bGUoKSkge1xuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdGl0bGUoKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoc3VidGl0bGUoKSkge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHN1YnRpdGxlKCksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCAvPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogY29udGVudHM7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTaGVsbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgLyoqIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCDigJQgc2UgcmVuZGVyaXphIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYC4gKi9cbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcblxuICAvKiogU3VidMOtdHVsbyBvcGNpb25hbCDigJQgc2UgcmVuZGVyaXphIGNvbW8gYHZhbC10aXRsZSBzaXplPVwibGFyZ2VcImAuICovXG4gIHJlYWRvbmx5IHN1YnRpdGxlID0gaW5wdXQ8c3RyaW5nPignJyk7XG5cbiAgLyoqXG4gICAqIExhYmVsIGRlbCBib3TDs24gZGUgY2llcnJlLiBTaSBubyBzZSBwcm92ZWUsIHNlIHJlc3VlbHZlIHbDrWEgaTE4biBjb24gbGFcbiAgICogY2xhdmUgYGNsb3NlYCBkZWwgbmFtZXNwYWNlIGBfZ2xvYmFsYCAoXCJDZXJyYXJcIiAvIFwiQ2xvc2VcIiAvIFwiRmVjaGFyXCIpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc2VMYWJlbCA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIC8qKlxuICAgKiBNdWVzdHJhIGVsIGJvdMOzbiBkZSBjaWVycmUgZGVsIGhlYWRlci4gYHRydWVgIHBvciBkZWZlY3RvIChlc3TDoW5kYXJcbiAgICogY2Fuw7NuaWNvKS4gU29sbyBzZSBkZXNhY3RpdmEgZW4gbW9kYWxlcyBuby1kaXNtaXNzYWJsZSAoZWouIGNvbmZpcm1hY2lvbmVzXG4gICAqIGJsb3F1ZWFudGVzIHF1ZSByZXF1aWVyZW4gcmVzcHVlc3RhIGV4cGzDrWNpdGEpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd0Nsb3NlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIHRvY2EgZWwgYm90w7NuIGRlIGNpZXJyZSBkZWwgaGVhZGVyLiAqL1xuICByZWFkb25seSBjbG9zZSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIC8qKiBMYWJlbCBlZmVjdGl2byDigJQgdXNhIGBjbG9zZUxhYmVsYCBzaSB2aWVuZSwgc2lubyBjYWUgYWwgaTE4biBgX2dsb2JhbC5jbG9zZWAuICovXG4gIHJlYWRvbmx5IHJlc29sdmVkQ2xvc2VMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuY2xvc2VMYWJlbCgpO1xuICAgIGlmIChsYWJlbCkgcmV0dXJuIGxhYmVsO1xuICAgIHJldHVybiB0aGlzLmkxOG4udCgnY2xvc2UnLCAnX2dsb2JhbCcpO1xuICB9KTtcblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG59XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc2hlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tb2RhbC1zaGVsbC9tb2RhbC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFtQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQWxDaEM7UUFtQ1UsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxpRkFBaUY7UUFDeEUsVUFBSyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUVuQyx1RUFBdUU7UUFDOUQsYUFBUSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXhDOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRTFDLCtEQUErRDtRQUN0RCxVQUFLLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEMsb0ZBQW9GO1FBQzNFLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztLQUtKO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzsrR0FsQ1UsbUJBQW1CO21HQUFuQixtQkFBbUIsd25CQTlCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCxtR0F0QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGdCQUFnQiwyRUFBRSxjQUFjOzs0RkErQnpGLG1CQUFtQjtrQkFsQy9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsWUFDM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25CdXR0b25zLCBJb25Db250ZW50LCBJb25IZWFkZXIsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcblxuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuLyoqXG4gKiBgdmFsLW1vZGFsLXNoZWxsYCDigJQgd3JhcHBlciBjYW7Ds25pY28gcGFyYSBtb2RhbGVzIGRlbCBmYWN0b3J5LlxuICpcbiAqIEltcGxlbWVudGEgZWwgcGF0csOzbiBvYmxpZ2F0b3JpbyBkZSBsYSBSZWdsYSAjNSAoYGZyb250ZW5kL0NMQVVERS5tZGApOlxuICogIC0gSGVhZGVyIHNpbiBgPGlvbi10aXRsZT5gLCBzb2xvIGJvdMOzbiBkZSBjaWVycmUgY29uIHRleHRvIGBDZXJyYXJgIGVuXG4gKiAgICBgc2xvdD1cImVuZFwiYC5cbiAqICAtIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCBlbiBlbCBCT0RZIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYFxuICogICAgKDMyLzI0IHB4KS5cbiAqICAtIFN1YnTDrXR1bG8gb3BjaW9uYWwgY29tbyBgdmFsLXRpdGxlIHNpemU9XCJsYXJnZVwiYCAoMjQvMTggcHgpLlxuICpcbiAqIEVsIGNvbnRlbmlkbyBkZWwgbW9kYWwgc2UgcHJveWVjdGEgdsOtYSBgPG5nLWNvbnRlbnQ+YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tb2RhbC1zaGVsbCBbdGl0bGVdPVwidGl0bGVcIiBbc3VidGl0bGVdPVwic3VidGl0bGVcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIDwhLS0gYm9keSBkZWwgbW9kYWwgLS0+XG4gKiAgIDxwPkNvbnRlbmlkby4uLjwvcD5cbiAqIDwvdmFsLW1vZGFsLXNoZWxsPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2luIHN1YnRpdGxlLCBjb24gbGFiZWwgZGUgY2llcnJlIGN1c3RvbTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtbW9kYWwtc2hlbGwgW3RpdGxlXT1cInRpdGxlXCIgW2Nsb3NlTGFiZWxdPVwiJ0ZlY2hhcidcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIC4uLlxuICogPC92YWwtbW9kYWwtc2hlbGw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1vZGFsLXNoZWxsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvbkhlYWRlciwgSW9uVG9vbGJhciwgSW9uQnV0dG9ucywgSW9uQnV0dG9uLCBJb25Db250ZW50LCBEaXNwbGF5Q29tcG9uZW50LCBUaXRsZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIEBpZiAoc2hvd0Nsb3NlKCkpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyByZXNvbHZlZENsb3NlTGFiZWwoKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICBAaWYgKHRpdGxlKCkpIHtcbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHRpdGxlKCksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKHN1YnRpdGxlKCkpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiBzdWJ0aXRsZSgpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsU2hlbGxDb21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIC8qKiBUw610dWxvIHByaW5jaXBhbCBkZWwgbW9kYWwg4oCUIHNlIHJlbmRlcml6YSBjb21vIGB2YWwtZGlzcGxheSBzaXplPVwic21hbGxcImAuICovXG4gIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQ8c3RyaW5nPignJyk7XG5cbiAgLyoqIFN1YnTDrXR1bG8gb3BjaW9uYWwg4oCUIHNlIHJlbmRlcml6YSBjb21vIGB2YWwtdGl0bGUgc2l6ZT1cImxhcmdlXCJgLiAqL1xuICByZWFkb25seSBzdWJ0aXRsZSA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBkZWwgYm90w7NuIGRlIGNpZXJyZS4gU2kgbm8gc2UgcHJvdmVlLCBzZSByZXN1ZWx2ZSB2w61hIGkxOG4gY29uIGxhXG4gICAqIGNsYXZlIGBjbG9zZWAgZGVsIG5hbWVzcGFjZSBgX2dsb2JhbGAgKFwiQ2VycmFyXCIgLyBcIkNsb3NlXCIgLyBcIkZlY2hhclwiKS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3NlTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCcnKTtcblxuICAvKipcbiAgICogTXVlc3RyYSBlbCBib3TDs24gZGUgY2llcnJlIGRlbCBoZWFkZXIuIGB0cnVlYCBwb3IgZGVmZWN0byAoZXN0w6FuZGFyXG4gICAqIGNhbsOzbmljbykuIFNvbG8gc2UgZGVzYWN0aXZhIGVuIG1vZGFsZXMgbm8tZGlzbWlzc2FibGUgKGVqLiBjb25maXJtYWNpb25lc1xuICAgKiBibG9xdWVhbnRlcyBxdWUgcmVxdWllcmVuIHJlc3B1ZXN0YSBleHBsw61jaXRhKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dDbG9zZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8qKiBFbWl0ZSBjdWFuZG8gZWwgdXNlciB0b2NhIGVsIGJvdMOzbiBkZSBjaWVycmUgZGVsIGhlYWRlci4gKi9cbiAgcmVhZG9ubHkgY2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAvKiogTGFiZWwgZWZlY3Rpdm8g4oCUIHVzYSBgY2xvc2VMYWJlbGAgc2kgdmllbmUsIHNpbm8gY2FlIGFsIGkxOG4gYF9nbG9iYWwuY2xvc2VgLiAqL1xuICByZWFkb25seSByZXNvbHZlZENsb3NlTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmNsb3NlTGFiZWwoKTtcbiAgICBpZiAobGFiZWwpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoJ2Nsb3NlJywgJ19nbG9iYWwnKTtcbiAgfSk7XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxufVxuIl19
@@ -64,7 +64,7 @@ export class ChangePasswordModalComponent {
64
64
  },
65
65
  ],
66
66
  actions: {
67
- ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
67
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block', shape: 'round' }),
68
68
  token: 'set-submit',
69
69
  textKey: 'setPasswordSubmit',
70
70
  },
@@ -98,7 +98,7 @@ export class ChangePasswordModalComponent {
98
98
  },
99
99
  ],
100
100
  actions: {
101
- ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
101
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block', shape: 'round' }),
102
102
  token: 'change-submit',
103
103
  textKey: 'changePasswordSubmit',
104
104
  },
@@ -237,11 +237,11 @@ export class ChangePasswordModalComponent {
237
237
  this.toast.show({ message, duration: 3500 });
238
238
  }
239
239
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
240
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangePasswordModalComponent, isStandalone: true, selector: "val-change-password-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangePasswordModalComponent, isStandalone: true, selector: "val-change-password-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
241
241
  }
242
242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, decorators: [{
243
243
  type: Component,
244
- args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
244
+ args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
245
245
  }], propDecorators: { isOpen: [{
246
246
  type: Input
247
247
  }], changed: [{
@@ -249,4 +249,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
249
249
  }], dismissed: [{
250
250
  type: Output
251
251
  }] } });
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvY2hhbmdlLXBhc3N3b3JkLW1vZGFsL2NoYW5nZS1wYXNzd29yZC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2NoYW5nZS1wYXNzd29yZC1tb2RhbC9jaGFuZ2UtcGFzc3dvcmQtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQWtCLGVBQWUsRUFBNEIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDOUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztB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bEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBhdXRoUGFzc3dvcmRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkJ1dHRvbnMsXG4gIElvbkNvbnRlbnQsXG4gIElvbkhlYWRlcixcbiAgSW9uTW9kYWwsXG4gIElvblNwaW5uZXIsXG4gIElvblRvb2xiYXIsXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5pbXBvcnQgeyBidXR0b24gfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vZmFjdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZSwgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIElucHV0STE4bkhlbHBlciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5cbi8qKiBNb2RvIGRlbCBtb2RhbCwgcmVzdWVsdG8gYWwgYWJyaXIgc2Vnw7puIHNpIGVsIHVzZXIgeWEgdGllbmUgY29udHJhc2XDsWEuICovXG50eXBlIFBhc3N3b3JkTW9kYWxNb2RlID0gJ2xvYWRpbmcnIHwgJ2NoYW5nZScgfCAnc2V0JztcblxuLyoqXG4gKiBgdmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbGAg4oCUIG1vZGFsIGRlIGdlc3Rpw7NuIGRlIGNvbnRyYXNlw7FhIHBhcmEgdW4gdXN1YXJpb1xuICogYXV0ZW50aWNhZG8uIEFuw6Fsb2dvIGFsIG1vZGFsIGRlIFwicmVjdXBlcmFyIGNvbnRyYXNlw7FhXCIgZGVsIGB2YWwtbG9naW5gLlxuICpcbiAqIEVzIGR1YWwtbW9kZTogYWwgYWJyaXJzZSBjb25zdWx0YSBgQXV0aFNlcnZpY2UuY2hlY2tIYXNQYXNzd29yZCgpYCB5IHNlIGFkYXB0YTpcbiAqICAtICoqY2hhbmdlKiog4oCUIGVsIHVzZXIgeWEgdGllbmUgY29udHJhc2XDsWEg4oaSIHBpZGUgYWN0dWFsICsgbnVldmEg4oaSXG4gKiAgICBgY2hhbmdlUGFzc3dvcmQoKWAuXG4gKiAgLSAqKnNldCoqIOKAlCBlbCB1c2VyIGVzIE9BdXRoLW9ubHkgKHNpbiBjb250cmFzZcOxYSkg4oaSIHBpZGUgc29sbyBsYSBudWV2YSxcbiAqICAgIHBpZGUgY29uZmlybWFjacOzbiBleHBsw61jaXRhIChubyBwaWVyZGUgZWwgYWNjZXNvIHNvY2lhbCwgZXMgYWRpdGl2bykg4oaSXG4gKiAgICBgc2V0UGFzc3dvcmRGb3JPQXV0aFVzZXIoKWAuXG4gKlxuICogU2VsZi1jb250YWluZWQ6IGlueWVjdGEgYEF1dGhTZXJ2aWNlYCB5IGxsYW1hIGVsIGVuZHBvaW50IGRpcmVjdG8g4oCUIGxhIGFwcFxuICogc29sbyBjb250cm9sYSBgW2lzT3Blbl1gIHkgcmVhY2Npb25hIGEgYChjaGFuZ2VkKWAgLyBgKGRpc21pc3NlZClgLlxuICpcbiAqIGkxOG46IHVzYSBlbCBuYW1lc3BhY2UgY29tcGFydGlkbyBgX2F1dGhgIChtaXNtYXMgY2xhdmVzIHF1ZSBgdmFsLWxvZ2luYCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDx2YWwtY2hhbmdlLXBhc3N3b3JkLW1vZGFsXG4gKiAgIFtpc09wZW5dPVwiaXNNb2RhbE9wZW4oKVwiXG4gKiAgIChjaGFuZ2VkKT1cImlzTW9kYWxPcGVuLnNldChmYWxzZSlcIlxuICogICAoZGlzbWlzc2VkKT1cImlzTW9kYWxPcGVuLnNldChmYWxzZSlcIlxuICogLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY2hhbmdlLXBhc3N3b3JkLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvbkJ1dHRvbiwgSW9uQnV0dG9ucywgSW9uQ29udGVudCwgSW9uSGVhZGVyLCBJb25Nb2RhbCwgSW9uU3Bpbm5lciwgSW9uVG9vbGJhciwgRm9ybUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFuZ2UtcGFzc3dvcmQtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFuZ2UtcGFzc3dvcmQtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhbmdlUGFzc3dvcmRNb2RhbENvbXBvbmVudCB7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250cm9sYSBsYSB2aXNpYmlsaWRhZCBkZWwgbW9kYWwuIExvIGRlY2lkZSBlbCBjb21wb25lbnRlIHBhZHJlLiBDYWRhIHZlelxuICAgKiBxdWUgcGFzYSBkZSBjZXJyYWRvIGEgYWJpZXJ0byBzZSByZXN1ZWx2ZSBlbCBtb2RvIChjaGFuZ2UgdnMgc2V0KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBpc09wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcGVuaW5nID0gdmFsdWUgJiYgIXRoaXMuX2lzT3BlbjtcbiAgICB0aGlzLl9pc09wZW4gPSB2YWx1ZTtcbiAgICBpZiAob3BlbmluZykge1xuICAgICAgdGhpcy5yZXNvbHZlTW9kZSgpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICAvKiogRW1pdGUgYWwgY2FtYmlhci9jcmVhciBsYSBjb250cmFzZcOxYSBjb24gw6l4aXRvLiBFbCBwYWRyZSBjaWVycmEgZWwgbW9kYWwuICovXG4gIEBPdXRwdXQoKSBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0ZSBjdWFuZG8gZWwgdXNlciBjaWVycmEgZWwgbW9kYWwgKGJvdMOzbiBYIG8gYmFja2Ryb3ApLiAqL1xuICBAT3V0cHV0KCkgZGlzbWlzc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuSGVscGVyID0gaW5qZWN0KElucHV0STE4bkhlbHBlcik7XG4gIHByaXZhdGUgY29uZmlybURpYWxvZyA9IGluamVjdChDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlID0gc2lnbmFsPFBhc3N3b3JkTW9kYWxNb2RlPignbG9hZGluZycpO1xuICAvKiogTW9kbyBhY3R1YWwg4oCUIGBsb2FkaW5nYCBtaWVudHJhcyBzZSBjb25zdWx0YSBgY2hlY2tIYXNQYXNzd29yZCgpYC4gKi9cbiAgcmVhZG9ubHkgbW9kZSA9IHRoaXMuX21vZGUuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuXG4gIC8qKiBUcmFkdWNlIHVuYSBjbGF2ZSBkZWwgbmFtZXNwYWNlIGBfYXV0aGAuICovXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdfYXV0aCcpO1xuICB9XG5cbiAgcmVhZG9ubHkgZm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuX21vZGUoKSA9PT0gJ3NldCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgICBuYW1lS2V5OiAnc2V0UGFzc3dvcmRUaXRsZScsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdGhpcy50KCdzZXRQYXNzd29yZERlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgIGZpZWxkczogW3RoaXMubmV3UGFzc3dvcmRGaWVsZCgwKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczoge1xuICAgICAgICAgIC4uLmJ1dHRvbih7IHRleHQ6ICcnLCB0eXBlOiAnc3VibWl0JywgZmlsbDogJ3NvbGlkJywgZXhwYW5kOiAnYmxvY2snIH0pLFxuICAgICAgICAgIHRva2VuOiAnc2V0LXN1Ym1pdCcsXG4gICAgICAgICAgdGV4dEtleTogJ3NldFBhc3N3b3JkU3VibWl0JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGU6IHRoaXMuX2Zvcm1TdGF0ZSgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnY2hhbmdlUGFzc3dvcmRUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMudCgnY2hhbmdlUGFzc3dvcmREZXNjcmlwdGlvbicpLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUEFTU1dPUkQsXG4gICAgICAgICAgICAgIG5hbWU6ICdjdXJyZW50UGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ2NoYW5nZS1jdXJyZW50LXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdjdXJyZW50UGFzc3dvcmQnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICdwYXNzd29yZFBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdjdXJyZW50UGFzc3dvcmRSZXF1aXJlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLm5ld1Bhc3N3b3JkRmllbGQoMSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7IHRleHQ6ICcnLCB0eXBlOiAnc3VibWl0JywgZmlsbDogJ3NvbGlkJywgZXhwYW5kOiAnYmxvY2snIH0pLFxuICAgICAgICB0b2tlbjogJ2NoYW5nZS1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnY2hhbmdlUGFzc3dvcmRTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9mb3JtU3RhdGUoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyoqIENhbXBvIFwibnVldmEgY29udHJhc2XDsWFcIiDigJQgY29tcGFydGlkbyBwb3IgYW1ib3MgbW9kb3MuICovXG4gIHByaXZhdGUgbmV3UGFzc3dvcmRGaWVsZChvcmRlcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgIG5hbWU6ICduZXdQYXNzd29yZCcsXG4gICAgICB0b2tlbjogJ2NoYW5nZS1uZXctcGFzc3dvcmQnLFxuICAgICAgbGFiZWxLZXk6ICduZXdQYXNzd29yZCcsXG4gICAgICBoaW50S2V5OiAnbmV3UGFzc3dvcmRIaW50JyxcbiAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdwYXNzd29yZFJlcXVpcmVkJyxcbiAgICAgICAgYXV0aFBhc3N3b3JkOiAncGFzc3dvcmRTdHJlbmd0aCcsXG4gICAgICB9LFxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGF1dGhQYXNzd29yZFZhbGlkYXRvcigpXSxcbiAgICAgIG9yZGVyLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG4gIH1cblxuICAvKiogQ2llcnJlIGluaWNpYWRvIHBvciBlbCB1c2VyIChYIC8gYmFja2Ryb3ApLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogQ29uc3VsdGEgc2kgZWwgdXNlciB5YSB0aWVuZSBjb250cmFzZcOxYSBwYXJhIGVsZWdpciBlbCBtb2RvIGRlbCBtb2RhbC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlLnNldCgnbG9hZGluZycpO1xuICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgIHRoaXMuYXV0aC5jaGVja0hhc1Bhc3N3b3JkKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLl9tb2RlLnNldChyZXMuaGFzUGFzc3dvcmQgPyAnY2hhbmdlJyA6ICdzZXQnKSxcbiAgICAgIC8vIEZhbGxiYWNrIGNvbnNlcnZhZG9yOiBhbnRlIHVuIGZhbGxvLCBhc3VtaXIgZmx1am8gZGUgY2FtYmlvIG5vcm1hbC5cbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLl9tb2RlLnNldCgnY2hhbmdlJyksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdWJtaXRIYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX21vZGUoKSA9PT0gJ3NldCcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2V0UGFzc3dvcmQoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZUNoYW5nZVBhc3N3b3JkKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBGbHVqbyBub3JtYWw6IGVsIHVzZXIgdGllbmUgY29udHJhc2XDsWEgeSBsYSBjYW1iaWEuICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlUGFzc3dvcmQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ2N1cnJlbnRQYXNzd29yZCddO1xuICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gZXZlbnQuZmllbGRzWyduZXdQYXNzd29yZCddO1xuXG4gICAgaWYgKCFjdXJyZW50UGFzc3dvcmQgfHwgIW5ld1Bhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ2NvbXBsZXRlQWxsRmllbGRzJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKGN1cnJlbnRQYXNzd29yZCwgbmV3UGFzc3dvcmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ3Bhc3N3b3JkQ2hhbmdlZFN1Y2Nlc3MnKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1am8gT0F1dGgtb25seTogZWwgdXNlciBubyB0aWVuZSBjb250cmFzZcOxYS4gQW50ZXMgZGUgY3JlYXJsYSBwaWRlXG4gICAqIGNvbmZpcm1hY2nDs24gZXhwbMOtY2l0YSDigJQgZXMgdW4gY2FtYmlvIGRlIGN1ZW50YSwgYXVucXVlIGFkaXRpdm8gKGNvbnNlcnZhXG4gICAqIGVsIGFjY2VzbyBzb2NpYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXRQYXNzd29yZChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gZXZlbnQuZmllbGRzWyduZXdQYXNzd29yZCddO1xuXG4gICAgaWYgKCFuZXdQYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb21wbGV0ZUFsbEZpZWxkcycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1EaWFsb2cuY29uZmlybSh7XG4gICAgICB0aXRsZTogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1UaXRsZScpLFxuICAgICAgbWVzc2FnZTogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1NZXNzYWdlJyksXG4gICAgICBjb25maXJtQnV0dG9uOiB7IHRleHQ6IHRoaXMudCgnc2V0UGFzc3dvcmRDb25maXJtT2snKSwgcm9sZTogJ2NvbmZpcm0nIH0sXG4gICAgICBjYW5jZWxCdXR0b246IHsgdGV4dDogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1DYW5jZWwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdC5jb25maXJtZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aC5zZXRQYXNzd29yZEZvck9BdXRoVXNlcihuZXdQYXNzd29yZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgncGFzc3dvcmRTZXRTdWNjZXNzJykpO1xuICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBkZWwgYmFja2VuZCBhIG1lbnNhamVzIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlRXJyb3IoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgY2FzZSAnQVVUSFYyX1NBTUVfUEFTU1dPUkQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvclNhbWVQYXNzd29yZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BBU1NXT1JEX0FMUkVBRFlfU0VUJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JQYXNzd29yZEFscmVhZHlTZXQnKTtcbiAgICAgIGNhc2UgJ1ZBTElEQVRJT05fTUlTU0lOR19SRVFVSVJFRF9GSUVMRFMnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvclBhc3N3b3JkVG9vV2VhaycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIEBpZiAobW9kZSgpID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWxvYWRpbmdcIj5cbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cInN1Ym1pdEhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvY2hhbmdlLXBhc3N3b3JkLW1vZGFsL2NoYW5nZS1wYXNzd29yZC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2NoYW5nZS1wYXNzd29yZC1tb2RhbC9jaGFuZ2UtcGFzc3dvcmQtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQWtCLGVBQWUsRUFBNEIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDOUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztB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SztnQkFhSSxPQUFPO3NCQUFoQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgYXV0aFBhc3N3b3JkVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25CdXR0b25zLFxuICBJb25Db250ZW50LFxuICBJb25IZWFkZXIsXG4gIElvbk1vZGFsLFxuICBJb25TcGlubmVyLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcblxuaW1wb3J0IHsgYnV0dG9uIH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGUsIENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJbnB1dEkxOG5IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuXG4vKiogTW9kbyBkZWwgbW9kYWwsIHJlc3VlbHRvIGFsIGFicmlyIHNlZ8O6biBzaSBlbCB1c2VyIHlhIHRpZW5lIGNvbnRyYXNlw7FhLiAqL1xudHlwZSBQYXNzd29yZE1vZGFsTW9kZSA9ICdsb2FkaW5nJyB8ICdjaGFuZ2UnIHwgJ3NldCc7XG5cbi8qKlxuICogYHZhbC1jaGFuZ2UtcGFzc3dvcmQtbW9kYWxgIOKAlCBtb2RhbCBkZSBnZXN0acOzbiBkZSBjb250cmFzZcOxYSBwYXJhIHVuIHVzdWFyaW9cbiAqIGF1dGVudGljYWRvLiBBbsOhbG9nbyBhbCBtb2RhbCBkZSBcInJlY3VwZXJhciBjb250cmFzZcOxYVwiIGRlbCBgdmFsLWxvZ2luYC5cbiAqXG4gKiBFcyBkdWFsLW1vZGU6IGFsIGFicmlyc2UgY29uc3VsdGEgYEF1dGhTZXJ2aWNlLmNoZWNrSGFzUGFzc3dvcmQoKWAgeSBzZSBhZGFwdGE6XG4gKiAgLSAqKmNoYW5nZSoqIOKAlCBlbCB1c2VyIHlhIHRpZW5lIGNvbnRyYXNlw7FhIOKGkiBwaWRlIGFjdHVhbCArIG51ZXZhIOKGklxuICogICAgYGNoYW5nZVBhc3N3b3JkKClgLlxuICogIC0gKipzZXQqKiDigJQgZWwgdXNlciBlcyBPQXV0aC1vbmx5IChzaW4gY29udHJhc2XDsWEpIOKGkiBwaWRlIHNvbG8gbGEgbnVldmEsXG4gKiAgICBwaWRlIGNvbmZpcm1hY2nDs24gZXhwbMOtY2l0YSAobm8gcGllcmRlIGVsIGFjY2VzbyBzb2NpYWwsIGVzIGFkaXRpdm8pIOKGklxuICogICAgYHNldFBhc3N3b3JkRm9yT0F1dGhVc2VyKClgLlxuICpcbiAqIFNlbGYtY29udGFpbmVkOiBpbnllY3RhIGBBdXRoU2VydmljZWAgeSBsbGFtYSBlbCBlbmRwb2ludCBkaXJlY3RvIOKAlCBsYSBhcHBcbiAqIHNvbG8gY29udHJvbGEgYFtpc09wZW5dYCB5IHJlYWNjaW9uYSBhIGAoY2hhbmdlZClgIC8gYChkaXNtaXNzZWQpYC5cbiAqXG4gKiBpMThuOiB1c2EgZWwgbmFtZXNwYWNlIGNvbXBhcnRpZG8gYF9hdXRoYCAobWlzbWFzIGNsYXZlcyBxdWUgYHZhbC1sb2dpbmApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbFxuICogICBbaXNPcGVuXT1cImlzTW9kYWxPcGVuKClcIlxuICogICAoY2hhbmdlZCk9XCJpc01vZGFsT3Blbi5zZXQoZmFsc2UpXCJcbiAqICAgKGRpc21pc3NlZCk9XCJpc01vZGFsT3Blbi5zZXQoZmFsc2UpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uTW9kYWwsIElvblNwaW5uZXIsIElvblRvb2xiYXIsIEZvcm1Db21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhbmdlLXBhc3N3b3JkLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhbmdlLXBhc3N3b3JkLW1vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENoYW5nZVBhc3N3b3JkTW9kYWxDb21wb25lbnQge1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQ29udHJvbGEgbGEgdmlzaWJpbGlkYWQgZGVsIG1vZGFsLiBMbyBkZWNpZGUgZWwgY29tcG9uZW50ZSBwYWRyZS4gQ2FkYSB2ZXpcbiAgICogcXVlIHBhc2EgZGUgY2VycmFkbyBhIGFiaWVydG8gc2UgcmVzdWVsdmUgZWwgbW9kbyAoY2hhbmdlIHZzIHNldCkuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgaXNPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3BlbmluZyA9IHZhbHVlICYmICF0aGlzLl9pc09wZW47XG4gICAgdGhpcy5faXNPcGVuID0gdmFsdWU7XG4gICAgaWYgKG9wZW5pbmcpIHtcbiAgICAgIHRoaXMucmVzb2x2ZU1vZGUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgLyoqIEVtaXRlIGFsIGNhbWJpYXIvY3JlYXIgbGEgY29udHJhc2XDsWEgY29uIMOpeGl0by4gRWwgcGFkcmUgY2llcnJhIGVsIG1vZGFsLiAqL1xuICBAT3V0cHV0KCkgY2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdGUgY3VhbmRvIGVsIHVzZXIgY2llcnJhIGVsIG1vZGFsIChib3TDs24gWCBvIGJhY2tkcm9wKS4gKi9cbiAgQE91dHB1dCgpIGRpc21pc3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgaTE4bkhlbHBlciA9IGluamVjdChJbnB1dEkxOG5IZWxwZXIpO1xuICBwcml2YXRlIGNvbmZpcm1EaWFsb2cgPSBpbmplY3QoQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kZSA9IHNpZ25hbDxQYXNzd29yZE1vZGFsTW9kZT4oJ2xvYWRpbmcnKTtcbiAgLyoqIE1vZG8gYWN0dWFsIOKAlCBgbG9hZGluZ2AgbWllbnRyYXMgc2UgY29uc3VsdGEgYGNoZWNrSGFzUGFzc3dvcmQoKWAuICovXG4gIHJlYWRvbmx5IG1vZGUgPSB0aGlzLl9tb2RlLmFzUmVhZG9ubHkoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtU3RhdGUgPSBzaWduYWw8Q29tcG9uZW50U3RhdGU+KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcblxuICAvKiogVHJhZHVjZSB1bmEgY2xhdmUgZGVsIG5hbWVzcGFjZSBgX2F1dGhgLiAqL1xuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLl9tb2RlKCkgPT09ICdzZXQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgICAgbmFtZUtleTogJ3NldFBhc3N3b3JkVGl0bGUnLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudCgnc2V0UGFzc3dvcmREZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICBmaWVsZHM6IFt0aGlzLm5ld1Bhc3N3b3JkRmllbGQoMCldLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgICAuLi5idXR0b24oeyB0ZXh0OiAnJywgdHlwZTogJ3N1Ym1pdCcsIGZpbGw6ICdzb2xpZCcsIGV4cGFuZDogJ2Jsb2NrJywgc2hhcGU6ICdyb3VuZCcgfSksXG4gICAgICAgICAgdG9rZW46ICdzZXQtc3VibWl0JyxcbiAgICAgICAgICB0ZXh0S2V5OiAnc2V0UGFzc3dvcmRTdWJtaXQnLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0ZTogdGhpcy5fZm9ybVN0YXRlKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdjaGFuZ2VQYXNzd29yZFRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy50KCdjaGFuZ2VQYXNzd29yZERlc2NyaXB0aW9uJyksXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgICAgbmFtZTogJ2N1cnJlbnRQYXNzd29yZCcsXG4gICAgICAgICAgICAgIHRva2VuOiAnY2hhbmdlLWN1cnJlbnQtcGFzc3dvcmQnLFxuICAgICAgICAgICAgICBsYWJlbEtleTogJ2N1cnJlbnRQYXNzd29yZCcsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ3Bhc3N3b3JkUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2N1cnJlbnRQYXNzd29yZFJlcXVpcmVkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMubmV3UGFzc3dvcmRGaWVsZCgxKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uYnV0dG9uKHsgdGV4dDogJycsIHR5cGU6ICdzdWJtaXQnLCBmaWxsOiAnc29saWQnLCBleHBhbmQ6ICdibG9jaycsIHNoYXBlOiAncm91bmQnIH0pLFxuICAgICAgICB0b2tlbjogJ2NoYW5nZS1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnY2hhbmdlUGFzc3dvcmRTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9mb3JtU3RhdGUoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyoqIENhbXBvIFwibnVldmEgY29udHJhc2XDsWFcIiDigJQgY29tcGFydGlkbyBwb3IgYW1ib3MgbW9kb3MuICovXG4gIHByaXZhdGUgbmV3UGFzc3dvcmRGaWVsZChvcmRlcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgIG5hbWU6ICduZXdQYXNzd29yZCcsXG4gICAgICB0b2tlbjogJ2NoYW5nZS1uZXctcGFzc3dvcmQnLFxuICAgICAgbGFiZWxLZXk6ICduZXdQYXNzd29yZCcsXG4gICAgICBoaW50S2V5OiAnbmV3UGFzc3dvcmRIaW50JyxcbiAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdwYXNzd29yZFJlcXVpcmVkJyxcbiAgICAgICAgYXV0aFBhc3N3b3JkOiAncGFzc3dvcmRTdHJlbmd0aCcsXG4gICAgICB9LFxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGF1dGhQYXNzd29yZFZhbGlkYXRvcigpXSxcbiAgICAgIG9yZGVyLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG4gIH1cblxuICAvKiogQ2llcnJlIGluaWNpYWRvIHBvciBlbCB1c2VyIChYIC8gYmFja2Ryb3ApLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogQ29uc3VsdGEgc2kgZWwgdXNlciB5YSB0aWVuZSBjb250cmFzZcOxYSBwYXJhIGVsZWdpciBlbCBtb2RvIGRlbCBtb2RhbC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlLnNldCgnbG9hZGluZycpO1xuICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgIHRoaXMuYXV0aC5jaGVja0hhc1Bhc3N3b3JkKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLl9tb2RlLnNldChyZXMuaGFzUGFzc3dvcmQgPyAnY2hhbmdlJyA6ICdzZXQnKSxcbiAgICAgIC8vIEZhbGxiYWNrIGNvbnNlcnZhZG9yOiBhbnRlIHVuIGZhbGxvLCBhc3VtaXIgZmx1am8gZGUgY2FtYmlvIG5vcm1hbC5cbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLl9tb2RlLnNldCgnY2hhbmdlJyksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdWJtaXRIYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX21vZGUoKSA9PT0gJ3NldCcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2V0UGFzc3dvcmQoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZUNoYW5nZVBhc3N3b3JkKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBGbHVqbyBub3JtYWw6IGVsIHVzZXIgdGllbmUgY29udHJhc2XDsWEgeSBsYSBjYW1iaWEuICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlUGFzc3dvcmQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ2N1cnJlbnRQYXNzd29yZCddO1xuICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gZXZlbnQuZmllbGRzWyduZXdQYXNzd29yZCddO1xuXG4gICAgaWYgKCFjdXJyZW50UGFzc3dvcmQgfHwgIW5ld1Bhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ2NvbXBsZXRlQWxsRmllbGRzJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKGN1cnJlbnRQYXNzd29yZCwgbmV3UGFzc3dvcmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ3Bhc3N3b3JkQ2hhbmdlZFN1Y2Nlc3MnKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Zvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1am8gT0F1dGgtb25seTogZWwgdXNlciBubyB0aWVuZSBjb250cmFzZcOxYS4gQW50ZXMgZGUgY3JlYXJsYSBwaWRlXG4gICAqIGNvbmZpcm1hY2nDs24gZXhwbMOtY2l0YSDigJQgZXMgdW4gY2FtYmlvIGRlIGN1ZW50YSwgYXVucXVlIGFkaXRpdm8gKGNvbnNlcnZhXG4gICAqIGVsIGFjY2VzbyBzb2NpYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXRQYXNzd29yZChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gZXZlbnQuZmllbGRzWyduZXdQYXNzd29yZCddO1xuXG4gICAgaWYgKCFuZXdQYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb21wbGV0ZUFsbEZpZWxkcycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1EaWFsb2cuY29uZmlybSh7XG4gICAgICB0aXRsZTogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1UaXRsZScpLFxuICAgICAgbWVzc2FnZTogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1NZXNzYWdlJyksXG4gICAgICBjb25maXJtQnV0dG9uOiB7IHRleHQ6IHRoaXMudCgnc2V0UGFzc3dvcmRDb25maXJtT2snKSwgcm9sZTogJ2NvbmZpcm0nIH0sXG4gICAgICBjYW5jZWxCdXR0b246IHsgdGV4dDogdGhpcy50KCdzZXRQYXNzd29yZENvbmZpcm1DYW5jZWwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdC5jb25maXJtZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aC5zZXRQYXNzd29yZEZvck9BdXRoVXNlcihuZXdQYXNzd29yZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgncGFzc3dvcmRTZXRTdWNjZXNzJykpO1xuICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBkZWwgYmFja2VuZCBhIG1lbnNhamVzIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlRXJyb3IoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgY2FzZSAnQVVUSFYyX1NBTUVfUEFTU1dPUkQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvclNhbWVQYXNzd29yZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BBU1NXT1JEX0FMUkVBRFlfU0VUJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JQYXNzd29yZEFscmVhZHlTZXQnKTtcbiAgICAgIGNhc2UgJ1ZBTElEQVRJT05fTUlTU0lOR19SRVFVSVJFRF9GSUVMRFMnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvclBhc3N3b3JkVG9vV2VhaycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1sb2FkaW5nXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJmb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJzdWJtaXRIYW5kbGVyKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9pb24tY29udGVudD5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvaW9uLW1vZGFsPlxuIl19