@po-ui/ng-storage 5.22.3 → 6.2.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 (39) hide show
  1. package/README.md +16 -16
  2. package/{esm2015/lib/drivers/lokijs/po-loki-driver.js → esm2020/lib/drivers/lokijs/po-loki-driver.mjs} +209 -209
  3. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +3 -3
  4. package/esm2020/lib/po-storage.module.mjs +33 -0
  5. package/esm2020/lib/services/po-storage-config.interface.mjs +11 -0
  6. package/esm2020/lib/services/po-storage.service.mjs +520 -0
  7. package/esm2020/po-ui-ng-storage.mjs +5 -0
  8. package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
  9. package/fesm2015/{po-ui-ng-storage.js → po-ui-ng-storage.mjs} +786 -774
  10. package/fesm2015/po-ui-ng-storage.mjs.map +1 -0
  11. package/fesm2020/po-ui-ng-storage.mjs +764 -0
  12. package/fesm2020/po-ui-ng-storage.mjs.map +1 -0
  13. package/lib/drivers/lokijs/po-loki-driver.d.ts +30 -30
  14. package/lib/index.d.ts +3 -3
  15. package/lib/po-storage.module.d.ts +14 -10
  16. package/lib/services/po-storage-config.interface.d.ts +27 -27
  17. package/lib/services/po-storage.service.d.ts +381 -378
  18. package/package.json +28 -13
  19. package/po-ui-ng-storage-6.2.0.tgz +0 -0
  20. package/po-ui-ng-storage.d.ts +5 -5
  21. package/public-api.d.ts +1 -1
  22. package/schematics/README.md +91 -91
  23. package/schematics/collection.json +10 -10
  24. package/schematics/ng-add/index.d.ts +7 -7
  25. package/schematics/ng-add/index.js +28 -28
  26. package/schematics/ng-add/index.js.map +1 -1
  27. package/schematics/ng-add/index.spec.d.ts +1 -1
  28. package/schematics/ng-add/index.spec.js +50 -50
  29. package/schematics/ng-add/index.spec.js.map +1 -1
  30. package/schematics/ng-add/schema.json +6 -6
  31. package/bundles/po-ui-ng-storage.umd.js +0 -1279
  32. package/bundles/po-ui-ng-storage.umd.js.map +0 -1
  33. package/esm2015/lib/po-storage.module.js +0 -29
  34. package/esm2015/lib/services/po-storage-config.interface.js +0 -11
  35. package/esm2015/lib/services/po-storage.service.js +0 -546
  36. package/esm2015/po-ui-ng-storage.js +0 -6
  37. package/fesm2015/po-ui-ng-storage.js.map +0 -1
  38. package/po-ui-ng-storage-5.22.3.tgz +0 -0
  39. package/po-ui-ng-storage.metadata.json +0 -1
@@ -0,0 +1,520 @@
1
+ import { Inject, Injectable, InjectionToken } from '@angular/core';
2
+ import * as LocalForage from 'localforage';
3
+ import 'localforage';
4
+ import IdleQueue from 'custom-idle-queue';
5
+ import { PoLokiDriver } from '../drivers/lokijs/po-loki-driver';
6
+ import * as i0 from "@angular/core";
7
+ export const PO_STORAGE_CONFIG_TOKEN = new InjectionToken('PO_STORAGE_CONFIG_TOKEN');
8
+ /**
9
+ * @description
10
+ *
11
+ * O PO Storage é uma biblioteca que fornece um serviço para armazenamento de dados no dispositivo local, sendo semelhante
12
+ * ao funcionamento do [IonicStorage](https://ionicframework.com/docs/storage/).
13
+ * É possível utilizar os drivers [Websql](https://dev.w3.org/html5/webdatabase/), [Indexeddb](https://www.w3.org/TR/IndexedDB/),
14
+ * [LocalStorage](https://html.spec.whatwg.org/multipage/webstorage.html) e também [LokiJS](https://github.com/techfort/LokiJS/wiki).
15
+ *
16
+ * Para um melhor ganho de performance ao buscar e salvar dados, recomendamos a utilização do `LokiJS`, um *database*
17
+ * orientado a documento semelhante ao MongoDB, que além de permitir a persistência dos dados no dispositivo possibilita
18
+ * também o armazenamento dos dados em memória. Outra vantagem, é o aumento do limite de armazenamento para
19
+ * aproximadamente `300mb`.
20
+ *
21
+ * A estrutura utilizada para armazenar os dados é a de chave/valor, onde uma chave funciona como um identificador exclusivo.
22
+ *
23
+ * #### Instalando o PO Storage
24
+ *
25
+ * Para instalar o `po-storage` em sua aplicação execute o seguinte comando:
26
+ *
27
+ * ```shell
28
+ * ng add @po-ui/ng-storage
29
+ * ```
30
+ * Será instalado o pacote `@po-ui/ng-storage` e também já importará `PoStorageModule` no módulo principal da sua aplicação, conforme abaixo:
31
+ *
32
+ * ```typescript
33
+ * import { PoStorageModule } from '@po-ui/ng-storage';
34
+ *
35
+ * @NgModule({
36
+ * declarations: [...],
37
+ * imports: [
38
+ * // Importação do módulo PoStorageModule
39
+ * PoStorageModule.forRoot(),
40
+ * ],
41
+ * bootstrap: [IonicApp],
42
+ * providers: [...]
43
+ * })
44
+ * export class AppModule {}
45
+ * ```
46
+ *
47
+ * Com a declaração do módulo, é criada uma base de dados no armazenamento local e o serviço `PoStorageService` estará
48
+ * pronto para ser utilizada na sua aplicação.
49
+ *
50
+ * #### Configurando as opções de armazenamento
51
+ *
52
+ * Na importação do módulo, o método `PoStorageModule.forRoot()` pode receber como parâmetro um objeto do tipo
53
+ * [`PoStorageConfig`](documentation/po-storage#po-storage-config),
54
+ * que serve para configurar as opções personalizadas do armazenamento, como por exemplo: o tipo de armazenamento
55
+ * preferêncial.
56
+ *
57
+ * Caso não seja passada nenhuma configuração a ordem padrão será: ['websql', 'indexeddb', 'localstorage', 'lokijs'].
58
+ *
59
+ * Abaixo segue um exemplo de configuração onde o storage preferencial passa a ser o `lokijs`:
60
+ *
61
+ * ```typescript
62
+ * import { PoStorageModule } from '@po-ui/ng-storage';
63
+ *
64
+ * @NgModule({
65
+ * declarations: [...],
66
+ * imports: [
67
+ * // Importação do módulo PoStorageModule com a configuração personalizada
68
+ * PoStorageModule.forRoot({
69
+ * name: 'mystorage',
70
+ * storeName: '_mystore',
71
+ * driverOrder: ['lokijs', 'websql', 'indexeddb', 'localstorage']
72
+ * }),
73
+ * ],
74
+ * bootstrap: [IonicApp],
75
+ * providers: [...]
76
+ * })
77
+ * export class AppModule {}
78
+ * ```
79
+ */
80
+ export class PoStorageService {
81
+ constructor(config) {
82
+ this.driver = null;
83
+ this.idleQueue = new IdleQueue();
84
+ this.lokijsDriver = new PoLokiDriver();
85
+ this.setStoragePromise(config);
86
+ }
87
+ /**
88
+ * Retorna a configuração padrão para o armazenamento. Caso nenhuma configuração seja inserida,
89
+ * essa configuração será utilizada.
90
+ *
91
+ * @returns {PoStorageConfig} Objeto com a configuração padrão do armazenamento.
92
+ */
93
+ static getDefaultConfig() {
94
+ return {
95
+ name: '_postorage',
96
+ storeName: '_pokv',
97
+ driverOrder: ['websql', 'indexeddb', 'localstorage', 'lokijs']
98
+ };
99
+ }
100
+ /**
101
+ * Cria uma instância do `PoStorageService` com a configuração de armazenamento passada como parâmetro.
102
+ *
103
+ * @param {PoStorageConfig} storageConfig Configuração para o armazenamento.
104
+ * @returns {PoStorageService} Instância do `PoStorageService`.
105
+ */
106
+ static providePoStorage(storageConfig) {
107
+ return new PoStorageService(PoStorageService.getConfig(storageConfig));
108
+ }
109
+ static getConfig(storageConfig) {
110
+ return storageConfig || PoStorageService.getDefaultConfig();
111
+ }
112
+ /**
113
+ * Busca uma lista armazenada pela chave e concatena com a lista passada por parâmetro.
114
+ *
115
+ * Por exemplo:
116
+ *
117
+ * ``` typescript
118
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
119
+ *
120
+ * this.poStorageService.set('clientKey', clients).then(() => {});
121
+ *
122
+ * ...
123
+ *
124
+ * const newClients = [ { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 } ];
125
+ *
126
+ * this.poStorageService.appendArrayToArray('clientKey', newClients).then(() => {
127
+ * // A lista agora será:
128
+ * // [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }, { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 }];
129
+ * });
130
+ * ```
131
+ *
132
+ * @param {string} key Chave da lista armazenada.
133
+ * @param {Array} value Lista que será concatenada.
134
+ *
135
+ * @returns {Promise<any>} Promessa que é resolvida após as duas listas serem concatenadas e armazenadas localmente.
136
+ */
137
+ async appendArrayToArray(key, value) {
138
+ const data = await this.getArrayOfStorage(key);
139
+ const newData = [...data, ...value];
140
+ return this.set(key, newData);
141
+ }
142
+ /**
143
+ * Acrescenta um item em uma lista armazenada pela chave.
144
+ *
145
+ * @param {string} key Chave da lista armazenada.
146
+ * @param {Array} value Item que será acrescentado na lista.
147
+ *
148
+ * @returns {Promise<any>} Promessa que é resolvida após o item ser acrescentado na lista armazenada.
149
+ */
150
+ async appendItemToArray(key, value) {
151
+ const data = await this.getArrayOfStorage(key);
152
+ data.push(value);
153
+ return this.set(key, data);
154
+ }
155
+ /**
156
+ * Remove todos os itens da base de dados local configurada na declaração do módulo `PoStorageModule`.
157
+ *
158
+ * > Utilize este método com cautela, para evitar a perda indesejada de dados.
159
+ *
160
+ * @returns {Promise<void>} Promessa que é resolvida após todos os itens da base de dados local serem removidos.
161
+ */
162
+ clear() {
163
+ return this.storagePromise.then(store => store.clear());
164
+ }
165
+ /**
166
+ * Verifica se existe um valor dentro de uma determinada chave.
167
+ *
168
+ * @param {string} key Chave que será verificada.
169
+ *
170
+ * @returns {Promise<boolean>} Promessa que é resolvida quando a verificação da existência do valor na chave é concluída.
171
+ */
172
+ exists(key) {
173
+ return this.get(key).then(data => Promise.resolve(data !== null));
174
+ }
175
+ /**
176
+ * Itera sobre todas as chaves armazenadas.
177
+ *
178
+ * @param {any} iteratorCallback Função de `callback` que é chamada a cada iteração, com os seguintes parâmetros:
179
+ * valor, chave e número da iteração.
180
+ *
181
+ * Exemplo de utilização:
182
+ *
183
+ * ``` typescript
184
+ * this.poStorageService.forEach((value: any, key: string, iterationNumber: number) => {
185
+ * // Iteração sobre cada chave armazenada.
186
+ * });
187
+ * ```
188
+ *
189
+ * @returns {Promise<void>} Promessa que é resolvida após a iteração sobre todas as chaves armazenadas.
190
+ */
191
+ forEach(iteratorCallback) {
192
+ return this.storagePromise.then(store => store.iterate(iteratorCallback));
193
+ }
194
+ /**
195
+ * Retorna o valor armazenado em uma determinada chave.
196
+ *
197
+ * @param {string} key Chave que identifica o item.
198
+ * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
199
+ * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
200
+ *
201
+ * Padrão: `false`.
202
+ *
203
+ * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
204
+ * @returns {Promise<any>} Promessa que é resolvida após o item ser buscado.
205
+ */
206
+ async get(key, lock = false) {
207
+ if (lock) {
208
+ await this.requestIdlePromise();
209
+ return await this.idleQueue.wrapCall(async () => {
210
+ await this.getImmutableItem(key);
211
+ });
212
+ }
213
+ return await this.getImmutableItem(key);
214
+ }
215
+ /**
216
+ * Retorna o nome do *driver* que está sendo usado para armazenar os dados, por exemplo: localStorage.
217
+ *
218
+ * @returns {string | null} Nome do *driver*.
219
+ */
220
+ getDriver() {
221
+ return this.driver;
222
+ }
223
+ /**
224
+ * Retorna o primeiro item de uma lista para uma determinada chave.
225
+ *
226
+ * @param {string} key Chave da lista.
227
+ * @returns {Promise<any>} Promessa que é resolvida após o primeiro item ser encontrado.
228
+ */
229
+ getFirstItem(key) {
230
+ return this.get(key).then((data) => Promise.resolve(data ? data[0] : null));
231
+ }
232
+ /**
233
+ * Remove o primeiro item de uma lista a partir da chave.
234
+ *
235
+ * @param {string} key Chave da lista que será removido o primeiro item.
236
+ * @returns {Promise<any>} Promessa que é resolvida após o primeiro item da lista ser removido.
237
+ */
238
+ getItemAndRemove(key) {
239
+ return this.get(key).then((data) => {
240
+ if (data === null) {
241
+ return null;
242
+ }
243
+ const item = data.shift();
244
+ return this.set(key, data).then(() => Promise.resolve(item));
245
+ });
246
+ }
247
+ /**
248
+ * Busca o primeiro objeto encontrado dentro de uma lista pelo do valor de um campo.
249
+ *
250
+ * Por exemplo:
251
+ *
252
+ * ``` typescript
253
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
254
+ *
255
+ * this.poStorageService.set('clientKey', clients).then(() => {});
256
+ *
257
+ * ...
258
+ *
259
+ * this.poStorageService.getItemByField('clientKey', 'name', 'Marie').then(client => {
260
+ * // Resultado do console.log: { name: 'Marie', age: 23 }
261
+ * console.log(client);
262
+ * });
263
+ * ```
264
+ *
265
+ * @param {string} key Chave da lista.
266
+ * @param {string} fieldName O campo a ser filtrado.
267
+ * @param {any} fieldValue O valor do campo.
268
+ * @returns {Promise<any>} Promessa que é resolvida com o item que foi encontrado.
269
+ */
270
+ getItemByField(key, fieldName, fieldValue) {
271
+ return this.get(key).then((storageRecords) => {
272
+ let storageRecordsFiltered = storageRecords.find(storageRecord => storageRecord[fieldName] === fieldValue);
273
+ storageRecordsFiltered = storageRecordsFiltered || null;
274
+ return Promise.resolve(storageRecordsFiltered);
275
+ });
276
+ }
277
+ /**
278
+ * Lista com todas as chaves armazenadas.
279
+ *
280
+ * @returns {Promise<Array<string>>} Promessa que é resolvida com todas as chaves armazenadas.
281
+ */
282
+ keys() {
283
+ return this.storagePromise.then(store => store.keys());
284
+ }
285
+ /**
286
+ * Quantidade de chaves armazenadas.
287
+ *
288
+ * @returns {Promise<number>} Promessa que é resolvida com o número de chaves armazenadas.
289
+ */
290
+ length() {
291
+ return this.storagePromise.then(store => store.length());
292
+ }
293
+ /**
294
+ * Utilizado para gerenciar o bloqueio e desbloqueio de recursos no `PoStorageService`.
295
+ * Aguardando a liberação da utilização dos recursos que participam deste comportamento e posteriormente envolve o recurso
296
+ * passado como parâmetro em um comportamento de bloqueio e desbloqueio.
297
+ *
298
+ * Este método se comporta igual a utilização em conjunta dos métodos: `PoStorageService.requestIdlePromise()`,
299
+ * `PoStorageService.lock()` e `PoStorageService.unlook()`.
300
+ *
301
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
302
+ *
303
+ * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
304
+ */
305
+ async limitedCallWrap(limitedResource) {
306
+ await this.requestIdlePromise();
307
+ return this.idleQueue.wrapCall(limitedResource);
308
+ }
309
+ /**
310
+ * Incrementa um valor na fila de bloqueio do `PoStorageService`. Utilizado juntamente com o método `unlock` para poder
311
+ * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
312
+ *
313
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
314
+ */
315
+ lock() {
316
+ this.idleQueue.lock();
317
+ }
318
+ /**
319
+ * Determina se o processo de inicialização do *driver* assíncrono foi concluído.
320
+ *
321
+ * @returns {Promise<LocalForage>} Promessa que é resolvida quando o processo de inicialização do *driver* assíncrono
322
+ * for concluído.
323
+ */
324
+ ready() {
325
+ return this.storagePromise;
326
+ }
327
+ /**
328
+ * Remove um valor associado a uma chave.
329
+ *
330
+ * @param {key} key Chave do valor que será removido.
331
+ * @returns {Promise<any>} Promessa que é resolvida após o valor ser removido.
332
+ */
333
+ remove(key) {
334
+ return this.storagePromise.then(store => store.removeItem(key));
335
+ }
336
+ /**
337
+ * Remove uma propriedade de um objeto armazenado.
338
+ *
339
+ * @param {string} key Chave do objeto armazenado.
340
+ * @param {string} property Propriedade que será removida.
341
+ *
342
+ * @returns {Promise<any>} Promessa que é resolvida após a propriedade ser removida.
343
+ */
344
+ async removeIndexFromObject(key, property) {
345
+ const data = await this.getObjectOfStorage(key);
346
+ delete data[property];
347
+ return this.set(key, data);
348
+ }
349
+ /**
350
+ * Remove um objeto de uma lista armazenada pelo valor de uma propriedade.
351
+ *
352
+ * Por exemplo:
353
+ *
354
+ * ``` typescript
355
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
356
+ *
357
+ * this.poStorageService.set('clientKey', clients).then(() => {});
358
+ *
359
+ * ...
360
+ *
361
+ * this.poStorageService.removeItemFromArray('clientKey', 'name', 'Marie').then(() => {
362
+ * // O objeto { name: 'Marie', age: 23 } foi removido da lista que está na chave 'clientKey'
363
+ * });
364
+ * ```
365
+ *
366
+ * @param {string} key Chave da lista que contém o item que será removido.
367
+ * @param {string} field O campo a ser filtrado no item.
368
+ * @param {string} value O valor do filtro.
369
+ * @returns {Promise<any>} Promessa que é resolvida quando o objeto for removido da lista.
370
+ */
371
+ async removeItemFromArray(key, field, value) {
372
+ let data = await this.getArrayOfStorage(key);
373
+ data = data.filter(item => item[field] !== value);
374
+ return this.set(key, data);
375
+ }
376
+ /**
377
+ * <a id="request-idle-promise"></a>
378
+ * Método que verifica se o acesso a base de dados configurada está liberado.
379
+ *
380
+ * Utilizado em conjunto com os métodos `lock()` e `unlock()` entre tarefas que não podem ser executadas de forma
381
+ * paralela, para não causar inconsistências nos dados.
382
+ *
383
+ * Exemplo de utilização:
384
+ *
385
+ * ```
386
+ * // Aguarda a liberação para continuar
387
+ * await this.poStorage.requestIdlePromise();
388
+ *
389
+ * this.poStorage.lock();
390
+ *
391
+ * // Executa uma tarefa que irá ler e/ou escrever na base de dados configurada.
392
+ *
393
+ * this.poStorage.unlock();
394
+ * ```
395
+ *
396
+ * > É importante sempre utilizá-lo antes de executar os métodos `lock()` e `unlock()` para garantir que a tarefa só
397
+ * será executada caso o acesso esteja livre.
398
+ *
399
+ * @returns {Promise<any>} Promessa que é resolvida quando o acesso a base de dados configurada estiver liberado.
400
+ */
401
+ requestIdlePromise() {
402
+ return this.idleQueue.requestIdlePromise();
403
+ }
404
+ /**
405
+ * Grava um valor em uma determinada chave.
406
+ *
407
+ * @param {string} key Chave para o valor que será gravado.
408
+ * @param {any} value Valor que será gravado.
409
+ * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
410
+ * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
411
+ *
412
+ * Padrão: `false`.
413
+ *
414
+ * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
415
+ * @returns {Promise<any>} Promessa que é resolvida após o valor ter sido gravado.
416
+ */
417
+ async set(key, value, lock = false) {
418
+ const store = await this.storagePromise;
419
+ const newValue = typeof value === 'object' ? JSON.parse(JSON.stringify(value)) : value;
420
+ if (lock) {
421
+ await this.requestIdlePromise();
422
+ return this.idleQueue.wrapCall(() => store.setItem(key, newValue));
423
+ }
424
+ return store.setItem(key, newValue);
425
+ }
426
+ /**
427
+ * Atribui um valor a uma propriedade de um objeto armazenado pela chave.
428
+ *
429
+ * Por exemplo:
430
+ *
431
+ * ``` typescript
432
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
433
+ *
434
+ * this.poStorageService.set('clientKey', clients).then(() => {});
435
+ *
436
+ * ...
437
+ *
438
+ * this.poStorageService.setIndexToObject('clientKey', 'name', 'Clare').then(() => {
439
+ * // O objeto { name: 'Marie', age: 23 } passa a ser { name: 'Clare', age: 23 }
440
+ * });
441
+ * ```
442
+ *
443
+ * @param {string} key Chave do objeto.
444
+ * @param {string} property Nome da propriedade do objeto.
445
+ * @param {any} value Valor que será gravado na propriedade do objeto.
446
+ */
447
+ async setIndexToObject(key, property, value) {
448
+ const data = await this.getObjectOfStorage(key);
449
+ data[property] = value;
450
+ return this.set(key, data);
451
+ }
452
+ /**
453
+ * Decrementa um valor na fila de bloqueio. Utilizado juntamente com o método `lock` para poder
454
+ * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
455
+ *
456
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
457
+ */
458
+ unlock() {
459
+ this.idleQueue.unlock();
460
+ }
461
+ async getArrayOfStorage(key) {
462
+ const data = await this.get(key);
463
+ return data || [];
464
+ }
465
+ async getImmutableItem(key) {
466
+ const store = await this.storagePromise;
467
+ const items = await store.getItem(key);
468
+ return items ? JSON.parse(JSON.stringify(items)) : null;
469
+ }
470
+ async defineLocalForageDriver(localForageInstance, driverOrder) {
471
+ await localForageInstance.defineDriver(this.lokijsDriver.getDriver());
472
+ await this.setDriver(localForageInstance, driverOrder);
473
+ return localForageInstance;
474
+ }
475
+ getDriverOrder(driverOrder) {
476
+ return driverOrder.map(driver => {
477
+ switch (driver) {
478
+ case 'indexeddb':
479
+ return LocalForage.INDEXEDDB;
480
+ case 'websql':
481
+ return LocalForage.WEBSQL;
482
+ case 'localstorage':
483
+ return LocalForage.LOCALSTORAGE;
484
+ default:
485
+ return driver;
486
+ }
487
+ });
488
+ }
489
+ async getObjectOfStorage(key) {
490
+ const data = await this.get(key);
491
+ return data || {};
492
+ }
493
+ async setDriver(localForageInstance, driverOrder) {
494
+ await localForageInstance.setDriver(this.getDriverOrder(driverOrder));
495
+ this.driver = localForageInstance.driver();
496
+ }
497
+ setStoragePromise(config) {
498
+ this.storagePromise = this.getStorageInstance(config);
499
+ }
500
+ async getStorageInstance(config) {
501
+ const defaultConfig = PoStorageService.getDefaultConfig();
502
+ const actualConfig = Object.assign(defaultConfig, config || {});
503
+ const localForageInstance = LocalForage.createInstance(actualConfig);
504
+ try {
505
+ return await this.defineLocalForageDriver(localForageInstance, actualConfig.driverOrder);
506
+ }
507
+ catch {
508
+ throw new Error(`Cannot use this drivers: ${actualConfig.driverOrder.join(', ')}.`);
509
+ }
510
+ }
511
+ }
512
+ PoStorageService.ɵfac = function PoStorageService_Factory(t) { return new (t || PoStorageService)(i0.ɵɵinject(PO_STORAGE_CONFIG_TOKEN)); };
513
+ PoStorageService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoStorageService, factory: PoStorageService.ɵfac });
514
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoStorageService, [{
515
+ type: Injectable
516
+ }], function () { return [{ type: undefined, decorators: [{
517
+ type: Inject,
518
+ args: [PO_STORAGE_CONFIG_TOKEN]
519
+ }] }]; }, null); })();
520
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmFnZS9zcmMvbGliL3NlcnZpY2VzL3BvLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxhQUFhLENBQUM7QUFFckIsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFFMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQUdoRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRXJGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVFRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFNM0IsWUFBNkMsTUFBd0I7UUFMN0QsV0FBTSxHQUFXLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUtsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0I7UUFDckIsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZO1lBQ2xCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQztTQUMvRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gs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QUksS0FBSyxDQUFDLDRCQUE0QixZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckY7SUFDSCxDQUFDOztnRkE1ZFUsZ0JBQWdCLGNBTVAsdUJBQXVCO3NFQU5oQyxnQkFBZ0IsV0FBaEIsZ0JBQWdCO3VGQUFoQixnQkFBZ0I7Y0FENUIsVUFBVTs7c0JBT0ksTUFBTTt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCAqIGFzIExvY2FsRm9yYWdlIGZyb20gJ2xvY2FsZm9yYWdlJztcbmltcG9ydCAnbG9jYWxmb3JhZ2UnO1xuXG5pbXBvcnQgSWRsZVF1ZXVlIGZyb20gJ2N1c3RvbS1pZGxlLXF1ZXVlJztcblxuaW1wb3J0IHsgUG9Mb2tpRHJpdmVyIH0gZnJvbSAnLi4vZHJpdmVycy9sb2tpanMvcG8tbG9raS1kcml2ZXInO1xuaW1wb3J0IHsgUG9TdG9yYWdlQ29uZmlnIH0gZnJvbSAnLi9wby1zdG9yYWdlLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgUE9fU1RPUkFHRV9DT05GSUdfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1BPX1NUT1JBR0VfQ09ORklHX1RPS0VOJyk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogTyBQTyBTdG9yYWdlIMOpIHVtYSBiaWJsaW90ZWNhIHF1ZSBmb3JuZWNlIHVtIHNlcnZpw6dvIHBhcmEgYXJtYXplbmFtZW50byBkZSBkYWRvcyBubyBkaXNwb3NpdGl2byBsb2NhbCwgc2VuZG8gc2VtZWxoYW50ZVxuICogYW8gZnVuY2lvbmFtZW50byBkbyBbSW9uaWNTdG9yYWdlXShodHRwczovL2lvbmljZnJhbWV3b3JrLmNvbS9kb2NzL3N0b3JhZ2UvKS5cbiAqIMOJIHBvc3PDrXZlbCB1dGlsaXphciBvcyBkcml2ZXJzIFtXZWJzcWxdKGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS93ZWJkYXRhYmFzZS8pLCBbSW5kZXhlZGRiXShodHRwczovL3d3dy53My5vcmcvVFIvSW5kZXhlZERCLyksXG4gKiBbTG9jYWxTdG9yYWdlXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJzdG9yYWdlLmh0bWwpIGUgdGFtYsOpbSBbTG9raUpTXShodHRwczovL2dpdGh1Yi5jb20vdGVjaGZvcnQvTG9raUpTL3dpa2kpLlxuICpcbiAqIFBhcmEgdW0gbWVsaG9yIGdhbmhvIGRlIHBlcmZvcm1hbmNlIGFvIGJ1c2NhciBlIHNhbHZhciBkYWRvcywgcmVjb21lbmRhbW9zIGEgdXRpbGl6YcOnw6NvIGRvIGBMb2tpSlNgLCB1bSAqZGF0YWJhc2UqXG4gKiBvcmllbnRhZG8gYSBkb2N1bWVudG8gc2VtZWxoYW50ZSBhbyBNb25nb0RCLCBxdWUgYWzDqW0gZGUgcGVybWl0aXIgYSBwZXJzaXN0w6puY2lhIGRvcyBkYWRvcyBubyBkaXNwb3NpdGl2byBwb3NzaWJpbGl0YVxuICogdGFtYsOpbSBvIGFybWF6ZW5hbWVudG8gZG9zIGRhZG9zIGVtIG1lbcOzcmlhLiBPdXRyYSB2YW50YWdlbSwgw6kgbyBhdW1lbnRvIGRvIGxpbWl0ZSBkZSBhcm1hemVuYW1lbnRvIHBhcmFcbiAqIGFwcm94aW1hZGFtZW50ZSBgMzAwbWJgLlxuICpcbiAqIEEgZXN0cnV0dXJhIHV0aWxpemFkYSBwYXJhIGFybWF6ZW5hciBvcyBkYWRvcyDDqSBhIGRlIGNoYXZlL3ZhbG9yLCBvbmRlIHVtYSBjaGF2ZSBmdW5jaW9uYSBjb21vIHVtIGlkZW50aWZpY2Fkb3IgZXhjbHVzaXZvLlxuICpcbiAqICMjIyMgSW5zdGFsYW5kbyBvIFBPIFN0b3JhZ2VcbiAqXG4gKiBQYXJhIGluc3RhbGFyIG8gYHBvLXN0b3JhZ2VgIGVtIHN1YSBhcGxpY2HDp8OjbyBleGVjdXRlIG8gc2VndWludGUgY29tYW5kbzpcbiAqXG4gKiBgYGBzaGVsbFxuICogbmcgYWRkIEBwby11aS9uZy1zdG9yYWdlXG4gKiBgYGBcbiAqIFNlcsOhIGluc3RhbGFkbyBvIHBhY290ZSBgQHBvLXVpL25nLXN0b3JhZ2VgIGUgdGFtYsOpbSBqw6EgaW1wb3J0YXLDoSBgUG9TdG9yYWdlTW9kdWxlYCBubyBtw7NkdWxvIHByaW5jaXBhbCBkYSBzdWEgYXBsaWNhw6fDo28sIGNvbmZvcm1lIGFiYWl4bzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBQb1N0b3JhZ2VNb2R1bGUgfSBmcm9tICdAcG8tdWkvbmctc3RvcmFnZSc7XG4gKlxuICogQE5nTW9kdWxlKHtcbiAqICBkZWNsYXJhdGlvbnM6IFsuLi5dLFxuICogIGltcG9ydHM6IFtcbiAqICAgIC8vIEltcG9ydGHDp8OjbyBkbyBtw7NkdWxvIFBvU3RvcmFnZU1vZHVsZVxuICogICAgUG9TdG9yYWdlTW9kdWxlLmZvclJvb3QoKSxcbiAqICBdLFxuICogIGJvb3RzdHJhcDogW0lvbmljQXBwXSxcbiAqICBwcm92aWRlcnM6IFsuLi5dXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQ29tIGEgZGVjbGFyYcOnw6NvIGRvIG3Ds2R1bG8sIMOpIGNyaWFkYSB1bWEgYmFzZSBkZSBkYWRvcyBubyBhcm1hemVuYW1lbnRvIGxvY2FsIGUgbyBzZXJ2acOnbyBgUG9TdG9yYWdlU2VydmljZWAgZXN0YXLDoVxuICogcHJvbnRvIHBhcmEgc2VyIHV0aWxpemFkYSBuYSBzdWEgYXBsaWNhw6fDo28uXG4gKlxuICogIyMjIyBDb25maWd1cmFuZG8gYXMgb3DDp8O1ZXMgZGUgYXJtYXplbmFtZW50b1xuICpcbiAqIE5hIGltcG9ydGHDp8OjbyBkbyBtw7NkdWxvLCBvIG3DqXRvZG8gYFBvU3RvcmFnZU1vZHVsZS5mb3JSb290KClgIHBvZGUgcmVjZWJlciBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG9cbiAqIFtgUG9TdG9yYWdlQ29uZmlnYF0oZG9jdW1lbnRhdGlvbi9wby1zdG9yYWdlI3BvLXN0b3JhZ2UtY29uZmlnKSxcbiAqIHF1ZSBzZXJ2ZSBwYXJhIGNvbmZpZ3VyYXIgYXMgb3DDp8O1ZXMgcGVyc29uYWxpemFkYXMgZG8gYXJtYXplbmFtZW50bywgY29tbyBwb3IgZXhlbXBsbzogbyB0aXBvIGRlIGFybWF6ZW5hbWVudG9cbiAqIHByZWZlcsOqbmNpYWwuXG4gKlxuICogQ2FzbyBuw6NvIHNlamEgcGFzc2FkYSBuZW5odW1hIGNvbmZpZ3VyYcOnw6NvIGEgb3JkZW0gcGFkcsOjbyBzZXLDoTogWyd3ZWJzcWwnLCAnaW5kZXhlZGRiJywgJ2xvY2Fsc3RvcmFnZScsICdsb2tpanMnXS5cbiAqXG4gKiBBYmFpeG8gc2VndWUgdW0gZXhlbXBsbyBkZSBjb25maWd1cmHDp8OjbyBvbmRlIG8gc3RvcmFnZSBwcmVmZXJlbmNpYWwgcGFzc2EgYSBzZXIgbyBgbG9raWpzYDpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBQb1N0b3JhZ2VNb2R1bGUgfSBmcm9tICdAcG8tdWkvbmctc3RvcmFnZSc7XG4gKlxuICogQE5nTW9kdWxlKHtcbiAqICBkZWNsYXJhdGlvbnM6IFsuLi5dLFxuICogIGltcG9ydHM6IFtcbiAqICAgIC8vIEltcG9ydGHDp8OjbyBkbyBtw7NkdWxvIFBvU3RvcmFnZU1vZHVsZSBjb20gYSBjb25maWd1cmHDp8OjbyBwZXJzb25hbGl6YWRhXG4gKiAgICBQb1N0b3JhZ2VNb2R1bGUuZm9yUm9vdCh7XG4gKiAgICAgIG5hbWU6ICdteXN0b3JhZ2UnLFxuICogICAgICBzdG9yZU5hbWU6ICdfbXlzdG9yZScsXG4gKiAgICAgIGRyaXZlck9yZGVyOiBbJ2xva2lqcycsICd3ZWJzcWwnLCAnaW5kZXhlZGRiJywgJ2xvY2Fsc3RvcmFnZSddXG4gKiAgICB9KSxcbiAqICBdLFxuICogIGJvb3RzdHJhcDogW0lvbmljQXBwXSxcbiAqICBwcm92aWRlcnM6IFsuLi5dXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb1N0b3JhZ2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBkcml2ZXI6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgaWRsZVF1ZXVlID0gbmV3IElkbGVRdWV1ZSgpO1xuICBwcml2YXRlIHN0b3JhZ2VQcm9taXNlOiBQcm9taXNlPExvY2FsRm9yYWdlPjtcbiAgcHJpdmF0ZSBsb2tpanNEcml2ZXI6IFBvTG9raURyaXZlcjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBPX1NUT1JBR0VfQ09ORklHX1RPS0VOKSBjb25maWc/OiBQb1N0b3JhZ2VDb25maWcpIHtcbiAgICB0aGlzLmxva2lqc0RyaXZlciA9IG5ldyBQb0xva2lEcml2ZXIoKTtcbiAgICB0aGlzLnNldFN0b3JhZ2VQcm9taXNlKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBhIGNvbmZpZ3VyYcOnw6NvIHBhZHLDo28gcGFyYSBvIGFybWF6ZW5hbWVudG8uIENhc28gbmVuaHVtYSBjb25maWd1cmHDp8OjbyBzZWphIGluc2VyaWRhLFxuICAgKiBlc3NhIGNvbmZpZ3VyYcOnw6NvIHNlcsOhIHV0aWxpemFkYS5cbiAgICpcbiAgICogQHJldHVybnMge1BvU3RvcmFnZUNvbmZpZ30gT2JqZXRvIGNvbSBhIGNvbmZpZ3VyYcOnw6NvIHBhZHLDo28gZG8gYXJtYXplbmFtZW50by5cbiAgICovXG4gIHN0YXRpYyBnZXREZWZhdWx0Q29uZmlnKCk6IFBvU3RvcmFnZUNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdfcG9zdG9yYWdlJyxcbiAgICAgIHN0b3JlTmFtZTogJ19wb2t2JyxcbiAgICAgIGRyaXZlck9yZGVyOiBbJ3dlYnNxbCcsICdpbmRleGVkZGInLCAnbG9jYWxzdG9yYWdlJywgJ2xva2lqcyddXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmlhIHVtYSBpbnN0w6JuY2lhIGRvIGBQb1N0b3JhZ2VTZXJ2aWNlYCBjb20gYSBjb25maWd1cmHDp8OjbyBkZSBhcm1hemVuYW1lbnRvIHBhc3NhZGEgY29tbyBwYXLDom1ldHJvLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvU3RvcmFnZUNvbmZpZ30gc3RvcmFnZUNvbmZpZyBDb25maWd1cmHDp8OjbyBwYXJhIG8gYXJtYXplbmFtZW50by5cbiAgICogQHJldHVybnMge1BvU3RvcmFnZVNlcnZpY2V9IEluc3TDom5jaWEgZG8gYFBvU3RvcmFnZVNlcnZpY2VgLlxuICAgKi9cbiAgc3RhdGljIHByb3ZpZGVQb1N0b3JhZ2Uoc3RvcmFnZUNvbmZpZz86IFBvU3RvcmFnZUNvbmZpZyk6IFBvU3RvcmFnZVNlcnZpY2Uge1xuICAgIHJldHVybiBuZXcgUG9TdG9yYWdlU2VydmljZShQb1N0b3JhZ2VTZXJ2aWNlLmdldENvbmZpZyhzdG9yYWdlQ29uZmlnKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRDb25maWcoc3RvcmFnZUNvbmZpZz86IFBvU3RvcmFnZUNvbmZpZykge1xuICAgIHJldHVybiBzdG9yYWdlQ29uZmlnIHx8IFBvU3RvcmFnZVNlcnZpY2UuZ2V0RGVmYXVsdENvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1c2NhIHVtYSBsaXN0YSBhcm1hemVuYWRhIHBlbGEgY2hhdmUgZSBjb25jYXRlbmEgY29tIGEgbGlzdGEgcGFzc2FkYSBwb3IgcGFyw6JtZXRyby5cbiAgICpcbiAgICogUG9yIGV4ZW1wbG86XG4gICAqXG4gICAqIGBgYCB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNsaWVudHMgPSBbIHsgbmFtZTogJ01hcmllJywgYWdlOiAyMyB9LCB7IG5hbWU6ICdQZXRoZXInLCBhZ2U6IDM5IH1dO1xuICAgKlxuICAgKiB0aGlzLnBvU3RvcmFnZVNlcnZpY2Uuc2V0KCdjbGllbnRLZXknLCBjbGllbnRzKS50aGVuKCgpID0+IHt9KTtcbiAgICpcbiAgICogLi4uXG4gICAqXG4gICAqIGNvbnN0IG5ld0NsaWVudHMgPSBbIHsgbmFtZTogJ0xpc2EnLCBhZ2U6IDM2IH0sIHsgbmFtZTogJ0JydWNlJywgYWdlOiAxOCB9IF07XG4gICAqXG4gICAqIHRoaXMucG9TdG9yYWdlU2VydmljZS5hcHBlbmRBcnJheVRvQXJyYXkoJ2NsaWVudEtleScsIG5ld0NsaWVudHMpLnRoZW4oKCkgPT4ge1xuICAgKiAgIC8vIEEgbGlzdGEgYWdvcmEgc2Vyw6E6XG4gICAqICAgLy8gWyB7IG5hbWU6ICdNYXJpZScsIGFnZTogMjMgfSwgeyBuYW1lOiAnUGV0aGVyJywgYWdlOiAzOSB9LCB7IG5hbWU6ICdMaXNhJywgYWdlOiAzNiB9LCB7IG5hbWU6ICdCcnVjZScsIGFnZTogMTggfV07XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGF2ZSBkYSBsaXN0YSBhcm1hemVuYWRhLlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBMaXN0YSBxdWUgc2Vyw6EgY29uY2F0ZW5hZGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgYXDDs3MgYXMgZHVhcyBsaXN0YXMgc2VyZW0gY29uY2F0ZW5hZGFzIGUgYXJtYXplbmFkYXMgbG9jYWxtZW50ZS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZEFycmF5VG9BcnJheShrZXk6IHN0cmluZywgdmFsdWU6IEFycmF5PGFueT4pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdldEFycmF5T2ZTdG9yYWdlKGtleSk7XG5cbiAgICBjb25zdCBuZXdEYXRhID0gWy4uLmRhdGEsIC4uLnZhbHVlXTtcbiAgICByZXR1cm4gdGhpcy5zZXQoa2V5LCBuZXdEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3Jlc2NlbnRhIHVtIGl0ZW0gZW0gdW1hIGxpc3RhIGFybWF6ZW5hZGEgcGVsYSBjaGF2ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGF2ZSBkYSBsaXN0YSBhcm1hemVuYWRhLlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBJdGVtIHF1ZSBzZXLDoSBhY3Jlc2NlbnRhZG8gbmEgbGlzdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgYXDDs3MgbyBpdGVtIHNlciBhY3Jlc2NlbnRhZG8gbmEgbGlzdGEgYXJtYXplbmFkYS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZEl0ZW1Ub0FycmF5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRBcnJheU9mU3RvcmFnZShrZXkpO1xuXG4gICAgZGF0YS5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoa2V5LCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdG9kb3Mgb3MgaXRlbnMgZGEgYmFzZSBkZSBkYWRvcyBsb2NhbCBjb25maWd1cmFkYSBuYSBkZWNsYXJhw6fDo28gZG8gbcOzZHVsbyBgUG9TdG9yYWdlTW9kdWxlYC5cbiAgICpcbiAgICogPiBVdGlsaXplIGVzdGUgbcOpdG9kbyBjb20gY2F1dGVsYSwgcGFyYSBldml0YXIgYSBwZXJkYSBpbmRlc2VqYWRhIGRlIGRhZG9zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBhcMOzcyB0b2RvcyBvcyBpdGVucyBkYSBiYXNlIGRlIGRhZG9zIGxvY2FsIHNlcmVtIHJlbW92aWRvcy5cbiAgICovXG4gIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQcm9taXNlLnRoZW4oc3RvcmUgPT4gc3RvcmUuY2xlYXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2UgZXhpc3RlIHVtIHZhbG9yIGRlbnRybyBkZSB1bWEgZGV0ZXJtaW5hZGEgY2hhdmUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hhdmUgcXVlIHNlcsOhIHZlcmlmaWNhZGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhIHZlcmlmaWNhw6fDo28gZGEgZXhpc3TDqm5jaWEgZG8gdmFsb3IgbmEgY2hhdmUgw6kgY29uY2x1w61kYS5cbiAgICovXG4gIGV4aXN0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldChrZXkpLnRoZW4oZGF0YSA9PiBQcm9taXNlLnJlc29sdmUoZGF0YSAhPT0gbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhIHNvYnJlIHRvZGFzIGFzIGNoYXZlcyBhcm1hemVuYWRhcy5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IGl0ZXJhdG9yQ2FsbGJhY2sgRnVuw6fDo28gZGUgYGNhbGxiYWNrYCBxdWUgw6kgY2hhbWFkYSBhIGNhZGEgaXRlcmHDp8OjbywgY29tIG9zIHNlZ3VpbnRlcyBwYXLDom1ldHJvczpcbiAgICogdmFsb3IsIGNoYXZlIGUgbsO6bWVybyBkYSBpdGVyYcOnw6NvLlxuICAgKlxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcbiAgICpcbiAgICogYGBgIHR5cGVzY3JpcHRcbiAgICogdGhpcy5wb1N0b3JhZ2VTZXJ2aWNlLmZvckVhY2goKHZhbHVlOiBhbnksIGtleTogc3RyaW5nLCBpdGVyYXRpb25OdW1iZXI6IG51bWJlcikgPT4ge1xuICAgKiAgIC8vIEl0ZXJhw6fDo28gc29icmUgY2FkYSBjaGF2ZSBhcm1hemVuYWRhLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIGFww7NzIGEgaXRlcmHDp8OjbyBzb2JyZSB0b2RhcyBhcyBjaGF2ZXMgYXJtYXplbmFkYXMuXG4gICAqL1xuICBmb3JFYWNoKGl0ZXJhdG9yQ2FsbGJhY2s6ICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZywgaXRlcmF0aW9uTnVtYmVyOiBudW1iZXIpID0+IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQcm9taXNlLnRoZW4oc3RvcmUgPT4gc3RvcmUuaXRlcmF0ZShpdGVyYXRvckNhbGxiYWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHZhbG9yIGFybWF6ZW5hZG8gZW0gdW1hIGRldGVybWluYWRhIGNoYXZlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoYXZlIHF1ZSBpZGVudGlmaWNhIG8gaXRlbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBsb2NrIERlZmluZSBzZSBpcsOhIHRyYXZhciBhIGxlaXR1cmEgZSBhIGVzY3JpdGEgZGEgYmFzZSBkZSBkYWRvcyBwYXJhIG7Do28gc2VyIGFjZXNzYWRhIGRlIGZvcm1hIHBhcmFsZWxhLlxuICAgKiBDYXNvIG91dHJhIGxlaXR1cmEvZXNjcml0YSBqw6EgdGVuaGEgc2lkbyBpbmljaWFkYSwgZXN0ZSBtw6l0b2RvIGlyw6EgZXNwZXJhciBvIG91dHJvIHRlcm1pbmFyIHBhcmEgZW50w6NvIGNvbWXDp2FyLlxuICAgKlxuICAgKiBQYWRyw6NvOiBgZmFsc2VgLlxuICAgKlxuICAgKiA+IEVzdGEgZGVmaW5pw6fDo28gc8OzIHNlcsOhIHbDoWxpZGEgc2UgbyBvdXRybyBhY2Vzc28gcGFyYWxlbG8gYSBlc3RlIG3DqXRvZG8gdGFtYsOpbSBlc3RpdmVyIGNvbSBvIHBhcsOibWV0cm8gKmxvY2sqIGF0aXZhZG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgYXDDs3MgbyBpdGVtIHNlciBidXNjYWRvLlxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBsb2NrOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChsb2NrKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGxlUHJvbWlzZSgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRsZVF1ZXVlLndyYXBDYWxsKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRJbW11dGFibGVJdGVtKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1tdXRhYmxlSXRlbShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgbyBub21lIGRvICpkcml2ZXIqIHF1ZSBlc3TDoSBzZW5kbyB1c2FkbyBwYXJhIGFybWF6ZW5hciBvcyBkYWRvcywgcG9yIGV4ZW1wbG86IGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IE5vbWUgZG8gKmRyaXZlciouXG4gICAqL1xuICBnZXREcml2ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kcml2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHByaW1laXJvIGl0ZW0gZGUgdW1hIGxpc3RhIHBhcmEgdW1hIGRldGVybWluYWRhIGNoYXZlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoYXZlIGRhIGxpc3RhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIGFww7NzIG8gcHJpbWVpcm8gaXRlbSBzZXIgZW5jb250cmFkby5cbiAgICovXG4gIGdldEZpcnN0SXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGtleSkudGhlbigoZGF0YTogQXJyYXk8YW55PikgPT4gUHJvbWlzZS5yZXNvbHZlKGRhdGEgPyBkYXRhWzBdIDogbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBvIHByaW1laXJvIGl0ZW0gZGUgdW1hIGxpc3RhIGEgcGFydGlyIGRhIGNoYXZlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoYXZlIGRhIGxpc3RhIHF1ZSBzZXLDoSByZW1vdmlkbyBvIHByaW1laXJvIGl0ZW0uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgYXDDs3MgbyBwcmltZWlybyBpdGVtIGRhIGxpc3RhIHNlciByZW1vdmlkby5cbiAgICovXG4gIGdldEl0ZW1BbmRSZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldChrZXkpLnRoZW4oKGRhdGE6IEFycmF5PGFueT4pID0+IHtcbiAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpdGVtID0gZGF0YS5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KGtleSwgZGF0YSkudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoaXRlbSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1c2NhIG8gcHJpbWVpcm8gb2JqZXRvIGVuY29udHJhZG8gZGVudHJvIGRlIHVtYSBsaXN0YSBwZWxvIGRvIHZhbG9yIGRlIHVtIGNhbXBvLlxuICAgKlxuICAgKiBQb3IgZXhlbXBsbzpcbiAgICpcbiAgICogYGBgIHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50cyA9IFsgeyBuYW1lOiAnTWFyaWUnLCBhZ2U6IDIzIH0sIHsgbmFtZTogJ1BldGhlcicsIGFnZTogMzkgfV07XG4gICAqXG4gICAqIHRoaXMucG9TdG9yYWdlU2VydmljZS5zZXQoJ2NsaWVudEtleScsIGNsaWVudHMpLnRoZW4oKCkgPT4ge30pO1xuICAgKlxuICAgKiAuLi5cbiAgICpcbiAgICogdGhpcy5wb1N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW1CeUZpZWxkKCdjbGllbnRLZXknLCAnbmFtZScsICdNYXJpZScpLnRoZW4oY2xpZW50ID0+IHtcbiAgICogICAvLyBSZXN1bHRhZG8gZG8gY29uc29sZS5sb2c6IHsgbmFtZTogJ01hcmllJywgYWdlOiAyMyB9XG4gICAqICAgY29uc29sZS5sb2coY2xpZW50KTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoYXZlIGRhIGxpc3RhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE8gY2FtcG8gYSBzZXIgZmlsdHJhZG8uXG4gICAqIEBwYXJhbSB7YW55fSBmaWVsZFZhbHVlIE8gdmFsb3IgZG8gY2FtcG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgY29tIG8gaXRlbSBxdWUgZm9pIGVuY29udHJhZG8uXG4gICAqL1xuICBnZXRJdGVtQnlGaWVsZChrZXk6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkVmFsdWU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGtleSkudGhlbigoc3RvcmFnZVJlY29yZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgIGxldCBzdG9yYWdlUmVjb3Jkc0ZpbHRlcmVkID0gc3RvcmFnZVJlY29yZHMuZmluZChzdG9yYWdlUmVjb3JkID0+IHN0b3JhZ2VSZWNvcmRbZmllbGROYW1lXSA9PT0gZmllbGRWYWx1ZSk7XG4gICAgICBzdG9yYWdlUmVjb3Jkc0ZpbHRlcmVkID0gc3RvcmFnZVJlY29yZHNGaWx0ZXJlZCB8fCBudWxsO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JhZ2VSZWNvcmRzRmlsdGVyZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RhIGNvbSB0b2RhcyBhcyBjaGF2ZXMgYXJtYXplbmFkYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHN0cmluZz4+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIGNvbSB0b2RhcyBhcyBjaGF2ZXMgYXJtYXplbmFkYXMuXG4gICAqL1xuICBrZXlzKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQcm9taXNlLnRoZW4oc3RvcmUgPT4gc3RvcmUua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWFudGlkYWRlIGRlIGNoYXZlcyBhcm1hemVuYWRhcy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBjb20gbyBuw7ptZXJvIGRlIGNoYXZlcyBhcm1hemVuYWRhcy5cbiAgICovXG4gIGxlbmd0aCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQcm9taXNlLnRoZW4oc3RvcmUgPT4gc3RvcmUubGVuZ3RoKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpemFkbyBwYXJhIGdlcmVuY2lhciBvIGJsb3F1ZWlvIGUgZGVzYmxvcXVlaW8gZGUgcmVjdXJzb3Mgbm8gYFBvU3RvcmFnZVNlcnZpY2VgLlxuICAgKiBBZ3VhcmRhbmRvIGEgbGliZXJhw6fDo28gZGEgdXRpbGl6YcOnw6NvIGRvcyByZWN1cnNvcyBxdWUgcGFydGljaXBhbSBkZXN0ZSBjb21wb3J0YW1lbnRvIGUgcG9zdGVyaW9ybWVudGUgZW52b2x2ZSBvIHJlY3Vyc29cbiAgICogcGFzc2FkbyBjb21vIHBhcsOibWV0cm8gZW0gdW0gY29tcG9ydGFtZW50byBkZSBibG9xdWVpbyBlIGRlc2Jsb3F1ZWlvLlxuICAgKlxuICAgKiBFc3RlIG3DqXRvZG8gc2UgY29tcG9ydGEgaWd1YWwgYSB1dGlsaXphw6fDo28gZW0gY29uanVudGEgZG9zIG3DqXRvZG9zOiBgUG9TdG9yYWdlU2VydmljZS5yZXF1ZXN0SWRsZVByb21pc2UoKWAsXG4gICAqIGBQb1N0b3JhZ2VTZXJ2aWNlLmxvY2soKWAgZSBgUG9TdG9yYWdlU2VydmljZS51bmxvb2soKWAuXG4gICAqXG4gICAqIFZlamEgbWFpcyBubyBtw6l0b2RvOiBbYFBvU3RvcmFnZS5yZXF1ZXN0SWRsZVByb21pc2UoKWBdKGRvY3VtZW50YXRpb24vcG8tc3RvcmFnZSNyZXF1ZXN0LWlkbGUtcHJvbWlzZSkuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpbWl0ZWRSZXNvdXJjZSBGdW7Dp8OjbyBxdWUgc2Vyw6EgZW52b2x2aWRhIG5vIGNvbXBvcnRhbWVudG8gZGUgYmxvcXVlaW8gZSBkZXNibG9xdWVpby5cbiAgICovXG4gIGFzeW5jIGxpbWl0ZWRDYWxsV3JhcChsaW1pdGVkUmVzb3VyY2U6IEZ1bmN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGxlUHJvbWlzZSgpO1xuICAgIHJldHVybiB0aGlzLmlkbGVRdWV1ZS53cmFwQ2FsbChsaW1pdGVkUmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudGEgdW0gdmFsb3IgbmEgZmlsYSBkZSBibG9xdWVpbyBkbyBgUG9TdG9yYWdlU2VydmljZWAuIFV0aWxpemFkbyBqdW50YW1lbnRlIGNvbSBvIG3DqXRvZG8gYHVubG9ja2AgcGFyYSBwb2RlclxuICAgKiBjb250cm9sYXIgYSBleGVjdcOnw6NvIGRlIHVtYSBkZXRlcm1pbmFkYSB0YXJlZmEgY29tIG8gYFBvU3RvcmFnZS5yZXF1ZXN0SWRsZVByb21pc2UoKWAuXG4gICAqXG4gICAqIFZlamEgbWFpcyBubyBtw6l0b2RvOiBbYFBvU3RvcmFnZS5yZXF1ZXN0SWRsZVByb21pc2UoKWBdKGRvY3VtZW50YXRpb24vcG8tc3RvcmFnZSNyZXF1ZXN0LWlkbGUtcHJvbWlzZSkuXG4gICAqL1xuICBsb2NrKCkge1xuICAgIHRoaXMuaWRsZVF1ZXVlLmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2UgbyBwcm9jZXNzbyBkZSBpbmljaWFsaXphw6fDo28gZG8gKmRyaXZlciogYXNzw61uY3Jvbm8gZm9pIGNvbmNsdcOtZG8uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvY2FsRm9yYWdlPn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBwcm9jZXNzbyBkZSBpbmljaWFsaXphw6fDo28gZG8gKmRyaXZlciogYXNzw61uY3Jvbm9cbiAgICogZm9yIGNvbmNsdcOtZG8uXG4gICAqL1xuICByZWFkeSgpOiBQcm9taXNlPExvY2FsRm9yYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVtIHZhbG9yIGFzc29jaWFkbyBhIHVtYSBjaGF2ZS5cbiAgICpcbiAgICogQHBhcmFtIHtrZXl9IGtleSBDaGF2ZSBkbyB2YWxvciBxdWUgc2Vyw6EgcmVtb3ZpZG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgYXDDs3MgbyB2YWxvciBzZXIgcmVtb3ZpZG8uXG4gICAqL1xuICByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQcm9taXNlLnRoZW4oc3RvcmUgPT4gc3RvcmUucmVtb3ZlSXRlbShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdW1hIHByb3ByaWVkYWRlIGRlIHVtIG9iamV0byBhcm1hemVuYWRvLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoYXZlIGRvIG9iamV0byBhcm1hemVuYWRvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcHJpZWRhZGUgcXVlIHNlcsOhIHJlbW92aWRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIGFww7NzIGEgcHJvcHJpZWRhZGUgc2VyIHJlbW92aWRhLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlSW5kZXhGcm9tT2JqZWN0KGtleTogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRPYmplY3RPZlN0b3JhZ2Uoa2V5KTtcblxuICAgIGRlbGV0ZSBkYXRhW3Byb3BlcnR5XTtcbiAgICByZXR1cm4gdGhpcy5zZXQoa2V5LCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdW0gb2JqZXRvIGRlIHVtYSBsaXN0YSBhcm1hemVuYWRhIHBlbG8gdmFsb3IgZGUgdW1hIHByb3ByaWVkYWRlLlxuICAgKlxuICAgKiBQb3IgZXhlbXBsbzpcbiAgICpcbiAgICogYGBgIHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50cyA9IFsgeyBuYW1lOiAnTWFyaWUnLCBhZ2U6IDIzIH0sIHsgbmFtZTogJ1BldGhlcicsIGFnZTogMzkgfV07XG4gICAqXG4gICAqIHRoaXMucG9TdG9yYWdlU2VydmljZS5zZXQoJ2NsaWVudEtleScsIGNsaWVudHMpLnRoZW4oKCkgPT4ge30pO1xuICAgKlxuICAgKiAuLi5cbiAgICpcbiAgICogdGhpcy5wb1N0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tQXJyYXkoJ2NsaWVudEtleScsICduYW1lJywgJ01hcmllJykudGhlbigoKSA9PiB7XG4gICAqICAgLy8gTyBvYmpldG8geyBuYW1lOiAnTWFyaWUnLCBhZ2U6IDIzIH0gZm9pIHJlbW92aWRvIGRhIGxpc3RhIHF1ZSBlc3TDoSBuYSBjaGF2ZSAnY2xpZW50S2V5J1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hhdmUgZGEgbGlzdGEgcXVlIGNvbnTDqW0gbyBpdGVtIHF1ZSBzZXLDoSByZW1vdmlkby5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIE8gY2FtcG8gYSBzZXIgZmlsdHJhZG8gbm8gaXRlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIE8gdmFsb3IgZG8gZmlsdHJvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIG9iamV0byBmb3IgcmVtb3ZpZG8gZGEgbGlzdGEuXG4gICAqL1xuICBhc3luYyByZW1vdmVJdGVtRnJvbUFycmF5KGtleTogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0QXJyYXlPZlN0b3JhZ2Uoa2V5KTtcblxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW1bZmllbGRdICE9PSB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGtleSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogPGEgaWQ9XCJyZXF1ZXN0LWlkbGUtcHJvbWlzZVwiPjwvYT5cbiAgICogTcOpdG9kbyBxdWUgdmVyaWZpY2Egc2UgbyBhY2Vzc28gYSBiYXNlIGRlIGRhZG9zIGNvbmZpZ3VyYWRhIGVzdMOhIGxpYmVyYWRvLlxuICAgKlxuICAgKiBVdGlsaXphZG8gZW0gY29uanVudG8gY29tIG9zIG3DqXRvZG9zIGBsb2NrKClgIGUgYHVubG9jaygpYCBlbnRyZSB0YXJlZmFzIHF1ZSBuw6NvIHBvZGVtIHNlciBleGVjdXRhZGFzIGRlIGZvcm1hXG4gICAqIHBhcmFsZWxhLCBwYXJhIG7Do28gY2F1c2FyIGluY29uc2lzdMOqbmNpYXMgbm9zIGRhZG9zLlxuICAgKlxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcbiAgICpcbiAgICogYGBgXG4gICAqIC8vIEFndWFyZGEgYSBsaWJlcmHDp8OjbyBwYXJhIGNvbnRpbnVhclxuICAgKiBhd2FpdCB0aGlzLnBvU3RvcmFnZS5yZXF1ZXN0SWRsZVByb21pc2UoKTtcbiAgICpcbiAgICogdGhpcy5wb1N0b3JhZ2UubG9jaygpO1xuICAgKlxuICAgKiAvLyBFeGVjdXRhIHVtYSB0YXJlZmEgcXVlIGlyw6EgbGVyIGUvb3UgZXNjcmV2ZXIgbmEgYmFzZSBkZSBkYWRvcyBjb25maWd1cmFkYS5cbiAgICpcbiAgICogdGhpcy5wb1N0b3JhZ2UudW5sb2NrKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IMOJIGltcG9ydGFudGUgc2VtcHJlIHV0aWxpesOhLWxvIGFudGVzIGRlIGV4ZWN1dGFyIG9zIG3DqXRvZG9zIGBsb2NrKClgIGUgYHVubG9jaygpYCBwYXJhIGdhcmFudGlyIHF1ZSBhIHRhcmVmYSBzw7NcbiAgICogc2Vyw6EgZXhlY3V0YWRhIGNhc28gbyBhY2Vzc28gZXN0ZWphIGxpdnJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIGFjZXNzbyBhIGJhc2UgZGUgZGFkb3MgY29uZmlndXJhZGEgZXN0aXZlciBsaWJlcmFkby5cbiAgICovXG4gIHJlcXVlc3RJZGxlUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmlkbGVRdWV1ZS5yZXF1ZXN0SWRsZVByb21pc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmF2YSB1bSB2YWxvciBlbSB1bWEgZGV0ZXJtaW5hZGEgY2hhdmUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hhdmUgcGFyYSBvIHZhbG9yIHF1ZSBzZXLDoSBncmF2YWRvLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsb3IgcXVlIHNlcsOhIGdyYXZhZG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9jayBEZWZpbmUgc2UgaXLDoSB0cmF2YXIgYSBsZWl0dXJhIGUgYSBlc2NyaXRhIGRhIGJhc2UgZGUgZGFkb3MgcGFyYSBuw6NvIHNlciBhY2Vzc2FkYSBkZSBmb3JtYSBwYXJhbGVsYS5cbiAgICogQ2FzbyBvdXRyYSBsZWl0dXJhL2VzY3JpdGEgasOhIHRlbmhhIHNpZG8gaW5pY2lhZGEsIGVzdGUgbcOpdG9kbyBpcsOhIGVzcGVyYXIgbyBvdXRybyB0ZXJtaW5hciBwYXJhIGVudMOjbyBjb21lw6dhci5cbiAgICpcbiAgICogUGFkcsOjbzogYGZhbHNlYC5cbiAgICpcbiAgICogPiBFc3RhIGRlZmluacOnw6NvIHPDsyBzZXLDoSB2w6FsaWRhIHNlIG8gb3V0cm8gYWNlc3NvIHBhcmFsZWxvIGEgZXN0ZSBtw6l0b2RvIHRhbWLDqW0gZXN0aXZlciBjb20gbyBwYXLDom1ldHJvICpsb2NrKiBhdGl2YWRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIGFww7NzIG8gdmFsb3IgdGVyIHNpZG8gZ3JhdmFkby5cbiAgICovXG4gIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgbG9jazogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdG9yZSA9IGF3YWl0IHRoaXMuc3RvcmFnZVByb21pc2U7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDogdmFsdWU7XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0SWRsZVByb21pc2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmlkbGVRdWV1ZS53cmFwQ2FsbCgoKSA9PiBzdG9yZS5zZXRJdGVtKGtleSwgbmV3VmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RvcmUuc2V0SXRlbShrZXksIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHJpYnVpIHVtIHZhbG9yIGEgdW1hIHByb3ByaWVkYWRlIGRlIHVtIG9iamV0byBhcm1hemVuYWRvIHBlbGEgY2hhdmUuXG4gICAqXG4gICAqIFBvciBleGVtcGxvOlxuICAgKlxuICAgKiBgYGAgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjbGllbnRzID0gWyB7IG5hbWU6ICdNYXJpZScsIGFnZTogMjMgfSwgeyBuYW1lOiAnUGV0aGVyJywgYWdlOiAzOSB9XTtcbiAgICpcbiAgICogdGhpcy5wb1N0b3JhZ2VTZXJ2aWNlLnNldCgnY2xpZW50S2V5JywgY2xpZW50cykudGhlbigoKSA9PiB7fSk7XG4gICAqXG4gICAqIC4uLlxuICAgKlxuICAgKiB0aGlzLnBvU3RvcmFnZVNlcnZpY2Uuc2V0SW5kZXhUb09iamVjdCgnY2xpZW50S2V5JywgJ25hbWUnLCAnQ2xhcmUnKS50aGVuKCgpID0+IHtcbiAgICogICAvLyBPIG9iamV0byB7IG5hbWU6ICdNYXJpZScsIGFnZTogMjMgfSBwYXNzYSBhIHNlciB7IG5hbWU6ICdDbGFyZScsIGFnZTogMjMgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hhdmUgZG8gb2JqZXRvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTm9tZSBkYSBwcm9wcmllZGFkZSBkbyBvYmpldG8uXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWxvciBxdWUgc2Vyw6EgZ3JhdmFkbyBuYSBwcm9wcmllZGFkZSBkbyBvYmpldG8uXG4gICAqL1xuICBhc3luYyBzZXRJbmRleFRvT2JqZWN0KGtleTogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRPYmplY3RPZlN0b3JhZ2Uoa2V5KTtcblxuICAgIGRhdGFbcHJvcGVydHldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGtleSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50YSB1bSB2YWxvciBuYSBmaWxhIGRlIGJsb3F1ZWlvLiBVdGlsaXphZG8ganVudGFtZW50ZSBjb20gbyBtw6l0b2RvIGBsb2NrYCBwYXJhIHBvZGVyXG4gICAqIGNvbnRyb2xhciBhIGV4ZWN1w6fDo28gZGUgdW1hIGRldGVybWluYWRhIHRhcmVmYSBjb20gbyBgUG9TdG9yYWdlLnJlcXVlc3RJZGxlUHJvbWlzZSgpYC5cbiAgICpcbiAgICogVmVqYSBtYWlzIG5vIG3DqXRvZG86IFtgUG9TdG9yYWdlLnJlcXVlc3RJZGxlUHJvbWlzZSgpYF0oZG9jdW1lbnRhdGlvbi9wby1zdG9yYWdlI3JlcXVlc3QtaWRsZS1wcm9taXNlKS5cbiAgICovXG4gIHVubG9jaygpIHtcbiAgICB0aGlzLmlkbGVRdWV1ZS51bmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXJyYXlPZlN0b3JhZ2Uoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXQoa2V5KTtcbiAgICByZXR1cm4gZGF0YSB8fCBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0SW1tdXRhYmxlSXRlbShrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgdGhpcy5zdG9yYWdlUHJvbWlzZTtcbiAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHN0b3JlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gaXRlbXMgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW1zKSkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWZpbmVMb2NhbEZvcmFnZURyaXZlcihsb2NhbEZvcmFnZUluc3RhbmNlOiBhbnksIGRyaXZlck9yZGVyKSB7XG4gICAgYXdhaXQgbG9jYWxGb3JhZ2VJbnN0YW5jZS5kZWZpbmVEcml2ZXIodGhpcy5sb2tpanNEcml2ZXIuZ2V0RHJpdmVyKCkpO1xuICAgIGF3YWl0IHRoaXMuc2V0RHJpdmVyKGxvY2FsRm9yYWdlSW5zdGFuY2UsIGRyaXZlck9yZGVyKTtcbiAgICByZXR1cm4gbG9jYWxGb3JhZ2VJbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJpdmVyT3JkZXIoZHJpdmVyT3JkZXI6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZHJpdmVyT3JkZXIubWFwKGRyaXZlciA9PiB7XG4gICAgICBzd2l0Y2ggKGRyaXZlcikge1xuICAgICAgICBjYXNlICdpbmRleGVkZGInOlxuICAgICAgICAgIHJldHVybiBMb2NhbEZvcmFnZS5JTkRFWEVEREI7XG4gICAgICAgIGNhc2UgJ3dlYnNxbCc6XG4gICAgICAgICAgcmV0dXJuIExvY2FsRm9yYWdlLldFQlNRTDtcbiAgICAgICAgY2FzZSAnbG9jYWxzdG9yYWdlJzpcbiAgICAgICAgICByZXR1cm4gTG9jYWxGb3JhZ2UuTE9DQUxTVE9SQUdFO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBkcml2ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9iamVjdE9mU3RvcmFnZShrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdldChrZXkpO1xuICAgIHJldHVybiBkYXRhIHx8IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXREcml2ZXIobG9jYWxGb3JhZ2VJbnN0YW5jZTogTG9jYWxGb3JhZ2UsIGRyaXZlck9yZGVyKSB7XG4gICAgYXdhaXQgbG9jYWxGb3JhZ2VJbnN0YW5jZS5zZXREcml2ZXIodGhpcy5nZXREcml2ZXJPcmRlcihkcml2ZXJPcmRlcikpO1xuICAgIHRoaXMuZHJpdmVyID0gbG9jYWxGb3JhZ2VJbnN0YW5jZS5kcml2ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RvcmFnZVByb21pc2UoY29uZmlnOiBQb1N0b3JhZ2VDb25maWcpIHtcbiAgICB0aGlzLnN0b3JhZ2VQcm9taXNlID0gdGhpcy5nZXRTdG9yYWdlSW5zdGFuY2UoY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RvcmFnZUluc3RhbmNlKGNvbmZpZzogUG9TdG9yYWdlQ29uZmlnKSB7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IFBvU3RvcmFnZVNlcnZpY2UuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIGNvbnN0IGFjdHVhbENvbmZpZyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdENvbmZpZywgY29uZmlnIHx8IHt9KTtcblxuICAgIGNvbnN0IGxvY2FsRm9yYWdlSW5zdGFuY2UgPSBMb2NhbEZvcmFnZS5jcmVhdGVJbnN0YW5jZShhY3R1YWxDb25maWcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRlZmluZUxvY2FsRm9yYWdlRHJpdmVyKGxvY2FsRm9yYWdlSW5zdGFuY2UsIGFjdHVhbENvbmZpZy5kcml2ZXJPcmRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgdGhpcyBkcml2ZXJzOiAke2FjdHVhbENvbmZpZy5kcml2ZXJPcmRlci5qb2luKCcsICcpfS5gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdWktbmctc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N0b3JhZ2Uvc3JjL3BvLXVpLW5nLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,2 +1,2 @@
1
- export * from './lib/index';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N0b3JhZ2Uvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9pbmRleCc7XHJcbiJdfQ==
1
+ export * from './lib/index';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N0b3JhZ2Uvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9pbmRleCc7XG4iXX0=