@po-ui/ng-sync 15.15.0 → 16.0.0-next.2

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 (127) hide show
  1. package/README.md +3 -3
  2. package/{esm2020 → esm2022}/lib/index.mjs +14 -14
  3. package/{esm2020 → esm2022}/lib/models/index.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/models/po-data-message.model.mjs +56 -56
  5. package/esm2022/lib/models/po-data-transform.model.mjs +23 -0
  6. package/esm2022/lib/models/po-entity/po-entity.model.mjs +217 -0
  7. package/esm2022/lib/models/po-event-sourcing-error-response.model.mjs +21 -0
  8. package/esm2022/lib/models/po-network-status.model.mjs +45 -0
  9. package/{esm2020 → esm2022}/lib/models/po-network-type.enum.mjs +29 -29
  10. package/esm2022/lib/models/po-query-builder/po-query-builder.model.mjs +246 -0
  11. package/{esm2020 → esm2022}/lib/models/po-request-type.enum.mjs +15 -15
  12. package/{esm2020 → esm2022}/lib/po-sync.module.mjs +40 -40
  13. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +16 -16
  14. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/index.mjs +3 -3
  15. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +1 -1
  16. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +1 -1
  17. package/esm2022/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +379 -0
  18. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +10 -10
  19. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +1 -1
  20. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +1 -1
  21. package/esm2022/lib/services/po-http-client/po-http-client.service.mjs +149 -0
  22. package/{esm2020 → esm2022}/lib/services/po-http-client/po-http-request-type.enum.mjs +24 -24
  23. package/esm2022/lib/services/po-network/po-network.service.mjs +59 -0
  24. package/{esm2020 → esm2022}/lib/services/po-schema/index.mjs +3 -3
  25. package/esm2022/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +78 -0
  26. package/esm2022/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +124 -0
  27. package/esm2022/lib/services/po-schema/po-schema.service.mjs +176 -0
  28. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +1 -1
  30. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +1 -1
  31. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +1 -1
  32. package/esm2022/lib/services/po-sync/po-sync.service.mjs +336 -0
  33. package/{esm2020 → esm2022}/lib/utils/utils.mjs +62 -62
  34. package/{esm2020 → esm2022}/po-ui-ng-sync.mjs +4 -4
  35. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  36. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs +2004 -1962
  37. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs.map +1 -1
  38. package/index.d.ts +5 -5
  39. package/lib/index.d.ts +14 -14
  40. package/lib/models/index.d.ts +5 -5
  41. package/lib/models/po-data-message.model.d.ts +46 -46
  42. package/lib/models/po-data-transform.model.d.ts +52 -52
  43. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  44. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  45. package/lib/models/po-network-status.model.d.ts +25 -25
  46. package/lib/models/po-network-type.enum.d.ts +28 -28
  47. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  48. package/lib/models/po-request-type.enum.d.ts +14 -14
  49. package/lib/po-sync.module.d.ts +11 -11
  50. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  51. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  52. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  53. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  54. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -74
  55. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  56. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  57. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  58. package/lib/services/po-http-client/po-http-client.service.d.ts +78 -78
  59. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  60. package/lib/services/po-network/po-network.service.d.ts +35 -35
  61. package/lib/services/po-schema/index.d.ts +3 -3
  62. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -51
  63. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  64. package/lib/services/po-schema/po-schema.service.d.ts +98 -98
  65. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  66. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  67. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  68. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  69. package/lib/services/po-sync/po-sync.service.d.ts +162 -162
  70. package/lib/utils/utils.d.ts +36 -36
  71. package/package.json +10 -16
  72. package/po-ui-ng-sync-16.0.0-next.2.tgz +0 -0
  73. package/public-api.d.ts +1 -1
  74. package/schematics/migrations.json +1 -1
  75. package/schematics/ng-add/index.d.ts +7 -7
  76. package/schematics/ng-add/index.js +31 -31
  77. package/schematics/ng-add/index.spec.d.ts +1 -1
  78. package/schematics/ng-add/index.spec.js +60 -60
  79. package/schematics/ng-generate/schema/index.d.ts +4 -4
  80. package/schematics/ng-generate/schema/index.js +12 -12
  81. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  82. package/schematics/ng-generate/schema/index.spec.js +44 -44
  83. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  84. package/schematics/ng-generate/schema/schema.js +2 -2
  85. package/schematics/ng-update/v14/changes.d.ts +2 -2
  86. package/schematics/ng-update/v14/changes.js +13 -13
  87. package/schematics/ng-update/v14/index.d.ts +1 -1
  88. package/schematics/ng-update/v14/index.js +15 -15
  89. package/schematics/ng-update/v15/changes.d.ts +4 -4
  90. package/schematics/ng-update/v15/changes.js +15 -15
  91. package/schematics/ng-update/v15/index.d.ts +1 -1
  92. package/schematics/ng-update/v15/index.js +36 -36
  93. package/schematics/ng-update/v2/changes.d.ts +8 -8
  94. package/schematics/ng-update/v2/changes.js +20 -20
  95. package/schematics/ng-update/v2/index.d.ts +5 -5
  96. package/schematics/ng-update/v2/index.js +101 -101
  97. package/schematics/ng-update/v3/changes.d.ts +2 -2
  98. package/schematics/ng-update/v3/changes.js +14 -14
  99. package/schematics/ng-update/v3/index.d.ts +1 -1
  100. package/schematics/ng-update/v3/index.js +16 -16
  101. package/schematics/ng-update/v4/changes.d.ts +2 -2
  102. package/schematics/ng-update/v4/changes.js +14 -14
  103. package/schematics/ng-update/v4/index.d.ts +1 -1
  104. package/schematics/ng-update/v4/index.js +15 -15
  105. package/schematics/ng-update/v5/changes.d.ts +2 -2
  106. package/schematics/ng-update/v5/changes.js +13 -13
  107. package/schematics/ng-update/v5/index.d.ts +1 -1
  108. package/schematics/ng-update/v5/index.js +15 -15
  109. package/schematics/ng-update/v6/changes.d.ts +2 -2
  110. package/schematics/ng-update/v6/changes.js +13 -13
  111. package/schematics/ng-update/v6/index.d.ts +1 -1
  112. package/schematics/ng-update/v6/index.js +15 -15
  113. package/esm2020/lib/models/po-data-transform.model.mjs +0 -22
  114. package/esm2020/lib/models/po-entity/po-entity.model.mjs +0 -214
  115. package/esm2020/lib/models/po-event-sourcing-error-response.model.mjs +0 -17
  116. package/esm2020/lib/models/po-network-status.model.mjs +0 -44
  117. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +0 -238
  118. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +0 -372
  119. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +0 -148
  120. package/esm2020/lib/services/po-network/po-network.service.mjs +0 -56
  121. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +0 -77
  122. package/esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +0 -124
  123. package/esm2020/lib/services/po-schema/po-schema.service.mjs +0 -174
  124. package/esm2020/lib/services/po-sync/po-sync.service.mjs +0 -325
  125. package/fesm2015/po-ui-ng-sync.mjs +0 -2113
  126. package/fesm2015/po-ui-ng-sync.mjs.map +0 -1
  127. package/po-ui-ng-sync-15.15.0.tgz +0 -0
@@ -1,214 +0,0 @@
1
- import { validateParameter } from '../../utils/utils';
2
- import { PoEventSourcingOperation } from '../../services/po-event-sourcing';
3
- import { PoQueryBuilder } from './../po-query-builder/po-query-builder.model';
4
- import { PoSchemaUtil } from '../../services/po-schema';
5
- /**
6
- * @description
7
- *
8
- * Uma instância `PoEntity` representa um *schema* e ela contém métodos que possibilitam manipular seus registros,
9
- * como por exemplo: buscar, criar e remover.
10
- *
11
- * Esta instância pode ser obtida a partir do retorno do método `PoSyncService.getModel('schema name')`.
12
- */
13
- export class PoEntity {
14
- constructor(eventSourcing, schema, poSchemaService) {
15
- this.eventSourcing = eventSourcing;
16
- this.schema = schema;
17
- this.poSchemaService = poSchemaService;
18
- }
19
- /**
20
- * Busca os registros do *schema*, podendo filtrar o resultado a partir do filtro passado e retornando apenas
21
- * os campos definidos.
22
- *
23
- * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
24
- * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
25
- *
26
- * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
27
- * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
28
- * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
29
- * Por exemplo, a definição abaixo:
30
- *
31
- * ```
32
- * PoQueryBuilder.select('name age address');
33
- * ```
34
- * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
35
- *
36
- * ```
37
- * PoQueryBuilder.select('-name -age');
38
- * ```
39
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
40
- */
41
- find(filter, fields) {
42
- const query = new PoQueryBuilder(this.poSchemaService, this.schema);
43
- if (filter) {
44
- query.filter(filter);
45
- }
46
- if (fields) {
47
- query.select(fields);
48
- }
49
- return query;
50
- }
51
- /**
52
- * Busca um registro pelo seu *id*.
53
- *
54
- * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
55
- * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
56
- *
57
- * @param {any} id Identificador do registro.
58
- * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
59
- * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
60
- * Por exemplo, a definição abaixo:
61
- *
62
- * ```
63
- * PoQueryBuilder.select('name age address');
64
- * ```
65
- * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
66
- *
67
- * ```
68
- * PoQueryBuilder.select('-name -age');
69
- * ```
70
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
71
- */
72
- findById(id, fields) {
73
- return this.findOne({ [this.schema.idField]: id }, fields);
74
- }
75
- /**
76
- * Semelhante ao método `PoEntity.find()`, porém retorna apenas o primeiro registro encontrado na busca.
77
- *
78
- * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
79
- * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
80
- *
81
- * @param {any} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
82
- * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
83
- * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
84
- * Por exemplo, a definição abaixo:
85
- *
86
- * ```
87
- * PoQueryBuilder.select('name age address');
88
- * ```
89
- * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
90
- *
91
- * ```
92
- * PoQueryBuilder.select('-name -age');
93
- * ```
94
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
95
- */
96
- findOne(filter, fields) {
97
- const query = this.find(filter, fields);
98
- query.limit(1);
99
- return query;
100
- }
101
- /**
102
- * Remove um registro.
103
- *
104
- * @param {object} record Registro que será removido.
105
- * @param {string} customRequestId Identificador customizado do comando.
106
- * @returns {Promise} Promessa que é concluída após o registro ser removido.
107
- */
108
- async remove(record, customRequestId) {
109
- validateParameter({ record });
110
- const remove = async () => {
111
- const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;
112
- const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];
113
- await this.poSchemaService.remove(this.schema.name, record[idField]);
114
- await this.eventSourcing.remove(this.schema.name, serverRecord, customRequestId);
115
- };
116
- return this.poSchemaService.limitedCallWrap(remove);
117
- }
118
- /**
119
- * Altera ou inclui um registro.
120
- *
121
- * > O registro será alterado se ele possuir um *id*, caso contrário um novo registro será criado.
122
- *
123
- * @param {object} record Registro que será persistido.
124
- * @param {string} customRequestId Identificador customizado do comando.
125
- * @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.
126
- */
127
- async save(record, customRequestId) {
128
- validateParameter({ record });
129
- return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));
130
- }
131
- /**
132
- * Salva uma lista de registros em lote.
133
- *
134
- * > Para cada registro da lista, será inserido um novo registro se o mesmo não tiver *id*, caso contrário
135
- * será contado como uma atualização de um registro existente.
136
- *
137
- * @param {Array<object>} records Lista de registros que serão persistidos.
138
- * @param {Array<string> | string} customRequestIds Identificador customizado do comando.
139
- *
140
- * Ao passar uma lista de identificadores, cada índice da lista de identificadores deverá
141
- * corresponder ao índice do registro na lista de registros.
142
- * @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.
143
- */
144
- async saveAll(records, customRequestIds) {
145
- validateParameter({ records });
146
- const saveAll = async () => {
147
- const batchEvents = [];
148
- for (let index = 0; index < records.length; index++) {
149
- const record = records[index];
150
- const sendToEventSourcing = false;
151
- const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(record);
152
- const updatedRecord = await this.selectSaveType(record, sendToEventSourcing);
153
- if (isNonLocalRecordChanged) {
154
- const customRequestId = customRequestIds instanceof Array ? customRequestIds[index] : customRequestIds;
155
- const eventOperation = this.createEventOperation(record, updatedRecord, customRequestId);
156
- batchEvents.push(eventOperation);
157
- }
158
- }
159
- await this.eventSourcing.createBatchEvents(this.schema.name, batchEvents);
160
- };
161
- return this.poSchemaService.limitedCallWrap(saveAll);
162
- }
163
- async create(newRecord, sendToEventSourcing, customRequestId) {
164
- const time = new Date().getTime();
165
- const syncProperties = {
166
- [PoSchemaUtil.syncInternalIdFieldName]: time,
167
- SyncInsertedDateTime: time,
168
- SyncUpdatedDateTime: null,
169
- SyncExclusionDateTime: null,
170
- SyncDeleted: false,
171
- SyncStatus: 0
172
- };
173
- const recordWithSyncProperties = { ...newRecord, ...syncProperties };
174
- const recordedData = await this.poSchemaService.create(this.schema, recordWithSyncProperties);
175
- if (sendToEventSourcing) {
176
- await this.eventSourcing.create(this.schema.name, recordWithSyncProperties, customRequestId);
177
- }
178
- return recordedData;
179
- }
180
- createEventOperation(record, updatedRecord, customRequestId) {
181
- const operation = PoSchemaUtil.getRecordId(record, this.schema)
182
- ? PoEventSourcingOperation.Update
183
- : PoEventSourcingOperation.Insert;
184
- const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
185
- return {
186
- record: serverRecord,
187
- customRequestId: customRequestId,
188
- operation: operation
189
- };
190
- }
191
- async isNonLocalRecordChanged(updatedRecord) {
192
- const nonLocalFieldNames = PoSchemaUtil.getNonLocalFieldNames(this.schema);
193
- const record = await this.poSchemaService.get(this.schema.name, updatedRecord[this.schema.idField]);
194
- return !PoSchemaUtil.isModelsEqual(nonLocalFieldNames, record, updatedRecord);
195
- }
196
- async selectSaveType(record, sendToEventSourcing, customRequestId) {
197
- const hasId = PoSchemaUtil.getRecordId(record, this.schema);
198
- return hasId
199
- ? await this.update(record, sendToEventSourcing, customRequestId)
200
- : await this.create(record, sendToEventSourcing, customRequestId);
201
- }
202
- async update(updatedRecord, sendToEventSourcing, customRequestId) {
203
- updatedRecord.SyncUpdatedDateTime = new Date().getTime();
204
- updatedRecord.SyncStatus = 0;
205
- const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(updatedRecord);
206
- const recordedData = await this.poSchemaService.update(this.schema, updatedRecord);
207
- if (isNonLocalRecordChanged && sendToEventSourcing) {
208
- const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
209
- await this.eventSourcing.update(this.schema.name, serverRecord, customRequestId);
210
- }
211
- return recordedData;
212
- }
213
- }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL21vZGVscy9wby1lbnRpdHkvcG8tZW50aXR5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sRUFDTCx3QkFBd0IsRUFHekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFtQixZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd6RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFDVSxhQUFxQyxFQUNyQyxNQUFvQixFQUNwQixlQUFnQztRQUZoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFDdkMsQ0FBQztJQUVKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLENBQUMsTUFBZSxFQUFFLE1BQWU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEUsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsUUFBUSxDQUFDLEVBQU8sRUFBRSxNQUFlO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsT0FBTyxDQUFDLE1BQVksRUFBRSxNQUFlO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWMsRUFBRSxlQUF3QjtRQUNuRCxpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFOUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDeEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUM7WUFDekcsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUYsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNyRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLGVBQXdCO1FBQ2pELGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBc0IsRUFBRSxnQkFBeUM7UUFDN0UsaUJBQWlCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRS9CLE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUV2QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFFbEMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUU3RSxJQUFJLHVCQUF1QixFQUFFO29CQUMzQixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDdkcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQ3pGLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ2xDO2FBQ0Y7WUFFRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFjLEVBQUUsbUJBQTRCLEVBQUUsZUFBd0I7UUFDekYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVsQyxNQUFNLGNBQWMsR0FBRztZQUNyQixDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLElBQUk7WUFDNUMsb0JBQW9CLEVBQUUsSUFBSTtZQUMxQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsV0FBVyxFQUFFLEtBQUs7WUFDbEIsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDO1FBQ0YsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFFckUsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFFOUYsSUFBSSxtQkFBbUIsRUFBRTtZQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixNQUFjLEVBQ2QsYUFBcUIsRUFDckIsZUFBd0I7UUFFeEIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM3RCxDQUFDLENBQUMsd0JBQXdCLENBQUMsTUFBTTtZQUNqQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO1FBRXBDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRW5HLE9BQU87WUFDTCxNQUFNLEVBQUUsWUFBWTtZQUNwQixlQUFlLEVBQUUsZUFBZTtZQUNoQyxTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxhQUFxQjtRQUN6RCxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXBHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FDMUIsTUFBYyxFQUNkLG1CQUE0QixFQUM1QixlQUF3QjtRQUV4QixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUQsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWtCLEVBQUUsbUJBQTRCLEVBQUUsZUFBd0I7UUFDN0YsYUFBYSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFN0IsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbkYsSUFBSSx1QkFBdUIsSUFBSSxtQkFBbUIsRUFBRTtZQUNsRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNsRjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24sXHJcbiAgUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICBQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbVxyXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BvLWV2ZW50LXNvdXJjaW5nJztcclxuaW1wb3J0IHsgUG9RdWVyeUJ1aWxkZXIgfSBmcm9tICcuLy4uL3BvLXF1ZXJ5LWJ1aWxkZXIvcG8tcXVlcnktYnVpbGRlci5tb2RlbCc7XHJcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSwgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tc2NoZW1hJztcclxuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIFVtYSBpbnN0w6JuY2lhIGBQb0VudGl0eWAgcmVwcmVzZW50YSB1bSAqc2NoZW1hKiBlIGVsYSBjb250w6ltIG3DqXRvZG9zIHF1ZSBwb3NzaWJpbGl0YW0gbWFuaXB1bGFyIHNldXMgcmVnaXN0cm9zLFxyXG4gKiBjb21vIHBvciBleGVtcGxvOiBidXNjYXIsIGNyaWFyIGUgcmVtb3Zlci5cclxuICpcclxuICogRXN0YSBpbnN0w6JuY2lhIHBvZGUgc2VyIG9idGlkYSBhIHBhcnRpciBkbyByZXRvcm5vIGRvIG3DqXRvZG8gYFBvU3luY1NlcnZpY2UuZ2V0TW9kZWwoJ3NjaGVtYSBuYW1lJylgLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBvRW50aXR5IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2luZzogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgc2NoZW1hOiBQb1N5bmNTY2hlbWEsXHJcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBCdXNjYSBvcyByZWdpc3Ryb3MgZG8gKnNjaGVtYSosIHBvZGVuZG8gZmlsdHJhciBvIHJlc3VsdGFkbyBhIHBhcnRpciBkbyBmaWx0cm8gcGFzc2FkbyBlIHJldG9ybmFuZG8gYXBlbmFzXHJcbiAgICogb3MgY2FtcG9zIGRlZmluaWRvcy5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZHMgQ2FtcG9zIHF1ZSBzZXLDo28gcmV0b3JuYWRvcyBub3MgcmVnaXN0cm9zLiBFc3RlIGNhbXBvcyBkZXZlbSBlc3RhciBkZW50cm8gZGVcclxuICAgKiB1bWEgKnN0cmluZyogc2VwYXJhZG9zIHBvciBlc3Bhw6dvIHBvZGVuZG8gdXNhciBvIGNhcmFjdGVyZSBgLWAgcGFyYSBleGNsdWlyIGNhbXBvcy5cclxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcclxuICAgKiBgYGBcclxuICAgKiBJcsOhIHJldG9ybmFyIGFwZW5hcyBvcyBjYW1wb3MgYG5hbWVgLCBgYWdlYCBlIGBhZGRyZXNzYC4gRSBwYXJhIG7Do28gbW9zdHJhciB1bSBjYW1wbyBvdSBtYWlzIGJhc3RhIGZhemVyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCctbmFtZSAtYWdlJyk7XHJcbiAgICogYGBgXHJcbiAgICogQHJldHVybnMge1BvUXVlcnlCdWlsZGVyfSBPYmpldG8gcXVlIHBvc3NpYmlsaXRhIGVuY2FkZWFyIHVtIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICBmaW5kKGZpbHRlcj86IG9iamVjdCwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUG9RdWVyeUJ1aWxkZXIodGhpcy5wb1NjaGVtYVNlcnZpY2UsIHRoaXMuc2NoZW1hKTtcclxuXHJcbiAgICBpZiAoZmlsdGVyKSB7XHJcbiAgICAgIHF1ZXJ5LmZpbHRlcihmaWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZHMpIHtcclxuICAgICAgcXVlcnkuc2VsZWN0KGZpZWxkcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzY2EgdW0gcmVnaXN0cm8gcGVsbyBzZXUgKmlkKi5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gaWQgSWRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXHJcbiAgICogdW1hICpzdHJpbmcqIHNlcGFyYWRvcyBwb3IgZXNwYcOnbyBwb2RlbmRvIHVzYXIgbyBjYXJhY3RlcmUgYC1gIHBhcmEgZXhjbHVpciBjYW1wb3MuXHJcbiAgICogUG9yIGV4ZW1wbG8sIGEgZGVmaW5pw6fDo28gYWJhaXhvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCduYW1lIGFnZSBhZGRyZXNzJyk7XHJcbiAgICogYGBgXHJcbiAgICogSXLDoSByZXRvcm5hciBhcGVuYXMgb3MgY2FtcG9zIGBuYW1lYCwgYGFnZWAgZSBgYWRkcmVzc2AuIEUgcGFyYSBuw6NvIG1vc3RyYXIgdW0gY2FtcG8gb3UgbWFpcyBiYXN0YSBmYXplcjpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIFBvUXVlcnlCdWlsZGVyLnNlbGVjdCgnLW5hbWUgLWFnZScpO1xyXG4gICAqIGBgYFxyXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgZmluZEJ5SWQoaWQ6IGFueSwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZE9uZSh7IFt0aGlzLnNjaGVtYS5pZEZpZWxkXTogaWQgfSwgZmllbGRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbWVsaGFudGUgYW8gbcOpdG9kbyBgUG9FbnRpdHkuZmluZCgpYCwgcG9yw6ltIHJldG9ybmEgYXBlbmFzIG8gcHJpbWVpcm8gcmVnaXN0cm8gZW5jb250cmFkbyBuYSBidXNjYS5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZHMgQ2FtcG9zIHF1ZSBzZXLDo28gcmV0b3JuYWRvcyBub3MgcmVnaXN0cm9zLiBFc3RlIGNhbXBvcyBkZXZlbSBlc3RhciBkZW50cm8gZGVcclxuICAgKiB1bWEgKnN0cmluZyogc2VwYXJhZG9zIHBvciBlc3Bhw6dvIHBvZGVuZG8gdXNhciBvIGNhcmFjdGVyZSBgLWAgcGFyYSBleGNsdWlyIGNhbXBvcy5cclxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcclxuICAgKiBgYGBcclxuICAgKiBJcsOhIHJldG9ybmFyIGFwZW5hcyBvcyBjYW1wb3MgYG5hbWVgLCBgYWdlYCBlIGBhZGRyZXNzYC4gRSBwYXJhIG7Do28gbW9zdHJhciB1bSBjYW1wbyBvdSBtYWlzIGJhc3RhIGZhemVyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCctbmFtZSAtYWdlJyk7XHJcbiAgICogYGBgXHJcbiAgICogQHJldHVybnMge1BvUXVlcnlCdWlsZGVyfSBPYmpldG8gcXVlIHBvc3NpYmlsaXRhIGVuY2FkZWFyIHVtIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICBmaW5kT25lKGZpbHRlcj86IGFueSwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmZpbmQoZmlsdGVyLCBmaWVsZHMpO1xyXG4gICAgcXVlcnkubGltaXQoMSk7XHJcbiAgICByZXR1cm4gcXVlcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdW0gcmVnaXN0cm8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSByZW1vdmlkby5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tUmVxdWVzdElkIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZG8gY29tYW5kby5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWVzc2EgcXVlIMOpIGNvbmNsdcOtZGEgYXDDs3MgbyByZWdpc3RybyBzZXIgcmVtb3ZpZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlKHJlY29yZDogb2JqZWN0LCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXIoeyByZWNvcmQgfSk7XHJcblxyXG4gICAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpZEZpZWxkID0gcmVjb3JkW3RoaXMuc2NoZW1hLmlkRmllbGRdID8gdGhpcy5zY2hlbWEuaWRGaWVsZCA6IFBvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZTtcclxuICAgICAgY29uc3Qgc2VydmVyUmVjb3JkID0gUG9TY2hlbWFVdGlsLnNlcGFyYXRlU2NoZW1hRmllbGRzKHRoaXMuc2NoZW1hLCByZWNvcmQpWydzZXJ2ZXJSZWNvcmQnXTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnJlbW92ZSh0aGlzLnNjaGVtYS5uYW1lLCByZWNvcmRbaWRGaWVsZF0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcucmVtb3ZlKHRoaXMuc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChyZW1vdmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWx0ZXJhIG91IGluY2x1aSB1bSByZWdpc3Ryby5cclxuICAgKlxyXG4gICAqID4gTyByZWdpc3RybyBzZXLDoSBhbHRlcmFkbyBzZSBlbGUgcG9zc3VpciB1bSAqaWQqLCBjYXNvIGNvbnRyw6FyaW8gdW0gbm92byByZWdpc3RybyBzZXLDoSBjcmlhZG8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSBwZXJzaXN0aWRvLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyBjb21hbmRvLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9tZXNzYSBxdWUgw6kgY29uY2x1w61kYSBhcMOzcyBvIHJlZ2lzdHJvIHNlciBhbHRlcmFkbyBvdSBpbmNsdcOtZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgc2F2ZShyZWNvcmQ6IG9iamVjdCwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcmVjb3JkIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAodGhpcy5zZWxlY3RTYXZlVHlwZS5iaW5kKHRoaXMsIHJlY29yZCwgdHJ1ZSwgY3VzdG9tUmVxdWVzdElkKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYWx2YSB1bWEgbGlzdGEgZGUgcmVnaXN0cm9zIGVtIGxvdGUuXHJcbiAgICpcclxuICAgKiA+IFBhcmEgY2FkYSByZWdpc3RybyBkYSBsaXN0YSwgc2Vyw6EgaW5zZXJpZG8gdW0gbm92byByZWdpc3RybyBzZSBvIG1lc21vIG7Do28gdGl2ZXIgKmlkKiwgY2FzbyBjb250csOhcmlvXHJcbiAgICogc2Vyw6EgY29udGFkbyBjb21vIHVtYSBhdHVhbGl6YcOnw6NvIGRlIHVtIHJlZ2lzdHJvIGV4aXN0ZW50ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVjb3JkcyBMaXN0YSBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyBwZXJzaXN0aWRvcy5cclxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCBzdHJpbmd9IGN1c3RvbVJlcXVlc3RJZHMgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyBjb21hbmRvLlxyXG4gICAqXHJcbiAgICogQW8gcGFzc2FyIHVtYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMsIGNhZGEgw61uZGljZSBkYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMgZGV2ZXLDoVxyXG4gICAqIGNvcnJlc3BvbmRlciBhbyDDrW5kaWNlIGRvIHJlZ2lzdHJvIG5hIGxpc3RhIGRlIHJlZ2lzdHJvcy5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgY29uY2x1w61kYSBhcMOzcyBvcyByZWdpc3Ryb3Mgc2VyZW0gYWx0ZXJhZG9zIG91IGluY2x1w61kb3MuXHJcbiAgICovXHJcbiAgYXN5bmMgc2F2ZUFsbChyZWNvcmRzOiBBcnJheTxvYmplY3Q+LCBjdXN0b21SZXF1ZXN0SWRzPzogQXJyYXk8c3RyaW5nPiB8IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlY29yZHMgfSk7XHJcblxyXG4gICAgY29uc3Qgc2F2ZUFsbCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgYmF0Y2hFdmVudHMgPSBbXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZWNvcmRzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IHNlbmRUb0V2ZW50U291cmNpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNOb25Mb2NhbFJlY29yZENoYW5nZWQgPSBhd2FpdCB0aGlzLmlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKHJlY29yZCk7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJlY29yZCA9IGF3YWl0IHRoaXMuc2VsZWN0U2F2ZVR5cGUocmVjb3JkLCBzZW5kVG9FdmVudFNvdXJjaW5nKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXN0b21SZXF1ZXN0SWQgPSBjdXN0b21SZXF1ZXN0SWRzIGluc3RhbmNlb2YgQXJyYXkgPyBjdXN0b21SZXF1ZXN0SWRzW2luZGV4XSA6IGN1c3RvbVJlcXVlc3RJZHM7XHJcbiAgICAgICAgICBjb25zdCBldmVudE9wZXJhdGlvbiA9IHRoaXMuY3JlYXRlRXZlbnRPcGVyYXRpb24ocmVjb3JkLCB1cGRhdGVkUmVjb3JkLCBjdXN0b21SZXF1ZXN0SWQpO1xyXG4gICAgICAgICAgYmF0Y2hFdmVudHMucHVzaChldmVudE9wZXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcuY3JlYXRlQmF0Y2hFdmVudHModGhpcy5zY2hlbWEubmFtZSwgYmF0Y2hFdmVudHMpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHNhdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGUobmV3UmVjb3JkOiBhbnksIHNlbmRUb0V2ZW50U291cmNpbmc6IGJvb2xlYW4sIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgY29uc3Qgc3luY1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgIFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdOiB0aW1lLFxyXG4gICAgICBTeW5jSW5zZXJ0ZWREYXRlVGltZTogdGltZSxcclxuICAgICAgU3luY1VwZGF0ZWREYXRlVGltZTogbnVsbCxcclxuICAgICAgU3luY0V4Y2x1c2lvbkRhdGVUaW1lOiBudWxsLFxyXG4gICAgICBTeW5jRGVsZXRlZDogZmFsc2UsXHJcbiAgICAgIFN5bmNTdGF0dXM6IDBcclxuICAgIH07XHJcbiAgICBjb25zdCByZWNvcmRXaXRoU3luY1Byb3BlcnRpZXMgPSB7IC4uLm5ld1JlY29yZCwgLi4uc3luY1Byb3BlcnRpZXMgfTtcclxuXHJcbiAgICBjb25zdCByZWNvcmRlZERhdGEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5jcmVhdGUodGhpcy5zY2hlbWEsIHJlY29yZFdpdGhTeW5jUHJvcGVydGllcyk7XHJcblxyXG4gICAgaWYgKHNlbmRUb0V2ZW50U291cmNpbmcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5ldmVudFNvdXJjaW5nLmNyZWF0ZSh0aGlzLnNjaGVtYS5uYW1lLCByZWNvcmRXaXRoU3luY1Byb3BlcnRpZXMsIGN1c3RvbVJlcXVlc3RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlY29yZGVkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRPcGVyYXRpb24oXHJcbiAgICByZWNvcmQ6IG9iamVjdCxcclxuICAgIHVwZGF0ZWRSZWNvcmQ6IG9iamVjdCxcclxuICAgIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZ1xyXG4gICk6IFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChyZWNvcmQsIHRoaXMuc2NoZW1hKVxyXG4gICAgICA/IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5VcGRhdGVcclxuICAgICAgOiBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSW5zZXJ0O1xyXG5cclxuICAgIGNvbnN0IHNlcnZlclJlY29yZCA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyh0aGlzLnNjaGVtYSwgdXBkYXRlZFJlY29yZClbJ3NlcnZlclJlY29yZCddO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlY29yZDogc2VydmVyUmVjb3JkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWQ6IGN1c3RvbVJlcXVlc3RJZCxcclxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKHVwZGF0ZWRSZWNvcmQ6IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3Qgbm9uTG9jYWxGaWVsZE5hbWVzID0gUG9TY2hlbWFVdGlsLmdldE5vbkxvY2FsRmllbGROYW1lcyh0aGlzLnNjaGVtYSk7XHJcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5nZXQodGhpcy5zY2hlbWEubmFtZSwgdXBkYXRlZFJlY29yZFt0aGlzLnNjaGVtYS5pZEZpZWxkXSk7XHJcblxyXG4gICAgcmV0dXJuICFQb1NjaGVtYVV0aWwuaXNNb2RlbHNFcXVhbChub25Mb2NhbEZpZWxkTmFtZXMsIHJlY29yZCwgdXBkYXRlZFJlY29yZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNlbGVjdFNhdmVUeXBlKFxyXG4gICAgcmVjb3JkOiBvYmplY3QsXHJcbiAgICBzZW5kVG9FdmVudFNvdXJjaW5nOiBib29sZWFuLFxyXG4gICAgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIGNvbnN0IGhhc0lkID0gUG9TY2hlbWFVdGlsLmdldFJlY29yZElkKHJlY29yZCwgdGhpcy5zY2hlbWEpO1xyXG5cclxuICAgIHJldHVybiBoYXNJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXBkYXRlKHJlY29yZCwgc2VuZFRvRXZlbnRTb3VyY2luZywgY3VzdG9tUmVxdWVzdElkKVxyXG4gICAgICA6IGF3YWl0IHRoaXMuY3JlYXRlKHJlY29yZCwgc2VuZFRvRXZlbnRTb3VyY2luZywgY3VzdG9tUmVxdWVzdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlKHVwZGF0ZWRSZWNvcmQ6IGFueSwgc2VuZFRvRXZlbnRTb3VyY2luZzogYm9vbGVhbiwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIHVwZGF0ZWRSZWNvcmQuU3luY1VwZGF0ZWREYXRlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgdXBkYXRlZFJlY29yZC5TeW5jU3RhdHVzID0gMDtcclxuXHJcbiAgICBjb25zdCBpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCA9IGF3YWl0IHRoaXMuaXNOb25Mb2NhbFJlY29yZENoYW5nZWQodXBkYXRlZFJlY29yZCk7XHJcbiAgICBjb25zdCByZWNvcmRlZERhdGEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS51cGRhdGUodGhpcy5zY2hlbWEsIHVwZGF0ZWRSZWNvcmQpO1xyXG5cclxuICAgIGlmIChpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCAmJiBzZW5kVG9FdmVudFNvdXJjaW5nKSB7XHJcbiAgICAgIGNvbnN0IHNlcnZlclJlY29yZCA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyh0aGlzLnNjaGVtYSwgdXBkYXRlZFJlY29yZClbJ3NlcnZlclJlY29yZCddO1xyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcudXBkYXRlKHRoaXMuc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVjb3JkZWREYXRhO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,17 +0,0 @@
1
- /**
2
- * @description
3
- *
4
- * Classe que define a resposta de erro para um item da fila de eventos que não foi enviado ao servidor por
5
- * alguma inconsistência.
6
- *
7
- * > Pode ser utilizada em casos onde um item da fila é enviado ao servidor com inconsistência nos dados, por exemplo
8
- * uma operação de *delete* ou *update* sem o `id` do objeto.
9
- */
10
- export class PoEventSourcingErrorResponse {
11
- /* istanbul ignore next */
12
- constructor({ message, operation }) {
13
- this.message = message;
14
- this.operation = operation;
15
- }
16
- }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmctZXJyb3ItcmVzcG9uc2UubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQU92QywwQkFBMEI7SUFDMUIsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9lbnVtcy9wby1ldmVudC1zb3VyY2luZy1vcGVyYXRpb24uZW51bSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIENsYXNzZSBxdWUgZGVmaW5lIGEgcmVzcG9zdGEgZGUgZXJybyBwYXJhIHVtIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zIHF1ZSBuw6NvIGZvaSBlbnZpYWRvIGFvIHNlcnZpZG9yIHBvclxyXG4gKiBhbGd1bWEgaW5jb25zaXN0w6puY2lhLlxyXG4gKlxyXG4gKiA+IFBvZGUgc2VyIHV0aWxpemFkYSBlbSBjYXNvcyBvbmRlIHVtIGl0ZW0gZGEgZmlsYSDDqSBlbnZpYWRvIGFvIHNlcnZpZG9yIGNvbSBpbmNvbnNpc3TDqm5jaWEgbm9zIGRhZG9zLCBwb3IgZXhlbXBsb1xyXG4gKiB1bWEgb3BlcmHDp8OjbyBkZSAqZGVsZXRlKiBvdSAqdXBkYXRlKiBzZW0gbyBgaWRgIGRvIG9iamV0by5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIHtcclxuICAvKiogTWVuc2FnZW0gZGUgZXJyby4gKi9cclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBPcGVyYcOnw6NvIHF1ZSBoYXZpYSBzaWRvIHJlcXVpc2l0YWRhLiAqL1xyXG4gIG9wZXJhdGlvbjogUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uO1xyXG5cclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgb3BlcmF0aW9uIH0pIHtcclxuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcclxuICB9XHJcbn1cclxuIl19
@@ -1,44 +0,0 @@
1
- import { PoNetworkType } from './po-network-type.enum';
2
- /**
3
- * @description
4
- *
5
- * Classe responsável por identificar a conexão de rede disponível no dispositivo.
6
- */
7
- export class PoNetworkStatus {
8
- constructor(networtkType) {
9
- this.setNetworkConnection(networtkType);
10
- }
11
- /**
12
- * Retorna se o dispositivo está conectado na rede.
13
- *
14
- * @returns {boolean} Status da conexão com a rede.
15
- */
16
- get status() {
17
- return this.type !== PoNetworkType.none;
18
- }
19
- /**
20
- * Retorna o tipo de conexão do dispositivo.
21
- *
22
- * @returns {PoNetworkType} Tipo da conexão com a rede.
23
- */
24
- get type() {
25
- return this._type;
26
- }
27
- set type(type) {
28
- this._type = type;
29
- }
30
- /* istanbul ignore next */
31
- setDefaultTypeNavigation() {
32
- return navigator.onLine ? PoNetworkType['ethernet'] : PoNetworkType.none;
33
- }
34
- setNetworkConnection(networtkType) {
35
- if (!networtkType) {
36
- this.type = this.setDefaultTypeNavigation();
37
- }
38
- else {
39
- const isGenerationMobile = ['2g', '3g', '4g'].includes(networtkType);
40
- this.type = isGenerationMobile ? PoNetworkType['_' + networtkType] : PoNetworkType[String(networtkType)];
41
- }
42
- }
43
- }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tbmV0d29yay1zdGF0dXMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvbW9kZWxzL3BvLW5ldHdvcmstc3RhdHVzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBWSxZQUFZO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFtQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsMEJBQTBCO0lBQ2xCLHdCQUF3QjtRQUM5QixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUMzRSxDQUFDO0lBRU8sb0JBQW9CLENBQUMsWUFBWTtRQUN2QyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDN0M7YUFBTTtZQUNMLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVyRSxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDMUc7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb05ldHdvcmtUeXBlIH0gZnJvbSAnLi9wby1uZXR3b3JrLXR5cGUuZW51bSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIENsYXNzZSByZXNwb25zw6F2ZWwgcG9yIGlkZW50aWZpY2FyIGEgY29uZXjDo28gZGUgcmVkZSBkaXNwb27DrXZlbCBubyBkaXNwb3NpdGl2by5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb05ldHdvcmtTdGF0dXMge1xyXG4gIHByaXZhdGUgX3R5cGU6IFBvTmV0d29ya1R5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5ldHdvcnRrVHlwZSkge1xyXG4gICAgdGhpcy5zZXROZXR3b3JrQ29ubmVjdGlvbihuZXR3b3J0a1R5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0b3JuYSBzZSBvIGRpc3Bvc2l0aXZvIGVzdMOhIGNvbmVjdGFkbyBuYSByZWRlLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFN0YXR1cyBkYSBjb25leMOjbyBjb20gYSByZWRlLlxyXG4gICAqL1xyXG4gIGdldCBzdGF0dXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlICE9PSBQb05ldHdvcmtUeXBlLm5vbmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRvcm5hIG8gdGlwbyBkZSBjb25leMOjbyBkbyBkaXNwb3NpdGl2by5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtQb05ldHdvcmtUeXBlfSBUaXBvIGRhIGNvbmV4w6NvIGNvbSBhIHJlZGUuXHJcbiAgICovXHJcbiAgZ2V0IHR5cGUoKTogUG9OZXR3b3JrVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcclxuICB9XHJcblxyXG4gIHNldCB0eXBlKHR5cGU6IFBvTmV0d29ya1R5cGUpIHtcclxuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xyXG4gIH1cclxuXHJcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICBwcml2YXRlIHNldERlZmF1bHRUeXBlTmF2aWdhdGlvbigpIHtcclxuICAgIHJldHVybiBuYXZpZ2F0b3Iub25MaW5lID8gUG9OZXR3b3JrVHlwZVsnZXRoZXJuZXQnXSA6IFBvTmV0d29ya1R5cGUubm9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TmV0d29ya0Nvbm5lY3Rpb24obmV0d29ydGtUeXBlKTogdm9pZCB7XHJcbiAgICBpZiAoIW5ldHdvcnRrVHlwZSkge1xyXG4gICAgICB0aGlzLnR5cGUgPSB0aGlzLnNldERlZmF1bHRUeXBlTmF2aWdhdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaXNHZW5lcmF0aW9uTW9iaWxlID0gWycyZycsICczZycsICc0ZyddLmluY2x1ZGVzKG5ldHdvcnRrVHlwZSk7XHJcblxyXG4gICAgICB0aGlzLnR5cGUgPSBpc0dlbmVyYXRpb25Nb2JpbGUgPyBQb05ldHdvcmtUeXBlWydfJyArIG5ldHdvcnRrVHlwZV0gOiBQb05ldHdvcmtUeXBlW1N0cmluZyhuZXR3b3J0a1R5cGUpXTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -1,238 +0,0 @@
1
- import { validateParameter } from '../../utils/utils';
2
- /**
3
- * @description
4
- *
5
- * Classe utilitária para construir consultas sobre os registros de um *schema*.
6
- *
7
- * A utilização dos métodos desta classe é feita a partir do retorno do método `PoEntity.find()`. Por exemplo,
8
- * para utilizar o método `PoQueryBuilder.page()`, é necessário:
9
- *
10
- * ``` typescript
11
- * PoSyncService.getModel('schema name').find().page(2).exec();
12
- * ```
13
- *
14
- * O `PoQueryBuilder` foi projetado para que os seus métodos sejam
15
- * chamados em cascata e ao final desse encadeamento invocar o método
16
- * `PoQueryBuilder.exec()` para que a busca seja concluída. Por exemplo:
17
- *
18
- * ``` typescript
19
- * PoSyncService
20
- * .getModel('schema name')
21
- * .find()
22
- * .page(2)
23
- * .pageSize(5)
24
- * .sort()
25
- * .exec();
26
- * ```
27
- */
28
- export class PoQueryBuilder {
29
- constructor(poSchemaService, schema) {
30
- this.poSchemaService = poSchemaService;
31
- this.schema = schema;
32
- this._page = 1;
33
- this.filters = {};
34
- }
35
- /**
36
- * Ao final da chamada dos métodos do `PoQueryBuilder` utilizados, este método deve ser chamado para que a busca seja concluída.
37
- *
38
- * @return {Promise<PoResponseApi | object>} Registros do *schema* na qual foi aplicado a consulta.
39
- */
40
- async exec() {
41
- let storageData = await this.poSchemaService.getAll(this.schema.name);
42
- if (storageData && storageData.length) {
43
- if (Object.keys(this.filters).length) {
44
- storageData = this.applyFilters(storageData);
45
- }
46
- if (this.fields) {
47
- storageData = this.applyFields(this.schema.fields, storageData);
48
- }
49
- if (this._sort) {
50
- storageData = this.order(storageData, this._sort);
51
- }
52
- if (this._limit) {
53
- return storageData[0];
54
- }
55
- else {
56
- return this.paginate(storageData);
57
- }
58
- }
59
- else {
60
- return {
61
- hasNext: false,
62
- items: []
63
- };
64
- }
65
- }
66
- /**
67
- * Aplica filtros sobre os registros, baseados nos campos e valores definidos como filtro. Por exemplo:
68
- *
69
- * ```
70
- * PoQueryBuilder.filter({ name: 'Marie', age: 24 });
71
- * ```
72
- * Retorna todos os registros que contenham a propriedade `name` igual a Marie e `age` igual a 24.
73
- *
74
- * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
75
- *
76
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
77
- */
78
- filter(filter) {
79
- if (filter && typeof filter === 'object') {
80
- this.filters = { ...this.filters, ...filter };
81
- }
82
- else {
83
- throw new Error('Filter must be an object');
84
- }
85
- return this;
86
- }
87
- /**
88
- * Limita o número de registros que serão retornados.
89
- *
90
- * @param {number} limit Número de registros retornados.
91
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
92
- */
93
- limit(limit) {
94
- this._limit = limit;
95
- return this;
96
- }
97
- /**
98
- * Especifica a página de registros que se deseja retornar.
99
- *
100
- * @param {number} page Número da página.
101
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
102
- */
103
- page(page) {
104
- validateParameter({ page });
105
- this._page = page;
106
- return this;
107
- }
108
- /**
109
- * Define quantos elementos serão retornados por página.
110
- *
111
- * @param {number} pageSize Número de registros por página.
112
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
113
- */
114
- pageSize(pageSize) {
115
- validateParameter({ pageSize });
116
- this._pageSize = pageSize;
117
- return this;
118
- }
119
- /**
120
- * Utilizado para definir quais campos do *schema* serão retornados na consulta.
121
- *
122
- * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
123
- * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
124
- * Por exemplo, a definição abaixo:
125
- *
126
- * ```
127
- * PoQueryBuilder.select('name age address');
128
- * ```
129
- * Irá retornar apenas os campos `name`, `age` e `address`. Para não retornar um campo ou mais basta fazer:
130
- *
131
- * ```
132
- * PoQueryBuilder.select('-name -age');
133
- * ```
134
- *
135
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
136
- */
137
- select(fields) {
138
- validateParameter({ fields });
139
- this.fields = fields;
140
- return this;
141
- }
142
- /**
143
- * Ordena os registros por um campo.
144
- *
145
- * @param {string} field Campo a ser ordenado. Para ordenar de forma decrescente basta colocar o caractere `-`
146
- * na frente do campo. Por exemplo:
147
- * ```
148
- * PoQueryBuilder.sort('-name');
149
- * ```
150
- *
151
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
152
- */
153
- sort(field) {
154
- validateParameter({ field });
155
- this._sort = field;
156
- return this;
157
- }
158
- /**
159
- * Essa função serve como alias para o `PoQueryBuilder.filter()`. É utilizada somente para dar maior legibilidade ao código.
160
- *
161
- * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
162
- * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
163
- */
164
- where(filter) {
165
- return this.filter(filter);
166
- }
167
- applyFields(schemaFields, data) {
168
- const receivedFields = this.fields.split(' ');
169
- let restrictedFields = [];
170
- let selectedFields = [];
171
- [selectedFields, restrictedFields] = this.groupFields(receivedFields);
172
- if (!selectedFields.length && restrictedFields.length) {
173
- selectedFields = [...schemaFields];
174
- }
175
- if (restrictedFields.length) {
176
- selectedFields = this.removeRestrictedFields(restrictedFields, selectedFields);
177
- }
178
- selectedFields = this.removeDuplicate(selectedFields);
179
- return this.removeFieldsData(data, selectedFields);
180
- }
181
- applyFilters(data) {
182
- Object.keys(this.filters).forEach(filterKey => {
183
- data = data.filter(item => item[filterKey] === this.filters[filterKey]);
184
- });
185
- return data;
186
- }
187
- groupFields(receivedFields) {
188
- const restrictedFields = [];
189
- const selectedFields = [];
190
- receivedFields.forEach(fields => {
191
- if (fields.startsWith('-')) {
192
- restrictedFields.push(fields.substring(1));
193
- }
194
- else {
195
- selectedFields.push(fields);
196
- }
197
- });
198
- return [selectedFields, restrictedFields];
199
- }
200
- paginate(data) {
201
- const dataLength = data.length;
202
- const pageSize = this._pageSize || dataLength;
203
- const pages = Math.ceil(dataLength / pageSize);
204
- const begin = this._page * pageSize - pageSize;
205
- const end = begin + pageSize;
206
- return { hasNext: this._page < pages, items: data.slice(begin, end) };
207
- }
208
- order(data, sortingField) {
209
- const descendingOrder = sortingField.startsWith('-');
210
- sortingField = descendingOrder ? sortingField.substr(1) : sortingField;
211
- return data.sort((optionA, optionB) => {
212
- if (optionA[sortingField] > optionB[sortingField]) {
213
- return !descendingOrder ? 1 : -1;
214
- }
215
- if (optionA[sortingField] < optionB[sortingField]) {
216
- return !descendingOrder ? -1 : 1;
217
- }
218
- return 0;
219
- });
220
- }
221
- removeDuplicate(fields) {
222
- return fields.filter((item, position) => fields.indexOf(item) === position);
223
- }
224
- removeFieldsData(data, chosenFields) {
225
- data.forEach(item => {
226
- Object.keys(item).forEach(keyItem => {
227
- if (!chosenFields.includes(keyItem)) {
228
- delete item[keyItem];
229
- }
230
- });
231
- });
232
- return data;
233
- }
234
- removeRestrictedFields(restrictedFields, fields) {
235
- return fields.filter(field => !restrictedFields.includes(field));
236
- }
237
- }
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcXVlcnktYnVpbGRlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9tb2RlbHMvcG8tcXVlcnktYnVpbGRlci9wby1xdWVyeS1idWlsZGVyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTXREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFTekIsWUFBb0IsZUFBZ0MsRUFBVSxNQUFvQjtRQUE5RCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ2hGLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RSxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3JDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM5QztZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNqRTtZQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxXQUFX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LENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQW1CLEVBQUUsWUFBMkI7UUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxnQkFBNEIsRUFBRSxNQUFrQjtRQUM3RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuaW1wb3J0IHsgUG9SZXNwb25zZUFwaSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1yZXNwb25zZS1hcGkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9wby1zY2hlbWEnO1xyXG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogQ2xhc3NlIHV0aWxpdMOhcmlhIHBhcmEgY29uc3RydWlyIGNvbnN1bHRhcyBzb2JyZSBvcyByZWdpc3Ryb3MgZGUgdW0gKnNjaGVtYSouXHJcbiAqXHJcbiAqIEEgdXRpbGl6YcOnw6NvIGRvcyBtw6l0b2RvcyBkZXN0YSBjbGFzc2Ugw6kgZmVpdGEgYSBwYXJ0aXIgZG8gcmV0b3JubyBkbyBtw6l0b2RvIGBQb0VudGl0eS5maW5kKClgLiBQb3IgZXhlbXBsbyxcclxuICogcGFyYSB1dGlsaXphciBvIG3DqXRvZG8gYFBvUXVlcnlCdWlsZGVyLnBhZ2UoKWAsIMOpIG5lY2Vzc8OhcmlvOlxyXG4gKlxyXG4gKiBgYGAgdHlwZXNjcmlwdFxyXG4gKiBQb1N5bmNTZXJ2aWNlLmdldE1vZGVsKCdzY2hlbWEgbmFtZScpLmZpbmQoKS5wYWdlKDIpLmV4ZWMoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE8gYFBvUXVlcnlCdWlsZGVyYCBmb2kgcHJvamV0YWRvIHBhcmEgcXVlIG9zIHNldXMgbcOpdG9kb3Mgc2VqYW1cclxuICogY2hhbWFkb3MgZW0gY2FzY2F0YSBlIGFvIGZpbmFsIGRlc3NlIGVuY2FkZWFtZW50byBpbnZvY2FyIG8gbcOpdG9kb1xyXG4gKiBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYCBwYXJhIHF1ZSBhIGJ1c2NhIHNlamEgY29uY2x1w61kYS4gUG9yIGV4ZW1wbG86XHJcbiAqXHJcbiAqIGBgYCB0eXBlc2NyaXB0XHJcbiAqIFBvU3luY1NlcnZpY2VcclxuICogICAuZ2V0TW9kZWwoJ3NjaGVtYSBuYW1lJylcclxuICogICAuZmluZCgpXHJcbiAqICAgLnBhZ2UoMilcclxuICogICAucGFnZVNpemUoNSlcclxuICogICAuc29ydCgpXHJcbiAqICAgLmV4ZWMoKTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUG9RdWVyeUJ1aWxkZXIge1xyXG4gIHByaXZhdGUgZmllbGRzOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBhbnk7XHJcblxyXG4gIHByaXZhdGUgX2xpbWl0OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfcGFnZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfc29ydDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlLCBwcml2YXRlIHNjaGVtYTogUG9TeW5jU2NoZW1hKSB7XHJcbiAgICB0aGlzLl9wYWdlID0gMTtcclxuICAgIHRoaXMuZmlsdGVycyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW8gZmluYWwgZGEgY2hhbWFkYSBkb3MgbcOpdG9kb3MgZG8gYFBvUXVlcnlCdWlsZGVyYCB1dGlsaXphZG9zLCBlc3RlIG3DqXRvZG8gZGV2ZSBzZXIgY2hhbWFkbyBwYXJhIHF1ZSBhIGJ1c2NhIHNlamEgY29uY2x1w61kYS5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UG9SZXNwb25zZUFwaSB8IG9iamVjdD59IFJlZ2lzdHJvcyBkbyAqc2NoZW1hKiBuYSBxdWFsIGZvaSBhcGxpY2FkbyBhIGNvbnN1bHRhLlxyXG4gICAqL1xyXG4gIGFzeW5jIGV4ZWMoKTogUHJvbWlzZTxQb1Jlc3BvbnNlQXBpIHwgb2JqZWN0PiB7XHJcbiAgICBsZXQgc3RvcmFnZURhdGEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5nZXRBbGwodGhpcy5zY2hlbWEubmFtZSk7XHJcblxyXG4gICAgaWYgKHN0b3JhZ2VEYXRhICYmIHN0b3JhZ2VEYXRhLmxlbmd0aCkge1xyXG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGgpIHtcclxuICAgICAgICBzdG9yYWdlRGF0YSA9IHRoaXMuYXBwbHlGaWx0ZXJzKHN0b3JhZ2VEYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5maWVsZHMpIHtcclxuICAgICAgICBzdG9yYWdlRGF0YSA9IHRoaXMuYXBwbHlGaWVsZHModGhpcy5zY2hlbWEuZmllbGRzLCBzdG9yYWdlRGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX3NvcnQpIHtcclxuICAgICAgICBzdG9yYWdlRGF0YSA9IHRoaXMub3JkZXIoc3RvcmFnZURhdGEsIHRoaXMuX3NvcnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fbGltaXQpIHtcclxuICAgICAgICByZXR1cm4gc3RvcmFnZURhdGFbMF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGUoc3RvcmFnZURhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGhhc05leHQ6IGZhbHNlLFxyXG4gICAgICAgIGl0ZW1zOiBbXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBsaWNhIGZpbHRyb3Mgc29icmUgb3MgcmVnaXN0cm9zLCBiYXNlYWRvcyBub3MgY2FtcG9zIGUgdmFsb3JlcyBkZWZpbmlkb3MgY29tbyBmaWx0cm8uIFBvciBleGVtcGxvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuZmlsdGVyKHsgbmFtZTogJ01hcmllJywgYWdlOiAyNCB9KTtcclxuICAgKiBgYGBcclxuICAgKiBSZXRvcm5hIHRvZG9zIG9zIHJlZ2lzdHJvcyBxdWUgY29udGVuaGFtIGEgcHJvcHJpZWRhZGUgYG5hbWVgIGlndWFsIGEgTWFyaWUgZSBgYWdlYCBpZ3VhbCBhIDI0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IGZpbHRlciBPYmpldG8gcXVlIGNvbnTDqW0gb3MgY2FtcG9zIGUgdmFsb3JlcyBhIHNlcmVtIGZpbHRyYWRvcyBubyAqc2NoZW1hKi5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBub3ZvIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICBmaWx0ZXIoZmlsdGVyPzogb2JqZWN0KTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgaWYgKGZpbHRlciAmJiB0eXBlb2YgZmlsdGVyID09PSAnb2JqZWN0Jykge1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSB7IC4uLnRoaXMuZmlsdGVycywgLi4uZmlsdGVyIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbHRlciBtdXN0IGJlIGFuIG9iamVjdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGltaXRhIG8gbsO6bWVybyBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyByZXRvcm5hZG9zLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IE7Dum1lcm8gZGUgcmVnaXN0cm9zIHJldG9ybmFkb3MuXHJcbiAgICogQHJldHVybnMge1BvUXVlcnlCdWlsZGVyfSBPYmpldG8gcXVlIHBvc3NpYmlsaXRhIGVuY2FkZWFyIHVtIG5vdm8gbcOpdG9kbyBkbyBgUG9RdWVyeUJ1aWxkZXJgLlxyXG4gICAqL1xyXG4gIGxpbWl0KGxpbWl0OiBudW1iZXIpOiBQb1F1ZXJ5QnVpbGRlciB7XHJcbiAgICB0aGlzLl9saW1pdCA9IGxpbWl0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3BlY2lmaWNhIGEgcMOhZ2luYSBkZSByZWdpc3Ryb3MgcXVlIHNlIGRlc2VqYSByZXRvcm5hci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIE7Dum1lcm8gZGEgcMOhZ2luYS5cclxuICAgKiBAcmV0dXJucyB7UG9RdWVyeUJ1aWxkZXJ9IE9iamV0byBxdWUgcG9zc2liaWxpdGEgZW5jYWRlYXIgdW0gbm92byBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgcGFnZShwYWdlOiBudW1iZXIpOiBQb1F1ZXJ5QnVpbGRlciB7XHJcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHBhZ2UgfSk7XHJcblxyXG4gICAgdGhpcy5fcGFnZSA9IHBhZ2U7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBxdWFudG9zIGVsZW1lbnRvcyBzZXLDo28gcmV0b3JuYWRvcyBwb3IgcMOhZ2luYS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlU2l6ZSBOw7ptZXJvIGRlIHJlZ2lzdHJvcyBwb3IgcMOhZ2luYS5cclxuICAgKiBAcmV0dXJucyB7UG9RdWVyeUJ1aWxkZXJ9IE9iamV0byBxdWUgcG9zc2liaWxpdGEgZW5jYWRlYXIgdW0gbm92byBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgcGFnZVNpemUocGFnZVNpemU6IG51bWJlcik6IFBvUXVlcnlCdWlsZGVyIHtcclxuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcGFnZVNpemUgfSk7XHJcblxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6YWRvIHBhcmEgZGVmaW5pciBxdWFpcyBjYW1wb3MgZG8gKnNjaGVtYSogc2Vyw6NvIHJldG9ybmFkb3MgbmEgY29uc3VsdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXHJcbiAgICogdW1hICpzdHJpbmcqIHNlcGFyYWRvcyBwb3IgZXNwYcOnbyBwb2RlbmRvIHVzYXIgbyBjYXJhY3RlcmUgYC1gIHBhcmEgZXhjbHVpciBjYW1wb3MuXHJcbiAgICogUG9yIGV4ZW1wbG8sIGEgZGVmaW5pw6fDo28gYWJhaXhvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCduYW1lIGFnZSBhZGRyZXNzJyk7XHJcbiAgICogYGBgXHJcbiAgICogSXLDoSByZXRvcm5hciBhcGVuYXMgb3MgY2FtcG9zIGBuYW1lYCwgYGFnZWAgZSBgYWRkcmVzc2AuIFBhcmEgbsOjbyByZXRvcm5hciB1bSBjYW1wbyBvdSBtYWlzIGJhc3RhIGZhemVyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCctbmFtZSAtYWdlJyk7XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UG9RdWVyeUJ1aWxkZXJ9IE9iamV0byBxdWUgcG9zc2liaWxpdGEgZW5jYWRlYXIgdW0gbm92byBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgc2VsZWN0KGZpZWxkczogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXIoeyBmaWVsZHMgfSk7XHJcblxyXG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9yZGVuYSBvcyByZWdpc3Ryb3MgcG9yIHVtIGNhbXBvLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIENhbXBvIGEgc2VyIG9yZGVuYWRvLiBQYXJhIG9yZGVuYXIgZGUgZm9ybWEgZGVjcmVzY2VudGUgYmFzdGEgY29sb2NhciBvIGNhcmFjdGVyZSBgLWBcclxuICAgKiBuYSBmcmVudGUgZG8gY2FtcG8uIFBvciBleGVtcGxvOlxyXG4gICAqIGBgYFxyXG4gICAqIFBvUXVlcnlCdWlsZGVyLnNvcnQoJy1uYW1lJyk7XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UG9RdWVyeUJ1aWxkZXJ9IE9iamV0byBxdWUgcG9zc2liaWxpdGEgZW5jYWRlYXIgdW0gbm92byBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgc29ydChmaWVsZDogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXIoeyBmaWVsZCB9KTtcclxuXHJcbiAgICB0aGlzLl9zb3J0ID0gZmllbGQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzc2EgZnVuw6fDo28gc2VydmUgY29tbyBhbGlhcyBwYXJhIG8gYFBvUXVlcnlCdWlsZGVyLmZpbHRlcigpYC4gw4kgdXRpbGl6YWRhIHNvbWVudGUgcGFyYSBkYXIgbWFpb3IgbGVnaWJpbGlkYWRlIGFvIGPDs2RpZ28uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxyXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBub3ZvIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICB3aGVyZShmaWx0ZXI6IG9iamVjdCk6IFBvUXVlcnlCdWlsZGVyIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcihmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUZpZWxkcyhzY2hlbWFGaWVsZHM6IEFycmF5PGFueT4sIGRhdGE6IEFycmF5PG9iamVjdD4pOiBBcnJheTxvYmplY3Q+IHtcclxuICAgIGNvbnN0IHJlY2VpdmVkRmllbGRzID0gdGhpcy5maWVsZHMuc3BsaXQoJyAnKTtcclxuICAgIGxldCByZXN0cmljdGVkRmllbGRzID0gW107XHJcbiAgICBsZXQgc2VsZWN0ZWRGaWVsZHMgPSBbXTtcclxuXHJcbiAgICBbc2VsZWN0ZWRGaWVsZHMsIHJlc3RyaWN0ZWRGaWVsZHNdID0gdGhpcy5ncm91cEZpZWxkcyhyZWNlaXZlZEZpZWxkcyk7XHJcblxyXG4gICAgaWYgKCFzZWxlY3RlZEZpZWxkcy5sZW5ndGggJiYgcmVzdHJpY3RlZEZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgc2VsZWN0ZWRGaWVsZHMgPSBbLi4uc2NoZW1hRmllbGRzXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdHJpY3RlZEZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgc2VsZWN0ZWRGaWVsZHMgPSB0aGlzLnJlbW92ZVJlc3RyaWN0ZWRGaWVsZHMocmVzdHJpY3RlZEZpZWxkcywgc2VsZWN0ZWRGaWVsZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGVkRmllbGRzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGUoc2VsZWN0ZWRGaWVsZHMpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnJlbW92ZUZpZWxkc0RhdGEoZGF0YSwgc2VsZWN0ZWRGaWVsZHMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoZGF0YTogQXJyYXk8b2JqZWN0Pik6IEFycmF5PG9iamVjdD4ge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZpbHRlcktleSA9PiB7XHJcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW1bZmlsdGVyS2V5XSA9PT0gdGhpcy5maWx0ZXJzW2ZpbHRlcktleV0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdyb3VwRmllbGRzKHJlY2VpdmVkRmllbGRzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8QXJyYXk8c3RyaW5nPj4ge1xyXG4gICAgY29uc3QgcmVzdHJpY3RlZEZpZWxkcyA9IFtdO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSBbXTtcclxuXHJcbiAgICByZWNlaXZlZEZpZWxkcy5mb3JFYWNoKGZpZWxkcyA9PiB7XHJcbiAgICAgIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgcmVzdHJpY3RlZEZpZWxkcy5wdXNoKGZpZWxkcy5zdWJzdHJpbmcoMSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGVkRmllbGRzLnB1c2goZmllbGRzKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gW3NlbGVjdGVkRmllbGRzLCByZXN0cmljdGVkRmllbGRzXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFnaW5hdGUoZGF0YTogQXJyYXk8YW55Pik6IHsgaGFzTmV4dDogYm9vbGVhbjsgaXRlbXM6IEFycmF5PGFueT4gfSB7XHJcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuX3BhZ2VTaXplIHx8IGRhdGFMZW5ndGg7XHJcblxyXG4gICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwoZGF0YUxlbmd0aCAvIHBhZ2VTaXplKTtcclxuICAgIGNvbnN0IGJlZ2luID0gdGhpcy5fcGFnZSAqIHBhZ2VTaXplIC0gcGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmQgPSBiZWdpbiArIHBhZ2VTaXplO1xyXG5cclxuICAgIHJldHVybiB7IGhhc05leHQ6IHRoaXMuX3BhZ2UgPCBwYWdlcywgaXRlbXM6IGRhdGEuc2xpY2UoYmVnaW4sIGVuZCkgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3JkZXIoZGF0YTogQXJyYXk8YW55Piwgc29ydGluZ0ZpZWxkOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcclxuICAgIGNvbnN0IGRlc2NlbmRpbmdPcmRlciA9IHNvcnRpbmdGaWVsZC5zdGFydHNXaXRoKCctJyk7XHJcbiAgICBzb3J0aW5nRmllbGQgPSBkZXNjZW5kaW5nT3JkZXIgPyBzb3J0aW5nRmllbGQuc3Vic3RyKDEpIDogc29ydGluZ0ZpZWxkO1xyXG5cclxuICAgIHJldHVybiBkYXRhLnNvcnQoKG9wdGlvbkEsIG9wdGlvbkIpID0+IHtcclxuICAgICAgaWYgKG9wdGlvbkFbc29ydGluZ0ZpZWxkXSA+IG9wdGlvbkJbc29ydGluZ0ZpZWxkXSkge1xyXG4gICAgICAgIHJldHVybiAhZGVzY2VuZGluZ09yZGVyID8gMSA6IC0xO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob3B0aW9uQVtzb3J0aW5nRmllbGRdIDwgb3B0aW9uQltzb3J0aW5nRmllbGRdKSB7XHJcbiAgICAgICAgcmV0dXJuICFkZXNjZW5kaW5nT3JkZXIgPyAtMSA6IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUR1cGxpY2F0ZShmaWVsZHMpOiBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKChpdGVtLCBwb3NpdGlvbikgPT4gZmllbGRzLmluZGV4T2YoaXRlbSkgPT09IHBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRmllbGRzRGF0YShkYXRhOiBBcnJheTxvYmplY3Q+LCBjaG9zZW5GaWVsZHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxvYmplY3Q+IHtcclxuICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChrZXlJdGVtID0+IHtcclxuICAgICAgICBpZiAoIWNob3NlbkZpZWxkcy5pbmNsdWRlcyhrZXlJdGVtKSkge1xyXG4gICAgICAgICAgZGVsZXRlIGl0ZW1ba2V5SXRlbV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVJlc3RyaWN0ZWRGaWVsZHMocmVzdHJpY3RlZEZpZWxkczogQXJyYXk8YW55PiwgZmllbGRzOiBBcnJheTxhbnk+KSB7XHJcbiAgICByZXR1cm4gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhcmVzdHJpY3RlZEZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpO1xyXG4gIH1cclxufVxyXG4iXX0=