http-request-manager 18.4.2 → 18.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,11 +1,43 @@
1
1
  # Request Manager Service Documentation
2
2
 
3
+ ## Demo Component (`HttpRequestServicesDemoComponent`)
4
+
5
+ The `HttpRequestServicesDemoComponent` is a comprehensive demonstration component that showcases the various services available in the `http-request-manager` library. It allows you to interactively test and visualize the functionality of HTTP services, state management, WebSockets, and local storage.
6
+
7
+ ### Usage
8
+
9
+ To use the demo component in your application, simply add the selector to your template and provide the necessary inputs.
10
+
11
+ ```html
12
+ <app-http-request-services-demo
13
+ [server]="'http://localhost:8080'"
14
+ [wsServer]="'ws://localhost:8080'"
15
+ [jwtToken]="'your-jwt-token'"
16
+ [adapter]="myAdapterFunction"
17
+ [mapper]="myMapperFunction">
18
+ </app-http-request-services-demo>
19
+ ```
20
+
21
+ ### Inputs
22
+
23
+ | Input | Type | Description | Default |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `server` | `string` | The base URL for HTTP requests used in the demo. | `'http://localhost:8080'` |
26
+ | `wsServer` | `string` | The WebSocket server URL for testing WS connections. | `'ws://localhost:8080'` |
27
+ | `jwtToken` | `string` | A JWT token used for authenticating WebSocket connections. | `''` |
28
+ | `adapter` | `Function` | An optional adapter function to transform incoming API data. | `undefined` |
29
+ | `mapper` | `Function` | An optional mapper function to transform outgoing request payloads. | `undefined` |
30
+
31
+ ---
32
+
3
33
  ## Summary
34
+
4
35
  The `http-request-manager` library provides a comprehensive set of services for handling HTTP requests, state management, local storage, and WebSocket communications in Angular applications.
5
36
 
6
37
  ## Initialization
7
38
 
8
39
  ### 1. Module Initialization (`forRoot`)
40
+
9
41
  To use the library, import `HttpRequestManagerModule` in your `AppModule` and configure it using the `forRoot` method.
10
42
 
11
43
  #### Configuration Options (`ConfigOptions`)
@@ -81,6 +113,7 @@ export class AppModule { }
81
113
  ```
82
114
 
83
115
  ### 2. AppService Initialization
116
+
84
117
  The `AppService` (used by `LocalStorageManagerService` for encryption) requires a unique `APP_ID` to be provided in your `AppModule`.
85
118
 
86
119
  ```typescript
@@ -102,6 +135,7 @@ export class AppModule { }
102
135
  ## Services Documentation
103
136
 
104
137
  ### 1. Request Manager Service (`HTTPManagerService`)
138
+
105
139
  **Path:** `request-manager-services/http-manager.service.ts`
106
140
 
107
141
  A robust HTTP client service using RxJS `BehaviorSubject` for state management.
@@ -110,6 +144,7 @@ A robust HTTP client service using RxJS `BehaviorSubject` for state management.
110
144
  This service acts as a wrapper around Angular's `HttpClient`, providing a centralized way to manage HTTP requests. It handles the entire lifecycle of a request, including loading states, error handling, and data updates, exposing them as Observables.
111
145
 
112
146
  **Features:**
147
+
113
148
  - **State Management:** Exposes `data$`, `isPending$`, `error$`, and `countdown$` observables.
114
149
  - **Polling:** Supports automatic polling of endpoints with a configurable interval and countdown timer.
115
150
  - **Retries:** Automatically retries failed requests based on configuration (number of attempts and delay).
@@ -137,7 +172,7 @@ Inject `HTTPManagerService` to make API requests. It handles loading state, erro
137
172
  | `saveAs` | `string` | Filename for file downloads. | `undefined` |
138
173
  | `ws` | `WSOptions` | WebSocket configuration options. | `undefined` |
139
174
 
140
- #### Example
175
+ #### HTTPManagerService Example
141
176
 
142
177
  ```typescript
143
178
  export class MyComponent {
@@ -180,6 +215,7 @@ const options = ApiRequest.adapt({
180
215
  ```
181
216
 
182
217
  ### 2. Request Manager Signal Service (`HTTPManagerSignalsService`)
218
+
183
219
  **Path:** `request-manager-services/http-manager-signals.service.ts`
184
220
 
185
221
  A modern alternative to `HTTPManagerService` using Angular Signals for state management.
@@ -188,6 +224,7 @@ A modern alternative to `HTTPManagerService` using Angular Signals for state man
188
224
  This service provides the same functionality as `HTTPManagerService` but exposes state using Angular Signals instead of RxJS Observables. This is ideal for modern Angular applications leveraging fine-grained reactivity.
189
225
 
190
226
  **Features:**
227
+
191
228
  - **Signal-Based State:** Exposes `data`, `isPending`, `error`, and `countdown` as Signals.
192
229
  - **Feature Parity:** Supports all features of `HTTPManagerService` including polling, retries, adapters, and streaming.
193
230
  - **Optimized for Signals:** Designed to work seamlessly with Angular's Signal-based components and templates.
@@ -211,6 +248,7 @@ export class MyComponent {
211
248
  ```
212
249
 
213
250
  ### 3. Request Manager State Service (`HTTPManagerStateService`)
251
+
214
252
  **Path:** `request-manager-state-service/http-manager-state.store.ts`
215
253
 
216
254
  An extension of `ComponentStore` designed for managing entity state (CRUD) with built-in HTTP request handling and WebSocket integration.
@@ -219,6 +257,7 @@ An extension of `ComponentStore` designed for managing entity state (CRUD) with
219
257
  This service combines HTTP requests with local state management. It automatically updates the local store when CRUD operations succeed, eliminating the need to manually refresh data. It also integrates with WebSockets to keep the state synchronized with server-side changes.
220
258
 
221
259
  **Features:**
260
+
222
261
  - **ComponentStore Integration:** Extends NGRX `ComponentStore` for robust state management.
223
262
  - **Automatic CRUD Updates:** `createRecord`, `updateRecord`, and `deleteRecord` automatically update the local state upon success.
224
263
  - **WebSocket Sync:** Listens for WebSocket messages to update, create, or delete records in real-time.
@@ -259,15 +298,18 @@ export class UsersStore extends HTTPManagerStateService<User> {
259
298
  ```
260
299
 
261
300
  **Features:**
301
+
262
302
  - **Automatic State Updates:** `createRecord`, `updateRecord`, and `deleteRecord` automatically update the local state upon success.
263
303
  - **Selectors:** `data$`, `selectRecord$(id)`.
264
304
  - **WebSocket Integration:** Automatically connects to WS if configured in `ApiRequest`. Syncs state on 'create', 'update', 'delete' events from WS.
265
305
  - **Runtime Configuration:** Use `setApiRequestOptions()` to update API or WS settings dynamically.
266
306
 
267
307
  ### 4. Request Manager Signal State Service
308
+
268
309
  *Note: Currently, the state management service (`HTTPManagerStateService`) is based on `ComponentStore` (RxJS). A dedicated Signal-based state manager is not yet available in this library.*
269
310
 
270
311
  ### 5. Local Storage Manager Service (`LocalStorageManagerService`)
312
+
271
313
  **Path:** `local-storage-manager-service/local-storage-manager.service.ts`
272
314
 
273
315
  Manages `localStorage` and `sessionStorage` with encryption and expiration support.
@@ -276,6 +318,7 @@ Manages `localStorage` and `sessionStorage` with encryption and expiration suppo
276
318
  This service provides a secure and managed way to interact with browser storage. It treats storage as a state, allowing you to subscribe to changes. It also handles data encryption and expiration automatically.
277
319
 
278
320
  **Features:**
321
+
279
322
  - **Encryption:** Encrypts data before saving to storage using `SymmetricalEncryptionService` (requires `APP_ID`).
280
323
  - **Expiration:** Supports setting an expiration time (`expiresIn`) for stored items. Automatically cleans up expired items.
281
324
  - **Storage Types:** Supports both `localStorage` (Global) and `sessionStorage` (Session).
@@ -283,6 +326,7 @@ This service provides a secure and managed way to interact with browser storage.
283
326
  - **Metadata Management:** Keeps track of storage settings (encryption, expiration) separately from the data.
284
327
 
285
328
  **Usage:**
329
+
286
330
  ```typescript
287
331
  localStorageManager = inject(LocalStorageManagerService);
288
332
 
@@ -308,6 +352,7 @@ this.localStorageManager.resetStore();
308
352
  ```
309
353
 
310
354
  ### 6. Store State Manager Service (`StoreStateManagerService`)
355
+
311
356
  **Path:** `store-state-manager-service/store-state-manager.service.ts`
312
357
 
313
358
  A service that extends `ComponentStore` to provide persistent state management synchronized with local or session storage.
@@ -316,6 +361,7 @@ A service that extends `ComponentStore` to provide persistent state management s
316
361
  This service bridges the gap between in-memory state (ComponentStore) and persistent storage. It ensures that your state is automatically saved to storage when it changes and restored from storage when the service is initialized.
317
362
 
318
363
  **Features:**
364
+
319
365
  - **Persistence:** Automatically saves state changes to `localStorage` or `sessionStorage`.
320
366
  - **State Restoration:** Restores state from storage on initialization.
321
367
  - **Reactivity:** Extends `ComponentStore`, providing all its benefits (selectors, updaters, effects).
@@ -357,11 +403,13 @@ export class SettingsStateService extends StoreStateManagerService {
357
403
  ```
358
404
 
359
405
  **Features:**
406
+
360
407
  - **Persistence:** Automatically saves state changes to LocalStorage or SessionStorage.
361
408
  - **Reactivity:** Extends `ComponentStore`, providing `data$` selector and `updater` methods.
362
409
  - **Encryption:** Supports encrypted storage via `LocalStorageManagerService`.
363
410
 
364
411
  ### 7. WebSocket Manager Service (`WebsocketService`)
412
+
365
413
  **Path:** `ws-manager-service/services/websocket.service.ts`
366
414
 
367
415
  Handles WebSocket connections, channel subscriptions, and messaging. It is used internally by `HTTPManagerStateService` but can be used standalone.
@@ -370,6 +418,7 @@ Handles WebSocket connections, channel subscriptions, and messaging. It is used
370
418
  This service manages the lifecycle of a WebSocket connection. It handles authentication, connection stability, and message routing. It supports a channel-based architecture for organizing communication.
371
419
 
372
420
  **Features:**
421
+
373
422
  - **Connection Management:** Handles connecting, disconnecting, and reconnecting.
374
423
  - **Authentication:** Supports JWT-based authentication for secure connections.
375
424
  - **Channels:** Allows subscribing and unsubscribing to specific channels.
@@ -377,6 +426,7 @@ This service manages the lifecycle of a WebSocket connection. It handles authent
377
426
  - **Observables:** Exposes `messages$` stream and `connectionStatus$` for reactive integration.
378
427
 
379
428
  **Usage:**
429
+
380
430
  ```typescript
381
431
  wsService = inject(WebsocketService);
382
432
 
@@ -502,7 +552,7 @@ When using `HTTPManagerStateService`, you can configure local database caching u
502
552
  | `table` | `string` | The name of the table in IndexedDB where records will be stored. | `''` |
503
553
  | `expiresIn` | `string` | The duration for which the data remains valid. Format: `'1d'` (days), `'1h'` (hours), `'30m'` (minutes). | `''` |
504
554
 
505
- ##### Example
555
+ ##### Database Storage Example
506
556
 
507
557
  ```typescript
508
558
  import { DatabaseStorage } from 'http-request-manager';
@@ -514,6 +564,7 @@ const dbConfig = DatabaseStorage.adapt({
514
564
  ```
515
565
 
516
566
  ### 9. Utils (`UtilsService`)
567
+
517
568
  **Path:** `utils/utils.service.ts`
518
569
 
519
570
  Provides utility functions for common tasks.
@@ -522,6 +573,7 @@ Provides utility functions for common tasks.
522
573
  A collection of helper functions used throughout the library and available for application use. It simplifies common tasks related to data manipulation, validation, and time calculations.
523
574
 
524
575
  **Features:**
576
+
525
577
  - **JSON Handling:** Safe `stringToJSON` and `JSONToString` methods.
526
578
  - **Type Checking:** `isString`, `isObject`, `isJSON`.
527
579
  - **Expiration:** `expires(string)` converts duration strings (e.g., '1d', '2h') to epoch timestamps. `hasExpired(timestamp)` checks if a timestamp has passed.
@@ -529,6 +581,7 @@ A collection of helper functions used throughout the library and available for a
529
581
  - **Object Equality:** `objectsEqual` for deep comparison.
530
582
 
531
583
  **Usage:**
584
+
532
585
  ```typescript
533
586
  utils = inject(UtilsService);
534
587
 
@@ -2,7 +2,7 @@ import { Component, inject, Input } from '@angular/core';
2
2
  import { FormBuilder, Validators } from '@angular/forms';
3
3
  import { combineLatest, map, EMPTY } from 'rxjs';
4
4
  import { HTTPManagerService, RandomNumber, ChannelMessage, CommunicationType } from '../../services';
5
- import { StateRequestService } from './services/state-request.service';
5
+ import { StateRequestServiceDemo } from './services/state-request-demo.service';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@angular/common";
8
8
  import * as i2 from "@angular/forms";
@@ -17,23 +17,23 @@ import * as i10 from "@angular/material/toolbar";
17
17
  export class RequestManagerWsDemoComponent {
18
18
  constructor() {
19
19
  this.httpManagerService = inject(HTTPManagerService);
20
- this.stateRequestService = inject(StateRequestService);
20
+ this.stateRequestServiceDemo = inject(StateRequestServiceDemo);
21
21
  this.fb = inject(FormBuilder);
22
- this.user$ = this.stateRequestService.user$;
23
- this.users$ = this.stateRequestService.userList$;
24
- this.attempts$ = this.stateRequestService.attempts$;
25
- this.nextRetry$ = this.stateRequestService.nextRetry$;
26
- this.connectionStatus$ = this.stateRequestService.status$;
22
+ this.user$ = this.stateRequestServiceDemo.user$;
23
+ this.users$ = this.stateRequestServiceDemo.userList$;
24
+ this.attempts$ = this.stateRequestServiceDemo.attempts$;
25
+ this.nextRetry$ = this.stateRequestServiceDemo.nextRetry$;
26
+ this.connectionStatus$ = this.stateRequestServiceDemo.status$;
27
27
  this.messages = this.fb.group({
28
28
  toUser: this.fb.control(null, Validators.required),
29
29
  content: this.fb.control(null, Validators.required),
30
30
  });
31
- this.data$ = this.stateRequestService.data$;
31
+ this.data$ = this.stateRequestServiceDemo.data$;
32
32
  this.fromMe = (user, fromUser) => {
33
33
  return user === fromUser;
34
34
  };
35
- this.communicationMessages$ = this.stateRequestService.communicationMessages$;
36
- this.latestCommunicationMessages$ = this.stateRequestService.latestCommunicationMessages$;
35
+ this.communicationMessages$ = this.stateRequestServiceDemo.communicationMessages$;
36
+ this.latestCommunicationMessages$ = this.stateRequestServiceDemo.latestCommunicationMessages$;
37
37
  this.chat$ = combineLatest([this.user$, this.communicationMessages$])
38
38
  .pipe(map(([user, messages]) => ({ user, messages })), map(obj => {
39
39
  if (!obj.user)
@@ -80,14 +80,14 @@ export class RequestManagerWsDemoComponent {
80
80
  return this.toUser.valid;
81
81
  }
82
82
  ngOnInit() {
83
- this.stateRequestService.updateConnection(this.server, this.wsServer, this.jwtToken);
84
- this.stateRequestService.getData();
83
+ this.stateRequestServiceDemo.updateConnection(this.server, this.wsServer, this.jwtToken);
84
+ this.stateRequestServiceDemo.getData();
85
85
  }
86
86
  onGetData() {
87
- this.stateRequestService.getData();
87
+ this.stateRequestServiceDemo.getData();
88
88
  }
89
89
  onAddData() {
90
- this.stateRequestService.addData();
90
+ this.stateRequestServiceDemo.addData();
91
91
  }
92
92
  onUpdateData(data) {
93
93
  const num = RandomNumber(1000, 9999);
@@ -98,14 +98,14 @@ export class RequestManagerWsDemoComponent {
98
98
  "email": "mikeboni@hotmail.com",
99
99
  "first_name": "mike"
100
100
  };
101
- this.stateRequestService.updateData(newData);
101
+ this.stateRequestServiceDemo.updateData(newData);
102
102
  }
103
103
  onSendMessage() {
104
104
  this.messages.markAllAsTouched();
105
105
  if (this.messages.invalid)
106
106
  return;
107
107
  const message = ChannelMessage.adapt(this.messages.value);
108
- this.stateRequestService.sendMessage(message);
108
+ this.stateRequestServiceDemo.sendMessage(message);
109
109
  this.content.reset();
110
110
  }
111
111
  onSendAlert() {
@@ -113,12 +113,12 @@ export class RequestManagerWsDemoComponent {
113
113
  if (this.messages.invalid)
114
114
  return;
115
115
  const message = ChannelMessage.adapt({ ...this.messages.value, type: CommunicationType.ALERT });
116
- this.stateRequestService.sendMessage(message);
116
+ this.stateRequestServiceDemo.sendMessage(message);
117
117
  this.content.reset();
118
118
  }
119
119
  onRemoveData(data) {
120
120
  const lastRec = data[data.length - 1];
121
- this.stateRequestService.deleteData(lastRec);
121
+ this.stateRequestServiceDemo.deleteData(lastRec);
122
122
  }
123
123
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestManagerWsDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
124
124
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RequestManagerWsDemoComponent, selector: "app-request-manager-ws-demo", inputs: { server: "server", wsServer: "wsServer", jwtToken: "jwtToken" }, ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2 style=\"display: flex;\">\n <span style=\"flex:1\">HTTP Request State Manager - Websockets</span>\n <span *ngIf=\"(connectionStatus$ | async) as connected; else NOT_CONNECTED\">\n WS -\n <span style=\"color: green;\">Connected</span>\n </span>\n <ng-template #NOT_CONNECTED>\n <span style=\"color: red;\">Disconnected {{ attempts$ | async }} - {{ nextRetry$ |async }}</span>\n </ng-template>\n </h2>\n\n <div>\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n <mat-toolbar>\n <div style=\"display: flex; flex:1\">\n <div style=\"flex:1\">{{ userInfo.name }}</div>\n <div>({{ userInfo.username }})</div>\n </div>\n </mat-toolbar>\n </div>\n\n <mat-tab-group animationDuration=\"0ms\">\n\n <mat-tab label=\"WS - Data Control\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(users$ |async) as users\">\n <mat-chip-set>\n <mat-chip *ngFor=\"let user of users\">\n {{ user.name }}\n </mat-chip>\n </mat-chip-set>\n </div>\n\n <div style=\"display: flex; gap: 1rem; margin-bottom: 1rem;\">\n <button mat-stroked-button (click)=\"onGetData()\">Get Data</button>\n <button mat-stroked-button color=\"accent\" (click)=\"onUpdateData(data)\">Update Data</button>\n <button mat-stroked-button color=\"warn\" (click)=\"onRemoveData(data)\">Remove Data</button>\n <button mat-stroked-button color=\"primary\" (click)=\"onAddData()\">Add Data</button>\n </div>\n\n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n <div>{{ data | json }}</div>\n <h2>{{ data.length }}</h2>\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Messaging\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n\n <div *ngIf=\"(users$ | async) as users\">\n\n <div style=\"display: flex; gap: 1rem\">\n\n <div style=\"flex:1\" [formGroup]=\"messages\">\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Users</mat-label>\n <mat-select formControlName=\"toUser\">\n <mat-option value=\"allChannels\" #selectedUser>\n All Users\n </mat-option>\n <mat-option *ngFor=\"let user of users\" [value]=\"user\">\n {{ user.username }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Send a Message</mat-label>\n <textarea\n matInput placeholder=\"Ex. It makes me feel...\"\n formControlName=\"content\"\n (keydown.enter)=\"onSendMessage(); $event.preventDefault()\"\n [disabled]=\"!isValid\"\n ></textarea>\n </mat-form-field>\n </div>\n <div style=\"display:flex; gap: .5rem;\">\n <div style=\"flex:1\"></div>\n <button mat-stroked-button (click)=\"onSendMessage()\" color=\"warn\">\n Send Alert\n </button>\n <button mat-stroked-button (click)=\"onSendAlert()\">\n Send Message\n </button>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"(chat$ | async) as chat\" style=\"border: thin gray solid; padding: 1rem; margin-top: 1rem;\">\n <!-- <app-messenger-chat\n [user]=\"chat.user\"\n [messages]=\"chat.messages\"\n ></app-messenger-chat> -->\n </div>\n\n </div>\n\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Custom Channel Messaging\" [disabled]=\"true\">\n WS - Custom Channel Messaging\n </mat-tab>\n\n </mat-tab-group>\n </div>\n\n</div>\n\n\n<div style=\"margin: 1rem;\">\n <h3>\n user: {{ user$ | async | json}}\n </h3>\n\n <h3>\n users: {{ users$ | async | json}}\n </h3>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i8.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
@@ -133,4 +133,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
133
133
  }], jwtToken: [{
134
134
  type: Input
135
135
  }] } });
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXdzLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQWMsYUFBYSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQU8sTUFBTSxNQUFNLENBQUM7QUFFbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3ZFLE1BQU0sT0FBTyw2QkFBNkI7SUFMMUM7UUFPRSx1QkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUMvQyx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUVqRCxPQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBTXhCLFVBQUssR0FBRyxJQUFJLENBQUMsbUJB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WUFBRSxPQUFNO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQy9GLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVM7UUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUUsQ0FBQyxDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM5QyxDQUFDOytHQTNJVSw2QkFBNkI7bUdBQTdCLDZCQUE2Qiw2SUNaMUMsdXNKQXVJQTs7NEZEM0hhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw2QkFBNkI7OEJBVzlCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBtYXAsIEVNUFRZLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSFRUUE1hbmFnZXJTZXJ2aWNlLCBSYW5kb21OdW1iZXIsIENoYW5uZWxNZXNzYWdlLCBDb21tdW5pY2F0aW9uVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFN0YXRlUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3N0YXRlLXJlcXVlc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXF1ZXN0LW1hbmFnZXItd3MtZGVtbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlcldzRGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgaHR0cE1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEhUVFBNYW5hZ2VyU2VydmljZSlcbiAgc3RhdGVSZXF1ZXN0U2VydmljZSA9IGluamVjdChTdGF0ZVJlcXVlc3RTZXJ2aWNlKVxuXG4gIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKVxuXG4gIEBJbnB1dCgpIHNlcnZlciE6IHN0cmluZztcbiAgQElucHV0KCkgd3NTZXJ2ZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGp3dFRva2VuITogc3RyaW5nO1xuXG4gIHVzZXIkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLnVzZXIkXG4gIHVzZXJzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS51c2VyTGlzdCRcblxuICBhdHRlbXB0cyQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UuYXR0ZW1wdHMkXG4gIG5leHRSZXRyeSQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UubmV4dFJldHJ5JFxuXG4gIGNvbm5lY3Rpb25TdGF0dXMkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLnN0YXR1cyRcblxuICBtZXNzYWdlcyA9IHRoaXMuZmIuZ3JvdXA8YW55Pih7XG4gICAgdG9Vc2VyOiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nfG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIGNvbnRlbnQ6IHRoaXMuZmIuY29udHJvbDxzdHJpbmd8bnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gIH0pXG5cbiAgZ2V0IHRvVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlcy5nZXQoJ3RvVXNlcicpIGFzIEZvcm1Db250cm9sXG4gIH1cblxuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlcy5nZXQoJ2NvbnRlbnQnKSBhcyBGb3JtQ29udHJvbFxuICB9XG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9Vc2VyLnZhbGlkXG4gIH1cblxuICBkYXRhJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5kYXRhJDtcblxuICBmcm9tTWUgPSAodXNlcjogc3RyaW5nLCBmcm9tVXNlcjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHVzZXIgPT09IGZyb21Vc2VyXG4gIH1cblxuICBjb21tdW5pY2F0aW9uTWVzc2FnZXMkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLmNvbW11bmljYXRpb25NZXNzYWdlcyRcbiAgbGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5sYXRlc3RDb21tdW5pY2F0aW9uTWVzc2FnZXMkXG5cbiAgY2hhdCQ6IE9ic2VydmFibGU8eyB1c2VyOiBhbnksIG1lc3NhZ2VzOiBhbnlbXX18YW55PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMudXNlciQsIHRoaXMuY29tbXVuaWNhdGlvbk1lc3NhZ2VzJF0pXG4gIC5waXBlKFxuICAgIG1hcCgoW3VzZXIsIG1lc3NhZ2VzXTogYW55KSA9PiAoeyB1c2VyLCBtZXNzYWdlcyB9KSksXG4gICAgbWFwKG9iaiA9PiB7XG5cbiAgICAgIGlmKCFvYmoudXNlcikgcmV0dXJuIEVNUFRZXG5cbiAgICAgIC8vIGNvbnN0IG1haW5Vc2VyID0gVXNlck5hbWUuYWRhcHQoe1xuICAgICAgLy8gICAgIGlkOiBvYmoudXNlci51c2VybmFtZSxcbiAgICAgIC8vICAgICBmaXJzdDogb2JqLnVzZXI/Lm5hbWU/LmZpcnN0LFxuICAgICAgLy8gICAgIGxhc3Q6IG9iai51c2VyPy5uYW1lPy5sYXN0LFxuICAgICAgLy8gfSlcblxuICAgICAgY29uc3QgbWFpblVzZXIgPSAnJ1xuXG4gICAgICBjb25zdCBtZXNzYWdlcyA9IG9iai5tZXNzYWdlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuXG4gICAgICAgIGlmKGl0ZW0udG9Vc2VyID09PSAnYWxsQ2hhbm5lbHMnKSB7XG4gICAgICAgICAgLy8gaXRlbS50b1VzZXIgPSBVc2VyTmFtZS5hZGFwdCh7XG4gICAgICAgICAgLy8gICAgIGlkOiAnJyxcbiAgICAgICAgICAvLyAgICAgZmlyc3Q6ICdBbGwgVXNlcnMnLFxuICAgICAgICAgIC8vICAgICBsYXN0OiAnJyxcbiAgICAgICAgICAvLyB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIE1lc3NhZ2UuYWRhcHQoe1xuICAgICAgICAvLyAgICAgZnJvbVVzZXI6IHtcbiAgICAgICAgLy8gICAgICAgaWQ6IGl0ZW0uZnJvbVVzZXIudXNlcm5hbWUsXG4gICAgICAgIC8vICAgICAgIGZpcnN0OiBpdGVtLmZyb21Vc2VyPy5uYW1lPy5maXJzdCxcbiAgICAgICAgLy8gICAgICAgbGFzdDogaXRlbS5mcm9tVXNlcj8ubmFtZT8ubGFzdCxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICB0b1VzZXI6IHtcbiAgICAgICAgLy8gICAgICAgaWQ6IGl0ZW0udG9Vc2VyLnVzZXJuYW1lLFxuICAgICAgICAvLyAgICAgICBmaXJzdDogaXRlbS50b1VzZXI/Lm5hbWU/LmZpcnN0LFxuICAgICAgICAvLyAgICAgICBsYXN0OiBpdGVtLnRvVXNlcj8ubmFtZT8ubGFzdCxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICBjb250ZW50OiBpdGVtLmNvbnRlbnQsXG4gICAgICAgIC8vICAgICBkYXRlOiBpdGVtLmlzc3VlZCxcbiAgICAgICAgLy8gfSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IHVzZXI6IG1haW5Vc2VyLCBtZXNzYWdlcyB9XG5cbiAgICB9KVxuICApO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS51cGRhdGVDb25uZWN0aW9uKHRoaXMuc2VydmVyLCB0aGlzLndzU2VydmVyLCB0aGlzLmp3dFRva2VuKTtcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UuZ2V0RGF0YSgpXG4gIH1cblxuICBvbkdldERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLmdldERhdGEoKVxuICB9XG5cbiAgb25BZGREYXRhKCkge1xuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5hZGREYXRhKClcbiAgfVxuXG4gIG9uVXBkYXRlRGF0YShkYXRhOiBhbnlbXSkge1xuXG4gICAgY29uc3QgbnVtID0gUmFuZG9tTnVtYmVyKDEwMDAsIDk5OTkpXG5cbiAgICBjb25zdCBuZXdEYXRhID0ge1xuICAgICAgXCJzcGlmZmVcIjogYHdhdmVjb2RlcnMuY29tL2RldmVsb3Blci8ke251bX1gLFxuICAgICAgXCJpZFwiOiA2MyxcbiAgICAgIFwibGFzdF9uYW1lXCI6IFwiYm9uaVwiLFxuICAgICAgXCJlbWFpbFwiOiBcIm1pa2Vib25pQGhvdG1haWwuY29tXCIsXG4gICAgICBcImZpcnN0X25hbWVcIjogXCJtaWtlXCJcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UudXBkYXRlRGF0YShuZXdEYXRhKVxuXG4gIH1cblxuICBvblNlbmRNZXNzYWdlKCkge1xuICAgIHRoaXMubWVzc2FnZXMubWFya0FsbEFzVG91Y2hlZCgpXG4gICAgaWYgKHRoaXMubWVzc2FnZXMuaW52YWxpZCkgcmV0dXJuXG4gICAgY29uc3QgbWVzc2FnZSA9IENoYW5uZWxNZXNzYWdlLmFkYXB0KHRoaXMubWVzc2FnZXMudmFsdWUpXG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgdGhpcy5jb250ZW50LnJlc2V0KClcbiAgfVxuXG4gIG9uU2VuZEFsZXJ0KCkge1xuICAgIHRoaXMubWVzc2FnZXMubWFya0FsbEFzVG91Y2hlZCgpXG4gICAgaWYgKHRoaXMubWVzc2FnZXMuaW52YWxpZCkgcmV0dXJuXG4gICAgY29uc3QgbWVzc2FnZSA9IENoYW5uZWxNZXNzYWdlLmFkYXB0KHsgLi4udGhpcy5tZXNzYWdlcy52YWx1ZSwgdHlwZTogQ29tbXVuaWNhdGlvblR5cGUuQUxFUlQgfSlcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UobWVzc2FnZSlcbiAgICB0aGlzLmNvbnRlbnQucmVzZXQoKVxuICB9XG5cbiAgb25SZW1vdmVEYXRhKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGxhc3RSZWMgPSBkYXRhW2RhdGEubGVuZ3RoIC0xXVxuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5kZWxldGVEYXRhKGxhc3RSZWMpXG4gIH1cblxufVxuIiwiPGRpdiBzdHlsZT1cIm1hcmdpbjogMnJlbTtcIj5cblxuICA8aDIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+SFRUUCBSZXF1ZXN0IFN0YXRlIE1hbmFnZXIgLSBXZWJzb2NrZXRzPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiKGNvbm5lY3Rpb25TdGF0dXMkIHwgYXN5bmMpIGFzIGNvbm5lY3RlZDsgZWxzZSBOT1RfQ09OTkVDVEVEXCI+XG4gICAgICBXUyAtXG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiBncmVlbjtcIj5Db25uZWN0ZWQ8L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxuZy10ZW1wbGF0ZSAjTk9UX0NPTk5FQ1RFRD5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHJlZDtcIj5EaXNjb25uZWN0ZWQge3sgYXR0ZW1wdHMkIHwgYXN5bmMgfX0gLSB7eyBuZXh0UmV0cnkkIHxhc3luYyB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2gyPlxuXG4gIDxkaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKHVzZXIkIHwgYXN5bmMpIGFzIHVzZXJJbmZvXCI+XG4gICAgICA8bWF0LXRvb2xiYXI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4OjFcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCI+e3sgdXNlckluZm8ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXY+KHt7IHVzZXJJbmZvLnVzZXJuYW1lIH19KTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LXRvb2xiYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LXRhYi1ncm91cCBhbmltYXRpb25EdXJhdGlvbj1cIjBtc1wiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gRGF0YSBDb250cm9sXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIihkYXRhJCB8IGFzeW5jKSBhcyBkYXRhXCIgc3R5bGU9XCJtYXJnaW46IDFyZW07IGRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbTsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIodXNlcnMkIHxhc3luYykgYXMgdXNlcnNcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiPlxuICAgICAgICAgICAgICAgIHt7IHVzZXIubmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0RGF0YSgpXCI+R2V0IERhdGE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwiYWNjZW50XCIgKGNsaWNrKT1cIm9uVXBkYXRlRGF0YShkYXRhKVwiPlVwZGF0ZSBEYXRhPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwib25SZW1vdmVEYXRhKGRhdGEpXCI+UmVtb3ZlIERhdGE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJvbkFkZERhdGEoKVwiPkFkZCBEYXRhPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICAgICAgPGRpdj57eyBkYXRhIHwganNvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPGgyPnt7IGRhdGEubGVuZ3RoIH19PC9oMj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gTWVzc2FnaW5nXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIihkYXRhJCB8IGFzeW5jKSBhcyBkYXRhXCIgc3R5bGU9XCJtYXJnaW46IDFyZW07IGRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbTsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIodXNlciQgfCBhc3luYykgYXMgdXNlckluZm9cIj5cblxuICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCIodXNlcnMkIHwgYXN5bmMpIGFzIHVzZXJzXCI+XG5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbVwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MVwiIFtmb3JtR3JvdXBdPVwibWVzc2FnZXNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwiZmxleDoxXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVzZXJzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidG9Vc2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFsbENoYW5uZWxzXCIgI3NlbGVjdGVkVXNlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFVzZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiIFt2YWx1ZV09XCJ1c2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVzZXIudXNlcm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwiZmxleDoxXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlNlbmQgYSBNZXNzYWdlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkV4LiBJdCBtYWtlcyBtZSBmZWVsLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25TZW5kTWVzc2FnZSgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBnYXA6IC41cmVtO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvblNlbmRNZXNzYWdlKClcIiBjb2xvcj1cIndhcm5cIj5cbiAgICAgICAgICAgICAgICAgICAgICBTZW5kIEFsZXJ0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25TZW5kQWxlcnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFNlbmQgTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGNoYXQkIHwgYXN5bmMpIGFzIGNoYXRcIiBzdHlsZT1cImJvcmRlcjogdGhpbiBncmF5IHNvbGlkOyBwYWRkaW5nOiAxcmVtOyBtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGFwcC1tZXNzZW5nZXItY2hhdFxuICAgICAgICAgICAgICAgICAgW3VzZXJdPVwiY2hhdC51c2VyXCJcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlc109XCJjaGF0Lm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgICA+PC9hcHAtbWVzc2VuZ2VyLWNoYXQ+IC0tPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gQ3VzdG9tIENoYW5uZWwgTWVzc2FnaW5nXCIgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgICAgV1MgLSBDdXN0b20gQ2hhbm5lbCBNZXNzYWdpbmdcbiAgICAgIDwvbWF0LXRhYj5cblxuICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbjxkaXYgc3R5bGU9XCJtYXJnaW46IDFyZW07XCI+XG4gIDxoMz5cbiAgICB1c2VyOiB7eyB1c2VyJCB8IGFzeW5jIHwganNvbn19XG4gIDwvaDM+XG5cbiAgPGgzPlxuICAgIHVzZXJzOiB7eyB1c2VycyQgfCBhc3luYyB8IGpzb259fVxuICA8L2gzPlxuPC9kaXY+XG4iXX0=
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXdzLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBYyxhQUFhLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBTyxNQUFNLE1BQU0sQ0FBQztBQUVsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPaEYsTUFBTSxPQUFPLDZCQUE2QjtJQUwxQztRQU9FLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQy9DLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBRXpELE9BQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFNeEIsVUFBSyxHQUFHLElBQUksQ0FBQyx1QkFB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QUFFLE9BQU07UUFDakMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDL0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRSxDQUFDLENBQUMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xELENBQUM7K0dBM0lVLDZCQUE2QjttR0FBN0IsNkJBQTZCLDZJQ1oxQyx1c0pBdUlBOzs0RkQzSGEsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDZCQUE2Qjs4QkFXOUIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBtYXAsIEVNUFRZLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSFRUUE1hbmFnZXJTZXJ2aWNlLCBSYW5kb21OdW1iZXIsIENoYW5uZWxNZXNzYWdlLCBDb21tdW5pY2F0aW9uVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vIH0gZnJvbSAnLi9zZXJ2aWNlcy9zdGF0ZS1yZXF1ZXN0LWRlbW8uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXF1ZXN0LW1hbmFnZXItd3MtZGVtbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlcldzRGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgaHR0cE1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEhUVFBNYW5hZ2VyU2VydmljZSlcbiAgc3RhdGVSZXF1ZXN0U2VydmljZURlbW8gPSBpbmplY3QoU3RhdGVSZXF1ZXN0U2VydmljZURlbW8pXG5cbiAgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpXG5cbiAgQElucHV0KCkgc2VydmVyITogc3RyaW5nO1xuICBASW5wdXQoKSB3c1NlcnZlciE6IHN0cmluZztcbiAgQElucHV0KCkgand0VG9rZW4hOiBzdHJpbmc7XG5cbiAgdXNlciQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vLnVzZXIkXG4gIHVzZXJzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZURlbW8udXNlckxpc3QkXG5cbiAgYXR0ZW1wdHMkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5hdHRlbXB0cyRcbiAgbmV4dFJldHJ5JCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZURlbW8ubmV4dFJldHJ5JFxuXG4gIGNvbm5lY3Rpb25TdGF0dXMkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5zdGF0dXMkXG5cbiAgbWVzc2FnZXMgPSB0aGlzLmZiLmdyb3VwPGFueT4oe1xuICAgIHRvVXNlcjogdGhpcy5mYi5jb250cm9sPHN0cmluZ3xudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBjb250ZW50OiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nfG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICB9KVxuXG4gIGdldCB0b1VzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZXMuZ2V0KCd0b1VzZXInKSBhcyBGb3JtQ29udHJvbFxuICB9XG5cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZXMuZ2V0KCdjb250ZW50JykgYXMgRm9ybUNvbnRyb2xcbiAgfVxuXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLnRvVXNlci52YWxpZFxuICB9XG5cbiAgZGF0YSQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vLmRhdGEkO1xuXG4gIGZyb21NZSA9ICh1c2VyOiBzdHJpbmcsIGZyb21Vc2VyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdXNlciA9PT0gZnJvbVVzZXJcbiAgfVxuXG4gIGNvbW11bmljYXRpb25NZXNzYWdlcyQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vLmNvbW11bmljYXRpb25NZXNzYWdlcyRcbiAgbGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZURlbW8ubGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzJFxuXG4gIGNoYXQkOiBPYnNlcnZhYmxlPHsgdXNlcjogYW55LCBtZXNzYWdlczogYW55W119fGFueT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnVzZXIkLCB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcyRdKVxuICAucGlwZShcbiAgICBtYXAoKFt1c2VyLCBtZXNzYWdlc106IGFueSkgPT4gKHsgdXNlciwgbWVzc2FnZXMgfSkpLFxuICAgIG1hcChvYmogPT4ge1xuXG4gICAgICBpZighb2JqLnVzZXIpIHJldHVybiBFTVBUWVxuXG4gICAgICAvLyBjb25zdCBtYWluVXNlciA9IFVzZXJOYW1lLmFkYXB0KHtcbiAgICAgIC8vICAgICBpZDogb2JqLnVzZXIudXNlcm5hbWUsXG4gICAgICAvLyAgICAgZmlyc3Q6IG9iai51c2VyPy5uYW1lPy5maXJzdCxcbiAgICAgIC8vICAgICBsYXN0OiBvYmoudXNlcj8ubmFtZT8ubGFzdCxcbiAgICAgIC8vIH0pXG5cbiAgICAgIGNvbnN0IG1haW5Vc2VyID0gJydcblxuICAgICAgY29uc3QgbWVzc2FnZXMgPSBvYmoubWVzc2FnZXMubWFwKChpdGVtOiBhbnkpID0+IHtcblxuICAgICAgICBpZihpdGVtLnRvVXNlciA9PT0gJ2FsbENoYW5uZWxzJykge1xuICAgICAgICAgIC8vIGl0ZW0udG9Vc2VyID0gVXNlck5hbWUuYWRhcHQoe1xuICAgICAgICAgIC8vICAgICBpZDogJycsXG4gICAgICAgICAgLy8gICAgIGZpcnN0OiAnQWxsIFVzZXJzJyxcbiAgICAgICAgICAvLyAgICAgbGFzdDogJycsXG4gICAgICAgICAgLy8gfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVybiBNZXNzYWdlLmFkYXB0KHtcbiAgICAgICAgLy8gICAgIGZyb21Vc2VyOiB7XG4gICAgICAgIC8vICAgICAgIGlkOiBpdGVtLmZyb21Vc2VyLnVzZXJuYW1lLFxuICAgICAgICAvLyAgICAgICBmaXJzdDogaXRlbS5mcm9tVXNlcj8ubmFtZT8uZmlyc3QsXG4gICAgICAgIC8vICAgICAgIGxhc3Q6IGl0ZW0uZnJvbVVzZXI/Lm5hbWU/Lmxhc3QsXG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAgdG9Vc2VyOiB7XG4gICAgICAgIC8vICAgICAgIGlkOiBpdGVtLnRvVXNlci51c2VybmFtZSxcbiAgICAgICAgLy8gICAgICAgZmlyc3Q6IGl0ZW0udG9Vc2VyPy5uYW1lPy5maXJzdCxcbiAgICAgICAgLy8gICAgICAgbGFzdDogaXRlbS50b1VzZXI/Lm5hbWU/Lmxhc3QsXG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAgY29udGVudDogaXRlbS5jb250ZW50LFxuICAgICAgICAvLyAgICAgZGF0ZTogaXRlbS5pc3N1ZWQsXG4gICAgICAgIC8vIH0pXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4geyB1c2VyOiBtYWluVXNlciwgbWVzc2FnZXMgfVxuXG4gICAgfSlcbiAgKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vLnVwZGF0ZUNvbm5lY3Rpb24odGhpcy5zZXJ2ZXIsIHRoaXMud3NTZXJ2ZXIsIHRoaXMuand0VG9rZW4pO1xuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZURlbW8uZ2V0RGF0YSgpXG4gIH1cblxuICBvbkdldERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5nZXREYXRhKClcbiAgfVxuXG4gIG9uQWRkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2VEZW1vLmFkZERhdGEoKVxuICB9XG5cbiAgb25VcGRhdGVEYXRhKGRhdGE6IGFueVtdKSB7XG5cbiAgICBjb25zdCBudW0gPSBSYW5kb21OdW1iZXIoMTAwMCwgOTk5OSlcblxuICAgIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgICBcInNwaWZmZVwiOiBgd2F2ZWNvZGVycy5jb20vZGV2ZWxvcGVyLyR7bnVtfWAsXG4gICAgICBcImlkXCI6IDYzLFxuICAgICAgXCJsYXN0X25hbWVcIjogXCJib25pXCIsXG4gICAgICBcImVtYWlsXCI6IFwibWlrZWJvbmlAaG90bWFpbC5jb21cIixcbiAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIm1pa2VcIlxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZURlbW8udXBkYXRlRGF0YShuZXdEYXRhKVxuXG4gIH1cblxuICBvblNlbmRNZXNzYWdlKCkge1xuICAgIHRoaXMubWVzc2FnZXMubWFya0FsbEFzVG91Y2hlZCgpXG4gICAgaWYgKHRoaXMubWVzc2FnZXMuaW52YWxpZCkgcmV0dXJuXG4gICAgY29uc3QgbWVzc2FnZSA9IENoYW5uZWxNZXNzYWdlLmFkYXB0KHRoaXMubWVzc2FnZXMudmFsdWUpXG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5zZW5kTWVzc2FnZShtZXNzYWdlKVxuICAgIHRoaXMuY29udGVudC5yZXNldCgpXG4gIH1cblxuICBvblNlbmRBbGVydCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VzLm1hcmtBbGxBc1RvdWNoZWQoKVxuICAgIGlmICh0aGlzLm1lc3NhZ2VzLmludmFsaWQpIHJldHVyblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBDaGFubmVsTWVzc2FnZS5hZGFwdCh7IC4uLnRoaXMubWVzc2FnZXMudmFsdWUsIHR5cGU6IENvbW11bmljYXRpb25UeXBlLkFMRVJUIH0pXG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5zZW5kTWVzc2FnZShtZXNzYWdlKVxuICAgIHRoaXMuY29udGVudC5yZXNldCgpXG4gIH1cblxuICBvblJlbW92ZURhdGEoZGF0YTogYW55KSB7XG4gICAgY29uc3QgbGFzdFJlYyA9IGRhdGFbZGF0YS5sZW5ndGggLTFdXG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtby5kZWxldGVEYXRhKGxhc3RSZWMpXG4gIH1cblxufVxuIiwiPGRpdiBzdHlsZT1cIm1hcmdpbjogMnJlbTtcIj5cblxuICA8aDIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+SFRUUCBSZXF1ZXN0IFN0YXRlIE1hbmFnZXIgLSBXZWJzb2NrZXRzPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiKGNvbm5lY3Rpb25TdGF0dXMkIHwgYXN5bmMpIGFzIGNvbm5lY3RlZDsgZWxzZSBOT1RfQ09OTkVDVEVEXCI+XG4gICAgICBXUyAtXG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiBncmVlbjtcIj5Db25uZWN0ZWQ8L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxuZy10ZW1wbGF0ZSAjTk9UX0NPTk5FQ1RFRD5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHJlZDtcIj5EaXNjb25uZWN0ZWQge3sgYXR0ZW1wdHMkIHwgYXN5bmMgfX0gLSB7eyBuZXh0UmV0cnkkIHxhc3luYyB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2gyPlxuXG4gIDxkaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKHVzZXIkIHwgYXN5bmMpIGFzIHVzZXJJbmZvXCI+XG4gICAgICA8bWF0LXRvb2xiYXI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4OjFcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCI+e3sgdXNlckluZm8ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXY+KHt7IHVzZXJJbmZvLnVzZXJuYW1lIH19KTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LXRvb2xiYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LXRhYi1ncm91cCBhbmltYXRpb25EdXJhdGlvbj1cIjBtc1wiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gRGF0YSBDb250cm9sXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIihkYXRhJCB8IGFzeW5jKSBhcyBkYXRhXCIgc3R5bGU9XCJtYXJnaW46IDFyZW07IGRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbTsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIodXNlcnMkIHxhc3luYykgYXMgdXNlcnNcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiPlxuICAgICAgICAgICAgICAgIHt7IHVzZXIubmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0RGF0YSgpXCI+R2V0IERhdGE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwiYWNjZW50XCIgKGNsaWNrKT1cIm9uVXBkYXRlRGF0YShkYXRhKVwiPlVwZGF0ZSBEYXRhPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwib25SZW1vdmVEYXRhKGRhdGEpXCI+UmVtb3ZlIERhdGE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJvbkFkZERhdGEoKVwiPkFkZCBEYXRhPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICAgICAgPGRpdj57eyBkYXRhIHwganNvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPGgyPnt7IGRhdGEubGVuZ3RoIH19PC9oMj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gTWVzc2FnaW5nXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIihkYXRhJCB8IGFzeW5jKSBhcyBkYXRhXCIgc3R5bGU9XCJtYXJnaW46IDFyZW07IGRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbTsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIodXNlciQgfCBhc3luYykgYXMgdXNlckluZm9cIj5cblxuICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCIodXNlcnMkIHwgYXN5bmMpIGFzIHVzZXJzXCI+XG5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbVwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MVwiIFtmb3JtR3JvdXBdPVwibWVzc2FnZXNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwiZmxleDoxXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVzZXJzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidG9Vc2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFsbENoYW5uZWxzXCIgI3NlbGVjdGVkVXNlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFVzZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiIFt2YWx1ZV09XCJ1c2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVzZXIudXNlcm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwiZmxleDoxXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlNlbmQgYSBNZXNzYWdlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkV4LiBJdCBtYWtlcyBtZSBmZWVsLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25TZW5kTWVzc2FnZSgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBnYXA6IC41cmVtO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvblNlbmRNZXNzYWdlKClcIiBjb2xvcj1cIndhcm5cIj5cbiAgICAgICAgICAgICAgICAgICAgICBTZW5kIEFsZXJ0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25TZW5kQWxlcnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFNlbmQgTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGNoYXQkIHwgYXN5bmMpIGFzIGNoYXRcIiBzdHlsZT1cImJvcmRlcjogdGhpbiBncmF5IHNvbGlkOyBwYWRkaW5nOiAxcmVtOyBtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGFwcC1tZXNzZW5nZXItY2hhdFxuICAgICAgICAgICAgICAgICAgW3VzZXJdPVwiY2hhdC51c2VyXCJcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlc109XCJjaGF0Lm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgICA+PC9hcHAtbWVzc2VuZ2VyLWNoYXQ+IC0tPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIldTIC0gQ3VzdG9tIENoYW5uZWwgTWVzc2FnaW5nXCIgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgICAgV1MgLSBDdXN0b20gQ2hhbm5lbCBNZXNzYWdpbmdcbiAgICAgIDwvbWF0LXRhYj5cblxuICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbjxkaXYgc3R5bGU9XCJtYXJnaW46IDFyZW07XCI+XG4gIDxoMz5cbiAgICB1c2VyOiB7eyB1c2VyJCB8IGFzeW5jIHwganNvbn19XG4gIDwvaDM+XG5cbiAgPGgzPlxuICAgIHVzZXJzOiB7eyB1c2VycyQgfCBhc3luYyB8IGpzb259fVxuICA8L2gzPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,97 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { UserData } from '../models/user-data.model';
3
+ import { DatabaseStorage, DataType, RetryOptions } from '../../../models';
4
+ import { HTTPManagerStateService, ApiRequest, RequestOptions, RandomNumber } from '../../../services';
5
+ import { OIDCClient } from '../models/oidc-client.model';
6
+ import * as i0 from "@angular/core";
7
+ export class StateRequestServiceDemo extends HTTPManagerStateService {
8
+ constructor() {
9
+ super(ApiRequest.adapt({
10
+ server: 'https://oidc.example.com',
11
+ retry: RetryOptions.adapt({
12
+ times: 3,
13
+ delay: 1,
14
+ }),
15
+ adapter: OIDCClient.adapt,
16
+ ws: {
17
+ id: 'WS-MY_DATA',
18
+ wsChannels: ['allChannels'],
19
+ wsServer: '',
20
+ jwtToken: '',
21
+ access: ['read,write,delete,update'],
22
+ userAdapter: {
23
+ id: 'username', // matches adapter in UserData
24
+ adapter: UserData.adapt,
25
+ },
26
+ retry: RetryOptions.adapt({
27
+ times: 3,
28
+ delay: 10,
29
+ }),
30
+ }
31
+ }), DataType.ARRAY, DatabaseStorage.adapt({
32
+ table: 'ws_demo_data',
33
+ expiresIn: '5mn',
34
+ }));
35
+ this.attempts$ = this.wsRetryAttempts$;
36
+ this.nextRetry$ = this.wsNextRetry$;
37
+ }
38
+ updateConnection(server, wsServer, jwtToken) {
39
+ this.setApiRequestOptions({
40
+ server,
41
+ retry: RetryOptions.adapt({
42
+ times: 3,
43
+ delay: 1,
44
+ }),
45
+ adapter: OIDCClient.adapt,
46
+ ws: {
47
+ id: 'WS-MY_DATA',
48
+ wsServer,
49
+ jwtToken,
50
+ userAdapter: {
51
+ id: 'username', // matches adapter in UserData
52
+ adapter: UserData.adapt,
53
+ },
54
+ retry: RetryOptions.adapt({
55
+ times: 3,
56
+ delay: 10,
57
+ }),
58
+ }
59
+ });
60
+ }
61
+ getData() {
62
+ this.fetchRecords(RequestOptions.adapt({ path: ['ai', 'tests'] }));
63
+ }
64
+ addData() {
65
+ const num = RandomNumber(1000, 9999);
66
+ const newData = {
67
+ "spiffe": `sample.com/developer/${num}`,
68
+ "last_name": "boni",
69
+ "email": "mikeboni@hotmail.com",
70
+ "first_name": "mike"
71
+ };
72
+ this.createRecord(newData, RequestOptions.adapt({ path: ['ai', 'tests'] }));
73
+ }
74
+ sendMessage(data) {
75
+ console.log('sendMessage', data);
76
+ this.wsMessaging(data);
77
+ }
78
+ updateData(data) {
79
+ const sampleOptions = RequestOptions.adapt({ path: ['ai', 'tests', data.id] });
80
+ console.log('updateData', sampleOptions);
81
+ this.updateRecord(data, sampleOptions);
82
+ }
83
+ deleteData(data) {
84
+ const sampleOptions = RequestOptions.adapt({ path: ['ai', 'tests', data.id] });
85
+ console.log('deleteData', sampleOptions);
86
+ this.deleteRecord(sampleOptions);
87
+ }
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestServiceDemo, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
89
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestServiceDemo, providedIn: 'root' }); }
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestServiceDemo, decorators: [{
92
+ type: Injectable,
93
+ args: [{
94
+ providedIn: 'root'
95
+ }]
96
+ }], ctorParameters: () => [] });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtcmVxdWVzdC1kZW1vLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vL3NlcnZpY2VzL3N0YXRlLXJlcXVlc3QtZGVtby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBa0IsTUFBTSxtQkFBbUIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBS3pELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSx1QkFBNEI7SUFLdkU7UUFDRSxLQUFLLENBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNmLE1BQU0sRUFBRSwwQkFBMEI7WUFDbEMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQztZQUNGLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSztZQUN6QixFQUFFLEVBQUU7Z0JBQ0YsRUFBRSxFQUFFLFlBQVk7Z0JBQ2hCLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDM0IsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osUUFBUSxFQUFFLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3BDLFdBQVcsRUFBRTtv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LE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbEMsQ0FBQzsrR0FuR1EsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVXNlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvdXNlci1kYXRhLm1vZGVsJztcbmltcG9ydCB7IERhdGFiYXNlU3RvcmFnZSwgRGF0YVR5cGUsIFJldHJ5T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5cbmltcG9ydCB7IEhUVFBNYW5hZ2VyU3RhdGVTZXJ2aWNlLCBBcGlSZXF1ZXN0LCBSZXF1ZXN0T3B0aW9ucywgUmFuZG9tTnVtYmVyLCBDaGFubmVsTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IE9JRENDbGllbnQgfSBmcm9tICcuLi9tb2RlbHMvb2lkYy1jbGllbnQubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdGF0ZVJlcXVlc3RTZXJ2aWNlRGVtbyBleHRlbmRzIEhUVFBNYW5hZ2VyU3RhdGVTZXJ2aWNlPGFueT4ge1xuXG4gIGF0dGVtcHRzJCA9IHRoaXMud3NSZXRyeUF0dGVtcHRzJFxuICBuZXh0UmV0cnkkID0gdGhpcy53c05leHRSZXRyeSRcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgICAgQXBpUmVxdWVzdC5hZGFwdCh7XG4gICAgICAgICAgc2VydmVyOiAnaHR0cHM6Ly9vaWRjLmV4YW1wbGUuY29tJyxcbiAgICAgICAgICByZXRyeTogUmV0cnlPcHRpb25zLmFkYXB0KHtcbiAgICAgICAgICAgIHRpbWVzOiAzLFxuICAgICAgICAgICAgZGVsYXk6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYWRhcHRlcjogT0lEQ0NsaWVudC5hZGFwdCxcbiAgICAgICAgICB3czoge1xuICAgICAgICAgICAgaWQ6ICdXUy1NWV9EQVRBJyxcbiAgICAgICAgICAgIHdzQ2hhbm5lbHM6IFsnYWxsQ2hhbm5lbHMnXSxcbiAgICAgICAgICAgIHdzU2VydmVyOiAnJyxcbiAgICAgICAgICAgIGp3dFRva2VuOiAnJyxcbiAgICAgICAgICAgIGFjY2VzczogWydyZWFkLHdyaXRlLGRlbGV0ZSx1cGRhdGUnXSxcbiAgICAgICAgICAgIHVzZXJBZGFwdGVyOiB7XG4gICAgICAgICAgICAgIGlkOiAndXNlcm5hbWUnLCAvLyBtYXRjaGVzIGFkYXB0ZXIgaW4gVXNlckRhdGFcbiAgICAgICAgICAgICAgYWRhcHRlcjogVXNlckRhdGEuYWRhcHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmV0cnk6IFJldHJ5T3B0aW9ucy5hZGFwdCh7XG4gICAgICAgICAgICAgIHRpbWVzOiAzLFxuICAgICAgICAgICAgICBkZWxheTogMTAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBEYXRhVHlwZS5BUlJBWSxcbiAgICAgICAgRGF0YWJhc2VTdG9yYWdlLmFkYXB0KHtcbiAgICAgICAgICB0YWJsZTogJ3dzX2RlbW9fZGF0YScsXG4gICAgICAgICAgZXhwaXJlc0luOiAnNW1uJyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgICB1cGRhdGVDb25uZWN0aW9uKHNlcnZlcjogc3RyaW5nLCB3c1NlcnZlcjogc3RyaW5nLCBqd3RUb2tlbjogc3RyaW5nKSB7XG5cbiAgICAgIHRoaXMuc2V0QXBpUmVxdWVzdE9wdGlvbnMoe1xuICAgICAgICAgIHNlcnZlcixcbiAgICAgICAgICByZXRyeTogUmV0cnlPcHRpb25zLmFkYXB0KHtcbiAgICAgICAgICAgIHRpbWVzOiAzLFxuICAgICAgICAgICAgZGVsYXk6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYWRhcHRlcjogT0lEQ0NsaWVudC5hZGFwdCxcbiAgICAgICAgICB3czoge1xuICAgICAgICAgICAgaWQ6ICdXUy1NWV9EQVRBJyxcbiAgICAgICAgICAgIHdzU2VydmVyLFxuICAgICAgICAgICAgand0VG9rZW4sXG4gICAgICAgICAgICB1c2VyQWRhcHRlcjoge1xuICAgICAgICAgICAgICBpZDogJ3VzZXJuYW1lJywgLy8gbWF0Y2hlcyBhZGFwdGVyIGluIFVzZXJEYXRhXG4gICAgICAgICAgICAgIGFkYXB0ZXI6IFVzZXJEYXRhLmFkYXB0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJldHJ5OiBSZXRyeU9wdGlvbnMuYWRhcHQoe1xuICAgICAgICAgICAgICB0aW1lczogMyxcbiAgICAgICAgICAgICAgZGVsYXk6IDEwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgfVxuXG4gICAgZ2V0RGF0YSgpIHtcbiAgICAgIHRoaXMuZmV0Y2hSZWNvcmRzKFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogWydhaScsJ3Rlc3RzJ10gfSkpXG4gICAgfVxuXG4gICAgYWRkRGF0YSgpIHtcblxuICAgICAgY29uc3QgbnVtID0gUmFuZG9tTnVtYmVyKDEwMDAsIDk5OTkpXG5cbiAgICAgIGNvbnN0IG5ld0RhdGEgPSAgICAge1xuICAgICAgICAgIFwic3BpZmZlXCI6IGBzYW1wbGUuY29tL2RldmVsb3Blci8ke251bX1gLFxuICAgICAgICAgIFwibGFzdF9uYW1lXCI6IFwiYm9uaVwiLFxuICAgICAgICAgIFwiZW1haWxcIjogXCJtaWtlYm9uaUBob3RtYWlsLmNvbVwiLFxuICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIm1pa2VcIlxuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZVJlY29yZChuZXdEYXRhLCBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFsnYWknLCd0ZXN0cyddIH0pKVxuXG4gICAgfVxuXG4gICAgc2VuZE1lc3NhZ2UoZGF0YTogQ2hhbm5lbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzZW5kTWVzc2FnZScsIGRhdGEpXG4gICAgICB0aGlzLndzTWVzc2FnaW5nKGRhdGEpXG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShkYXRhOiBhbnkpIHtcbiAgICAgIGNvbnN0IHNhbXBsZU9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFsnYWknLCAndGVzdHMnLCBkYXRhLmlkXSB9KVxuICAgICAgY29uc29sZS5sb2coJ3VwZGF0ZURhdGEnLCBzYW1wbGVPcHRpb25zKVxuICAgICAgdGhpcy51cGRhdGVSZWNvcmQoZGF0YSwgc2FtcGxlT3B0aW9ucylcblxuICAgIH1cblxuICAgIGRlbGV0ZURhdGEoZGF0YTogYW55KSB7XG4gICAgICBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbJ2FpJywgJ3Rlc3RzJywgZGF0YS5pZF0gfSlcbiAgICAgIGNvbnNvbGUubG9nKCdkZWxldGVEYXRhJywgc2FtcGxlT3B0aW9ucylcbiAgICAgIHRoaXMuZGVsZXRlUmVjb3JkKHNhbXBsZU9wdGlvbnMpXG4gICAgfVxuXG59XG4iXX0=