@ngx-pwa/local-storage 15.0.0 → 16.0.0

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 (58) hide show
  1. package/{esm2020 → esm2022}/lib/databases/exceptions.mjs +2 -2
  2. package/esm2022/lib/databases/indexeddb-database.mjs +305 -0
  3. package/esm2022/lib/databases/local-database.mjs +67 -0
  4. package/esm2022/lib/databases/localstorage-database.mjs +158 -0
  5. package/esm2022/lib/databases/memory-database.mjs +84 -0
  6. package/{esm2020 → esm2022}/lib/providers.mjs +3 -3
  7. package/esm2022/lib/storage.module.mjs +40 -0
  8. package/esm2022/lib/storages/local-storage.service.mjs +81 -0
  9. package/esm2022/lib/storages/storage-map.service.mjs +293 -0
  10. package/esm2022/lib/tokens.mjs +59 -0
  11. package/esm2022/lib/validation/json-schema.mjs +5 -0
  12. package/esm2022/lib/validation/json-validator.mjs +244 -0
  13. package/esm2022/public-api.mjs +12 -0
  14. package/{fesm2020 → fesm2022}/ngx-pwa-local-storage.mjs +543 -553
  15. package/fesm2022/ngx-pwa-local-storage.mjs.map +1 -0
  16. package/lib/databases/indexeddb-database.d.ts +2 -2
  17. package/lib/databases/local-database.d.ts +1 -1
  18. package/lib/databases/localstorage-database.d.ts +3 -3
  19. package/lib/databases/memory-database.d.ts +2 -2
  20. package/lib/providers.d.ts +1 -1
  21. package/lib/storage.module.d.ts +2 -2
  22. package/lib/storages/local-storage.service.d.ts +3 -3
  23. package/lib/storages/storage-map.service.d.ts +6 -7
  24. package/lib/tokens.d.ts +1 -1
  25. package/lib/validation/json-schema.d.ts +8 -8
  26. package/lib/validation/json-validator.d.ts +1 -1
  27. package/package.json +10 -16
  28. package/public-api.d.ts +10 -10
  29. package/schematics/collection.json +1 -1
  30. package/schematics/migration.json +1 -1
  31. package/schematics/ng-add/index.d.ts +1 -1
  32. package/schematics/ng-add/index.js +7 -7
  33. package/schematics/ng-add/index.js.map +1 -1
  34. package/schematics/ng-add/schema.json +2 -2
  35. package/schematics/ng-update/index.d.ts +1 -1
  36. package/schematics/ng-update/index.js +3 -3
  37. package/schematics/ng-update/index.js.map +1 -1
  38. package/schematics/utility/config.d.ts +1 -1
  39. package/schematics/utility/config.js +7 -7
  40. package/schematics/utility/module.d.ts +1 -1
  41. package/schematics/utility/module.js +6 -6
  42. package/schematics/utility/module.js.map +1 -1
  43. package/esm2020/lib/databases/indexeddb-database.mjs +0 -304
  44. package/esm2020/lib/databases/local-database.mjs +0 -66
  45. package/esm2020/lib/databases/localstorage-database.mjs +0 -160
  46. package/esm2020/lib/databases/memory-database.mjs +0 -83
  47. package/esm2020/lib/storage.module.mjs +0 -39
  48. package/esm2020/lib/storages/local-storage.service.mjs +0 -80
  49. package/esm2020/lib/storages/storage-map.service.mjs +0 -299
  50. package/esm2020/lib/tokens.mjs +0 -59
  51. package/esm2020/lib/validation/json-schema.mjs +0 -5
  52. package/esm2020/lib/validation/json-validator.mjs +0 -243
  53. package/esm2020/public-api.mjs +0 -12
  54. package/fesm2015/ngx-pwa-local-storage.mjs +0 -1432
  55. package/fesm2015/ngx-pwa-local-storage.mjs.map +0 -1
  56. package/fesm2020/ngx-pwa-local-storage.mjs.map +0 -1
  57. /package/{esm2020 → esm2022}/lib/storages/exceptions.mjs +0 -0
  58. /package/{esm2020 → esm2022}/ngx-pwa-local-storage.mjs +0 -0
@@ -1,299 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { throwError, of, ReplaySubject } from 'rxjs';
3
- import { mergeMap, catchError, tap } from 'rxjs/operators';
4
- import { JSONValidator } from '../validation/json-validator';
5
- import { IndexedDBDatabase } from '../databases/indexeddb-database';
6
- import { LocalStorageDatabase } from '../databases/localstorage-database';
7
- import { MemoryDatabase } from '../databases/memory-database';
8
- import { IDB_BROKEN_ERROR } from '../databases/exceptions';
9
- import { ValidationError } from './exceptions';
10
- import { LS_PREFIX } from '../tokens';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "../databases/local-database";
13
- import * as i2 from "../validation/json-validator";
14
- export class StorageMap {
15
- /**
16
- * Constructor params are provided by Angular (but can also be passed manually in tests)
17
- * @param database Storage to use
18
- * @param jsonValidator Validator service
19
- * @param LSPrefix Prefix for `localStorage` keys to avoid collision for multiple apps on the same subdomain or for interoperability
20
- */
21
- constructor(database, jsonValidator = new JSONValidator(),
22
- // `inject()` cannot be used here, as `StorageMap` needs other manual params
23
- LSPrefix = '') {
24
- this.database = database;
25
- this.jsonValidator = jsonValidator;
26
- this.LSPrefix = LSPrefix;
27
- this.notifiers = new Map();
28
- }
29
- /**
30
- * **Number of items** in storage, wrapped in an `Observable`.
31
- *
32
- * @example
33
- * this.storageMap.size.subscribe((size) => {
34
- * console.log(size);
35
- * });
36
- */
37
- get size() {
38
- return this.database.size
39
- /* Catch if `indexedDb` is broken */
40
- .pipe(this.catchIDBBroken(() => this.database.size));
41
- }
42
- /**
43
- * Tells you which storage engine is used. *Only useful for interoperability.*
44
- * Note that due to some browsers issues in some special contexts
45
- * (Firefox private mode and Safari cross-origin iframes),
46
- * **this information may be wrong at initialization,**
47
- * as the storage could fallback from `indexedDB` to `localStorage`
48
- * only after a first read or write operation.
49
- * @returns Storage engine used
50
- *
51
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
52
- *
53
- * @example
54
- * if (this.storageMap.backingEngine === 'indexedDB') {}
55
- */
56
- get backingEngine() {
57
- if (this.database instanceof IndexedDBDatabase) {
58
- return 'indexedDB';
59
- }
60
- else if (this.database instanceof LocalStorageDatabase) {
61
- return 'localStorage';
62
- }
63
- else if (this.database instanceof MemoryDatabase) {
64
- return 'memory';
65
- }
66
- else {
67
- return 'unknown';
68
- }
69
- }
70
- /**
71
- * Info about `indexedDB` database. *Only useful for interoperability.*
72
- * @returns `indexedDB` database name, store name and database version.
73
- * **Values will be empty if the storage is not `indexedDB`,**
74
- * **so it should be used after an engine check**.
75
- *
76
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
77
- *
78
- * @example
79
- * if (this.storageMap.backingEngine === 'indexedDB') {
80
- * const { database, store, version } = this.storageMap.backingStore;
81
- * }
82
- */
83
- get backingStore() {
84
- return (this.database instanceof IndexedDBDatabase) ?
85
- this.database.backingStore :
86
- { database: '', store: '', version: 0 };
87
- }
88
- /**
89
- * Info about `localStorage` fallback storage. *Only useful for interoperability.*
90
- * @returns `localStorage` prefix.
91
- * **Values will be empty if the storage is not `localStorage`,**
92
- * **so it should be used after an engine check**.
93
- *
94
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
95
- *
96
- * @example
97
- * if (this.storageMap.backingEngine === 'localStorage') {
98
- * const { prefix } = this.storageMap.fallbackBackingStore;
99
- * }
100
- */
101
- get fallbackBackingStore() {
102
- return (this.database instanceof LocalStorageDatabase) ?
103
- { prefix: this.database.prefix } :
104
- { prefix: '' };
105
- }
106
- get(key, schema) {
107
- /* Get the data in storage */
108
- return this.database.get(key).pipe(
109
- /* Check if `indexedDb` is broken */
110
- this.catchIDBBroken(() => this.database.get(key)), mergeMap((data) => {
111
- /* No need to validate if the data is empty */
112
- if ((data === undefined) || (data === null)) {
113
- return of(undefined);
114
- }
115
- else if (schema) {
116
- /* Validate data against a JSON schema if provided */
117
- if (!this.jsonValidator.validate(data, schema)) {
118
- return throwError(() => new ValidationError());
119
- }
120
- /* Data have been checked, so it's OK to cast */
121
- return of(data);
122
- }
123
- /* Cast to unknown as the data wasn't checked */
124
- return of(data);
125
- }));
126
- }
127
- /**
128
- * Set an item in storage.
129
- * Note that setting `null` or `undefined` will remove the item to avoid some browsers issues.
130
- * @param key The item's key
131
- * @param data The item's value
132
- * @param schema Optional JSON schema to validate the data
133
- * @returns A RxJS `Observable` to wait the end of the operation
134
- *
135
- * @example
136
- * this.storageMap.set('key', 'value').subscribe(() => {});
137
- */
138
- set(key, data, schema) {
139
- /* Storing `undefined` or `null` is useless and can cause issues in `indexedDb` in some browsers,
140
- * so removing item instead for all storages to have a consistent API */
141
- if ((data === undefined) || (data === null)) {
142
- return this.delete(key);
143
- }
144
- /* Validate data against a JSON schema if provided */
145
- if (schema && !this.jsonValidator.validate(data, schema)) {
146
- return throwError(() => new ValidationError());
147
- }
148
- return this.database.set(key, data).pipe(
149
- /* Catch if `indexedDb` is broken */
150
- this.catchIDBBroken(() => this.database.set(key, data)),
151
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
152
- tap(() => { this.notify(key, data); }));
153
- }
154
- /**
155
- * Delete an item in storage
156
- * @param key The item's key
157
- * @returns A RxJS `Observable` to wait the end of the operation
158
- *
159
- * @example
160
- * this.storageMap.delete('key').subscribe(() => {});
161
- */
162
- delete(key) {
163
- return this.database.delete(key).pipe(
164
- /* Catch if `indexedDb` is broken */
165
- this.catchIDBBroken(() => this.database.delete(key)),
166
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
167
- tap(() => { this.notify(key, undefined); }));
168
- }
169
- /**
170
- * Delete all items in storage
171
- * @returns A RxJS `Observable` to wait the end of the operation
172
- *
173
- * @example
174
- * this.storageMap.clear().subscribe(() => {});
175
- */
176
- clear() {
177
- return this.database.clear().pipe(
178
- /* Catch if `indexedDb` is broken */
179
- this.catchIDBBroken(() => this.database.clear()),
180
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
181
- tap(() => {
182
- for (const key of this.notifiers.keys()) {
183
- this.notify(key, undefined);
184
- }
185
- }));
186
- }
187
- /**
188
- * Get all keys stored in storage. Note **this is an *iterating* `Observable`**:
189
- * * if there is no key, the `next` callback will not be invoked,
190
- * * if you need to wait the whole operation to end, be sure to act in the `complete` callback,
191
- * as this `Observable` can emit several values and so will invoke the `next` callback several times.
192
- * @returns A list of the keys wrapped in a RxJS `Observable`
193
- *
194
- * @example
195
- * this.storageMap.keys().subscribe({
196
- * next: (key) => { console.log(key); },
197
- * complete: () => { console.log('Done'); },
198
- * });
199
- */
200
- keys() {
201
- return this.database.keys()
202
- /* Catch if `indexedDb` is broken */
203
- .pipe(this.catchIDBBroken(() => this.database.keys()));
204
- }
205
- /**
206
- * Tells if a key exists in storage
207
- * @returns A RxJS `Observable` telling if the key exists
208
- *
209
- * @example
210
- * this.storageMap.has('key').subscribe((hasKey) => {
211
- * if (hasKey) {}
212
- * });
213
- */
214
- has(key) {
215
- return this.database.has(key)
216
- /* Catch if `indexedDb` is broken */
217
- .pipe(this.catchIDBBroken(() => this.database.has(key)));
218
- }
219
- watch(key, schema) {
220
- /* Check if there is already a notifier */
221
- if (!this.notifiers.has(key)) {
222
- this.notifiers.set(key, new ReplaySubject(1));
223
- }
224
- /* Non-null assertion is required because TypeScript doesn't narrow `.has()` yet */
225
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
226
- const notifier = this.notifiers.get(key);
227
- /* Get the current item value */
228
- (schema ? this.get(key, schema) : this.get(key)).subscribe({
229
- next: (result) => notifier.next(result),
230
- error: (error) => notifier.error(error),
231
- });
232
- /* Only the public API of the `Observable` should be returned */
233
- return (schema ?
234
- notifier.asObservable() :
235
- notifier.asObservable());
236
- }
237
- /**
238
- * Notify when a value changes
239
- * @param key The item's key
240
- * @param data The new value
241
- */
242
- notify(key, value) {
243
- const notifier = this.notifiers.get(key);
244
- if (notifier) {
245
- notifier.next(value);
246
- }
247
- }
248
- /**
249
- * RxJS operator to catch if `indexedDB` is broken
250
- * @param operationCallback Callback with the operation to redo
251
- */
252
- catchIDBBroken(operationCallback) {
253
- return catchError((error) => {
254
- /* Check if `indexedDB` is broken based on error message (the specific error class seems to be lost in the process) */
255
- if ((error !== undefined) && (error !== null)
256
- && (typeof error === 'object') && ('message' in error)
257
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
258
- && (error.message === IDB_BROKEN_ERROR)) {
259
- /* When storage is fully disabled in browser (via the "Block all cookies" option),
260
- * just trying to check `localStorage` variable causes a security exception.
261
- * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118
262
- */
263
- try {
264
- if ('getItem' in localStorage) {
265
- /* Fallback to `localStorage` if available */
266
- this.database = new LocalStorageDatabase(this.LSPrefix);
267
- }
268
- else {
269
- /* Fallback to memory storage otherwise */
270
- this.database = new MemoryDatabase();
271
- }
272
- }
273
- catch {
274
- /* Fallback to memory storage otherwise */
275
- this.database = new MemoryDatabase();
276
- }
277
- /* Redo the operation */
278
- return operationCallback();
279
- }
280
- else {
281
- /* Otherwise, rethrow the error */
282
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
283
- return throwError(() => error);
284
- }
285
- });
286
- }
287
- }
288
- StorageMap.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: StorageMap, deps: [{ token: i1.LocalDatabase }, { token: i2.JSONValidator }, { token: LS_PREFIX }], target: i0.ɵɵFactoryTarget.Injectable });
289
- StorageMap.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: StorageMap, providedIn: 'root' });
290
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: StorageMap, decorators: [{
291
- type: Injectable,
292
- args: [{
293
- providedIn: 'root'
294
- }]
295
- }], ctorParameters: function () { return [{ type: i1.LocalDatabase }, { type: i2.JSONValidator }, { type: undefined, decorators: [{
296
- type: Inject,
297
- args: [LS_PREFIX]
298
- }] }]; } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1tYXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wd2EvbG9jYWwtc3RvcmFnZS9zcmMvbGliL3N0b3JhZ2VzL3N0b3JhZ2UtbWFwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFVBQVUsRUFBRSxFQUFFLEVBQW9CLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7OztBQUt0QyxNQUFNLE9BQU8sVUFBVTtJQUlyQjs7Ozs7T0FLRztJQUNILFlBQ1ksUUFBdUIsRUFDdkIsZ0JBQStCLElBQUksYUFBYSxFQUFFO0lBQzVELDRFQUE0RTtJQUN0QyxXQUFXLEVBQUU7UUFIekMsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBcUM7UUFFdEIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQVozQyxjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7SUFhN0Qs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LENBQUMsRUFBRTtnQkFFdkM7OzttQkFHRztnQkFDSCxJQUFJO29CQUVGLElBQUksU0FBUyxJQUFJLFlBQVksRUFBRTt3QkFFN0IsNkNBQTZDO3dCQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUV6RDt5QkFBTTt3QkFFTCwwQ0FBMEM7d0JBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztxQkFFdEM7aUJBRUY7Z0JBQUMsTUFBTTtvQkFFTiwwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztpQkFFdEM7Z0JBRUQsd0JBQXdCO2dCQUN4QixPQUFPLGlCQUFpQixFQUFFLENBQUM7YUFFNUI7aUJBQU07Z0JBRUwsa0NBQWtDO2dCQUNsQywrREFBK0Q7Z0JBQy9ELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBRWhDO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDOzt1R0F0WlUsVUFBVSw0RUFjWCxTQUFTOzJHQWRSLFVBQVUsY0FGVCxNQUFNOzJGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFlSSxNQUFNOzJCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIG9mLCBPcGVyYXRvckZ1bmN0aW9uLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtZXJnZU1hcCwgY2F0Y2hFcnJvciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBKU09OU2NoZW1hLCBKU09OU2NoZW1hQm9vbGVhbiwgSlNPTlNjaGVtYUludGVnZXIsXG4gIEpTT05TY2hlbWFOdW1iZXIsIEpTT05TY2hlbWFTdHJpbmcsIEpTT05TY2hlbWFBcnJheU9mXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgSlNPTlZhbGlkYXRvciB9IGZyb20gJy4uL3ZhbGlkYXRpb24vanNvbi12YWxpZGF0b3InO1xuaW1wb3J0IHsgSW5kZXhlZERCRGF0YWJhc2UgfSBmcm9tICcuLi9kYXRhYmFzZXMvaW5kZXhlZGRiLWRhdGFiYXNlJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZURhdGFiYXNlIH0gZnJvbSAnLi4vZGF0YWJhc2VzL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZSc7XG5pbXBvcnQgeyBNZW1vcnlEYXRhYmFzZSB9IGZyb20gJy4uL2RhdGFiYXNlcy9tZW1vcnktZGF0YWJhc2UnO1xuaW1wb3J0IHsgTG9jYWxEYXRhYmFzZSB9IGZyb20gJy4uL2RhdGFiYXNlcy9sb2NhbC1kYXRhYmFzZSc7XG5pbXBvcnQgeyBJREJfQlJPS0VOX0VSUk9SIH0gZnJvbSAnLi4vZGF0YWJhc2VzL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7IExTX1BSRUZJWCB9IGZyb20gJy4uL3Rva2Vucyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VNYXAge1xuXG4gIHByb3RlY3RlZCBub3RpZmllcnMgPSBuZXcgTWFwPHN0cmluZywgUmVwbGF5U3ViamVjdDx1bmtub3duPj4oKTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgcGFyYW1zIGFyZSBwcm92aWRlZCBieSBBbmd1bGFyIChidXQgY2FuIGFsc28gYmUgcGFzc2VkIG1hbnVhbGx5IGluIHRlc3RzKVxuICAgKiBAcGFyYW0gZGF0YWJhc2UgU3RvcmFnZSB0byB1c2VcbiAgICogQHBhcmFtIGpzb25WYWxpZGF0b3IgVmFsaWRhdG9yIHNlcnZpY2VcbiAgICogQHBhcmFtIExTUHJlZml4IFByZWZpeCBmb3IgYGxvY2FsU3RvcmFnZWAga2V5cyB0byBhdm9pZCBjb2xsaXNpb24gZm9yIG11bHRpcGxlIGFwcHMgb24gdGhlIHNhbWUgc3ViZG9tYWluIG9yIGZvciBpbnRlcm9wZXJhYmlsaXR5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YWJhc2U6IExvY2FsRGF0YWJhc2UsXG4gICAgcHJvdGVjdGVkIGpzb25WYWxpZGF0b3I6IEpTT05WYWxpZGF0b3IgPSBuZXcgSlNPTlZhbGlkYXRvcigpLFxuICAgIC8vIGBpbmplY3QoKWAgY2Fubm90IGJlIHVzZWQgaGVyZSwgYXMgYFN0b3JhZ2VNYXBgIG5lZWRzIG90aGVyIG1hbnVhbCBwYXJhbXNcbiAgICBASW5qZWN0KExTX1BSRUZJWCkgcHJvdGVjdGVkIHJlYWRvbmx5IExTUHJlZml4ID0gJycsXG4gICkge31cblxuICAvKipcbiAgICogKipOdW1iZXIgb2YgaXRlbXMqKiBpbiBzdG9yYWdlLCB3cmFwcGVkIGluIGFuIGBPYnNlcnZhYmxlYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLnNpemUuc3Vic2NyaWJlKChzaXplKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coc2l6ZSk7XG4gICAqIH0pO1xuICAgKi9cbiAgZ2V0IHNpemUoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnNpemVcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLnNpemUpKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRlbGxzIHlvdSB3aGljaCBzdG9yYWdlIGVuZ2luZSBpcyB1c2VkLiAqT25seSB1c2VmdWwgZm9yIGludGVyb3BlcmFiaWxpdHkuKlxuICAgKiBOb3RlIHRoYXQgZHVlIHRvIHNvbWUgYnJvd3NlcnMgaXNzdWVzIGluIHNvbWUgc3BlY2lhbCBjb250ZXh0c1xuICAgKiAoRmlyZWZveCBwcml2YXRlIG1vZGUgYW5kIFNhZmFyaSBjcm9zcy1vcmlnaW4gaWZyYW1lcyksXG4gICAqICoqdGhpcyBpbmZvcm1hdGlvbiBtYXkgYmUgd3JvbmcgYXQgaW5pdGlhbGl6YXRpb24sKipcbiAgICogYXMgdGhlIHN0b3JhZ2UgY291bGQgZmFsbGJhY2sgZnJvbSBgaW5kZXhlZERCYCB0byBgbG9jYWxTdG9yYWdlYFxuICAgKiBvbmx5IGFmdGVyIGEgZmlyc3QgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIFN0b3JhZ2UgZW5naW5lIHVzZWRcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9JTlRFUk9QRVJBQklMSVRZLm1kfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpZiAodGhpcy5zdG9yYWdlTWFwLmJhY2tpbmdFbmdpbmUgPT09ICdpbmRleGVkREInKSB7fVxuICAgKi9cbiAgZ2V0IGJhY2tpbmdFbmdpbmUoKTogJ2luZGV4ZWREQicgfCAnbG9jYWxTdG9yYWdlJyB8ICdtZW1vcnknIHwgJ3Vua25vd24nIHtcblxuICAgIGlmICh0aGlzLmRhdGFiYXNlIGluc3RhbmNlb2YgSW5kZXhlZERCRGF0YWJhc2UpIHtcblxuICAgICAgcmV0dXJuICdpbmRleGVkREInO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGFiYXNlIGluc3RhbmNlb2YgTG9jYWxTdG9yYWdlRGF0YWJhc2UpIHtcblxuICAgICAgcmV0dXJuICdsb2NhbFN0b3JhZ2UnO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGFiYXNlIGluc3RhbmNlb2YgTWVtb3J5RGF0YWJhc2UpIHtcblxuICAgICAgcmV0dXJuICdtZW1vcnknO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgcmV0dXJuICd1bmtub3duJztcblxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm8gYWJvdXQgYGluZGV4ZWREQmAgZGF0YWJhc2UuICpPbmx5IHVzZWZ1bCBmb3IgaW50ZXJvcGVyYWJpbGl0eS4qXG4gICAqIEByZXR1cm5zIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWUsIHN0b3JlIG5hbWUgYW5kIGRhdGFiYXNlIHZlcnNpb24uXG4gICAqICoqVmFsdWVzIHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN0b3JhZ2UgaXMgbm90IGBpbmRleGVkREJgLCoqXG4gICAqICoqc28gaXQgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgYW4gZW5naW5lIGNoZWNrKiouXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvSU5URVJPUEVSQUJJTElUWS5tZH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaWYgKHRoaXMuc3RvcmFnZU1hcC5iYWNraW5nRW5naW5lID09PSAnaW5kZXhlZERCJykge1xuICAgKiAgIGNvbnN0IHsgZGF0YWJhc2UsIHN0b3JlLCB2ZXJzaW9uIH0gPSB0aGlzLnN0b3JhZ2VNYXAuYmFja2luZ1N0b3JlO1xuICAgKiB9XG4gICAqL1xuICBnZXQgYmFja2luZ1N0b3JlKCk6IHsgZGF0YWJhc2U6IHN0cmluZywgc3RvcmU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyIH0ge1xuXG4gICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlIGluc3RhbmNlb2YgSW5kZXhlZERCRGF0YWJhc2UpID9cbiAgICAgIHRoaXMuZGF0YWJhc2UuYmFja2luZ1N0b3JlIDpcbiAgICAgIHsgZGF0YWJhc2U6ICcnLCBzdG9yZTogJycsIHZlcnNpb246IDAgfTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm8gYWJvdXQgYGxvY2FsU3RvcmFnZWAgZmFsbGJhY2sgc3RvcmFnZS4gKk9ubHkgdXNlZnVsIGZvciBpbnRlcm9wZXJhYmlsaXR5LipcbiAgICogQHJldHVybnMgYGxvY2FsU3RvcmFnZWAgcHJlZml4LlxuICAgKiAqKlZhbHVlcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBzdG9yYWdlIGlzIG5vdCBgbG9jYWxTdG9yYWdlYCwqKlxuICAgKiAqKnNvIGl0IHNob3VsZCBiZSB1c2VkIGFmdGVyIGFuIGVuZ2luZSBjaGVjayoqLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL0lOVEVST1BFUkFCSUxJVFkubWR9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGlmICh0aGlzLnN0b3JhZ2VNYXAuYmFja2luZ0VuZ2luZSA9PT0gJ2xvY2FsU3RvcmFnZScpIHtcbiAgICogICBjb25zdCB7IHByZWZpeCB9ID0gdGhpcy5zdG9yYWdlTWFwLmZhbGxiYWNrQmFja2luZ1N0b3JlO1xuICAgKiB9XG4gICAqL1xuICBnZXQgZmFsbGJhY2tCYWNraW5nU3RvcmUoKTogeyBwcmVmaXg6IHN0cmluZyB9IHtcblxuICAgIHJldHVybiAodGhpcy5kYXRhYmFzZSBpbnN0YW5jZW9mIExvY2FsU3RvcmFnZURhdGFiYXNlKSA/XG4gICAgICB7IHByZWZpeDogdGhpcy5kYXRhYmFzZS5wcmVmaXggfSA6XG4gICAgICB7IHByZWZpeDogJycgfTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpdGVtIHZhbHVlIGluIHN0b3JhZ2UuXG4gICAqIFRoZSBzaWduYXR1cmUgaGFzIG1hbnkgb3ZlcmxvYWRzIGR1ZSB0byB2YWxpZGF0aW9uLCAqKnBsZWFzZSByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbi4qKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL1ZBTElEQVRJT04ubWR9XG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHBhcmFtIHNjaGVtYSBPcHRpb25hbCBKU09OIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGUgZGF0YVxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSdzIHZhbHVlIGlmIHRoZSBrZXkgZXhpc3RzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UsIHdyYXBwZWQgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuZ2V0KCdrZXknLCB7IHR5cGU6ICdzdHJpbmcnIH0pLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAqICAgcmVzdWx0OyAvLyBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmZhY2UgVXNlciB7XG4gICAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAqICAgbGFzdE5hbWU/OiBzdHJpbmc7XG4gICAqIH1cbiAgICpcbiAgICogY29uc3Qgc2NoZW1hID0ge1xuICAgKiAgIHR5cGU6ICdvYmplY3QnLFxuICAgKiAgIHByb3BlcnRpZXM6IHtcbiAgICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgKiAgICAgbGFzdE5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICogICB9LFxuICAgKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddXG4gICAqIH07XG4gICAqXG4gICAqIHRoaXMuc3RvcmFnZU1hcC5nZXQ8VXNlcj4oJ3VzZXInLCBzY2hlbWEpLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgKiAgIGlmICh1c2VyKSB7XG4gICAqICAgICB1c2VyLmZpcnN0TmFtZTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgZ2V0KGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPjtcbiAgZ2V0PFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFTdHJpbmcpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICBnZXQ8VCBleHRlbmRzIG51bWJlciA9IG51bWJlcj4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyBib29sZWFuID0gYm9vbGVhbj4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUJvb2xlYW4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICBnZXQ8VCBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdID0gc3RyaW5nW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFTdHJpbmc+KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyByZWFkb25seSBudW1iZXJbXSA9IG51bWJlcltdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hSW50ZWdlciB8IEpTT05TY2hlbWFOdW1iZXI+KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG4gIGdldDxUIGV4dGVuZHMgcmVhZG9ubHkgYm9vbGVhbltdID0gYm9vbGVhbltdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hQm9vbGVhbj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICBnZXQ8VD4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGdldDxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcsIHNjaGVtYT86IEpTT05TY2hlbWEpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcblxuICAgIC8qIEdldCB0aGUgZGF0YSBpbiBzdG9yYWdlICovXG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGtleSkucGlwZShcbiAgICAgIC8qIENoZWNrIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLmdldChrZXkpKSxcbiAgICAgIG1lcmdlTWFwKChkYXRhKSA9PiB7XG5cbiAgICAgICAgLyogTm8gbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGUgZGF0YSBpcyBlbXB0eSAqL1xuICAgICAgICBpZiAoKGRhdGEgPT09IHVuZGVmaW5lZCkgfHwgKGRhdGEgPT09IG51bGwpKSB7XG5cbiAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYSkge1xuXG4gICAgICAgICAgLyogVmFsaWRhdGUgZGF0YSBhZ2FpbnN0IGEgSlNPTiBzY2hlbWEgaWYgcHJvdmlkZWQgKi9cbiAgICAgICAgICBpZiAoIXRoaXMuanNvblZhbGlkYXRvci52YWxpZGF0ZShkYXRhLCBzY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIERhdGEgaGF2ZSBiZWVuIGNoZWNrZWQsIHNvIGl0J3MgT0sgdG8gY2FzdCAqL1xuICAgICAgICAgIHJldHVybiBvZihkYXRhIGFzIFQgfCB1bmRlZmluZWQpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBDYXN0IHRvIHVua25vd24gYXMgdGhlIGRhdGEgd2Fzbid0IGNoZWNrZWQgKi9cbiAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuXG4gICAgICB9KSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGl0ZW0gaW4gc3RvcmFnZS5cbiAgICogTm90ZSB0aGF0IHNldHRpbmcgYG51bGxgIG9yIGB1bmRlZmluZWRgIHdpbGwgcmVtb3ZlIHRoZSBpdGVtIHRvIGF2b2lkIHNvbWUgYnJvd3NlcnMgaXNzdWVzLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBkYXRhIFRoZSBpdGVtJ3MgdmFsdWVcbiAgICogQHBhcmFtIHNjaGVtYSBPcHRpb25hbCBKU09OIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGUgZGF0YVxuICAgKiBAcmV0dXJucyBBIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMuc3RvcmFnZU1hcC5zZXQoJ2tleScsICd2YWx1ZScpLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAqL1xuICBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IHVua25vd24sIHNjaGVtYT86IEpTT05TY2hlbWEpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD4ge1xuXG4gICAgLyogU3RvcmluZyBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXMgdXNlbGVzcyBhbmQgY2FuIGNhdXNlIGlzc3VlcyBpbiBgaW5kZXhlZERiYCBpbiBzb21lIGJyb3dzZXJzLFxuICAgICAqIHNvIHJlbW92aW5nIGl0ZW0gaW5zdGVhZCBmb3IgYWxsIHN0b3JhZ2VzIHRvIGhhdmUgYSBjb25zaXN0ZW50IEFQSSAqL1xuICAgIGlmICgoZGF0YSA9PT0gdW5kZWZpbmVkKSB8fCAoZGF0YSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIC8qIFZhbGlkYXRlIGRhdGEgYWdhaW5zdCBhIEpTT04gc2NoZW1hIGlmIHByb3ZpZGVkICovXG4gICAgaWYgKHNjaGVtYSAmJiAhdGhpcy5qc29uVmFsaWRhdG9yLnZhbGlkYXRlKGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2Uuc2V0KGtleSwgZGF0YSkucGlwZShcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLnNldChrZXksIGRhdGEpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4geyB0aGlzLm5vdGlmeShrZXksIGRhdGEpOyB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBpdGVtIGluIHN0b3JhZ2VcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcmV0dXJucyBBIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMuc3RvcmFnZU1hcC5kZWxldGUoJ2tleScpLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZGVsZXRlKGtleSkucGlwZShcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLmRlbGV0ZShrZXkpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4geyB0aGlzLm5vdGlmeShrZXksIHVuZGVmaW5lZCk7IH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGl0ZW1zIGluIHN0b3JhZ2VcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0byB3YWl0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuY2xlYXIoKS5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICAgKi9cbiAgY2xlYXIoKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+IHtcblxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmNsZWFyKCkucGlwZShcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLmNsZWFyKCkpLFxuICAgICAgLyogTm90aWZ5IHdhdGNoZXJzIChtdXN0IGJlIGxhc3QgYmVjYXVzZSBpdCBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcykgKi9cbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubm90aWZpZXJzLmtleXMoKSkge1xuICAgICAgICAgIHRoaXMubm90aWZ5KGtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBzdG9yZWQgaW4gc3RvcmFnZS4gTm90ZSAqKnRoaXMgaXMgYW4gKml0ZXJhdGluZyogYE9ic2VydmFibGVgKio6XG4gICAqICogaWYgdGhlcmUgaXMgbm8ga2V5LCB0aGUgYG5leHRgIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQsXG4gICAqICogaWYgeW91IG5lZWQgdG8gd2FpdCB0aGUgd2hvbGUgb3BlcmF0aW9uIHRvIGVuZCwgYmUgc3VyZSB0byBhY3QgaW4gdGhlIGBjb21wbGV0ZWAgY2FsbGJhY2ssXG4gICAqIGFzIHRoaXMgYE9ic2VydmFibGVgIGNhbiBlbWl0IHNldmVyYWwgdmFsdWVzIGFuZCBzbyB3aWxsIGludm9rZSB0aGUgYG5leHRgIGNhbGxiYWNrIHNldmVyYWwgdGltZXMuXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiB0aGUga2V5cyB3cmFwcGVkIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmtleXMoKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChrZXkpID0+IHsgY29uc29sZS5sb2coa2V5KTsgfSxcbiAgICogICBjb21wbGV0ZTogKCkgPT4geyBjb25zb2xlLmxvZygnRG9uZScpOyB9LFxuICAgKiB9KTtcbiAgICovXG4gIGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmtleXMoKVxuICAgICAgLyogQ2F0Y2ggaWYgYGluZGV4ZWREYmAgaXMgYnJva2VuICovXG4gICAgICAucGlwZSh0aGlzLmNhdGNoSURCQnJva2VuKCgpID0+IHRoaXMuZGF0YWJhc2Uua2V5cygpKSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyBpZiBhIGtleSBleGlzdHMgaW4gc3RvcmFnZVxuICAgKiBAcmV0dXJucyBBIFJ4SlMgYE9ic2VydmFibGVgIHRlbGxpbmcgaWYgdGhlIGtleSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmhhcygna2V5Jykuc3Vic2NyaWJlKChoYXNLZXkpID0+IHtcbiAgICogICBpZiAoaGFzS2V5KSB7fVxuICAgKiB9KTtcbiAgICovXG4gIGhhcyhrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuaGFzKGtleSlcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy5jYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLmRhdGFiYXNlLmhhcyhrZXkpKSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBhbiBpdGVtIHZhbHVlIGluIHN0b3JhZ2UuXG4gICAqICoqTm90ZSBvbmx5IGNoYW5nZXMgZG9uZSB2aWEgdGhpcyBsaWIgd2lsbCBiZSB3YXRjaGVkKiosIGV4dGVybmFsIGNoYW5nZXMgaW4gc3RvcmFnZSBjYW4ndCBiZSBkZXRlY3RlZC5cbiAgICogVGhlIHNpZ25hdHVyZSBoYXMgbWFueSBvdmVybG9hZHMgZHVlIHRvIHZhbGlkYXRpb24sICoqcGxlYXNlIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uLioqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXkgdG8gd2F0Y2hcbiAgICogQHBhcmFtIHNjaGVtYSBPcHRpb25hbCBKU09OIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGUgaW5pdGlhbCB2YWx1ZVxuICAgKiBAcmV0dXJucyBBbiBpbmZpbml0ZSBgT2JzZXJ2YWJsZWAgZ2l2aW5nIHRoZSBjdXJyZW50IHZhbHVlXG4gICAqL1xuICB3YXRjaChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj47XG4gIHdhdGNoPFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFTdHJpbmcpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICB3YXRjaDxUIGV4dGVuZHMgbnVtYmVyID0gbnVtYmVyPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hSW50ZWdlciB8IEpTT05TY2hlbWFOdW1iZXIpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICB3YXRjaDxUIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdID0gc3RyaW5nW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFTdHJpbmc+KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIHJlYWRvbmx5IG51bWJlcltdID0gbnVtYmVyW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgd2F0Y2g8VCBleHRlbmRzIHJlYWRvbmx5IGJvb2xlYW5bXSA9IGJvb2xlYW5bXT4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUJvb2xlYW4+KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VD4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIHdhdGNoPFQgPSB1bmtub3duPihrZXk6IHN0cmluZywgc2NoZW1hPzogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIG5vdGlmaWVyICovXG4gICAgaWYgKCF0aGlzLm5vdGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5ub3RpZmllcnMuc2V0KGtleSwgbmV3IFJlcGxheVN1YmplY3QoMSkpO1xuICAgIH1cblxuICAgIC8qIE5vbi1udWxsIGFzc2VydGlvbiBpcyByZXF1aXJlZCBiZWNhdXNlIFR5cGVTY3JpcHQgZG9lc24ndCBuYXJyb3cgYC5oYXMoKWAgeWV0ICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICBjb25zdCBub3RpZmllciA9IHRoaXMubm90aWZpZXJzLmdldChrZXkpITtcblxuICAgIC8qIEdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlICovXG4gICAgKHNjaGVtYSA/IHRoaXMuZ2V0PFQ+KGtleSwgc2NoZW1hKSA6IHRoaXMuZ2V0KGtleSkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzdWx0KSA9PiBub3RpZmllci5uZXh0KHJlc3VsdCksXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiBub3RpZmllci5lcnJvcihlcnJvciksXG4gICAgfSk7XG5cbiAgICAvKiBPbmx5IHRoZSBwdWJsaWMgQVBJIG9mIHRoZSBgT2JzZXJ2YWJsZWAgc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgcmV0dXJuIChzY2hlbWEgP1xuICAgICAgbm90aWZpZXIuYXNPYnNlcnZhYmxlKCkgYXMgT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiA6XG4gICAgICBub3RpZmllci5hc09ic2VydmFibGUoKVxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgd2hlbiBhIHZhbHVlIGNoYW5nZXNcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgbmV3IHZhbHVlXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm90aWZpZXIgPSB0aGlzLm5vdGlmaWVycy5nZXQoa2V5KTtcblxuICAgIGlmIChub3RpZmllcikge1xuICAgICAgbm90aWZpZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogUnhKUyBvcGVyYXRvciB0byBjYXRjaCBpZiBgaW5kZXhlZERCYCBpcyBicm9rZW5cbiAgICogQHBhcmFtIG9wZXJhdGlvbkNhbGxiYWNrIENhbGxiYWNrIHdpdGggdGhlIG9wZXJhdGlvbiB0byByZWRvXG4gICAqL1xuICBwcm90ZWN0ZWQgY2F0Y2hJREJCcm9rZW48VD4ob3BlcmF0aW9uQ2FsbGJhY2s6ICgpID0+IE9ic2VydmFibGU8VD4pOiBPcGVyYXRvckZ1bmN0aW9uPFQsIFQ+IHtcblxuICAgIHJldHVybiBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuXG4gICAgICAvKiBDaGVjayBpZiBgaW5kZXhlZERCYCBpcyBicm9rZW4gYmFzZWQgb24gZXJyb3IgbWVzc2FnZSAodGhlIHNwZWNpZmljIGVycm9yIGNsYXNzIHNlZW1zIHRvIGJlIGxvc3QgaW4gdGhlIHByb2Nlc3MpICovXG4gICAgICBpZiAoKGVycm9yICE9PSB1bmRlZmluZWQpICYmIChlcnJvciAhPT0gbnVsbClcbiAgICAgICYmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSAmJiAoJ21lc3NhZ2UnIGluIGVycm9yKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgJiYgKGVycm9yLm1lc3NhZ2UgPT09IElEQl9CUk9LRU5fRVJST1IpKSB7XG5cbiAgICAgICAgLyogV2hlbiBzdG9yYWdlIGlzIGZ1bGx5IGRpc2FibGVkIGluIGJyb3dzZXIgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbiksXG4gICAgICAgICAqIGp1c3QgdHJ5aW5nIHRvIGNoZWNrIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIGNhdXNlcyBhIHNlY3VyaXR5IGV4Y2VwdGlvbi5cbiAgICAgICAgICogUHJldmVudHMgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvMTE4XG4gICAgICAgICAqL1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgaWYgKCdnZXRJdGVtJyBpbiBsb2NhbFN0b3JhZ2UpIHtcblxuICAgICAgICAgICAgLyogRmFsbGJhY2sgdG8gYGxvY2FsU3RvcmFnZWAgaWYgYXZhaWxhYmxlICovXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKHRoaXMuTFNQcmVmaXgpO1xuXG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLyogRmFsbGJhY2sgdG8gbWVtb3J5IHN0b3JhZ2Ugb3RoZXJ3aXNlICovXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IE1lbW9yeURhdGFiYXNlKCk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvKiBGYWxsYmFjayB0byBtZW1vcnkgc3RvcmFnZSBvdGhlcndpc2UgKi9cbiAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IE1lbW9yeURhdGFiYXNlKCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFJlZG8gdGhlIG9wZXJhdGlvbiAqL1xuICAgICAgICByZXR1cm4gb3BlcmF0aW9uQ2FsbGJhY2soKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICAvKiBPdGhlcndpc2UsIHJldGhyb3cgdGhlIGVycm9yICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG5cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gIH1cblxufVxuIl19
@@ -1,59 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * Token to provide a prefix to `localStorage` keys.
4
- */
5
- export const LS_PREFIX = new InjectionToken('localStoragePrefix', {
6
- providedIn: 'root',
7
- factory: () => ''
8
- });
9
- /**
10
- * Default name used for `indexedDB` database.
11
- */
12
- export const DEFAULT_IDB_DB_NAME = 'ngStorage';
13
- /**
14
- * Token to provide `indexedDB` database name.
15
- */
16
- export const IDB_DB_NAME = new InjectionToken('localStorageIDBDBName', {
17
- providedIn: 'root',
18
- factory: () => DEFAULT_IDB_DB_NAME
19
- });
20
- /**
21
- * Default version used for `indexedDB` database.
22
- */
23
- export const DEFAULT_IDB_DB_VERSION = 1;
24
- /**
25
- * Token to provide `indexedDB` database version.
26
- * Must be an unsigned **integer**.
27
- */
28
- export const IDB_DB_VERSION = new InjectionToken('localStorageIDBDBVersion', {
29
- providedIn: 'root',
30
- factory: () => DEFAULT_IDB_DB_VERSION
31
- });
32
- /**
33
- * Default name used for `indexedDB` object store.
34
- */
35
- export const DEFAULT_IDB_STORE_NAME = 'localStorage';
36
- /**
37
- * Token to provide `indexedDB` store name.
38
- * For backward compatibility, the default can't be set now, `IndexedDBDatabase` will do it at runtime.
39
- */
40
- export const IDB_STORE_NAME = new InjectionToken('localStorageIDBStoreName', {
41
- providedIn: 'root',
42
- factory: () => DEFAULT_IDB_STORE_NAME
43
- });
44
- /**
45
- * Default value for interoperability with native `indexedDB` and other storage libs,
46
- * by changing how values are stored in `indexedDB` database.
47
- */
48
- export const DEFAULT_IDB_NO_WRAP = true;
49
- /**
50
- * Token to allow interoperability with native `indexedDB` and other storage libs,
51
- * by changing how values are stored in `indexedDB` database.
52
- * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.
53
- * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.
54
- */
55
- export const IDB_NO_WRAP = new InjectionToken('localStorageIDBWrap', {
56
- providedIn: 'root',
57
- factory: () => DEFAULT_IDB_NO_WRAP
58
- });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVMsb0JBQW9CLEVBQUU7SUFDeEUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Q0FDbEIsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVMsdUJBQXVCLEVBQUU7SUFDN0UsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFeEM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVUscUJBQXFCLEVBQUU7SUFDNUUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRva2VuIHRvIHByb3ZpZGUgYSBwcmVmaXggdG8gYGxvY2FsU3RvcmFnZWAga2V5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IExTX1BSRUZJWCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdsb2NhbFN0b3JhZ2VQcmVmaXgnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gJydcbn0pO1xuXG4vKipcbiAqIERlZmF1bHQgbmFtZSB1c2VkIGZvciBgaW5kZXhlZERCYCBkYXRhYmFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURCX0RCX05BTUUgPSAnbmdTdG9yYWdlJztcblxuLyoqXG4gKiBUb2tlbiB0byBwcm92aWRlIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWUuXG4gKi9cbmV4cG9ydCBjb25zdCBJREJfREJfTkFNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdsb2NhbFN0b3JhZ2VJREJEQk5hbWUnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gREVGQVVMVF9JREJfREJfTkFNRVxufSk7XG5cbi8qKlxuICogRGVmYXVsdCB2ZXJzaW9uIHVzZWQgZm9yIGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfREJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBgaW5kZXhlZERCYCBkYXRhYmFzZSB2ZXJzaW9uLlxuICogTXVzdCBiZSBhbiB1bnNpZ25lZCAqKmludGVnZXIqKi5cbiAqL1xuZXhwb3J0IGNvbnN0IElEQl9EQl9WRVJTSU9OID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oJ2xvY2FsU3RvcmFnZUlEQkRCVmVyc2lvbicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9EQl9WRVJTSU9OXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IG5hbWUgdXNlZCBmb3IgYGluZGV4ZWREQmAgb2JqZWN0IHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfU1RPUkVfTkFNRSA9ICdsb2NhbFN0b3JhZ2UnO1xuXG4vKipcbiAqIFRva2VuIHRvIHByb3ZpZGUgYGluZGV4ZWREQmAgc3RvcmUgbmFtZS5cbiAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgZGVmYXVsdCBjYW4ndCBiZSBzZXQgbm93LCBgSW5kZXhlZERCRGF0YWJhc2VgIHdpbGwgZG8gaXQgYXQgcnVudGltZS5cbiAqL1xuZXhwb3J0IGNvbnN0IElEQl9TVE9SRV9OQU1FID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ2xvY2FsU3RvcmFnZUlEQlN0b3JlTmFtZScsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9TVE9SRV9OQU1FXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IHZhbHVlIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lEQl9OT19XUkFQID0gdHJ1ZTtcblxuLyoqXG4gKiBUb2tlbiB0byBhbGxvdyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKiBEZWZhdWx0cyB0byBgdHJ1ZWAuIENoYW5nZSB0byBgZmFsc2VgIGZvciBiYWNrd2FyZCBjb21wYXRpYmxpdHkgaW4gZXhpc3RpbmcgYXBwbGljYXRpb25zLlxuICogKipETyBOT1QgQ0hBTkdFIFRISVMgQkVIQVZJT1IgT05DRSBJTiBQUk9EVUNUSU9OKiosIGFzIGl0IHdvdWxkIGJyZWFrIHdpdGggZXhpc3RpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IElEQl9OT19XUkFQID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KCdsb2NhbFN0b3JhZ2VJREJXcmFwJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IERFRkFVTFRfSURCX05PX1dSQVBcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VDb25maWcge1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHByb3ZpZGVMb2NhbFN0b3JhZ2VQcmVmaXgoKWAgbWV0aG9kIGluc3RlYWRcbiAgICovXG4gIExTUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHByb3ZpZGVJbmRleGVkREJEYXRhQmFzZU5hbWUoKWAgbWV0aG9kIGluc3RlYWRcbiAgICovXG4gIElEQkRCTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlSW5kZXhlZERCU3RvcmVOYW1lKClgIG1ldGhvZCBpbnN0ZWFkXG4gICAqL1xuICBJREJTdG9yZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgcHJvdmlkZUluZGV4ZWREQkRhdGFCYXNlVmVyc2lvbigpYCBtZXRob2QgaW5zdGVhZFxuICAgKi9cbiAgSURCREJWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG5hdGl2ZSBgaW5kZXhlZERCYCBhbmQgb3RoZXIgc3RvcmFnZSBsaWJzLFxuICAgKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC4gQ2hhbmdlIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuXG4gICAqICoqRE8gTk9UIENIQU5HRSBUSElTIEJFSEFWSU9SIE9OQ0UgSU4gUFJPRFVDVElPTioqLCBhcyBpdCB3b3VsZCBicmVhayB3aXRoIGV4aXN0aW5nIGRhdGEuXG4gICAqL1xuICBJREJOb1dyYXA/OiBib29sZWFuO1xuXG59XG4iXX0=
@@ -1,5 +0,0 @@
1
- /* All schemas interfaces must have a required and different `type`,
2
- * to create a TypeScript discriminant union type.
3
- * Avoid https://github.com/cyrilletuzi/angular-async-local-storage/issues/64 */
4
- export {};
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztnRkFFZ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBbGwgc2NoZW1hcyBpbnRlcmZhY2VzIG11c3QgaGF2ZSBhIHJlcXVpcmVkIGFuZCBkaWZmZXJlbnQgYHR5cGVgLFxuICogdG8gY3JlYXRlIGEgVHlwZVNjcmlwdCBkaXNjcmltaW5hbnQgdW5pb24gdHlwZS5cbiAqIEF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzY0ICovXG5cbi8qKlxuICogSlNPTiBTY2hlbWEgdG8gZGVzY3JpYmUgYSBib29sZWFuIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFCb29sZWFuIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogJ2Jvb2xlYW4nO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBib29sZWFuO1xuXG59XG5cbi8qKlxuICogSlNPTiBTY2hlbWEgdG8gZGVzY3JpYmUgYSBudW1iZXIgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTlNjaGVtYU51bWJlciB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGEgbnVtZXJpYyB2YWx1ZS5cbiAgICovXG4gIHR5cGU6ICdudW1iZXInO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgYSBtdWx0aXBsZSBvZiB4LlxuICAgKiBNdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLlxuICAgKi9cbiAgbXVsdGlwbGVPZj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBtYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoaXMgbWF4aW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1heGltdW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1pbmltdW0uXG4gICAqL1xuICBtaW5pbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgZXhjbHVzaXZlTWluaW11bT86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGFuIGludGVnZXIgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTlNjaGVtYUludGVnZXIge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhbiBpbnRlZ2VyIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogJ2ludGVnZXInO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgYSBtdWx0aXBsZSBvZiB4LlxuICAgKiBNdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLlxuICAgKi9cbiAgbXVsdGlwbGVPZj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBtYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoaXMgbWF4aW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1heGltdW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1pbmltdW0uXG4gICAqL1xuICBtaW5pbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgZXhjbHVzaXZlTWluaW11bT86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFTdHJpbmcge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhIHN0cmluZyB2YWx1ZS5cbiAgICovXG4gIHR5cGU6ICdzdHJpbmcnO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWF4aXVtIGxlbmd0aCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1heExlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWluaW11bSBsZW5ndGggZm9yIGEgc3RyaW5nLlxuICAgKiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gICAqL1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIGEgc3RyaW5nLlxuICAgKiBNdXN0IGJlIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLCAqd2l0aG91dCogdGhlIGAvYCBkZWxpbWl0ZXJzLlxuICAgKi9cbiAgcGF0dGVybj86IHN0cmluZztcblxufVxuXG4vKipcbiAqIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hQXJyYXkge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhbiBhcnJheSBvZiB2YWx1ZXMuXG4gICAqL1xuICB0eXBlOiAnYXJyYXknO1xuXG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXksIG9yIGFycmF5IG9mIHNjaGVtYXMgZm9yIGEgdHVwbGUuXG4gICAqL1xuICBpdGVtczogSlNPTlNjaGVtYSB8IHJlYWRvbmx5IEpTT05TY2hlbWFbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgbGVuZ3RoIGlzIGxvd2VyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1heEl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIHZhbHVlLlxuICAgKiBNdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIuXG4gICAqL1xuICBtaW5JdGVtcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgb25seSBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAqL1xuICB1bmlxdWVJdGVtcz86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhbiBhcnJheSBvZiBwcmltaXRpdmUgdmFsdWVzOlxuICogLSBhcnJheSBvZiBib29sZWFuczogYEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFCb29sZWFuPmAsXG4gKiAtIGFycmF5IG9mIG51bWJlcnM6IGBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hTnVtYmVyPmAsXG4gKiAtIGFycmF5IG9mIGludGVnZXJzOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUludGVnZXI+YCxcbiAqIC0gYXJyYXkgb2Ygc3RyaW5nczogYEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFTdHJpbmc+YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hQXJyYXlPZjxUIGV4dGVuZHMgSlNPTlNjaGVtYUJvb2xlYW4gfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hU3RyaW5nPiB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6ICdhcnJheSc7XG5cbiAgLyoqXG4gICAqIFNjaGVtYSBmb3IgdGhlIHZhbHVlcyBvZiBhbiBhcnJheS5cbiAgICovXG4gIGl0ZW1zOiBUO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIGFuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hT2JqZWN0IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gb2JqZWN0LlxuICAgKi9cbiAgdHlwZTogJ29iamVjdCc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGFuZCB0aGVpciBhc3NvY2lhdGVkIEpTT04gc2NoZW1hcy5cbiAgICovXG4gIHByb3BlcnRpZXM6IHtcbiAgICBbazogc3RyaW5nXTogSlNPTlNjaGVtYTtcbiAgfTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgbmFtZXMgb2YgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgZm9yIGFuIG9iamVjdC5cbiAgICogUHJvcGVydGllcyBzZXQgYXMgcmVxdWlyZWQgc2hvdWxkIGJlIHByZXNlbnQgaW4gYHByb3BlcnRpZXNgIHRvby5cbiAgICovXG4gIHJlcXVpcmVkPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbn1cblxuLyoqXG4gKiBTdWJzZXQgb2YgdGhlIEpTT04gU2NoZW1hIHN0YW5kYXJkLlxuICogVHlwZXMgYXJlIGVuZm9yY2VkIHRvIHZhbGlkYXRlIGV2ZXJ5dGhpbmc6IGVhY2ggdmFsdWUgKiptdXN0KiogaGF2ZSBhIGB0eXBlYC5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvVkFMSURBVElPTi5tZH1cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hOiBKU09OU2NoZW1hID0geyB0eXBlOiAnc3RyaW5nJyB9O1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzY2hlbWE6IEpTT05TY2hlbWEgPSB7IHR5cGU6ICdudW1iZXInIH07XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYTogSlNPTlNjaGVtYSA9IHsgdHlwZTogJ2ludGVnZXInIH07XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYTogSlNPTlNjaGVtYSA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYTogSlNPTlNjaGVtYSA9IHtcbiAqICAgdHlwZTogJ2FycmF5JyxcbiAqICAgaXRlbXM6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAqIH07XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYTogSlNPTlNjaGVtYSA9IHtcbiAqICAgdHlwZTogJ29iamVjdCcsXG4gKiAgIHByb3BlcnRpZXM6IHtcbiAqICAgICBmaXJzdE5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAqICAgICBsYXN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogICB9LFxuICogICByZXF1aXJlZDogWydmaXJzdE5hbWUnXSxcbiAqIH07XG4gKi9cbmV4cG9ydCB0eXBlIEpTT05TY2hlbWEgPSBKU09OU2NoZW1hU3RyaW5nIHwgSlNPTlNjaGVtYU51bWJlciB8IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYUJvb2xlYW4gfCBKU09OU2NoZW1hQXJyYXkgfCBKU09OU2NoZW1hT2JqZWN0O1xuIl19