@po-ui/ng-sync 18.23.0 → 19.0.0-next.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 (77) hide show
  1. package/fesm2022/po-ui-ng-sync.mjs +37 -19
  2. package/fesm2022/po-ui-ng-sync.mjs.map +1 -1
  3. package/lib/services/po-http-client/po-http-client.service.d.ts +8 -8
  4. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +1 -1
  5. package/package.json +13 -15
  6. package/po-ui-ng-sync-19.0.0-next.0.tgz +0 -0
  7. package/schematics/collection.json +5 -0
  8. package/schematics/migrations.json +6 -1
  9. package/schematics/ng-add/index.d.ts +1 -5
  10. package/schematics/ng-add/index.js +3 -37
  11. package/schematics/ng-add/index.js.map +1 -1
  12. package/schematics/ng-add/setup-project.d.ts +2 -0
  13. package/schematics/ng-add/setup-project.js +179 -0
  14. package/schematics/ng-add/setup-project.js.map +1 -0
  15. package/schematics/ng-generate/schema/index.js +1 -1
  16. package/schematics/ng-generate/schema/index.js.map +1 -1
  17. package/schematics/ng-update/v14/index.js +2 -2
  18. package/schematics/ng-update/v14/index.js.map +1 -1
  19. package/schematics/ng-update/v15/index.js +2 -2
  20. package/schematics/ng-update/v15/index.js.map +1 -1
  21. package/schematics/ng-update/v16/index.js +2 -2
  22. package/schematics/ng-update/v16/index.js.map +1 -1
  23. package/schematics/ng-update/v17/index.js +2 -2
  24. package/schematics/ng-update/v17/index.js.map +1 -1
  25. package/schematics/ng-update/v18/index.js +2 -2
  26. package/schematics/ng-update/v18/index.js.map +1 -1
  27. package/schematics/ng-update/v19/changes.d.ts +2 -0
  28. package/schematics/ng-update/v19/changes.js +14 -0
  29. package/schematics/ng-update/v19/changes.js.map +1 -0
  30. package/schematics/ng-update/v19/index.d.ts +1 -0
  31. package/schematics/ng-update/v19/index.js +16 -0
  32. package/schematics/ng-update/v19/index.js.map +1 -0
  33. package/schematics/ng-update/v2/index.js +3 -4
  34. package/schematics/ng-update/v2/index.js.map +1 -1
  35. package/schematics/ng-update/v3/index.js +2 -3
  36. package/schematics/ng-update/v3/index.js.map +1 -1
  37. package/schematics/ng-update/v4/index.js +2 -2
  38. package/schematics/ng-update/v4/index.js.map +1 -1
  39. package/schematics/ng-update/v5/index.js +2 -2
  40. package/schematics/ng-update/v5/index.js.map +1 -1
  41. package/schematics/ng-update/v6/index.js +2 -2
  42. package/schematics/ng-update/v6/index.js.map +1 -1
  43. package/esm2022/lib/index.mjs +0 -15
  44. package/esm2022/lib/models/index.mjs +0 -6
  45. package/esm2022/lib/models/po-data-message.model.mjs +0 -57
  46. package/esm2022/lib/models/po-data-transform.model.mjs +0 -23
  47. package/esm2022/lib/models/po-entity/po-entity.model.mjs +0 -217
  48. package/esm2022/lib/models/po-event-sourcing-error-response.model.mjs +0 -21
  49. package/esm2022/lib/models/po-network-status.model.mjs +0 -45
  50. package/esm2022/lib/models/po-network-type.enum.mjs +0 -30
  51. package/esm2022/lib/models/po-query-builder/po-query-builder.model.mjs +0 -246
  52. package/esm2022/lib/models/po-request-type.enum.mjs +0 -16
  53. package/esm2022/lib/po-sync.module.mjs +0 -40
  54. package/esm2022/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +0 -17
  55. package/esm2022/lib/services/po-event-sourcing/index.mjs +0 -4
  56. package/esm2022/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +0 -2
  57. package/esm2022/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +0 -2
  58. package/esm2022/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +0 -379
  59. package/esm2022/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +0 -11
  60. package/esm2022/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +0 -2
  61. package/esm2022/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +0 -2
  62. package/esm2022/lib/services/po-http-client/po-http-client.service.mjs +0 -149
  63. package/esm2022/lib/services/po-http-client/po-http-request-type.enum.mjs +0 -25
  64. package/esm2022/lib/services/po-network/po-network.service.mjs +0 -59
  65. package/esm2022/lib/services/po-schema/index.mjs +0 -4
  66. package/esm2022/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +0 -78
  67. package/esm2022/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +0 -124
  68. package/esm2022/lib/services/po-schema/po-schema.service.mjs +0 -176
  69. package/esm2022/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +0 -2
  70. package/esm2022/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +0 -2
  71. package/esm2022/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +0 -2
  72. package/esm2022/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +0 -2
  73. package/esm2022/lib/services/po-sync/po-sync.service.mjs +0 -336
  74. package/esm2022/lib/utils/utils.mjs +0 -63
  75. package/esm2022/po-ui-ng-sync.mjs +0 -5
  76. package/esm2022/public-api.mjs +0 -2
  77. package/po-ui-ng-sync-18.23.0.tgz +0 -0
@@ -1,176 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { PoSchemaUtil } from './po-schema-util/po-schema-util.model';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./po-schema-definition/po-schema-definition.service";
5
- import * as i2 from "@po-ui/ng-storage";
6
- /**
7
- * @docsPrivate
8
- *
9
- * @description
10
- *
11
- * Serviço que realiza as operações nos `schemas`.
12
- */
13
- export class PoSchemaService {
14
- poSchemaDefinitionService;
15
- poStorage;
16
- constructor(poSchemaDefinitionService, poStorage) {
17
- this.poSchemaDefinitionService = poSchemaDefinitionService;
18
- this.poStorage = poStorage;
19
- }
20
- /**
21
- * Retorna o id a partir de uma chave de um *schema*.
22
- *
23
- * @param {string} schemaKey Chave do *schema* em que será realizada a busca do id.
24
- */
25
- static getIdByRecordKey(schemaKey) {
26
- return schemaKey.split(':')[1];
27
- }
28
- /**
29
- * Retorna a chave do *schema* informado.
30
- *
31
- * @param {string} schemaName Nome do *schema*.
32
- * @param {any} recordId Id do registro.
33
- * @param {boolean} isLocalKey Indica se é uma chave local.
34
- */
35
- static getRecordKey(schemaName, recordId, isLocalKey = false) {
36
- return isLocalKey ? `${schemaName}_local:${recordId}` : `${schemaName}:${recordId}`;
37
- }
38
- /**
39
- * Verifica se o dado informado é uma chave de um *schema*.
40
- *
41
- * @param {string} data Dado que será verificado se é uma chave de um *schema*.
42
- * @param {string} schemaName Nome do *schema*.
43
- */
44
- static isSchemaKey(data, schemaName) {
45
- return data ? data.startsWith(`${schemaName}:`) : false;
46
- }
47
- /**
48
- * Cria um novo registro para o *schema* informado.
49
- *
50
- * @param {PoSyncSchema} schema **Schema* em que será criado o registro.
51
- * @param {object} newRecord Registro que será criado.
52
- */
53
- async create(schema, newRecord) {
54
- const id = PoSchemaUtil.getRecordId(newRecord, schema);
55
- return this.save(schema, newRecord, id);
56
- }
57
- /**
58
- * Destrói as chaves do *storage* que contém os registros dos *schemas*.
59
- *
60
- * @returns {Promise<void>} Promessa que é resolvida quando as chaves referentes aos *schemas* forem destruídas.
61
- */
62
- async destroySchemasRecords() {
63
- const schemas = await this.poSchemaDefinitionService.getAll();
64
- const storageKeys = await this.poStorage.keys();
65
- for (const key of storageKeys) {
66
- const schemaKey = schemas.find(schema => PoSchemaService.isSchemaKey(key, schema.name));
67
- if (schemaKey) {
68
- const id = PoSchemaService.getIdByRecordKey(key);
69
- await this.remove(schemaKey.name, id);
70
- }
71
- }
72
- }
73
- /**
74
- * Retorna o registro referente ao *schema* informado.
75
- *
76
- * @param {string} schemaName Nome do *schema*.
77
- * @param {any} recordId Id do registro.
78
- */
79
- async get(schemaName, recordId) {
80
- const isLocalRecord = true;
81
- const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
82
- const record = await this.getRecord(schemaName, recordId);
83
- return Object.assign(record, localRecord);
84
- }
85
- /**
86
- * Retorna todos os registros referente ao *schema* informado.
87
- *
88
- * @param {string} schemaName Nome do *schema*.
89
- */
90
- async getAll(schemaName) {
91
- const storageKeys = await this.poStorage.keys();
92
- const schemaRecords = [];
93
- for (const key of storageKeys) {
94
- if (PoSchemaService.isSchemaKey(key, schemaName)) {
95
- const id = PoSchemaService.getIdByRecordKey(key);
96
- schemaRecords.push(await this.get(schemaName, id));
97
- }
98
- }
99
- return schemaRecords;
100
- }
101
- /**
102
- * Aguarda a liberação do recurso limitado, posteriormente o envolve em um comportamento
103
- * de bloqueio e desbloqueio.
104
- *
105
- * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
106
- */
107
- limitedCallWrap(limitedResource) {
108
- return this.poStorage.limitedCallWrap(limitedResource);
109
- }
110
- /**
111
- * Remove um registro de um *schema* informado.
112
- *
113
- * @param {string} schemaName Nome do *schema*.
114
- * @param {any} recordId Id do registro.
115
- */
116
- async remove(schemaName, recordId) {
117
- const recordKey = PoSchemaService.getRecordKey(schemaName, recordId);
118
- const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
119
- await this.poStorage.remove(recordKey);
120
- await this.poStorage.remove(localRecordKey);
121
- }
122
- /**
123
- * Atualiza um registro de um *schema* informado.
124
- *
125
- * @param {PoSyncSchema} schema **Schema* referente ao registro que será alterado.
126
- * @param {object} record Registro que será atualizado.
127
- * @param {any} recordId Id do registro que deseja ser alterado. Deve ser utilizado em casos em que o id foi alterado.
128
- */
129
- async update(schema, record, recordId) {
130
- const id = PoSchemaUtil.getRecordId(record, schema);
131
- if (recordId) {
132
- record = await this.updateRecordId(schema.name, record, recordId);
133
- }
134
- return this.save(schema, record, id);
135
- }
136
- /**
137
- * Atualiza todos os registros de um *schema*.
138
- *
139
- * @param {PoSyncSchema} schema **Schema* referente aos registros que serão alterados.
140
- * @param {Array<object>} records Lista de registros que serão alterados.
141
- */
142
- async updateAll(schema, records) {
143
- for (const record of records) {
144
- await this.update(schema, record);
145
- }
146
- }
147
- async getRecord(schemaName, recordId, isLocalRecord = false) {
148
- return (await this.poStorage.get(PoSchemaService.getRecordKey(schemaName, recordId, isLocalRecord))) || {};
149
- }
150
- async save(schema, record, recordId) {
151
- const { serverRecord, localRecord } = PoSchemaUtil.separateSchemaFields(schema, record);
152
- const recordKey = PoSchemaService.getRecordKey(schema.name, recordId);
153
- await this.poStorage.set(recordKey, serverRecord);
154
- await this.saveLocalFields(schema.name, localRecord, recordId);
155
- return record;
156
- }
157
- async saveLocalFields(schemaName, localFields, recordId) {
158
- const containsLocalFields = Object.keys(localFields).length;
159
- if (containsLocalFields) {
160
- const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
161
- await this.poStorage.set(localRecordKey, localFields);
162
- }
163
- }
164
- async updateRecordId(schemaName, record, recordId) {
165
- const isLocalRecord = true;
166
- const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
167
- await this.remove(schemaName, recordId);
168
- return Object.assign(record, localRecord);
169
- }
170
- static ɵfac = function PoSchemaService_Factory(t) { return new (t || PoSchemaService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoStorageService)); };
171
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSchemaService, factory: PoSchemaService.ɵfac });
172
- }
173
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSchemaService, [{
174
- type: Injectable
175
- }], () => [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoStorageService }], null); })();
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc2NoZW1hLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBR3JFOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBRWhCO0lBQ0E7SUFGVixZQUNVLHlCQUFvRCxFQUNwRCxTQUEyQjtRQUQzQiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQ2xDLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQWlCO1FBQy9DLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLFFBQWEsRUFBRSxhQUFzQixLQUFLO1FBQ3hGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsVUFBVSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDekQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFD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IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQb1N0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQHBvLXVpL25nLXN0b3JhZ2UnO1xuXG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRvY3NQcml2YXRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2VydmnDp28gcXVlIHJlYWxpemEgYXMgb3BlcmHDp8O1ZXMgbm9zIGBzY2hlbWFzYC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvU2NoZW1hU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uU2VydmljZTogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvU3RvcmFnZTogUG9TdG9yYWdlU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgbyBpZCBhIHBhcnRpciBkZSB1bWEgY2hhdmUgZGUgdW0gKnNjaGVtYSouXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFLZXkgQ2hhdmUgZG8gKnNjaGVtYSogZW0gcXVlIHNlcsOhIHJlYWxpemFkYSBhIGJ1c2NhIGRvIGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWRCeVJlY29yZEtleShzY2hlbWFLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNjaGVtYUtleS5zcGxpdCgnOicpWzFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgYSBjaGF2ZSBkbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xvY2FsS2V5IEluZGljYSBzZSDDqSB1bWEgY2hhdmUgbG9jYWwuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWNvcmRLZXkoc2NoZW1hTmFtZTogc3RyaW5nLCByZWNvcmRJZDogYW55LCBpc0xvY2FsS2V5OiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0xvY2FsS2V5ID8gYCR7c2NoZW1hTmFtZX1fbG9jYWw6JHtyZWNvcmRJZH1gIDogYCR7c2NoZW1hTmFtZX06JHtyZWNvcmRJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNlIG8gZGFkbyBpbmZvcm1hZG8gw6kgdW1hIGNoYXZlIGRlIHVtICpzY2hlbWEqLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBEYWRvIHF1ZSBzZXLDoSB2ZXJpZmljYWRvIHNlIMOpIHVtYSBjaGF2ZSBkZSB1bSAqc2NoZW1hKi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYU5hbWUgTm9tZSBkbyAqc2NoZW1hKi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlzU2NoZW1hS2V5KGRhdGE6IHN0cmluZywgc2NoZW1hTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGEgPyBkYXRhLnN0YXJ0c1dpdGgoYCR7c2NoZW1hTmFtZX06YCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmlhIHVtIG5vdm8gcmVnaXN0cm8gcGFyYSBvICpzY2hlbWEqIGluZm9ybWFkby5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogZW0gcXVlIHNlcsOhIGNyaWFkbyBvIHJlZ2lzdHJvLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSBjcmlhZG8uXG4gICAqL1xuICBhc3luYyBjcmVhdGUoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIG5ld1JlY29yZDogb2JqZWN0KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBpZCA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChuZXdSZWNvcmQsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZShzY2hlbWEsIG5ld1JlY29yZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryw7NpIGFzIGNoYXZlcyBkbyAqc3RvcmFnZSogcXVlIGNvbnTDqW0gb3MgcmVnaXN0cm9zIGRvcyAqc2NoZW1hcyouXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhb3MgKnNjaGVtYXMqIGZvcmVtIGRlc3RydcOtZGFzLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveVNjaGVtYXNSZWNvcmRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgY29uc3Qgc3RvcmFnZUtleXMgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5rZXlzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzdG9yYWdlS2V5cykge1xuICAgICAgY29uc3Qgc2NoZW1hS2V5ID0gc2NoZW1hcy5maW5kKHNjaGVtYSA9PiBQb1NjaGVtYVNlcnZpY2UuaXNTY2hlbWFLZXkoa2V5LCBzY2hlbWEubmFtZSkpO1xuXG4gICAgICBpZiAoc2NoZW1hS2V5KSB7XG4gICAgICAgIGNvbnN0IGlkID0gUG9TY2hlbWFTZXJ2aWNlLmdldElkQnlSZWNvcmRLZXkoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoc2NoZW1hS2V5Lm5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHJlZ2lzdHJvIHJlZmVyZW50ZSBhbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICovXG4gIGFzeW5jIGdldChzY2hlbWFOYW1lOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlzTG9jYWxSZWNvcmQgPSB0cnVlO1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkID0gYXdhaXQgdGhpcy5nZXRSZWNvcmQoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIGlzTG9jYWxSZWNvcmQpO1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHRoaXMuZ2V0UmVjb3JkKHNjaGVtYU5hbWUsIHJlY29yZElkKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlY29yZCwgbG9jYWxSZWNvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdG9kb3Mgb3MgcmVnaXN0cm9zIHJlZmVyZW50ZSBhbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqL1xuICBhc3luYyBnZXRBbGwoc2NoZW1hTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxvYmplY3Q+PiB7XG4gICAgY29uc3Qgc3RvcmFnZUtleXMgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5rZXlzKCk7XG4gICAgY29uc3Qgc2NoZW1hUmVjb3JkcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmFnZUtleXMpIHtcbiAgICAgIGlmIChQb1NjaGVtYVNlcnZpY2UuaXNTY2hlbWFLZXkoa2V5LCBzY2hlbWFOYW1lKSkge1xuICAgICAgICBjb25zdCBpZCA9IFBvU2NoZW1hU2VydmljZS5nZXRJZEJ5UmVjb3JkS2V5KGtleSk7XG4gICAgICAgIHNjaGVtYVJlY29yZHMucHVzaChhd2FpdCB0aGlzLmdldChzY2hlbWFOYW1lLCBpZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFSZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFndWFyZGEgYSBsaWJlcmHDp8OjbyBkbyByZWN1cnNvIGxpbWl0YWRvLCBwb3N0ZXJpb3JtZW50ZSBvIGVudm9sdmUgZW0gdW0gY29tcG9ydGFtZW50b1xuICAgKiBkZSBibG9xdWVpbyBlIGRlc2Jsb3F1ZWlvLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaW1pdGVkUmVzb3VyY2UgRnVuw6fDo28gcXVlIHNlcsOhIGVudm9sdmlkYSBubyBjb21wb3J0YW1lbnRvIGRlIGJsb3F1ZWlvIGUgZGVzYmxvcXVlaW8uXG4gICAqL1xuICBsaW1pdGVkQ2FsbFdyYXAobGltaXRlZFJlc291cmNlOiBGdW5jdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLmxpbWl0ZWRDYWxsV3JhcChsaW1pdGVkUmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1bSByZWdpc3RybyBkZSB1bSAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICovXG4gIGFzeW5jIHJlbW92ZShzY2hlbWFOYW1lOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IFBvU2NoZW1hU2VydmljZS5nZXRSZWNvcmRLZXkoc2NoZW1hTmFtZSwgcmVjb3JkSWQpO1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkS2V5ID0gUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWFOYW1lLCByZWNvcmRJZCwgdHJ1ZSk7XG5cbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5yZW1vdmUocmVjb3JkS2V5KTtcbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5yZW1vdmUobG9jYWxSZWNvcmRLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dWFsaXphIHVtIHJlZ2lzdHJvIGRlIHVtICpzY2hlbWEqIGluZm9ybWFkby5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogcmVmZXJlbnRlIGFvIHJlZ2lzdHJvIHF1ZSBzZXLDoSBhbHRlcmFkby5cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlY29yZCBSZWdpc3RybyBxdWUgc2Vyw6EgYXR1YWxpemFkby5cbiAgICogQHBhcmFtIHthbnl9IHJlY29yZElkIElkIGRvIHJlZ2lzdHJvIHF1ZSBkZXNlamEgc2VyIGFsdGVyYWRvLiBEZXZlIHNlciB1dGlsaXphZG8gZW0gY2Fzb3MgZW0gcXVlIG8gaWQgZm9pIGFsdGVyYWRvLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKHNjaGVtYTogUG9TeW5jU2NoZW1hLCByZWNvcmQ6IG9iamVjdCwgcmVjb3JkSWQ/OiBhbnkpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlkID0gUG9TY2hlbWFVdGlsLmdldFJlY29yZElkKHJlY29yZCwgc2NoZW1hKTtcblxuICAgIGlmIChyZWNvcmRJZCkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRJZChzY2hlbWEubmFtZSwgcmVjb3JkLCByZWNvcmRJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2F2ZShzY2hlbWEsIHJlY29yZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dWFsaXphIHRvZG9zIG9zIHJlZ2lzdHJvcyBkZSB1bSAqc2NoZW1hKi5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogcmVmZXJlbnRlIGFvcyByZWdpc3Ryb3MgcXVlIHNlcsOjbyBhbHRlcmFkb3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVjb3JkcyBMaXN0YSBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyBhbHRlcmFkb3MuXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHJlY29yZHM6IEFycmF5PG9iamVjdD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZShzY2hlbWEsIHJlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNvcmQoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIGlzTG9jYWxSZWNvcmQgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnBvU3RvcmFnZS5nZXQoUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCkpKSB8fCB7fTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZShzY2hlbWE6IFBvU3luY1NjaGVtYSwgcmVjb3JkOiBvYmplY3QsIHJlY29yZElkOiBhbnkpIHtcbiAgICBjb25zdCB7IHNlcnZlclJlY29yZCwgbG9jYWxSZWNvcmQgfSA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyhzY2hlbWEsIHJlY29yZCk7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWEubmFtZSwgcmVjb3JkSWQpO1xuXG4gICAgYXdhaXQgdGhpcy5wb1N0b3JhZ2Uuc2V0KHJlY29yZEtleSwgc2VydmVyUmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbEZpZWxkcyhzY2hlbWEubmFtZSwgbG9jYWxSZWNvcmQsIHJlY29yZElkKTtcblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVMb2NhbEZpZWxkcyhzY2hlbWFOYW1lOiBzdHJpbmcsIGxvY2FsRmllbGRzOiBvYmplY3QsIHJlY29yZElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGFpbnNMb2NhbEZpZWxkcyA9IE9iamVjdC5rZXlzKGxvY2FsRmllbGRzKS5sZW5ndGg7XG5cbiAgICBpZiAoY29udGFpbnNMb2NhbEZpZWxkcykge1xuICAgICAgY29uc3QgbG9jYWxSZWNvcmRLZXkgPSBQb1NjaGVtYVNlcnZpY2UuZ2V0UmVjb3JkS2V5KHNjaGVtYU5hbWUsIHJlY29yZElkLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMucG9TdG9yYWdlLnNldChsb2NhbFJlY29yZEtleSwgbG9jYWxGaWVsZHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmVjb3JkSWQoc2NoZW1hTmFtZSwgcmVjb3JkLCByZWNvcmRJZCkge1xuICAgIGNvbnN0IGlzTG9jYWxSZWNvcmQgPSB0cnVlO1xuXG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBhd2FpdCB0aGlzLmdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5yZW1vdmUoc2NoZW1hTmFtZSwgcmVjb3JkSWQpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvRGF0YVRyYW5zZm9ybSB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL3BvLWRhdGEtdHJhbnNmb3JtLm1vZGVsJztcbmltcG9ydCB7IFBvTmV0d29ya1R5cGUgfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9wby1uZXR3b3JrLXR5cGUuZW51bSc7XG5cbi8qKlxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIHBhcmEgYSBkZWZpbmnDp8OjbyBkYXMgY29uZmlndXJhw6fDtWVzIGRvIHNpbmNyb25pc21vLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9TeW5jQ29uZmlnIHtcbiAgLyoqXG4gICAqIENsYXNzZSB1c2FkYSBwYXJhIGEgdHJhc2Zvcm1hw6fDo28gZG9zIGRhZG9zIG5hcyByZXF1aXNpw6fDtWVzLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEFkYXB0YW5kbyBhIHJlc3Bvc3RhIGRhIEFQSSBwYXJhIG8gcGFkcsOjbyBkbyBQTyBVSV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqL1xuICBkYXRhVHJhbnNmb3JtPzogUG9EYXRhVHJhbnNmb3JtO1xuXG4gIC8qKlxuICAgKiBUZW1wbyBlbSBzZWd1bmRvcyBkbyBzaWNyb25pc21vIHBlcmnDs2RpY28uXG4gICAqIENhc28gbsOjbyBzZWphIGRlZmluaWRvLCBvIHNpbmNyb25pc21vIHBlcmnDs2RpY28gZXN0YXLDoSBkZXNhYmlsaXRhZG8uXG4gICAqL1xuICBwZXJpb2Q/OiBudW1iZXI7XG5cbiAgLyoqIFRpcG9zIGRlIGNvbmV4w7VlcyBwZXJtaXRpZGFzIHBhcmEgbyBzaW5jcm9uaXNtby4gKi9cbiAgdHlwZTogUG9OZXR3b3JrVHlwZSB8IEFycmF5PFBvTmV0d29ya1R5cGU+O1xufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdXNlZEJ5IFBvU3luY1NlcnZpY2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBJbnRlcmZhY2UgcXVlIGlyw6EgbWFwZWFyIGFzIGNvbmZpZ3VyYcOnw7VlcyBkb3MgY2FtcG9zIGRvIGBQb1N5bmNTY2hlbWFgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY0ZpZWxkT3B0aW9ucyB7XG4gIC8qKiBQcm9wcmllZGFkZSBxdWUgaW5mb3JtYSBvIG5vbWUgZG8gY2FtcG8uICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogUHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgc2UgbyBjYW1wbyBzZXLDoSBhcGVuYXMgcGFyYSBhcm1hemVuYW1lbnRvIGxvY2FsXG4gICAqIG91IHNlIGRldmUgc2VyIGVudmlhZG8gcGFyYSBvIHNlcnZpZG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWw/OiBib29sZWFuO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsJztcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEB1c2VkQnkgUG9TeW5jU2VydmljZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIERlZmluZSBhIHJlc3Bvc3RhIGRvcyBldmVudG9zIGVudmlhZG9zIGFvIHNlcnZpZG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1Jlc3BvbnNlIHtcbiAgLyoqIElkZW50aWZpY2Fkb3IgZG8gZXZlbnRvIG5hIGZpbGEuICovXG4gIGlkOiBudW1iZXI7XG5cbiAgLyoqIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZG8gcmVnaXN0cm8uICovXG4gIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZztcblxuICAvKiogRGFkb3MgZGEgcmVxdWlzacOnw6NvLiAqL1xuICByZXF1ZXN0OiBQb0h0dHBSZXF1ZXN0RGF0YTtcblxuICAvKiogUmVzcG9zdGEgcmV0b3JuYWRhIGFww7NzIGEgdGVudGF0aXZhIGRlIGVudmlvIHBhcmEgbyBzZXJ2aWRvci4gKi9cbiAgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTxPYmplY3Q+IHwgSHR0cEVycm9yUmVzcG9uc2UgfCBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvU3luY0ZpZWxkT3B0aW9ucyB9IGZyb20gJy4vcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZSc7XG5cbi8qKlxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIHF1ZSBpcsOhIG1hcGVhciBhcyBpbmZvcm1hw6fDtWVzIGRvcyByZWN1cnNvcywgcHJpbmNpcGFsbWVudGUgc3VhIG9yaWdlbSBlIGFzIGluZm9ybWHDp8O1ZXMgcXVlIHNlcsOjbyByZXRvcm5hZGFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1NjaGVtYSB7XG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIGEgZGF0YSBkZSBjcmlhw6fDo28gZG8gcmVnaXN0cm8uICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIGEgZGF0YSBkZSBkZWxlw6fDo28uICovXG4gIHJlYWRvbmx5IGRlbGV0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIHNlIG8gcmVnaXN0cm8gZm9pIGV4Y2x1w61kby4gKi9cbiAgcmVhZG9ubHkgZGVsZXRlZEZpZWxkOiBzdHJpbmc7XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBwYXJhIGV4Y2x1aXIgcmVnaXN0cm9zLiAqL1xuICByZWFkb25seSBkZWxldGVVcmxBcGk/OiBzdHJpbmc7XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBxdWUgcHJvdmVyw6EgYXBlbmFzIGRhZG9zIGFsdGVyYWRvcyBubyBzZXJ2aWRvci4gKi9cbiAgcmVhZG9ubHkgZGlmZlVybEFwaTogc3RyaW5nO1xuXG4gIC8qKiBDYW1wb3MgcXVlIHNlcsOjbyByZXRvcm5hZG9zIHBlbGEgQVBJLiAqL1xuICByZWFkb25seSBmaWVsZHM6IEFycmF5PHN0cmluZyB8IFBvU3luY0ZpZWxkT3B0aW9ucz47XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBxdWUgdXRpbGl6YSBvIG3DqXRvZG8gR0VUIHF1ZSBwcm92ZXLDoSBvcyBkYWRvcy4gKi9cbiAgcmVhZG9ubHkgZ2V0VXJsQXBpOiBzdHJpbmc7XG5cbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcmVmZXJlbnRlIGFvIGlkZW50aWZpY2Fkb3Igw7puaWNvIHBhcmEgb3MgaXRlbnMgZG8gKnNjaGVtYSouICovXG4gIHJlYWRvbmx5IGlkRmllbGQ6IHN0cmluZztcblxuICAvKiogSWRlbnRpZmnDp8OjbyBwYXJhIHJlcHJlc2VudGFyIG8gKnNjaGVtYSouICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogUXVhbnRpZGFkZSBkZSBpdGVucyBwb3IgcMOhZ2luYSBxdWUgc2Vyw6EgZW52aWFkbyBwZWxhIEFQSS4gKi9cbiAgcmVhZG9ubHkgcGFnZVNpemU6IG51bWJlcjtcblxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSB1dGlsaXphIG8gbcOpdG9kbyBQVVQgcGFyYSBhdHVhbGl6YXIgcmVnaXN0cm9zLiAqL1xuICByZWFkb25seSBwYXRjaFVybEFwaT86IHN0cmluZztcblxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSB1dGlsaXphIG8gbcOpdG9kbyBQT1NUIHBhcmEgaW5jbHVpciBvcyByZWdpc3Ryb3MuICovXG4gIHJlYWRvbmx5IHBvc3RVcmxBcGk/OiBzdHJpbmc7XG5cbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgYSBkYXRhIGRlIGF0dWFsaXphw6fDo28gZG8gcmVnaXN0cm8uICovXG4gIHJlYWRvbmx5IHVwZGF0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8vIERhdGEvSG9yYSBkYSDDumx0aW1hIHZleiBxdWUgYSBzaW5jcm9uaWEgYWNvbnRlY2V1IHBhcmEgZXNzZSAqc2NoZW1hKi5cbiAgbGFzdFN5bmM/OiBzdHJpbmc7XG59XG4iXX0=
@@ -1,336 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
3
- import { expand, map, mergeMap, reduce } from 'rxjs/operators';
4
- import { validateParameter, validateArray } from '../../utils/utils';
5
- import { PoDataMessage, PoEntity } from '../../models';
6
- import { PoRequestType } from '../../models/po-request-type.enum';
7
- import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "../po-event-sourcing/po-event-sourcing.service";
10
- import * as i2 from "../po-http-client/po-http-client.service";
11
- import * as i3 from "../po-network/po-network.service";
12
- import * as i4 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
- import * as i5 from "./../po-schema/po-schema.service";
14
- /**
15
- * @description
16
- *
17
- * O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão
18
- * armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por
19
- * cada consulta.
20
- */
21
- export class PoSyncService {
22
- poEventSourcingService;
23
- poHttpClient;
24
- poNetworkService;
25
- poSchemaDefinitionService;
26
- poSchemaService;
27
- models = [];
28
- config;
29
- emitter;
30
- eventSub;
31
- finishSyncSubject = new Subject();
32
- isSyncEnabled = true;
33
- schemas;
34
- subscription;
35
- syncing = false;
36
- timer;
37
- constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
38
- this.poEventSourcingService = poEventSourcingService;
39
- this.poHttpClient = poHttpClient;
40
- this.poNetworkService = poNetworkService;
41
- this.poSchemaDefinitionService = poSchemaDefinitionService;
42
- this.poSchemaService = poSchemaService;
43
- }
44
- /**
45
- * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
46
- * as definições dos *schemas*, os registros de cada *schema* e a fila
47
- * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
48
- *
49
- * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
50
- * recomenda-se utilizar o método `prepare()` em seguida.
51
- *
52
- * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
53
- *
54
- * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
55
- */
56
- async destroy() {
57
- const destroyFunction = async () => {
58
- await this.poSchemaService.destroySchemasRecords();
59
- await this.poSchemaDefinitionService.destroy();
60
- await this.poEventSourcingService.destroyEventSourcingQueue();
61
- };
62
- return this.poSchemaService.limitedCallWrap(destroyFunction);
63
- }
64
- /**
65
- * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
66
- *
67
- * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
68
- */
69
- disableSync() {
70
- this.isSyncEnabled = false;
71
- if (this.timer && this.subscription) {
72
- this.subscription.unsubscribe();
73
- }
74
- }
75
- /**
76
- * <a id="enable-sync"></a>
77
- * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
78
- *
79
- * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
80
- */
81
- enableSync() {
82
- this.isSyncEnabled = true;
83
- this.createSubscribe();
84
- }
85
- /**
86
- * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
87
- * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
88
- * deste método.
89
- *
90
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
91
- *
92
- * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
93
- */
94
- getResponses() {
95
- return this.poEventSourcingService.responsesSubject();
96
- }
97
- /**
98
- * Retorna uma instância de `PoEntity` para um determinado *schema*.
99
- *
100
- * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
101
- *
102
- * @param {string} schemaName Nome do *schema*.
103
- * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
104
- */
105
- getModel(schemaName) {
106
- const model = this.models[schemaName];
107
- if (!model) {
108
- throw new Error('Model not found: ' + schemaName);
109
- }
110
- return model;
111
- }
112
- /**
113
- * Insere uma requisição HTTP na fila de eventos do `po-sync`.
114
- *
115
- * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
116
- *
117
- * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
118
- * @param {string} customRequestId Identificador customizado da requisição HTTP.
119
- * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
120
- */
121
- insertHttpCommand(requestData, customRequestId) {
122
- validateParameter({ requestData });
123
- return this.poEventSourcingService.httpCommand(requestData, customRequestId);
124
- }
125
- /**
126
- * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
127
- * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
128
- *
129
- * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
130
- *
131
- * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
132
- * carga inicial for concluída.
133
- */
134
- loadData() {
135
- const loads = [];
136
- this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
137
- return forkJoin(loads);
138
- }
139
- /**
140
- * Responsável por notificar sempre que houver sincronismo.
141
- *
142
- * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
143
- *
144
- * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
145
- */
146
- onSync() {
147
- if (!this.eventSub) {
148
- this.eventSub = Observable.create(e => {
149
- this.emitter = e;
150
- });
151
- }
152
- return this.eventSub;
153
- }
154
- /**
155
- * Prepara a aplicação criando os schemas e aplica as configurações.
156
- *
157
- * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
158
- *
159
- * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
160
- * @param {PoSyncConfig} config Configurações adicionais.
161
- * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
162
- */
163
- prepare(schemas, config) {
164
- validateArray({ schemas });
165
- const defaultSyncConfig = {
166
- type: this.poNetworkService.getConnectionStatus().type,
167
- period: 60,
168
- dataTransform: new PoDataMessage()
169
- };
170
- this.schemas = schemas;
171
- this.config = config || defaultSyncConfig;
172
- this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
173
- this.poEventSourcingService.config = this.config;
174
- this.startTimer(this.config.period);
175
- this.reactiveSync();
176
- this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
177
- return this.saveSchemas().then(() => {
178
- this.schemas.forEach(schema => {
179
- this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
180
- });
181
- return Promise.resolve();
182
- });
183
- }
184
- /**
185
- * Remove um item da fila de eventos que espera a sincronização.
186
- *
187
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
188
- *
189
- * @param {any} idEventSourcing Identificador do item da fila de eventos.
190
- * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
191
- */
192
- removeItemOfSync(idEventSourcing) {
193
- return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
194
- }
195
- /**
196
- * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
197
- *
198
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
199
- *
200
- * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
201
- */
202
- resumeSync() {
203
- if (!this.canSync()) {
204
- const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
205
- finishSyncSubscription.unsubscribe();
206
- return this.sync();
207
- });
208
- return Promise.resolve();
209
- }
210
- return this.sync();
211
- }
212
- /**
213
- * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
214
- *
215
- * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
216
- *
217
- * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
218
- *
219
- * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
220
- */
221
- async sync() {
222
- if (this.canSync()) {
223
- this.startSync();
224
- try {
225
- await this.poEventSourcingService.syncSend();
226
- await this.poEventSourcingService.syncGet();
227
- if (this.emitter) {
228
- this.emitter.next();
229
- }
230
- this.finishSync();
231
- }
232
- catch (error) {
233
- this.syncError();
234
- }
235
- }
236
- }
237
- canSync() {
238
- if (this.syncing || !this.isSyncEnabled) {
239
- return false;
240
- }
241
- else {
242
- const currentConnection = this.poNetworkService.getConnectionStatus();
243
- const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
244
- const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
245
- return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
246
- }
247
- }
248
- createSubscribe() {
249
- if (this.timer) {
250
- this.subscription = this.timer.subscribe(() => {
251
- this.sync().then(() => {
252
- this.subscription.unsubscribe();
253
- this.subscription = null;
254
- this.timer = null;
255
- this.startTimer(this.config.period);
256
- });
257
- });
258
- }
259
- }
260
- finishSync() {
261
- this.syncing = false;
262
- this.finishSyncSubject.next(null);
263
- }
264
- getOnePage(schema, page = 1) {
265
- const params = [];
266
- params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
267
- params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
268
- const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
269
- return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
270
- const now = new Date().getTime();
271
- responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
272
- item.SyncInsertedDateTime = now;
273
- item.SyncUpdatedDateTime = null;
274
- item.SyncExclusionDateTime = null;
275
- item.SyncDeleted = false;
276
- item.SyncStatus = 2;
277
- });
278
- return this.poSchemaService
279
- .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
280
- .then(() => responseBody);
281
- }));
282
- }
283
- loadEntityData(schema) {
284
- let page = 1;
285
- return this.getOnePage(schema, page).pipe(expand(data => {
286
- this.config.dataTransform.transform(data);
287
- const hasNext = this.config.dataTransform.hasNext();
288
- if (hasNext) {
289
- return this.getOnePage(schema, ++page);
290
- }
291
- else {
292
- return of();
293
- }
294
- }), reduce((acc, obj) => {
295
- acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
296
- return acc;
297
- }, {
298
- entity: schema.name,
299
- data: []
300
- }));
301
- }
302
- reactiveSync() {
303
- this.poNetworkService.onChange().subscribe(networkStatus => {
304
- if (networkStatus.status) {
305
- this.startTimer(this.config.period);
306
- return this.sync();
307
- }
308
- if (this.subscription) {
309
- this.subscription.unsubscribe();
310
- }
311
- });
312
- }
313
- async saveSchemas() {
314
- const storageSchemas = await this.poSchemaDefinitionService.getAll();
315
- this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
316
- return this.poSchemaDefinitionService.saveAll(this.schemas);
317
- }
318
- startSync() {
319
- this.syncing = true;
320
- }
321
- startTimer(period) {
322
- if (period && this.isSyncEnabled) {
323
- this.timer = timer(period * 1000);
324
- this.createSubscribe();
325
- }
326
- }
327
- syncError() {
328
- this.finishSync();
329
- }
330
- static ɵfac = function PoSyncService_Factory(t) { return new (t || PoSyncService)(i0.ɵɵinject(i1.PoEventSourcingService), i0.ɵɵinject(i2.PoHttpClientService), i0.ɵɵinject(i3.PoNetworkService), i0.ɵɵinject(i4.PoSchemaDefinitionService), i0.ɵɵinject(i5.PoSchemaService)); };
331
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSyncService, factory: PoSyncService.ɵfac });
332
- }
333
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSyncService, [{
334
- type: Injectable
335
- }], () => [{ type: i1.PoEventSourcingService }, { type: i2.PoHttpClientService }, { type: i3.PoNetworkService }, { type: i4.PoSchemaDefinitionService }, { type: i5.PoSchemaService }], null); })();
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFLdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUtsRjs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sYUFBYTtJQWNkO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFqQlYsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFFckIsTUFBTSxDQUFlO0lBQ3JCLE9BQU8sQ0FBTTtJQUNiLFFBQVEsQ0FBa0I7SUFDMUIsaUJBQWlCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7SUFDdkQsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixPQUFPLENBQXNCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBcUI7SUFFbEMsWUFDVSxzQkFBOEMsRUFDOUMsWUFBaUMsRUFDakMsZ0JBQWtDLEVBQ2xDLHlCQUFvRCxFQUNw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LEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO3VFQTVWVSxhQUFhO2dFQUFiLGFBQWEsV0FBYixhQUFhOztpRkFBYixhQUFhO2NBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZXhwYW5kLCBtYXAsIG1lcmdlTWFwLCByZWR1Y2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBhcmFtZXRlciwgdmFsaWRhdGVBcnJheSB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHsgUG9EYXRhTWVzc2FnZSwgUG9FbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nU2VydmljZSB9IGZyb20gJy4uL3BvLWV2ZW50LXNvdXJjaW5nL3BvLWV2ZW50LXNvdXJjaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdERhdGEgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtcmVxdWVzdC1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb05ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vcG8tbmV0d29yay9wby1uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9SZXF1ZXN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtdXRpbC9wby1zY2hlbWEtdXRpbC5tb2RlbCc7XG5pbXBvcnQgeyBQb1N5bmNDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tc3luYy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1Jlc3BvbnNlIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1NjaGVtYSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gYFBvU3luY1NlcnZpY2VgIMOpIHV0aWxpemFkbyBwYXJhIGNvbmZpZ3VyYXIgdG9kYSBhIGJhc2UgZGUgZGFkb3MgcXVlIHJlY2ViZXLDoSBhcyBpbmZvcm1hw6fDtWVzIHF1ZSBzZXLDo29cbiAqIGFybWF6ZW5hZGFzICpvZmZsaW5lKiB2aW5kYXMgZG8gc2Vydmlkb3IuIE5lbGUgb2NvcnJlIHRvZGEgYSBwcmVwYXJhw6fDo28gZG9zIG1vZGVsb3MgZGUgZGFkb3MgcmV0b3JuYWRvcyBwb3JcbiAqIGNhZGEgY29uc3VsdGEuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb1N5bmNTZXJ2aWNlIHtcbiAgbW9kZWxzOiBBcnJheTxQb0VudGl0eT4gPSBbXTtcblxuICBwcml2YXRlIGNvbmZpZzogUG9TeW5jQ29uZmlnO1xuICBwcml2YXRlIGVtaXR0ZXI6IGFueTtcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxhbnk+O1xuICBwcml2YXRlIGZpbmlzaFN5bmNTdWJqZWN0OiBTdWJqZWN0PG51bGw+ID0gbmV3IFN1YmplY3Q8bnVsbD4oKTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHN5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9FdmVudFNvdXJjaW5nU2VydmljZTogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHBvSHR0cENsaWVudDogUG9IdHRwQ2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIHBvTmV0d29ya1NlcnZpY2U6IFBvTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlOiBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9TY2hlbWFTZXJ2aWNlOiBQb1NjaGVtYVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBEZXN0csOzaSB0b2RhcyBhcyBjaGF2ZXMgZG8gKnN0b3JhZ2UqIHJlZmVyZW50ZXMgYW8gYHBvLXN5bmNgLCBvdSBzZWphLFxuICAgKiBhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKiwgb3MgcmVnaXN0cm9zIGRlIGNhZGEgKnNjaGVtYSogZSBhIGZpbGFcbiAgICogZGUgZXZlbnRvcyBxdWUgZXN0w6NvIHBhcmEgc2VyIGVudmlhZG9zIGFvIHNlcnZpZG9yICooRXZlbnRTb3VyY2luZykqLlxuICAgKlxuICAgKiA+IFBhcmEgcXVlIG7Do28gdmVuaGFtIG9jb3JyZXIgZXJyb3MgZW0gYcOnw7VlcyBxdWUgZGVwZW5kYW0gZGFzIGRlZmluacOnw7VlcyBkb3MgKnNjaGVtYXMqLFxuICAgKiByZWNvbWVuZGEtc2UgdXRpbGl6YXIgbyBtw6l0b2RvIGBwcmVwYXJlKClgIGVtIHNlZ3VpZGEuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQWx0ZXJhbmRvIGFzIGRlZmluacOnw7VlcyBkb3Mgc2NoZW1hc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGFzIGNoYXZlcyByZWZlcmVudGVzIGFvIGBwby1zeW5jYCBmb3JlbSBkZXN0cnXDrWRhcy5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBkZXN0cm95RnVuY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5kZXN0cm95U2NoZW1hc1JlY29yZHMoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZGVzdHJveUV2ZW50U291cmNpbmdRdWV1ZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKGRlc3Ryb3lGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxuICAgKlxuICAgKiA+IFBhcmEgaGFiaWxpdGFyIG5vdmFtZW50ZSBhIHNpbmNyb25pemHDp8OjbyB1dGlsaXplIG8gbcOpdG9kbyBbYFBvU3luY1NlcnZpY2UuZW5hYmxlU3luYygpYF0oZG9jdW1lbnRhdGlvbi9wby1zeW5jI2VuYWJsZS1zeW5jKS5cbiAgICovXG4gIGRpc2FibGVTeW5jKCkge1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMudGltZXIgJiYgdGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIDxhIGlkPVwiZW5hYmxlLXN5bmNcIj48L2E+XG4gICAqIEhhYmlsaXRhIHRvZG9zIG9zIHRpcG9zIGRlIHNpbmNyb25pemHDp8OjbyBkZSBkYWRvcyAocGVyacOzZGljYSwgcmVhdGl2YSBlIG1hbnVhbCkuXG4gICAqXG4gICAqIFBvciBwYWRyw6NvLCBzZW1wcmUgcXVlIHNlIGluaWNpYWxpemEgdW1hIGFwbGljYcOnw6NvIGNvbSBQTyBTeW5jIGFzIHNpbmNyb25pemHDp8O1ZXMgasOhIGVzdMOjbyBoYWJpbGl0YWRhcy5cbiAgICovXG4gIGVuYWJsZVN5bmMoKSB7XG4gICAgdGhpcy5pc1N5bmNFbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcXVlIGRpc3BvbmliaWxpemEgYSBwYXJ0aXIgZGUgc3VhIGluc2NyacOnw6NvIG8gZXZlbnRvIGRlIHJldG9ybm8gZGFzIG9wZXJhw6fDtWVzIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWVcbiAgICogZm9yYW0gZW52aWFkYXMgYW8gc2Vydmlkb3IuIEEgY2FkYSBvcGVyYcOnw6NvIGVudmlhZGEgcGFyYSBvIHNlcnZpZG9yLCBzZXLDoSBkaXNwYXJhZG8gdW0gZXZlbnRvIHBhcmEgYSBpbnNjcmnDp8Ojb1xuICAgKiBkZXN0ZSBtw6l0b2RvLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPn0gT2JzZXJ2YWJsZSBjb20gdW0gb2JqZXRvIGRvIHRpcG8gYFBvU3luY1Jlc3BvbnNlYC5cbiAgICovXG4gIGdldFJlc3BvbnNlcygpOiBPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5yZXNwb25zZXNTdWJqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSB1bWEgaW5zdMOibmNpYSBkZSBgUG9FbnRpdHlgIHBhcmEgdW0gZGV0ZXJtaW5hZG8gKnNjaGVtYSouXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTWFuaXB1bGFuZG8gb3MgcmVnaXN0cm9zIGRlIHVtIHNjaGVtYV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEByZXR1cm5zIHtQb0VudGl0eX0gT2JqZXRvIHBhcmEgZWZldHVhciBjb25zdWx0YXMgZSBhbHRlcmHDp8O1ZXMgbm9zIGRhZG9zLlxuICAgKi9cbiAgZ2V0TW9kZWwoc2NoZW1hTmFtZTogc3RyaW5nKTogUG9FbnRpdHkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbc2NoZW1hTmFtZV07XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBub3QgZm91bmQ6ICcgKyBzY2hlbWFOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VyZSB1bWEgcmVxdWlzacOnw6NvIEhUVFAgbmEgZmlsYSBkZSBldmVudG9zIGRvIGBwby1zeW5jYC5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBJbnNlcmluZG8gcmVxdWlzacOnw7VlcyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7UG9IdHRwUmVxdWVzdERhdGF9IHBvSHR0cFJlcXVlc3REYXRhIERhZG9zIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tUmVxdWVzdElkIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZGEgcmVxdWlzacOnw6NvIEhUVFAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFByb21lc3NhIGNvbSBvIGlkZW50aWZpY2Fkb3IgZGEgcmVxdWlzacOnw6NvIEhUVFAgY3JpYWRhLlxuICAgKi9cbiAgaW5zZXJ0SHR0cENvbW1hbmQocmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhLCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcmVxdWVzdERhdGEgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmh0dHBDb21tYW5kKHJlcXVlc3REYXRhLCBjdXN0b21SZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZXR1YSB1bWEgY2hhbWFkYSBuYSBBUEkgZG8gc2Vydmlkb3IgcGFyYSByZWFsaXphciBhIGNhcmdhIGluaWNpYWwgZG9zIGRhZG9zLiBEZXZlIHNlciBjaGFtYWRvIGFwZW5hcyB1bWEgdmV6XG4gICAqIG5hIGFwbGljYcOnw6NvLCBhcMOzcyBhIHByZXBhcmHDp8OjbyBkb3MgKnNjaGVtYXMqIHJlYWxpemFkYSBhdHJhdsOpcyBkbyBtw6l0b2RvIGBQb1N5bmNTZXJ2aWNlLnByZXBhcmUoKWAuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FyZ2EgaW5pY2lhbCBkb3MgZGFkb3NdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxBcnJheTx7IGVudGl0eTogc3RyaW5nLCBkYXRhOiBBcnJheTxhbnk+IH0+Pn0gT2JzZXJ2YWJsZSBxdWUgbm90aWZpY2Fyw6EgcXVhbmRvIGFcbiAgICogY2FyZ2EgaW5pY2lhbCBmb3IgY29uY2x1w61kYS5cbiAgICovXG4gIGxvYWREYXRhKCk6IE9ic2VydmFibGU8QXJyYXk8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9Pj4ge1xuICAgIGNvbnN0IGxvYWRzOiBBcnJheTxPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4+ID0gW107XG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goZWwgPT4gbG9hZHMucHVzaCh0aGlzLmxvYWRFbnRpdHlEYXRhKGVsKSkpO1xuICAgIHJldHVybiBmb3JrSm9pbihsb2Fkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzcG9uc8OhdmVsIHBvciBub3RpZmljYXIgc2VtcHJlIHF1ZSBob3V2ZXIgc2luY3JvbmlzbW8uXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTm90aWZpY2HDp8OjbyBww7NzLXNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59IE9ic2VydmFibGUgcXVlIMOpIGRpc3BhcmFkbyBhIGNhZGEgc2luY3JvbmlzbW8gcmVhbGl6YWRvLlxuICAgKi9cbiAgb25TeW5jKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XG4gICAgICB0aGlzLmV2ZW50U3ViID0gT2JzZXJ2YWJsZS5jcmVhdGUoZSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRTdWI7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYSBhIGFwbGljYcOnw6NvIGNyaWFuZG8gb3Mgc2NoZW1hcyBlIGFwbGljYSBhcyBjb25maWd1cmHDp8O1ZXMuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gUHJlcGFyYW5kbyBhIGFwbGljYcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxQb1N5bmNTY2hlbWE+fSBzY2hlbWFzIExpc3RhIGRlICpzY2hlbWFzKiBhIHNlcmVtIHByZXBhcmFkb3MuXG4gICAqIEBwYXJhbSB7UG9TeW5jQ29uZmlnfSBjb25maWcgQ29uZmlndXJhw6fDtWVzIGFkaWNpb25haXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgYXBsaWNhw6fDo28gZXN0aXZlciBwcmVwYXJhZGEgcGFyYSBhIHV0aWxpemHDp8OjbyBkbyBgcG8tc3luY2AuXG4gICAqL1xuICBwcmVwYXJlKHNjaGVtYXM6IEFycmF5PFBvU3luY1NjaGVtYT4sIGNvbmZpZz86IFBvU3luY0NvbmZpZyk6IFByb21pc2U8YW55PiB7XG4gICAgdmFsaWRhdGVBcnJheSh7IHNjaGVtYXMgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0U3luY0NvbmZpZzogUG9TeW5jQ29uZmlnID0ge1xuICAgICAgdHlwZTogdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKS50eXBlLFxuICAgICAgcGVyaW9kOiA2MCxcbiAgICAgIGRhdGFUcmFuc2Zvcm06IG5ldyBQb0RhdGFNZXNzYWdlKClcbiAgICB9O1xuXG4gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hcztcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0U3luY0NvbmZpZztcbiAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtID0gdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybSB8fCBuZXcgUG9EYXRhTWVzc2FnZSgpO1xuICAgIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5jb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICB0aGlzLnJlYWN0aXZlU3luYygpO1xuICAgIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5vblNhdmVEYXRhKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luYygpKTtcblxuICAgIHJldHVybiB0aGlzLnNhdmVTY2hlbWFzKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICB0aGlzLm1vZGVsc1tzY2hlbWEubmFtZV0gPSBuZXcgUG9FbnRpdHkodGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLCBzY2hlbWEsIHRoaXMucG9TY2hlbWFTZXJ2aWNlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1bSBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWUgZXNwZXJhIGEgc2luY3Jvbml6YcOnw6NvLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBpZEV2ZW50U291cmNpbmcgSWRlbnRpZmljYWRvciBkbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyDDqSByZW1vdmlkby5cbiAgICovXG4gIHJlbW92ZUl0ZW1PZlN5bmMoaWRFdmVudFNvdXJjaW5nOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVtb3ZlRXZlbnRTb3VyY2luZ0l0ZW0oaWRFdmVudFNvdXJjaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWVudmlhIG9zIGNvbWFuZG9zIHBlbmRlbnRlcyBuYSBmaWxhIChpbmNsdXPDo28sIGFsdGVyYcOnw6NvIGUgZXhjbHVzw6NvKSBlIGJ1c2NhIG5vdm9zIGRhZG9zIGRvIHNlcnZpZG9yLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSByZXNvbHZlIG8gc2luY3JvbmlzbW8gZGlzcGFyYWRvLlxuICAgKi9cbiAgcmVzdW1lU3luYygpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5jYW5TeW5jKCkpIHtcbiAgICAgIGNvbnN0IGZpbmlzaFN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFN5bmNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhcmEgbyBzaW5jcm9uaXNtbyBlbnZpYW5kbyBvcyBldmVudG9zIHBlbmRlbnRlcyAoaW5jbHVzw6NvLCBhbHRlcmHDp8OjbyBlIGV4Y2x1c8OjbykgZSBidXNjYW5kbyBub3ZvcyBkYWRvcyBkbyBzZXJ2aWRvci5cbiAgICpcbiAgICogTyBzaW5jcm9uaXNtbyBzb21lbnRlIHNlcsOhIGV4ZWN1dGFkbyBkZXBvaXMgcXVlIG8gYWNlc3NvIGEgYmFzZSBkZSBkYWRvcyBsb2NhbCBkbyBkaXNwb3NpdGl2byBmb3IgbGliZXJhZGEuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gU2luY3Jvbml6YcOnw6NvIG1hbnVhbF0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIG8gc2luY3JvbmlzbW8gZm9yIGZpbmFsaXphZG8uXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY2FuU3luYygpKSB7XG4gICAgICB0aGlzLnN0YXJ0U3luYygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY1NlbmQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnN5bmNHZXQoKTtcblxuICAgICAgICBpZiAodGhpcy5lbWl0dGVyKSB7XG4gICAgICAgICAgdGhpcy5lbWl0dGVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmluaXNoU3luYygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zeW5jRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhblN5bmMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3luY2luZyB8fCAhdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uID0gdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIGNvbnN0IGlzQ29uZmlndXJlZENvbm5lY3Rpb24gPSB0aGlzLmNvbmZpZyAmJiBjdXJyZW50Q29ubmVjdGlvbi50eXBlID09PSB0aGlzLmNvbmZpZy50eXBlO1xuICAgICAgY29uc3QgaXNDb25maWdJbmNsdWRlc1R5cGUgPVxuICAgICAgICB0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy50eXBlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy5jb25maWcudHlwZS5pbmNsdWRlcyhjdXJyZW50Q29ubmVjdGlvbi50eXBlKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnRDb25uZWN0aW9uLnN0YXR1cyAmJiAoIXRoaXMuY29uZmlnIHx8IGlzQ29uZmlndXJlZENvbm5lY3Rpb24gfHwgaXNDb25maWdJbmNsdWRlc1R5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMudGltZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY29uZmlnLnBlcmlvZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZmluaXNoU3luY1N1YmplY3QubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T25lUGFnZShzY2hlbWE6IFBvU3luY1NjaGVtYSwgcGFnZTogbnVtYmVyID0gMSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlU2l6ZVBhcmFtTmFtZSgpfT0ke3NjaGVtYS5wYWdlU2l6ZX1gKTtcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlfWApO1xuXG4gICAgY29uc3QgdXJsID0gYCR7UG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKX0/JHtwYXJhbXMuam9pbignJicpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuZ2V0KHVybCkucGlwZShcbiAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlQm9keSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICByZXNwb25zZUJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgaXRlbS5TeW5jSW5zZXJ0ZWREYXRlVGltZSA9IG5vdztcbiAgICAgICAgICBpdGVtLlN5bmNVcGRhdGVkRGF0ZVRpbWUgPSBudWxsO1xuICAgICAgICAgIGl0ZW0uU3luY0V4Y2x1c2lvbkRhdGVUaW1lID0gbnVsbDtcbiAgICAgICAgICBpdGVtLlN5bmNEZWxldGVkID0gZmFsc2U7XG4gICAgICAgICAgaXRlbS5TeW5jU3RhdHVzID0gMjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZVxuICAgICAgICAgIC51cGRhdGVBbGwoc2NoZW1hLCByZXNwb25zZUJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXSlcbiAgICAgICAgICAudGhlbigoKSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRW50aXR5RGF0YShzY2hlbWE6IFBvU3luY1NjaGVtYSk6IE9ic2VydmFibGU8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9PiB7XG4gICAgbGV0IHBhZ2UgPSAxO1xuICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCBwYWdlKS5waXBlKFxuICAgICAgZXhwYW5kKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLnRyYW5zZm9ybShkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpO1xuICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCArK3BhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHJlZHVjZShcbiAgICAgICAgKGFjYywgb2JqKSA9PiB7XG4gICAgICAgICAgYWNjLmRhdGEgPSBhY2MuZGF0YS5jb25jYXQob2JqW3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBlbnRpdHk6IHNjaGVtYS5uYW1lLFxuICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFjdGl2ZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5wb05ldHdvcmtTZXJ2aWNlLm9uQ2hhbmdlKCkuc3Vic2NyaWJlKG5ldHdvcmtTdGF0dXMgPT4ge1xuICAgICAgaWYgKG5ldHdvcmtTdGF0dXMuc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlU2NoZW1hcygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN0b3JhZ2VTY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+ID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLmdldEFsbCgpO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiAoc2NoZW1hLmxhc3RTeW5jID0gUG9TY2hlbWFVdGlsLmdldExhc3RTeW5jKHN0b3JhZ2VTY2hlbWFzLCBzY2hlbWEubmFtZSkpKTtcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLnNhdmVBbGwodGhpcy5zY2hlbWFzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY2luZyA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZXIocGVyaW9kKTogdm9pZCB7XG4gICAgaWYgKHBlcmlvZCAmJiB0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHRoaXMudGltZXIgPSB0aW1lcihwZXJpb2QgKiAxMDAwKTtcbiAgICAgIHRoaXMuY3JlYXRlU3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5maW5pc2hTeW5jKCk7XG4gIH1cbn1cbiJdfQ==