@po-ui/ng-sync 5.22.2 → 5.22.3

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 (108) hide show
  1. package/README.md +22 -22
  2. package/bundles/po-ui-ng-sync.umd.js +2915 -2915
  3. package/bundles/po-ui-ng-sync.umd.js.map +1 -1
  4. package/esm2015/lib/index.js +15 -15
  5. package/esm2015/lib/models/index.js +6 -6
  6. package/esm2015/lib/models/po-data-message.model.js +57 -57
  7. package/esm2015/lib/models/po-data-transform.model.js +22 -22
  8. package/esm2015/lib/models/po-entity/po-entity.model.js +229 -229
  9. package/esm2015/lib/models/po-event-sourcing-error-response.model.js +17 -17
  10. package/esm2015/lib/models/po-network-status.model.js +44 -44
  11. package/esm2015/lib/models/po-network-type.enum.js +30 -30
  12. package/esm2015/lib/models/po-query-builder/po-query-builder.model.js +241 -241
  13. package/esm2015/lib/models/po-request-type.enum.js +16 -16
  14. package/esm2015/lib/po-sync.module.js +31 -31
  15. package/esm2015/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.js +17 -17
  16. package/esm2015/lib/services/po-event-sourcing/index.js +4 -4
  17. package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.js +2 -2
  18. package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.js +2 -2
  19. package/esm2015/lib/services/po-event-sourcing/po-event-sourcing.service.js +411 -411
  20. package/esm2015/lib/services/po-http-client/interfaces/po-http-header-option.interface.js +11 -11
  21. package/esm2015/lib/services/po-http-client/interfaces/po-http-request-data.interface.js +2 -2
  22. package/esm2015/lib/services/po-http-client/interfaces/po-response-api.interface.js +2 -2
  23. package/esm2015/lib/services/po-http-client/po-http-client.service.js +147 -147
  24. package/esm2015/lib/services/po-http-client/po-http-request-type.enum.js +25 -25
  25. package/esm2015/lib/services/po-network/po-network.service.js +58 -58
  26. package/esm2015/lib/services/po-schema/index.js +4 -4
  27. package/esm2015/lib/services/po-schema/po-schema-definition/po-schema-definition.service.js +80 -80
  28. package/esm2015/lib/services/po-schema/po-schema-util/po-schema-util.model.js +124 -124
  29. package/esm2015/lib/services/po-schema/po-schema.service.js +198 -198
  30. package/esm2015/lib/services/po-sync/interfaces/po-sync-config.interface.js +2 -2
  31. package/esm2015/lib/services/po-sync/interfaces/po-sync-field-options.interface.js +2 -2
  32. package/esm2015/lib/services/po-sync/interfaces/po-sync-response.interface.js +2 -2
  33. package/esm2015/lib/services/po-sync/interfaces/po-sync-schema.interface.js +2 -2
  34. package/esm2015/lib/services/po-sync/po-sync.service.js +336 -336
  35. package/esm2015/lib/utils/utils.js +63 -63
  36. package/esm2015/po-ui-ng-sync.js +8 -8
  37. package/esm2015/public-api.js +2 -2
  38. package/fesm2015/po-ui-ng-sync.js +2047 -2047
  39. package/fesm2015/po-ui-ng-sync.js.map +1 -1
  40. package/lib/index.d.ts +14 -14
  41. package/lib/models/index.d.ts +5 -5
  42. package/lib/models/po-data-message.model.d.ts +46 -46
  43. package/lib/models/po-data-transform.model.d.ts +52 -52
  44. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  45. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  46. package/lib/models/po-network-status.model.d.ts +25 -25
  47. package/lib/models/po-network-type.enum.d.ts +28 -28
  48. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  49. package/lib/models/po-request-type.enum.d.ts +14 -14
  50. package/lib/po-sync.module.d.ts +7 -7
  51. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  52. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  53. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  54. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  55. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +71 -71
  56. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  57. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  58. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  59. package/lib/services/po-http-client/po-http-client.service.d.ts +75 -75
  60. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  61. package/lib/services/po-network/po-network.service.d.ts +33 -33
  62. package/lib/services/po-schema/index.d.ts +3 -3
  63. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +48 -48
  64. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  65. package/lib/services/po-schema/po-schema.service.d.ts +95 -95
  66. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  67. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  68. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  69. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  70. package/lib/services/po-sync/po-sync.service.d.ts +159 -159
  71. package/lib/utils/utils.d.ts +36 -36
  72. package/package.json +4 -4
  73. package/po-ui-ng-sync-5.22.3.tgz +0 -0
  74. package/po-ui-ng-sync.d.ts +8 -8
  75. package/public-api.d.ts +1 -1
  76. package/schematics/README.md +169 -169
  77. package/schematics/collection.json +15 -15
  78. package/schematics/migrations.json +25 -25
  79. package/schematics/ng-add/index.d.ts +7 -7
  80. package/schematics/ng-add/index.js +33 -33
  81. package/schematics/ng-add/index.spec.d.ts +1 -1
  82. package/schematics/ng-add/index.spec.js +62 -62
  83. package/schematics/ng-add/schema.json +7 -7
  84. package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
  85. package/schematics/ng-generate/schema/index.d.ts +4 -4
  86. package/schematics/ng-generate/schema/index.js +12 -12
  87. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  88. package/schematics/ng-generate/schema/index.spec.js +44 -44
  89. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  90. package/schematics/ng-generate/schema/schema.js +2 -2
  91. package/schematics/ng-generate/schema/schema.json +31 -31
  92. package/schematics/ng-update/v2/changes.d.ts +8 -8
  93. package/schematics/ng-update/v2/changes.js +20 -20
  94. package/schematics/ng-update/v2/index.d.ts +5 -5
  95. package/schematics/ng-update/v2/index.js +101 -101
  96. package/schematics/ng-update/v3/changes.d.ts +2 -2
  97. package/schematics/ng-update/v3/changes.js +14 -14
  98. package/schematics/ng-update/v3/index.d.ts +1 -1
  99. package/schematics/ng-update/v3/index.js +16 -16
  100. package/schematics/ng-update/v4/changes.d.ts +2 -2
  101. package/schematics/ng-update/v4/changes.js +14 -14
  102. package/schematics/ng-update/v4/index.d.ts +1 -1
  103. package/schematics/ng-update/v4/index.js +15 -15
  104. package/schematics/ng-update/v5/changes.d.ts +2 -2
  105. package/schematics/ng-update/v5/changes.js +13 -13
  106. package/schematics/ng-update/v5/index.d.ts +1 -1
  107. package/schematics/ng-update/v5/index.js +15 -15
  108. package/po-ui-ng-sync-5.22.2.tgz +0 -0
@@ -1,336 +1,336 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
4
- import { expand, map, mergeMap, reduce } from 'rxjs/operators';
5
- import { validateParameter, validateArray } from '../../utils/utils';
6
- import { PoDataMessage, PoEntity } from '../../models';
7
- import { PoEventSourcingService } from '../po-event-sourcing/po-event-sourcing.service';
8
- import { PoHttpClientService } from '../po-http-client/po-http-client.service';
9
- import { PoNetworkService } from '../po-network/po-network.service';
10
- import { PoRequestType } from '../../models/po-request-type.enum';
11
- import { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';
12
- import { PoSchemaService } from './../po-schema/po-schema.service';
13
- import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
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
- constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
23
- this.poEventSourcingService = poEventSourcingService;
24
- this.poHttpClient = poHttpClient;
25
- this.poNetworkService = poNetworkService;
26
- this.poSchemaDefinitionService = poSchemaDefinitionService;
27
- this.poSchemaService = poSchemaService;
28
- this.models = [];
29
- this.finishSyncSubject = new Subject();
30
- this.isSyncEnabled = true;
31
- this.syncing = false;
32
- }
33
- /**
34
- * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
35
- * as definições dos *schemas*, os registros de cada *schema* e a fila
36
- * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
37
- *
38
- * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
39
- * recomenda-se utilizar o método `prepare()` em seguida.
40
- *
41
- * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
42
- *
43
- * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
44
- */
45
- destroy() {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const destroyFunction = () => __awaiter(this, void 0, void 0, function* () {
48
- yield this.poSchemaService.destroySchemasRecords();
49
- yield this.poSchemaDefinitionService.destroy();
50
- yield this.poEventSourcingService.destroyEventSourcingQueue();
51
- });
52
- return this.poSchemaService.limitedCallWrap(destroyFunction);
53
- });
54
- }
55
- /**
56
- * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
57
- *
58
- * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
59
- */
60
- disableSync() {
61
- this.isSyncEnabled = false;
62
- if (this.timer && this.subscription) {
63
- this.subscription.unsubscribe();
64
- }
65
- }
66
- /**
67
- * <a id="enable-sync"></a>
68
- * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
69
- *
70
- * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
71
- */
72
- enableSync() {
73
- this.isSyncEnabled = true;
74
- this.createSubscribe();
75
- }
76
- /**
77
- * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
78
- * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
79
- * deste método.
80
- *
81
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
82
- *
83
- * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
84
- */
85
- getResponses() {
86
- return this.poEventSourcingService.responsesSubject();
87
- }
88
- /**
89
- * Retorna uma instância de `PoEntity` para um determinado *schema*.
90
- *
91
- * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
92
- *
93
- * @param {string} schemaName Nome do *schema*.
94
- * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
95
- */
96
- getModel(schemaName) {
97
- const model = this.models[schemaName];
98
- if (!model) {
99
- throw new Error('Model not found: ' + schemaName);
100
- }
101
- return model;
102
- }
103
- /**
104
- * Insere uma requisição HTTP na fila de eventos do `po-sync`.
105
- *
106
- * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
107
- *
108
- * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
109
- * @param {string} customRequestId Identificador customizado da requisição HTTP.
110
- * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
111
- */
112
- insertHttpCommand(requestData, customRequestId) {
113
- validateParameter({ requestData });
114
- return this.poEventSourcingService.httpCommand(requestData, customRequestId);
115
- }
116
- /**
117
- * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
118
- * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
119
- *
120
- * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
121
- *
122
- * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
123
- * carga inicial for concluída.
124
- */
125
- loadData() {
126
- const loads = [];
127
- this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
128
- return forkJoin(loads);
129
- }
130
- /**
131
- * Responsável por notificar sempre que houver sincronismo.
132
- *
133
- * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
134
- *
135
- * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
136
- */
137
- onSync() {
138
- if (!this.eventSub) {
139
- this.eventSub = Observable.create(e => {
140
- this.emitter = e;
141
- });
142
- }
143
- return this.eventSub;
144
- }
145
- /**
146
- * Prepara a aplicação criando os schemas e aplica as configurações.
147
- *
148
- * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
149
- *
150
- * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
151
- * @param {PoSyncConfig} config Configurações adicionais.
152
- * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
153
- */
154
- prepare(schemas, config) {
155
- validateArray({ schemas });
156
- const defaultSyncConfig = {
157
- type: this.poNetworkService.getConnectionStatus().type,
158
- period: 60,
159
- dataTransform: new PoDataMessage()
160
- };
161
- this.schemas = schemas;
162
- this.config = config || defaultSyncConfig;
163
- this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
164
- this.poEventSourcingService.config = this.config;
165
- this.startTimer(this.config.period);
166
- this.reactiveSync();
167
- this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
168
- return this.saveSchemas().then(() => {
169
- this.schemas.forEach(schema => {
170
- this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
171
- });
172
- return Promise.resolve();
173
- });
174
- }
175
- /**
176
- * Remove um item da fila de eventos que espera a sincronização.
177
- *
178
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
179
- *
180
- * @param {any} idEventSourcing Identificador do item da fila de eventos.
181
- * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
182
- */
183
- removeItemOfSync(idEventSourcing) {
184
- return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
185
- }
186
- /**
187
- * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
188
- *
189
- * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
190
- *
191
- * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
192
- */
193
- resumeSync() {
194
- if (!this.canSync()) {
195
- const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
196
- finishSyncSubscription.unsubscribe();
197
- return this.sync();
198
- });
199
- return Promise.resolve();
200
- }
201
- return this.sync();
202
- }
203
- /**
204
- * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
205
- *
206
- * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
207
- *
208
- * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
209
- *
210
- * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
211
- */
212
- sync() {
213
- return __awaiter(this, void 0, void 0, function* () {
214
- if (this.canSync()) {
215
- this.startSync();
216
- try {
217
- yield this.poEventSourcingService.syncSend();
218
- yield this.poEventSourcingService.syncGet();
219
- if (this.emitter) {
220
- this.emitter.next();
221
- }
222
- this.finishSync();
223
- }
224
- catch (error) {
225
- this.syncError();
226
- }
227
- }
228
- });
229
- }
230
- canSync() {
231
- if (this.syncing || !this.isSyncEnabled) {
232
- return false;
233
- }
234
- else {
235
- const currentConnection = this.poNetworkService.getConnectionStatus();
236
- const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
237
- const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
238
- return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
239
- }
240
- }
241
- createSubscribe() {
242
- if (this.timer) {
243
- this.subscription = this.timer.subscribe(() => {
244
- this.sync().then(() => {
245
- this.subscription.unsubscribe();
246
- this.subscription = null;
247
- this.timer = null;
248
- this.startTimer(this.config.period);
249
- });
250
- });
251
- }
252
- }
253
- finishSync() {
254
- this.syncing = false;
255
- this.finishSyncSubject.next();
256
- }
257
- getOnePage(schema, page = 1) {
258
- const params = [];
259
- params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
260
- params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
261
- const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
262
- return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
263
- const now = new Date().getTime();
264
- responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
265
- item.SyncInsertedDateTime = now;
266
- item.SyncUpdatedDateTime = null;
267
- item.SyncExclusionDateTime = null;
268
- item.SyncDeleted = false;
269
- item.SyncStatus = 2;
270
- });
271
- return this.poSchemaService
272
- .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
273
- .then(() => responseBody);
274
- }));
275
- }
276
- loadEntityData(schema) {
277
- let page = 1;
278
- return this.getOnePage(schema, page).pipe(expand(data => {
279
- this.config.dataTransform.transform(data);
280
- const hasNext = this.config.dataTransform.hasNext();
281
- if (hasNext) {
282
- return this.getOnePage(schema, ++page);
283
- }
284
- else {
285
- return of();
286
- }
287
- }), reduce((acc, obj) => {
288
- acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
289
- return acc;
290
- }, {
291
- entity: schema.name,
292
- data: []
293
- }));
294
- }
295
- reactiveSync() {
296
- this.poNetworkService.onChange().subscribe(networkStatus => {
297
- if (networkStatus.status) {
298
- this.startTimer(this.config.period);
299
- return this.sync();
300
- }
301
- if (this.subscription) {
302
- this.subscription.unsubscribe();
303
- }
304
- });
305
- }
306
- saveSchemas() {
307
- return __awaiter(this, void 0, void 0, function* () {
308
- const storageSchemas = yield this.poSchemaDefinitionService.getAll();
309
- this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
310
- return this.poSchemaDefinitionService.saveAll(this.schemas);
311
- });
312
- }
313
- startSync() {
314
- this.syncing = true;
315
- }
316
- startTimer(period) {
317
- if (period && this.isSyncEnabled) {
318
- this.timer = timer(period * 1000);
319
- this.createSubscribe();
320
- }
321
- }
322
- syncError() {
323
- this.finishSync();
324
- }
325
- }
326
- PoSyncService.decorators = [
327
- { type: Injectable }
328
- ];
329
- PoSyncService.ctorParameters = () => [
330
- { type: PoEventSourcingService },
331
- { type: PoHttpClientService },
332
- { type: PoNetworkService },
333
- { type: PoSchemaDefinitionService },
334
- { type: PoSchemaService }
335
- ];
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBS2xGOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBYXhCLFlBQ1Usc0JBQThDLEVBQzlDLFlBQWlDLEVBQ2pDLGdCQUFrQyxFQUNsQyx5QkFBb0QsRUFDcEQsZUFBZ0M7UUFKaEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWpCMUMsV0FBTSxHQUFvQixFQUFFLENBQUM7UUFLckIsc0JBQWlCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFDdkQsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsWUFBTyxHQUFZLEtBQUssQ0FBQztJQVM5QixDQUFDO0lBRUo7Ozs7Ozs7Ozs7O09BV0c7SUFDRyxPQUFPOztZQUNYLE1BQU0sZUFBZSxHQUFHLEdBQVMsRUFBRTtnQkFDakMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMvQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2hFLENBQUMsQ0FBQSxDQUFDO1lBRUYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsUUFBUSxDQUFDLFVBQWtCO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILGlCQUFpQixDQUFDLFdBQThCLEVBQUUsZUFBd0I7UUFDeEUsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sS0FBSyxHQUE0RCxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU8sQ0FBQyxPQUE0QixFQUFFLE1BQXFCO1FBQ3pELGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxpQkFBaUIsR0FBaUI7WUFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUk7WUFDdEQsTUFBTSxFQUFFLEVBQUU7WUFDVixhQUFhLEVBQUUsSUFBSSxhQUFhLEVBQUU7U0FDbkMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLGlCQUFpQixDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV0RSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxlQUFvQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDbEYsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDRyxJQUFJOztZQUNSLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBRWpCLElBQUk7b0JBQ0YsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzdDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUU1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ3JCO29CQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDbkI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUNsQjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRU8sT0FBTztRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RSxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFGLE1BQU0sb0JBQW9CLEdBQ3hCLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4RyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxzQkFBc0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3JHO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBb0IsRUFBRSxPQUFlLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRXBGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQzlCLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2dCQUNoQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlO2lCQUN4QixTQUFTLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7aUJBQzlFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFvQjtRQUN6QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BELElBQUksT0FBTyxFQUFFO2dCQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4QztpQkFBTTtnQkFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsRUFDRixNQUFNLENBQ0osQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDWCxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRDtZQUNFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsRUFBRTtTQUNULENBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDcEI7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFYSxXQUFXOztZQUN2QixNQUFNLGNBQWMsR0FBd0IsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7S0FBQTtJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQU07UUFDdkIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7O1lBN1ZGLFVBQVU7OztZQW5CRixzQkFBc0I7WUFDdEIsbUJBQW1CO1lBRW5CLGdCQUFnQjtZQUVoQix5QkFBeUI7WUFDekIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgbWVyZ2VNYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHZhbGlkYXRlUGFyYW1ldGVyLCB2YWxpZGF0ZUFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBQb0RhdGFNZXNzYWdlLCBQb0VudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcG8tZXZlbnQtc291cmNpbmcvcG8tZXZlbnQtc291cmNpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQb0h0dHBDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0RGF0YSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi9wby1uZXR3b3JrL3BvLW5ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBQb1JlcXVlc3RUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLXJlcXVlc3QtdHlwZS5lbnVtJztcbmltcG9ydCB7IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS11dGlsL3BvLXNjaGVtYS11dGlsLm1vZGVsJztcbmltcG9ydCB7IFBvU3luY0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9TeW5jUmVzcG9uc2UgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogTyBgUG9TeW5jU2VydmljZWAgw6kgdXRpbGl6YWRvIHBhcmEgY29uZmlndXJhciB0b2RhIGEgYmFzZSBkZSBkYWRvcyBxdWUgcmVjZWJlcsOhIGFzIGluZm9ybWHDp8O1ZXMgcXVlIHNlcsOjb1xuICogYXJtYXplbmFkYXMgKm9mZmxpbmUqIHZpbmRhcyBkbyBzZXJ2aWRvci4gTmVsZSBvY29ycmUgdG9kYSBhIHByZXBhcmHDp8OjbyBkb3MgbW9kZWxvcyBkZSBkYWRvcyByZXRvcm5hZG9zIHBvclxuICogY2FkYSBjb25zdWx0YS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvU3luY1NlcnZpY2Uge1xuICBtb2RlbHM6IEFycmF5PFBvRW50aXR5PiA9IFtdO1xuXG4gIHByaXZhdGUgY29uZmlnOiBQb1N5bmNDb25maWc7XG4gIHByaXZhdGUgZW1pdHRlcjogYW55O1xuICBwcml2YXRlIGV2ZW50U3ViOiBPYnNlcnZhYmxlPGFueT47XG4gIHByaXZhdGUgZmluaXNoU3luY1N1YmplY3Q6IFN1YmplY3Q8bnVsbD4gPSBuZXcgU3ViamVjdDxudWxsPigpO1xuICBwcml2YXRlIGlzU3luY0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIHNjaGVtYXM6IEFycmF5PFBvU3luY1NjaGVtYT47XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHRpbWVyOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwb0V2ZW50U291cmNpbmdTZXJ2aWNlOiBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9IdHRwQ2xpZW50OiBQb0h0dHBDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9OZXR3b3JrU2VydmljZTogUG9OZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIHBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2U6IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1NjaGVtYVNlcnZpY2U6IFBvU2NoZW1hU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIERlc3Ryw7NpIHRvZGFzIGFzIGNoYXZlcyBkbyAqc3RvcmFnZSogcmVmZXJlbnRlcyBhbyBgcG8tc3luY2AsIG91IHNlamEsXG4gICAqIGFzIGRlZmluacOnw7VlcyBkb3MgKnNjaGVtYXMqLCBvcyByZWdpc3Ryb3MgZGUgY2FkYSAqc2NoZW1hKiBlIGEgZmlsYVxuICAgKiBkZSBldmVudG9zIHF1ZSBlc3TDo28gcGFyYSBzZXIgZW52aWFkb3MgYW8gc2Vydmlkb3IgKihFdmVudFNvdXJjaW5nKSouXG4gICAqXG4gICAqID4gUGFyYSBxdWUgbsOjbyB2ZW5oYW0gb2NvcnJlciBlcnJvcyBlbSBhw6fDtWVzIHF1ZSBkZXBlbmRhbSBkYXMgZGVmaW5pw6fDtWVzIGRvcyAqc2NoZW1hcyosXG4gICAqIHJlY29tZW5kYS1zZSB1dGlsaXphciBvIG3DqXRvZG8gYHByZXBhcmUoKWAgZW0gc2VndWlkYS5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBBbHRlcmFuZG8gYXMgZGVmaW5pw6fDtWVzIGRvcyBzY2hlbWFzXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gYXMgY2hhdmVzIHJlZmVyZW50ZXMgYW8gYHBvLXN5bmNgIGZvcmVtIGRlc3RydcOtZGFzLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRlc3Ryb3lGdW5jdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmRlc3Ryb3lTY2hlbWFzUmVjb3JkcygpO1xuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5kZXN0cm95RXZlbnRTb3VyY2luZ1F1ZXVlKCk7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAoZGVzdHJveUZ1bmN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNhYmlsaXRhIHRvZG9zIG9zIHRpcG9zIGRlIHNpbmNyb25pemHDp8OjbyBkZSBkYWRvcyAocGVyacOzZGljYSwgcmVhdGl2YSBlIG1hbnVhbCkuXG4gICAqXG4gICAqID4gUGFyYSBoYWJpbGl0YXIgbm92YW1lbnRlIGEgc2luY3Jvbml6YcOnw6NvIHV0aWxpemUgbyBtw6l0b2RvIFtgUG9TeW5jU2VydmljZS5lbmFibGVTeW5jKClgXShkb2N1bWVudGF0aW9uL3BvLXN5bmMjZW5hYmxlLXN5bmMpLlxuICAgKi9cbiAgZGlzYWJsZVN5bmMoKSB7XG4gICAgdGhpcy5pc1N5bmNFbmFibGVkID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy50aW1lciAmJiB0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogPGEgaWQ9XCJlbmFibGUtc3luY1wiPjwvYT5cbiAgICogSGFiaWxpdGEgdG9kb3Mgb3MgdGlwb3MgZGUgc2luY3Jvbml6YcOnw6NvIGRlIGRhZG9zIChwZXJpw7NkaWNhLCByZWF0aXZhIGUgbWFudWFsKS5cbiAgICpcbiAgICogUG9yIHBhZHLDo28sIHNlbXByZSBxdWUgc2UgaW5pY2lhbGl6YSB1bWEgYXBsaWNhw6fDo28gY29tIFBPIFN5bmMgYXMgc2luY3Jvbml6YcOnw7VlcyBqw6EgZXN0w6NvIGhhYmlsaXRhZGFzLlxuICAgKi9cbiAgZW5hYmxlU3luYygpIHtcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuY3JlYXRlU3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBxdWUgZGlzcG9uaWJpbGl6YSBhIHBhcnRpciBkZSBzdWEgaW5zY3Jpw6fDo28gbyBldmVudG8gZGUgcmV0b3JubyBkYXMgb3BlcmHDp8O1ZXMgZGEgZmlsYSBkZSBldmVudG9zIHF1ZVxuICAgKiBmb3JhbSBlbnZpYWRhcyBhbyBzZXJ2aWRvci4gQSBjYWRhIG9wZXJhw6fDo28gZW52aWFkYSBwYXJhIG8gc2Vydmlkb3IsIHNlcsOhIGRpc3BhcmFkbyB1bSBldmVudG8gcGFyYSBhIGluc2NyacOnw6NvXG4gICAqIGRlc3RlIG3DqXRvZG8uXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FwdHVyYW5kbyByZXNwb3N0YXMgZGEgc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge09ic2VydmFibGU8UG9TeW5jUmVzcG9uc2U+fSBPYnNlcnZhYmxlIGNvbSB1bSBvYmpldG8gZG8gdGlwbyBgUG9TeW5jUmVzcG9uc2VgLlxuICAgKi9cbiAgZ2V0UmVzcG9uc2VzKCk6IE9ic2VydmFibGU8UG9TeW5jUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnJlc3BvbnNlc1N1YmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvcm5hIHVtYSBpbnN0w6JuY2lhIGRlIGBQb0VudGl0eWAgcGFyYSB1bSBkZXRlcm1pbmFkbyAqc2NoZW1hKi5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBNYW5pcHVsYW5kbyBvcyByZWdpc3Ryb3MgZGUgdW0gc2NoZW1hXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYU5hbWUgTm9tZSBkbyAqc2NoZW1hKi5cbiAgICogQHJldHVybnMge1BvRW50aXR5fSBPYmpldG8gcGFyYSBlZmV0dWFyIGNvbnN1bHRhcyBlIGFsdGVyYcOnw7VlcyBub3MgZGFkb3MuXG4gICAqL1xuICBnZXRNb2RlbChzY2hlbWFOYW1lOiBzdHJpbmcpOiBQb0VudGl0eSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsc1tzY2hlbWFOYW1lXTtcbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZGVsIG5vdCBmb3VuZDogJyArIHNjaGVtYU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJlIHVtYSByZXF1aXNpw6fDo28gSFRUUCBuYSBmaWxhIGRlIGV2ZW50b3MgZG8gYHBvLXN5bmNgLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEluc2VyaW5kbyByZXF1aXNpw6fDtWVzIEhUVFAgbmEgZmlsYSBkZSBldmVudG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHtQb0h0dHBSZXF1ZXN0RGF0YX0gcG9IdHRwUmVxdWVzdERhdGEgRGFkb3MgZGEgcmVxdWlzacOnw6NvIEhUVFAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkYSByZXF1aXNpw6fDo28gSFRUUC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gUHJvbWVzc2EgY29tIG8gaWRlbnRpZmljYWRvciBkYSByZXF1aXNpw6fDo28gSFRUUCBjcmlhZGEuXG4gICAqL1xuICBpbnNlcnRIdHRwQ29tbWFuZChyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdmFsaWRhdGVQYXJhbWV0ZXIoeyByZXF1ZXN0RGF0YSB9KTtcblxuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuaHR0cENvbW1hbmQocmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogRWZldHVhIHVtYSBjaGFtYWRhIG5hIEFQSSBkbyBzZXJ2aWRvciBwYXJhIHJlYWxpemFyIGEgY2FyZ2EgaW5pY2lhbCBkb3MgZGFkb3MuIERldmUgc2VyIGNoYW1hZG8gYXBlbmFzIHVtYSB2ZXpcbiAgICogbmEgYXBsaWNhw6fDo28sIGFww7NzIGEgcHJlcGFyYcOnw6NvIGRvcyAqc2NoZW1hcyogcmVhbGl6YWRhIGF0cmF2w6lzIGRvIG3DqXRvZG8gYFBvU3luY1NlcnZpY2UucHJlcGFyZSgpYC5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXJnYSBpbmljaWFsIGRvcyBkYWRvc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEFycmF5PHsgZW50aXR5OiBzdHJpbmcsIGRhdGE6IEFycmF5PGFueT4gfT4+fSBPYnNlcnZhYmxlIHF1ZSBub3RpZmljYXLDoSBxdWFuZG8gYVxuICAgKiBjYXJnYSBpbmljaWFsIGZvciBjb25jbHXDrWRhLlxuICAgKi9cbiAgbG9hZERhdGEoKTogT2JzZXJ2YWJsZTxBcnJheTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiB7XG4gICAgY29uc3QgbG9hZHM6IEFycmF5PE9ic2VydmFibGU8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9Pj4gPSBbXTtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChlbCA9PiBsb2Fkcy5wdXNoKHRoaXMubG9hZEVudGl0eURhdGEoZWwpKSk7XG4gICAgcmV0dXJuIGZvcmtKb2luKGxvYWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25zw6F2ZWwgcG9yIG5vdGlmaWNhciBzZW1wcmUgcXVlIGhvdXZlciBzaW5jcm9uaXNtby5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBOb3RpZmljYcOnw6NvIHDDs3Mtc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSBxdWUgw6kgZGlzcGFyYWRvIGEgY2FkYSBzaW5jcm9uaXNtbyByZWFsaXphZG8uXG4gICAqL1xuICBvblN5bmMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZXZlbnRTdWIpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShlID0+IHtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ldmVudFN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhIGEgYXBsaWNhw6fDo28gY3JpYW5kbyBvcyBzY2hlbWFzIGUgYXBsaWNhIGFzIGNvbmZpZ3VyYcOnw7Vlcy5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBQcmVwYXJhbmRvIGEgYXBsaWNhw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PFBvU3luY1NjaGVtYT59IHNjaGVtYXMgTGlzdGEgZGUgKnNjaGVtYXMqIGEgc2VyZW0gcHJlcGFyYWRvcy5cbiAgICogQHBhcmFtIHtQb1N5bmNDb25maWd9IGNvbmZpZyBDb25maWd1cmHDp8O1ZXMgYWRpY2lvbmFpcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gYSBhcGxpY2HDp8OjbyBlc3RpdmVyIHByZXBhcmFkYSBwYXJhIGEgdXRpbGl6YcOnw6NvIGRvIGBwby1zeW5jYC5cbiAgICovXG4gIHByZXBhcmUoc2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPiwgY29uZmlnPzogUG9TeW5jQ29uZmlnKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YWxpZGF0ZUFycmF5KHsgc2NoZW1hcyB9KTtcblxuICAgIGNvbnN0IGRlZmF1bHRTeW5jQ29uZmlnOiBQb1N5bmNDb25maWcgPSB7XG4gICAgICB0eXBlOiB0aGlzLnBvTmV0d29ya1NlcnZpY2UuZ2V0Q29ubmVjdGlvblN0YXR1cygpLnR5cGUsXG4gICAgICBwZXJpb2Q6IDYwLFxuICAgICAgZGF0YVRyYW5zZm9ybTogbmV3IFBvRGF0YU1lc3NhZ2UoKVxuICAgIH07XG5cbiAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IGRlZmF1bHRTeW5jQ29uZmlnO1xuICAgIHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0gPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtIHx8IG5ldyBQb0RhdGFNZXNzYWdlKCk7XG4gICAgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xuICAgIHRoaXMucmVhY3RpdmVTeW5jKCk7XG4gICAgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLm9uU2F2ZURhdGEoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zeW5jKCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2F2ZVNjaGVtYXMoKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWxzW3NjaGVtYS5uYW1lXSA9IG5ldyBQb0VudGl0eSh0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UsIHNjaGVtYSwgdGhpcy5wb1NjaGVtYVNlcnZpY2UpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVtIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zIHF1ZSBlc3BlcmEgYSBzaW5jcm9uaXphw6fDo28uXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FwdHVyYW5kbyByZXNwb3N0YXMgZGEgc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IGlkRXZlbnRTb3VyY2luZyBJZGVudGlmaWNhZG9yIGRvIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zIMOpIHJlbW92aWRvLlxuICAgKi9cbiAgcmVtb3ZlSXRlbU9mU3luYyhpZEV2ZW50U291cmNpbmc6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5yZW1vdmVFdmVudFNvdXJjaW5nSXRlbShpZEV2ZW50U291cmNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZW52aWEgb3MgY29tYW5kb3MgcGVuZGVudGVzIG5hIGZpbGEgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2Egbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FwdHVyYW5kbyByZXNwb3N0YXMgZGEgc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIHJlc29sdmUgbyBzaW5jcm9uaXNtbyBkaXNwYXJhZG8uXG4gICAqL1xuICByZXN1bWVTeW5jKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmNhblN5bmMoKSkge1xuICAgICAgY29uc3QgZmluaXNoU3luY1N1YnNjcmlwdGlvbiA9IHRoaXMuZmluaXNoU3luY1N1YmplY3QuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZmluaXNoU3luY1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGFyYSBvIHNpbmNyb25pc21vIGVudmlhbmRvIG9zIGV2ZW50b3MgcGVuZGVudGVzIChpbmNsdXPDo28sIGFsdGVyYcOnw6NvIGUgZXhjbHVzw6NvKSBlIGJ1c2NhbmRvIG5vdm9zIGRhZG9zIGRvIHNlcnZpZG9yLlxuICAgKlxuICAgKiBPIHNpbmNyb25pc21vIHNvbWVudGUgc2Vyw6EgZXhlY3V0YWRvIGRlcG9pcyBxdWUgbyBhY2Vzc28gYSBiYXNlIGRlIGRhZG9zIGxvY2FsIGRvIGRpc3Bvc2l0aXZvIGZvciBsaWJlcmFkYS5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBTaW5jcm9uaXphw6fDo28gbWFudWFsXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBzaW5jcm9uaXNtbyBmb3IgZmluYWxpemFkby5cbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5jYW5TeW5jKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRTeW5jKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5zeW5jU2VuZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY0dldCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmVtaXR0ZXIpIHtcbiAgICAgICAgICB0aGlzLmVtaXR0ZXIubmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maW5pc2hTeW5jKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnN5bmNFcnJvcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuU3luYygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zeW5jaW5nIHx8ICF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudENvbm5lY3Rpb24gPSB0aGlzLnBvTmV0d29ya1NlcnZpY2UuZ2V0Q29ubmVjdGlvblN0YXR1cygpO1xuICAgICAgY29uc3QgaXNDb25maWd1cmVkQ29ubmVjdGlvbiA9IHRoaXMuY29uZmlnICYmIGN1cnJlbnRDb25uZWN0aW9uLnR5cGUgPT09IHRoaXMuY29uZmlnLnR5cGU7XG4gICAgICBjb25zdCBpc0NvbmZpZ0luY2x1ZGVzVHlwZSA9XG4gICAgICAgIHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLnR5cGUgaW5zdGFuY2VvZiBBcnJheSAmJiB0aGlzLmNvbmZpZy50eXBlLmluY2x1ZGVzKGN1cnJlbnRDb25uZWN0aW9uLnR5cGUpO1xuXG4gICAgICByZXR1cm4gY3VycmVudENvbm5lY3Rpb24uc3RhdHVzICYmICghdGhpcy5jb25maWcgfHwgaXNDb25maWd1cmVkQ29ubmVjdGlvbiB8fCBpc0NvbmZpZ0luY2x1ZGVzVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy50aW1lci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaFN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jaW5nID0gZmFsc2U7XG4gICAgdGhpcy5maW5pc2hTeW5jU3ViamVjdC5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldE9uZVBhZ2Uoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHBhZ2U6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlUGFyYW1OYW1lKCl9PSR7cGFnZX1gKTtcblxuICAgIGNvbnN0IHVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCl9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmdldCh1cmwpLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSksXG4gICAgICBtZXJnZU1hcChyZXNwb25zZUJvZHkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGl0ZW0uU3luY0luc2VydGVkRGF0ZVRpbWUgPSBub3c7XG4gICAgICAgICAgaXRlbS5TeW5jVXBkYXRlZERhdGVUaW1lID0gbnVsbDtcbiAgICAgICAgICBpdGVtLlN5bmNFeGNsdXNpb25EYXRlVGltZSA9IG51bGw7XG4gICAgICAgICAgaXRlbS5TeW5jRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgIGl0ZW0uU3luY1N0YXR1cyA9IDI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2VcbiAgICAgICAgICAudXBkYXRlQWxsKHNjaGVtYSwgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzcG9uc2VCb2R5KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4ge1xuICAgIGxldCBwYWdlID0gMTtcbiAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgcGFnZSkucGlwZShcbiAgICAgIGV4cGFuZChkYXRhID0+IHtcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmhhc05leHQoKTtcbiAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgKytwYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICByZWR1Y2UoXG4gICAgICAgIChhY2MsIG9iaikgPT4ge1xuICAgICAgICAgIGFjYy5kYXRhID0gYWNjLmRhdGEuY29uY2F0KG9ialt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldKTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZW50aXR5OiBzY2hlbWEubmFtZSxcbiAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhY3RpdmVTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMucG9OZXR3b3JrU2VydmljZS5vbkNoYW5nZSgpLnN1YnNjcmliZShuZXR3b3JrU3RhdHVzID0+IHtcbiAgICAgIGlmIChuZXR3b3JrU3RhdHVzLnN0YXR1cykge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVNjaGVtYXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdG9yYWdlU2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPiA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5nZXRBbGwoKTtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4gKHNjaGVtYS5sYXN0U3luYyA9IFBvU2NoZW1hVXRpbC5nZXRMYXN0U3luYyhzdG9yYWdlU2NoZW1hcywgc2NoZW1hLm5hbWUpKSk7XG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5zYXZlQWxsKHRoaXMuc2NoZW1hcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0U3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNpbmcgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRpbWVyKHBlcmlvZCk6IHZvaWQge1xuICAgIGlmIChwZXJpb2QgJiYgdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICB0aGlzLnRpbWVyID0gdGltZXIocGVyaW9kICogMTAwMCk7XG4gICAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0Vycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuZmluaXNoU3luYygpO1xuICB9XG59XG4iXX0=
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
4
+ import { expand, map, mergeMap, reduce } from 'rxjs/operators';
5
+ import { validateParameter, validateArray } from '../../utils/utils';
6
+ import { PoDataMessage, PoEntity } from '../../models';
7
+ import { PoEventSourcingService } from '../po-event-sourcing/po-event-sourcing.service';
8
+ import { PoHttpClientService } from '../po-http-client/po-http-client.service';
9
+ import { PoNetworkService } from '../po-network/po-network.service';
10
+ import { PoRequestType } from '../../models/po-request-type.enum';
11
+ import { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';
12
+ import { PoSchemaService } from './../po-schema/po-schema.service';
13
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
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
+ constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
23
+ this.poEventSourcingService = poEventSourcingService;
24
+ this.poHttpClient = poHttpClient;
25
+ this.poNetworkService = poNetworkService;
26
+ this.poSchemaDefinitionService = poSchemaDefinitionService;
27
+ this.poSchemaService = poSchemaService;
28
+ this.models = [];
29
+ this.finishSyncSubject = new Subject();
30
+ this.isSyncEnabled = true;
31
+ this.syncing = false;
32
+ }
33
+ /**
34
+ * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
35
+ * as definições dos *schemas*, os registros de cada *schema* e a fila
36
+ * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
37
+ *
38
+ * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
39
+ * recomenda-se utilizar o método `prepare()` em seguida.
40
+ *
41
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
42
+ *
43
+ * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
44
+ */
45
+ destroy() {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ const destroyFunction = () => __awaiter(this, void 0, void 0, function* () {
48
+ yield this.poSchemaService.destroySchemasRecords();
49
+ yield this.poSchemaDefinitionService.destroy();
50
+ yield this.poEventSourcingService.destroyEventSourcingQueue();
51
+ });
52
+ return this.poSchemaService.limitedCallWrap(destroyFunction);
53
+ });
54
+ }
55
+ /**
56
+ * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
57
+ *
58
+ * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
59
+ */
60
+ disableSync() {
61
+ this.isSyncEnabled = false;
62
+ if (this.timer && this.subscription) {
63
+ this.subscription.unsubscribe();
64
+ }
65
+ }
66
+ /**
67
+ * <a id="enable-sync"></a>
68
+ * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
69
+ *
70
+ * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
71
+ */
72
+ enableSync() {
73
+ this.isSyncEnabled = true;
74
+ this.createSubscribe();
75
+ }
76
+ /**
77
+ * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
78
+ * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
79
+ * deste método.
80
+ *
81
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
82
+ *
83
+ * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
84
+ */
85
+ getResponses() {
86
+ return this.poEventSourcingService.responsesSubject();
87
+ }
88
+ /**
89
+ * Retorna uma instância de `PoEntity` para um determinado *schema*.
90
+ *
91
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
92
+ *
93
+ * @param {string} schemaName Nome do *schema*.
94
+ * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
95
+ */
96
+ getModel(schemaName) {
97
+ const model = this.models[schemaName];
98
+ if (!model) {
99
+ throw new Error('Model not found: ' + schemaName);
100
+ }
101
+ return model;
102
+ }
103
+ /**
104
+ * Insere uma requisição HTTP na fila de eventos do `po-sync`.
105
+ *
106
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
107
+ *
108
+ * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
109
+ * @param {string} customRequestId Identificador customizado da requisição HTTP.
110
+ * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
111
+ */
112
+ insertHttpCommand(requestData, customRequestId) {
113
+ validateParameter({ requestData });
114
+ return this.poEventSourcingService.httpCommand(requestData, customRequestId);
115
+ }
116
+ /**
117
+ * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
118
+ * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
119
+ *
120
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
121
+ *
122
+ * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
123
+ * carga inicial for concluída.
124
+ */
125
+ loadData() {
126
+ const loads = [];
127
+ this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
128
+ return forkJoin(loads);
129
+ }
130
+ /**
131
+ * Responsável por notificar sempre que houver sincronismo.
132
+ *
133
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
134
+ *
135
+ * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
136
+ */
137
+ onSync() {
138
+ if (!this.eventSub) {
139
+ this.eventSub = Observable.create(e => {
140
+ this.emitter = e;
141
+ });
142
+ }
143
+ return this.eventSub;
144
+ }
145
+ /**
146
+ * Prepara a aplicação criando os schemas e aplica as configurações.
147
+ *
148
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
149
+ *
150
+ * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
151
+ * @param {PoSyncConfig} config Configurações adicionais.
152
+ * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
153
+ */
154
+ prepare(schemas, config) {
155
+ validateArray({ schemas });
156
+ const defaultSyncConfig = {
157
+ type: this.poNetworkService.getConnectionStatus().type,
158
+ period: 60,
159
+ dataTransform: new PoDataMessage()
160
+ };
161
+ this.schemas = schemas;
162
+ this.config = config || defaultSyncConfig;
163
+ this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
164
+ this.poEventSourcingService.config = this.config;
165
+ this.startTimer(this.config.period);
166
+ this.reactiveSync();
167
+ this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
168
+ return this.saveSchemas().then(() => {
169
+ this.schemas.forEach(schema => {
170
+ this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
171
+ });
172
+ return Promise.resolve();
173
+ });
174
+ }
175
+ /**
176
+ * Remove um item da fila de eventos que espera a sincronização.
177
+ *
178
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
179
+ *
180
+ * @param {any} idEventSourcing Identificador do item da fila de eventos.
181
+ * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
182
+ */
183
+ removeItemOfSync(idEventSourcing) {
184
+ return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
185
+ }
186
+ /**
187
+ * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
188
+ *
189
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
190
+ *
191
+ * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
192
+ */
193
+ resumeSync() {
194
+ if (!this.canSync()) {
195
+ const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
196
+ finishSyncSubscription.unsubscribe();
197
+ return this.sync();
198
+ });
199
+ return Promise.resolve();
200
+ }
201
+ return this.sync();
202
+ }
203
+ /**
204
+ * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
205
+ *
206
+ * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
207
+ *
208
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
209
+ *
210
+ * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
211
+ */
212
+ sync() {
213
+ return __awaiter(this, void 0, void 0, function* () {
214
+ if (this.canSync()) {
215
+ this.startSync();
216
+ try {
217
+ yield this.poEventSourcingService.syncSend();
218
+ yield this.poEventSourcingService.syncGet();
219
+ if (this.emitter) {
220
+ this.emitter.next();
221
+ }
222
+ this.finishSync();
223
+ }
224
+ catch (error) {
225
+ this.syncError();
226
+ }
227
+ }
228
+ });
229
+ }
230
+ canSync() {
231
+ if (this.syncing || !this.isSyncEnabled) {
232
+ return false;
233
+ }
234
+ else {
235
+ const currentConnection = this.poNetworkService.getConnectionStatus();
236
+ const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
237
+ const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
238
+ return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
239
+ }
240
+ }
241
+ createSubscribe() {
242
+ if (this.timer) {
243
+ this.subscription = this.timer.subscribe(() => {
244
+ this.sync().then(() => {
245
+ this.subscription.unsubscribe();
246
+ this.subscription = null;
247
+ this.timer = null;
248
+ this.startTimer(this.config.period);
249
+ });
250
+ });
251
+ }
252
+ }
253
+ finishSync() {
254
+ this.syncing = false;
255
+ this.finishSyncSubject.next();
256
+ }
257
+ getOnePage(schema, page = 1) {
258
+ const params = [];
259
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
260
+ params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
261
+ const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
262
+ return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
263
+ const now = new Date().getTime();
264
+ responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
265
+ item.SyncInsertedDateTime = now;
266
+ item.SyncUpdatedDateTime = null;
267
+ item.SyncExclusionDateTime = null;
268
+ item.SyncDeleted = false;
269
+ item.SyncStatus = 2;
270
+ });
271
+ return this.poSchemaService
272
+ .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
273
+ .then(() => responseBody);
274
+ }));
275
+ }
276
+ loadEntityData(schema) {
277
+ let page = 1;
278
+ return this.getOnePage(schema, page).pipe(expand(data => {
279
+ this.config.dataTransform.transform(data);
280
+ const hasNext = this.config.dataTransform.hasNext();
281
+ if (hasNext) {
282
+ return this.getOnePage(schema, ++page);
283
+ }
284
+ else {
285
+ return of();
286
+ }
287
+ }), reduce((acc, obj) => {
288
+ acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
289
+ return acc;
290
+ }, {
291
+ entity: schema.name,
292
+ data: []
293
+ }));
294
+ }
295
+ reactiveSync() {
296
+ this.poNetworkService.onChange().subscribe(networkStatus => {
297
+ if (networkStatus.status) {
298
+ this.startTimer(this.config.period);
299
+ return this.sync();
300
+ }
301
+ if (this.subscription) {
302
+ this.subscription.unsubscribe();
303
+ }
304
+ });
305
+ }
306
+ saveSchemas() {
307
+ return __awaiter(this, void 0, void 0, function* () {
308
+ const storageSchemas = yield this.poSchemaDefinitionService.getAll();
309
+ this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
310
+ return this.poSchemaDefinitionService.saveAll(this.schemas);
311
+ });
312
+ }
313
+ startSync() {
314
+ this.syncing = true;
315
+ }
316
+ startTimer(period) {
317
+ if (period && this.isSyncEnabled) {
318
+ this.timer = timer(period * 1000);
319
+ this.createSubscribe();
320
+ }
321
+ }
322
+ syncError() {
323
+ this.finishSync();
324
+ }
325
+ }
326
+ PoSyncService.decorators = [
327
+ { type: Injectable }
328
+ ];
329
+ PoSyncService.ctorParameters = () => [
330
+ { type: PoEventSourcingService },
331
+ { type: PoHttpClientService },
332
+ { type: PoNetworkService },
333
+ { type: PoSchemaDefinitionService },
334
+ { type: PoSchemaService }
335
+ ];
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBS2xGOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBYXhCLFlBQ1Usc0JBQThDLEVBQzlDLFlBQWlDLEVBQ2pDLGdCQUFrQyxFQUNsQyx5QkFBb0QsRUFDcEQsZUFBZ0M7UUFKaEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWpCMUMsV0FBTSxHQUFvQixFQUFFLENBQUM7UUFLckIsc0JBQWlCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFDdkQsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsWUFBTyxHQUFZLEtBQUssQ0FBQztJQVM5QixDQUFDO0lBRUo7Ozs7Ozs7Ozs7O09BV0c7SUFDRyxPQUFPOztZQUNYLE1BQU0sZUFBZSxHQUFHLEdBQVMsRUFBRTtnQkFDakMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMvQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2hFLENBQUMsQ0FBQSxDQUFDO1lBRUYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsUUFBUSxDQUFDLFVBQWtCO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILGlCQUFpQixDQUFDLFdBQThCLEVBQUUsZUFBd0I7UUFDeEUsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sS0FBSyxHQUE0RCxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU8sQ0FBQyxPQUE0QixFQUFFLE1BQXFCO1FBQ3pELGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxpQkFBaUIsR0FBaUI7WUFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUk7WUFDdEQsTUFBTSxFQUFFLEVBQUU7WUFDVixhQUFhLEVBQUUsSUFBSSxhQUFhLEVBQUU7U0FDbkMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLGlCQUFpQixDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV0RSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxlQUFvQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDbEYsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDRyxJQUFJOztZQUNSLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBRWpCLElBQUk7b0JBQ0YsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzdDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUU1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ3JCO29CQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDbkI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUNsQjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRU8sT0FBTztRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RSxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFGLE1BQU0sb0JBQW9CLEdBQ3hCLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4RyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxzQkFBc0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3JHO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBb0IsRUFBRSxPQUFlLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRXBGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQzlCLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2dCQUNoQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlO2lCQUN4QixTQUFTLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7aUJBQzlFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFvQjtRQUN6QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BELElBQUksT0FBTyxFQUFFO2dCQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4QztpQkFBTTtnQkFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsRUFDRixNQUFNLENBQ0osQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDWCxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRDtZQUNFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsRUFBRTtTQUNULENBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDcEI7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFYSxXQUFXOztZQUN2QixNQUFNLGNBQWMsR0FBd0IsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7S0FBQTtJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQU07UUFDdkIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7O1lBN1ZGLFVBQVU7OztZQW5CRixzQkFBc0I7WUFDdEIsbUJBQW1CO1lBRW5CLGdCQUFnQjtZQUVoQix5QkFBeUI7WUFDekIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgbWVyZ2VNYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgdmFsaWRhdGVQYXJhbWV0ZXIsIHZhbGlkYXRlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBQb0RhdGFNZXNzYWdlLCBQb0VudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UgfSBmcm9tICcuLi9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtY2xpZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0RGF0YSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9OZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3BvLW5ldHdvcmsvcG8tbmV0d29yay5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9SZXF1ZXN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtdXRpbC9wby1zY2hlbWEtdXRpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFBvU3luY0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1N5bmNSZXNwb25zZSB9IGZyb20gJy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXJlc3BvbnNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvU3luY1NjaGVtYSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBPIGBQb1N5bmNTZXJ2aWNlYCDDqSB1dGlsaXphZG8gcGFyYSBjb25maWd1cmFyIHRvZGEgYSBiYXNlIGRlIGRhZG9zIHF1ZSByZWNlYmVyw6EgYXMgaW5mb3JtYcOnw7VlcyBxdWUgc2Vyw6NvXHJcbiAqIGFybWF6ZW5hZGFzICpvZmZsaW5lKiB2aW5kYXMgZG8gc2Vydmlkb3IuIE5lbGUgb2NvcnJlIHRvZGEgYSBwcmVwYXJhw6fDo28gZG9zIG1vZGVsb3MgZGUgZGFkb3MgcmV0b3JuYWRvcyBwb3JcclxuICogY2FkYSBjb25zdWx0YS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFBvU3luY1NlcnZpY2Uge1xyXG4gIG1vZGVsczogQXJyYXk8UG9FbnRpdHk+ID0gW107XHJcblxyXG4gIHByaXZhdGUgY29uZmlnOiBQb1N5bmNDb25maWc7XHJcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHByaXZhdGUgZmluaXNoU3luY1N1YmplY3Q6IFN1YmplY3Q8bnVsbD4gPSBuZXcgU3ViamVjdDxudWxsPigpO1xyXG4gIHByaXZhdGUgaXNTeW5jRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcG9FdmVudFNvdXJjaW5nU2VydmljZTogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9IdHRwQ2xpZW50OiBQb0h0dHBDbGllbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb05ldHdvcmtTZXJ2aWNlOiBQb05ldHdvcmtTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlOiBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYVNlcnZpY2U6IFBvU2NoZW1hU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHLDs2kgdG9kYXMgYXMgY2hhdmVzIGRvICpzdG9yYWdlKiByZWZlcmVudGVzIGFvIGBwby1zeW5jYCwgb3Ugc2VqYSxcclxuICAgKiBhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKiwgb3MgcmVnaXN0cm9zIGRlIGNhZGEgKnNjaGVtYSogZSBhIGZpbGFcclxuICAgKiBkZSBldmVudG9zIHF1ZSBlc3TDo28gcGFyYSBzZXIgZW52aWFkb3MgYW8gc2Vydmlkb3IgKihFdmVudFNvdXJjaW5nKSouXHJcbiAgICpcclxuICAgKiA+IFBhcmEgcXVlIG7Do28gdmVuaGFtIG9jb3JyZXIgZXJyb3MgZW0gYcOnw7VlcyBxdWUgZGVwZW5kYW0gZGFzIGRlZmluacOnw7VlcyBkb3MgKnNjaGVtYXMqLFxyXG4gICAqIHJlY29tZW5kYS1zZSB1dGlsaXphciBvIG3DqXRvZG8gYHByZXBhcmUoKWAgZW0gc2VndWlkYS5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQWx0ZXJhbmRvIGFzIGRlZmluacOnw7VlcyBkb3Mgc2NoZW1hc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhbyBgcG8tc3luY2AgZm9yZW0gZGVzdHJ1w61kYXMuXHJcbiAgICovXHJcbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgZGVzdHJveUZ1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5kZXN0cm95U2NoZW1hc1JlY29yZHMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmRlc3Ryb3lFdmVudFNvdXJjaW5nUXVldWUoKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChkZXN0cm95RnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxyXG4gICAqXHJcbiAgICogPiBQYXJhIGhhYmlsaXRhciBub3ZhbWVudGUgYSBzaW5jcm9uaXphw6fDo28gdXRpbGl6ZSBvIG3DqXRvZG8gW2BQb1N5bmNTZXJ2aWNlLmVuYWJsZVN5bmMoKWBdKGRvY3VtZW50YXRpb24vcG8tc3luYyNlbmFibGUtc3luYykuXHJcbiAgICovXHJcbiAgZGlzYWJsZVN5bmMoKSB7XHJcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy50aW1lciAmJiB0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogPGEgaWQ9XCJlbmFibGUtc3luY1wiPjwvYT5cclxuICAgKiBIYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxyXG4gICAqXHJcbiAgICogUG9yIHBhZHLDo28sIHNlbXByZSBxdWUgc2UgaW5pY2lhbGl6YSB1bWEgYXBsaWNhw6fDo28gY29tIFBPIFN5bmMgYXMgc2luY3Jvbml6YcOnw7VlcyBqw6EgZXN0w6NvIGhhYmlsaXRhZGFzLlxyXG4gICAqL1xyXG4gIGVuYWJsZVN5bmMoKSB7XHJcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jcmVhdGVTdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIGRpc3BvbmliaWxpemEgYSBwYXJ0aXIgZGUgc3VhIGluc2NyacOnw6NvIG8gZXZlbnRvIGRlIHJldG9ybm8gZGFzIG9wZXJhw6fDtWVzIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWVcclxuICAgKiBmb3JhbSBlbnZpYWRhcyBhbyBzZXJ2aWRvci4gQSBjYWRhIG9wZXJhw6fDo28gZW52aWFkYSBwYXJhIG8gc2Vydmlkb3IsIHNlcsOhIGRpc3BhcmFkbyB1bSBldmVudG8gcGFyYSBhIGluc2NyacOnw6NvXHJcbiAgICogZGVzdGUgbcOpdG9kby5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FwdHVyYW5kbyByZXNwb3N0YXMgZGEgc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPn0gT2JzZXJ2YWJsZSBjb20gdW0gb2JqZXRvIGRvIHRpcG8gYFBvU3luY1Jlc3BvbnNlYC5cclxuICAgKi9cclxuICBnZXRSZXNwb25zZXMoKTogT2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5yZXNwb25zZXNTdWJqZWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRvcm5hIHVtYSBpbnN0w6JuY2lhIGRlIGBQb0VudGl0eWAgcGFyYSB1bSBkZXRlcm1pbmFkbyAqc2NoZW1hKi5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTWFuaXB1bGFuZG8gb3MgcmVnaXN0cm9zIGRlIHVtIHNjaGVtYV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxyXG4gICAqIEByZXR1cm5zIHtQb0VudGl0eX0gT2JqZXRvIHBhcmEgZWZldHVhciBjb25zdWx0YXMgZSBhbHRlcmHDp8O1ZXMgbm9zIGRhZG9zLlxyXG4gICAqL1xyXG4gIGdldE1vZGVsKHNjaGVtYU5hbWU6IHN0cmluZyk6IFBvRW50aXR5IHtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbc2NoZW1hTmFtZV07XHJcbiAgICBpZiAoIW1vZGVsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgbm90IGZvdW5kOiAnICsgc2NoZW1hTmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kZWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcmUgdW1hIHJlcXVpc2nDp8OjbyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvcyBkbyBgcG8tc3luY2AuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEluc2VyaW5kbyByZXF1aXNpw6fDtWVzIEhUVFAgbmEgZmlsYSBkZSBldmVudG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UG9IdHRwUmVxdWVzdERhdGF9IHBvSHR0cFJlcXVlc3REYXRhIERhZG9zIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkYSByZXF1aXNpw6fDo28gSFRUUC5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBQcm9tZXNzYSBjb20gbyBpZGVudGlmaWNhZG9yIGRhIHJlcXVpc2nDp8OjbyBIVFRQIGNyaWFkYS5cclxuICAgKi9cclxuICBpbnNlcnRIdHRwQ29tbWFuZChyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlcXVlc3REYXRhIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuaHR0cENvbW1hbmQocmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZmV0dWEgdW1hIGNoYW1hZGEgbmEgQVBJIGRvIHNlcnZpZG9yIHBhcmEgcmVhbGl6YXIgYSBjYXJnYSBpbmljaWFsIGRvcyBkYWRvcy4gRGV2ZSBzZXIgY2hhbWFkbyBhcGVuYXMgdW1hIHZlelxyXG4gICAqIG5hIGFwbGljYcOnw6NvLCBhcMOzcyBhIHByZXBhcmHDp8OjbyBkb3MgKnNjaGVtYXMqIHJlYWxpemFkYSBhdHJhdsOpcyBkbyBtw6l0b2RvIGBQb1N5bmNTZXJ2aWNlLnByZXBhcmUoKWAuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcmdhIGluaWNpYWwgZG9zIGRhZG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEFycmF5PHsgZW50aXR5OiBzdHJpbmcsIGRhdGE6IEFycmF5PGFueT4gfT4+fSBPYnNlcnZhYmxlIHF1ZSBub3RpZmljYXLDoSBxdWFuZG8gYVxyXG4gICAqIGNhcmdhIGluaWNpYWwgZm9yIGNvbmNsdcOtZGEuXHJcbiAgICovXHJcbiAgbG9hZERhdGEoKTogT2JzZXJ2YWJsZTxBcnJheTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiB7XHJcbiAgICBjb25zdCBsb2FkczogQXJyYXk8T2JzZXJ2YWJsZTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiA9IFtdO1xyXG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goZWwgPT4gbG9hZHMucHVzaCh0aGlzLmxvYWRFbnRpdHlEYXRhKGVsKSkpO1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKGxvYWRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3BvbnPDoXZlbCBwb3Igbm90aWZpY2FyIHNlbXByZSBxdWUgaG91dmVyIHNpbmNyb25pc21vLlxyXG4gICAqXHJcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBOb3RpZmljYcOnw6NvIHDDs3Mtc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59IE9ic2VydmFibGUgcXVlIMOpIGRpc3BhcmFkbyBhIGNhZGEgc2luY3JvbmlzbW8gcmVhbGl6YWRvLlxyXG4gICAqL1xyXG4gIG9uU3luYygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShlID0+IHtcclxuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJlcGFyYSBhIGFwbGljYcOnw6NvIGNyaWFuZG8gb3Mgc2NoZW1hcyBlIGFwbGljYSBhcyBjb25maWd1cmHDp8O1ZXMuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFByZXBhcmFuZG8gYSBhcGxpY2HDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0FycmF5PFBvU3luY1NjaGVtYT59IHNjaGVtYXMgTGlzdGEgZGUgKnNjaGVtYXMqIGEgc2VyZW0gcHJlcGFyYWRvcy5cclxuICAgKiBAcGFyYW0ge1BvU3luY0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYcOnw7VlcyBhZGljaW9uYWlzLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgYXBsaWNhw6fDo28gZXN0aXZlciBwcmVwYXJhZGEgcGFyYSBhIHV0aWxpemHDp8OjbyBkbyBgcG8tc3luY2AuXHJcbiAgICovXHJcbiAgcHJlcGFyZShzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+LCBjb25maWc/OiBQb1N5bmNDb25maWcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdmFsaWRhdGVBcnJheSh7IHNjaGVtYXMgfSk7XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdFN5bmNDb25maWc6IFBvU3luY0NvbmZpZyA9IHtcclxuICAgICAgdHlwZTogdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKS50eXBlLFxyXG4gICAgICBwZXJpb2Q6IDYwLFxyXG4gICAgICBkYXRhVHJhbnNmb3JtOiBuZXcgUG9EYXRhTWVzc2FnZSgpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0U3luY0NvbmZpZztcclxuICAgIHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0gPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtIHx8IG5ldyBQb0RhdGFNZXNzYWdlKCk7XHJcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcclxuICAgIHRoaXMucmVhY3RpdmVTeW5jKCk7XHJcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uub25TYXZlRGF0YSgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmMoKSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2F2ZVNjaGVtYXMoKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zY2hlbWFzLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICB0aGlzLm1vZGVsc1tzY2hlbWEubmFtZV0gPSBuZXcgUG9FbnRpdHkodGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLCBzY2hlbWEsIHRoaXMucG9TY2hlbWFTZXJ2aWNlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHVtIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zIHF1ZSBlc3BlcmEgYSBzaW5jcm9uaXphw6fDo28uXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gaWRFdmVudFNvdXJjaW5nIElkZW50aWZpY2Fkb3IgZG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyDDqSByZW1vdmlkby5cclxuICAgKi9cclxuICByZW1vdmVJdGVtT2ZTeW5jKGlkRXZlbnRTb3VyY2luZzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVtb3ZlRXZlbnRTb3VyY2luZ0l0ZW0oaWRFdmVudFNvdXJjaW5nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZW52aWEgb3MgY29tYW5kb3MgcGVuZGVudGVzIG5hIGZpbGEgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2Egbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgcmVzb2x2ZSBvIHNpbmNyb25pc21vIGRpc3BhcmFkby5cclxuICAgKi9cclxuICByZXN1bWVTeW5jKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU3luYygpKSB7XHJcbiAgICAgIGNvbnN0IGZpbmlzaFN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgZmluaXNoU3luY1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zeW5jKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXJhIG8gc2luY3JvbmlzbW8gZW52aWFuZG8gb3MgZXZlbnRvcyBwZW5kZW50ZXMgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2FuZG8gbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXHJcbiAgICpcclxuICAgKiBPIHNpbmNyb25pc21vIHNvbWVudGUgc2Vyw6EgZXhlY3V0YWRvIGRlcG9pcyBxdWUgbyBhY2Vzc28gYSBiYXNlIGRlIGRhZG9zIGxvY2FsIGRvIGRpc3Bvc2l0aXZvIGZvciBsaWJlcmFkYS5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gU2luY3Jvbml6YcOnw6NvIG1hbnVhbF0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIHNpbmNyb25pc21vIGZvciBmaW5hbGl6YWRvLlxyXG4gICAqL1xyXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmNhblN5bmMoKSkge1xyXG4gICAgICB0aGlzLnN0YXJ0U3luYygpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY1NlbmQoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY0dldCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbWl0dGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXR0ZXIubmV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5pc2hTeW5jKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5zeW5jRXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW5TeW5jKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc3luY2luZyB8fCAhdGhpcy5pc1N5bmNFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uID0gdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKTtcclxuICAgICAgY29uc3QgaXNDb25maWd1cmVkQ29ubmVjdGlvbiA9IHRoaXMuY29uZmlnICYmIGN1cnJlbnRDb25uZWN0aW9uLnR5cGUgPT09IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgIGNvbnN0IGlzQ29uZmlnSW5jbHVkZXNUeXBlID1cclxuICAgICAgICB0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy50eXBlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy5jb25maWcudHlwZS5pbmNsdWRlcyhjdXJyZW50Q29ubmVjdGlvbi50eXBlKTtcclxuXHJcbiAgICAgIHJldHVybiBjdXJyZW50Q29ubmVjdGlvbi5zdGF0dXMgJiYgKCF0aGlzLmNvbmZpZyB8fCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uIHx8IGlzQ29uZmlnSW5jbHVkZXNUeXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGltZXIpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zeW5jKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaFN5bmMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN5bmNpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuZmluaXNoU3luY1N1YmplY3QubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPbmVQYWdlKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBwYWdlOiBudW1iZXIgPSAxKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xyXG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlU2l6ZVBhcmFtTmFtZSgpfT0ke3NjaGVtYS5wYWdlU2l6ZX1gKTtcclxuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVBhcmFtTmFtZSgpfT0ke3BhZ2V9YCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gYCR7UG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKX0/JHtwYXJhbXMuam9pbignJicpfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmdldCh1cmwpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcclxuICAgICAgbWVyZ2VNYXAocmVzcG9uc2VCb2R5ID0+IHtcclxuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICByZXNwb25zZUJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICBpdGVtLlN5bmNJbnNlcnRlZERhdGVUaW1lID0gbm93O1xyXG4gICAgICAgICAgaXRlbS5TeW5jVXBkYXRlZERhdGVUaW1lID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uU3luY0V4Y2x1c2lvbkRhdGVUaW1lID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uU3luY0RlbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGl0ZW0uU3luY1N0YXR1cyA9IDI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlXHJcbiAgICAgICAgICAudXBkYXRlQWxsKHNjaGVtYSwgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pXHJcbiAgICAgICAgICAudGhlbigoKSA9PiByZXNwb25zZUJvZHkpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4ge1xyXG4gICAgbGV0IHBhZ2UgPSAxO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0T25lUGFnZShzY2hlbWEsIHBhZ2UpLnBpcGUoXHJcbiAgICAgIGV4cGFuZChkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLnRyYW5zZm9ybShkYXRhKTtcclxuICAgICAgICBjb25zdCBoYXNOZXh0ID0gdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5oYXNOZXh0KCk7XHJcbiAgICAgICAgaWYgKGhhc05leHQpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCArK3BhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gb2YoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICByZWR1Y2UoXHJcbiAgICAgICAgKGFjYywgb2JqKSA9PiB7XHJcbiAgICAgICAgICBhY2MuZGF0YSA9IGFjYy5kYXRhLmNvbmNhdChvYmpbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXSk7XHJcbiAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZW50aXR5OiBzY2hlbWEubmFtZSxcclxuICAgICAgICAgIGRhdGE6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFjdGl2ZVN5bmMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvTmV0d29ya1NlcnZpY2Uub25DaGFuZ2UoKS5zdWJzY3JpYmUobmV0d29ya1N0YXR1cyA9PiB7XHJcbiAgICAgIGlmIChuZXR3b3JrU3RhdHVzLnN0YXR1cykge1xyXG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVTY2hlbWFzKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzdG9yYWdlU2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPiA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5nZXRBbGwoKTtcclxuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiAoc2NoZW1hLmxhc3RTeW5jID0gUG9TY2hlbWFVdGlsLmdldExhc3RTeW5jKHN0b3JhZ2VTY2hlbWFzLCBzY2hlbWEubmFtZSkpKTtcclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2Uuc2F2ZUFsbCh0aGlzLnNjaGVtYXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydFN5bmMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN5bmNpbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydFRpbWVyKHBlcmlvZCk6IHZvaWQge1xyXG4gICAgaWYgKHBlcmlvZCAmJiB0aGlzLmlzU3luY0VuYWJsZWQpIHtcclxuICAgICAgdGhpcy50aW1lciA9IHRpbWVyKHBlcmlvZCAqIDEwMDApO1xyXG4gICAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jRXJyb3IoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbmlzaFN5bmMoKTtcclxuICB9XHJcbn1cclxuIl19