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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +3 -3
  2. package/{esm2020 → esm2022}/lib/index.mjs +14 -14
  3. package/{esm2020 → esm2022}/lib/models/index.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/models/po-data-message.model.mjs +56 -56
  5. package/esm2022/lib/models/po-data-transform.model.mjs +23 -0
  6. package/esm2022/lib/models/po-entity/po-entity.model.mjs +217 -0
  7. package/esm2022/lib/models/po-event-sourcing-error-response.model.mjs +21 -0
  8. package/esm2022/lib/models/po-network-status.model.mjs +45 -0
  9. package/{esm2020 → esm2022}/lib/models/po-network-type.enum.mjs +29 -29
  10. package/esm2022/lib/models/po-query-builder/po-query-builder.model.mjs +246 -0
  11. package/{esm2020 → esm2022}/lib/models/po-request-type.enum.mjs +15 -15
  12. package/{esm2020 → esm2022}/lib/po-sync.module.mjs +40 -40
  13. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +16 -16
  14. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/index.mjs +3 -3
  15. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +1 -1
  16. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +1 -1
  17. package/esm2022/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +379 -0
  18. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +10 -10
  19. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +1 -1
  20. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +1 -1
  21. package/esm2022/lib/services/po-http-client/po-http-client.service.mjs +149 -0
  22. package/{esm2020 → esm2022}/lib/services/po-http-client/po-http-request-type.enum.mjs +24 -24
  23. package/esm2022/lib/services/po-network/po-network.service.mjs +59 -0
  24. package/{esm2020 → esm2022}/lib/services/po-schema/index.mjs +3 -3
  25. package/esm2022/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +78 -0
  26. package/esm2022/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +124 -0
  27. package/esm2022/lib/services/po-schema/po-schema.service.mjs +176 -0
  28. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +1 -1
  30. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +1 -1
  31. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +1 -1
  32. package/esm2022/lib/services/po-sync/po-sync.service.mjs +336 -0
  33. package/{esm2020 → esm2022}/lib/utils/utils.mjs +62 -62
  34. package/{esm2020 → esm2022}/po-ui-ng-sync.mjs +4 -4
  35. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  36. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs +2004 -1962
  37. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs.map +1 -1
  38. package/index.d.ts +5 -5
  39. package/lib/index.d.ts +14 -14
  40. package/lib/models/index.d.ts +5 -5
  41. package/lib/models/po-data-message.model.d.ts +46 -46
  42. package/lib/models/po-data-transform.model.d.ts +52 -52
  43. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  44. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  45. package/lib/models/po-network-status.model.d.ts +25 -25
  46. package/lib/models/po-network-type.enum.d.ts +28 -28
  47. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  48. package/lib/models/po-request-type.enum.d.ts +14 -14
  49. package/lib/po-sync.module.d.ts +11 -11
  50. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  51. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  52. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  53. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  54. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -74
  55. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  56. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  57. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  58. package/lib/services/po-http-client/po-http-client.service.d.ts +78 -78
  59. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  60. package/lib/services/po-network/po-network.service.d.ts +35 -35
  61. package/lib/services/po-schema/index.d.ts +3 -3
  62. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -51
  63. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  64. package/lib/services/po-schema/po-schema.service.d.ts +98 -98
  65. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  66. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  67. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  68. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  69. package/lib/services/po-sync/po-sync.service.d.ts +162 -162
  70. package/lib/utils/utils.d.ts +36 -36
  71. package/package.json +10 -16
  72. package/po-ui-ng-sync-16.0.0-next.2.tgz +0 -0
  73. package/public-api.d.ts +1 -1
  74. package/schematics/migrations.json +1 -1
  75. package/schematics/ng-add/index.d.ts +7 -7
  76. package/schematics/ng-add/index.js +31 -31
  77. package/schematics/ng-add/index.spec.d.ts +1 -1
  78. package/schematics/ng-add/index.spec.js +60 -60
  79. package/schematics/ng-generate/schema/index.d.ts +4 -4
  80. package/schematics/ng-generate/schema/index.js +12 -12
  81. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  82. package/schematics/ng-generate/schema/index.spec.js +44 -44
  83. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  84. package/schematics/ng-generate/schema/schema.js +2 -2
  85. package/schematics/ng-update/v14/changes.d.ts +2 -2
  86. package/schematics/ng-update/v14/changes.js +13 -13
  87. package/schematics/ng-update/v14/index.d.ts +1 -1
  88. package/schematics/ng-update/v14/index.js +15 -15
  89. package/schematics/ng-update/v15/changes.d.ts +4 -4
  90. package/schematics/ng-update/v15/changes.js +15 -15
  91. package/schematics/ng-update/v15/index.d.ts +1 -1
  92. package/schematics/ng-update/v15/index.js +36 -36
  93. package/schematics/ng-update/v2/changes.d.ts +8 -8
  94. package/schematics/ng-update/v2/changes.js +20 -20
  95. package/schematics/ng-update/v2/index.d.ts +5 -5
  96. package/schematics/ng-update/v2/index.js +101 -101
  97. package/schematics/ng-update/v3/changes.d.ts +2 -2
  98. package/schematics/ng-update/v3/changes.js +14 -14
  99. package/schematics/ng-update/v3/index.d.ts +1 -1
  100. package/schematics/ng-update/v3/index.js +16 -16
  101. package/schematics/ng-update/v4/changes.d.ts +2 -2
  102. package/schematics/ng-update/v4/changes.js +14 -14
  103. package/schematics/ng-update/v4/index.d.ts +1 -1
  104. package/schematics/ng-update/v4/index.js +15 -15
  105. package/schematics/ng-update/v5/changes.d.ts +2 -2
  106. package/schematics/ng-update/v5/changes.js +13 -13
  107. package/schematics/ng-update/v5/index.d.ts +1 -1
  108. package/schematics/ng-update/v5/index.js +15 -15
  109. package/schematics/ng-update/v6/changes.d.ts +2 -2
  110. package/schematics/ng-update/v6/changes.js +13 -13
  111. package/schematics/ng-update/v6/index.d.ts +1 -1
  112. package/schematics/ng-update/v6/index.js +15 -15
  113. package/esm2020/lib/models/po-data-transform.model.mjs +0 -22
  114. package/esm2020/lib/models/po-entity/po-entity.model.mjs +0 -214
  115. package/esm2020/lib/models/po-event-sourcing-error-response.model.mjs +0 -17
  116. package/esm2020/lib/models/po-network-status.model.mjs +0 -44
  117. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +0 -238
  118. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +0 -372
  119. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +0 -148
  120. package/esm2020/lib/services/po-network/po-network.service.mjs +0 -56
  121. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +0 -77
  122. package/esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +0 -124
  123. package/esm2020/lib/services/po-schema/po-schema.service.mjs +0 -174
  124. package/esm2020/lib/services/po-sync/po-sync.service.mjs +0 -325
  125. package/fesm2015/po-ui-ng-sync.mjs +0 -2113
  126. package/fesm2015/po-ui-ng-sync.mjs.map +0 -1
  127. package/po-ui-ng-sync-15.15.0.tgz +0 -0
@@ -0,0 +1,379 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { StatusCodes } from 'http-status-codes';
3
+ import { Observable, of, Subject } from 'rxjs';
4
+ import { expand, map, reduce } from 'rxjs/operators';
5
+ import { toBase64, toFile } from '../../utils/utils';
6
+ import { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';
7
+ import { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';
8
+ import { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';
9
+ import { PoRequestType } from '../../models/po-request-type.enum';
10
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
+ import * as i2 from "./../po-schema/po-schema.service";
14
+ import * as i3 from "@po-ui/ng-storage";
15
+ import * as i4 from "./../po-http-client/po-http-client.service";
16
+ export class PoEventSourcingService {
17
+ poSchemaDefinition;
18
+ poSchemaService;
19
+ poStorage;
20
+ poHttpClient;
21
+ static event_sourcing_name = 'EventSourcing';
22
+ static VALID_HTTP_STATUS_CODES = [
23
+ StatusCodes.OK,
24
+ StatusCodes.CREATED,
25
+ StatusCodes.ACCEPTED,
26
+ StatusCodes.NON_AUTHORITATIVE_INFORMATION,
27
+ StatusCodes.NO_CONTENT,
28
+ StatusCodes.RESET_CONTENT,
29
+ StatusCodes.PARTIAL_CONTENT,
30
+ StatusCodes.MULTI_STATUS // 207
31
+ ];
32
+ config;
33
+ stoppedQueueEventSourcing = false;
34
+ emitter;
35
+ eventSub;
36
+ responseSubject = new Subject();
37
+ schemasSyncConfig = {};
38
+ constructor(poSchemaDefinition, poSchemaService, poStorage, poHttpClient) {
39
+ this.poSchemaDefinition = poSchemaDefinition;
40
+ this.poSchemaService = poSchemaService;
41
+ this.poStorage = poStorage;
42
+ this.poHttpClient = poHttpClient;
43
+ }
44
+ static getUrl(eventSourcingItem, schema, requestType) {
45
+ const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);
46
+ const schemaId = eventSourcingItem.record[schema.idField];
47
+ if (requestType === PoRequestType.GET) {
48
+ return schemaUrl;
49
+ }
50
+ if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {
51
+ return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;
52
+ }
53
+ if (requestType === PoRequestType.POST) {
54
+ return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);
55
+ }
56
+ }
57
+ create(schemaName, newItem, customRequestId) {
58
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Insert, newItem, schemaName, customRequestId);
59
+ return this.insertEventSourcingQueue(eventSourcingItem);
60
+ }
61
+ async createBatchEvents(schemaName, eventList) {
62
+ const eventSourcingList = this.createEventSourcingList(schemaName, eventList);
63
+ await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);
64
+ this.notifyEventCreation();
65
+ }
66
+ /**
67
+ * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao
68
+ * servidor *(EventSourcing)*.
69
+ *
70
+ * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.
71
+ */
72
+ destroyEventSourcingQueue() {
73
+ return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);
74
+ }
75
+ async httpCommand(httpOperationData, customRequestId) {
76
+ httpOperationData = await this.serializeBody(httpOperationData);
77
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Http, httpOperationData, undefined, customRequestId);
78
+ await this.insertEventSourcingQueue(eventSourcingItem);
79
+ return eventSourcingItem.id;
80
+ }
81
+ responsesSubject() {
82
+ return this.responseSubject.asObservable();
83
+ }
84
+ onSaveData() {
85
+ if (!this.eventSub) {
86
+ this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));
87
+ }
88
+ return this.eventSub;
89
+ }
90
+ remove(schemaName, itemToDelete, customRequestId) {
91
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Delete, itemToDelete, schemaName, customRequestId);
92
+ return this.insertEventSourcingQueue(eventSourcingItem);
93
+ }
94
+ removeEventSourcingItem(idEventSourcingItem) {
95
+ return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);
96
+ }
97
+ syncGet() {
98
+ const syncGetFunction = async () => this.poSchemaDefinition.getAll().then(schemas => {
99
+ const schemaPromises = this.updateStorageSchemas(schemas);
100
+ return Promise.all(schemaPromises);
101
+ });
102
+ return this.poSchemaService.limitedCallWrap(syncGetFunction);
103
+ }
104
+ async syncSend() {
105
+ const syncSendFunction = async () => {
106
+ const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);
107
+ if (itemOfQueue) {
108
+ await this.selectOperation(itemOfQueue);
109
+ }
110
+ if (this.stoppedQueueEventSourcing || !itemOfQueue) {
111
+ this.stoppedQueueEventSourcing = false;
112
+ return Promise.resolve();
113
+ }
114
+ return syncSendFunction();
115
+ };
116
+ return this.poSchemaService.limitedCallWrap(syncSendFunction);
117
+ }
118
+ update(schemaName, itemUpdated, customRequestId) {
119
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Update, itemUpdated, schemaName, customRequestId);
120
+ return this.insertEventSourcingQueue(eventSourcingItem);
121
+ }
122
+ /* Avalia se o body é do tipo File e se for converte para base64 */
123
+ async serializeBody(requestData) {
124
+ let { body, mimeType, bodyType, fileName } = requestData;
125
+ if (body instanceof File) {
126
+ bodyType = 'File';
127
+ mimeType = body.type;
128
+ fileName = body.name;
129
+ body = await toBase64(body);
130
+ }
131
+ return { ...requestData, body, mimeType, bodyType, fileName };
132
+ }
133
+ buildUrlParams(schema, baseUrl, pageNumber) {
134
+ const params = [];
135
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
136
+ params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);
137
+ return `${baseUrl}?${params.join('&')}`;
138
+ }
139
+ checkRecordIdExists(recordId, operation) {
140
+ if (!recordId) {
141
+ const error = {
142
+ message: 'Identifier not defined',
143
+ operation: operation
144
+ };
145
+ throw new PoEventSourcingErrorResponse(error);
146
+ }
147
+ }
148
+ concatPageItems(pageAcumulator, requestBody) {
149
+ if (requestBody[this.config.dataTransform.getItemsFieldName()]) {
150
+ pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];
151
+ }
152
+ return pageAcumulator;
153
+ }
154
+ createEventSourcingItem(operation, newItem, schemaName, customRequestId, id) {
155
+ if (!schemaName && operation !== PoEventSourcingOperation.Http) {
156
+ throw new Error('PoSyncSchema is not defined.');
157
+ }
158
+ return {
159
+ id: id ? id : new Date().getTime(),
160
+ dateTime: new Date().getTime(),
161
+ schema: schemaName,
162
+ operation: operation,
163
+ record: newItem,
164
+ customRequestId: customRequestId
165
+ };
166
+ }
167
+ createEventSourcingList(schemaName, eventList) {
168
+ return eventList.map((eventItem, index) => {
169
+ const id = new Date().getTime() + index;
170
+ return this.createEventSourcingItem(eventItem.operation, eventItem.record, schemaName, eventItem.customRequestId, id);
171
+ });
172
+ }
173
+ createSchemaSyncConfig(schemaName) {
174
+ this.schemasSyncConfig[schemaName] = {
175
+ page: undefined,
176
+ currentUrlDiff: undefined,
177
+ responseDate: undefined
178
+ };
179
+ }
180
+ async deleteOperation(eventSourcingItem) {
181
+ try {
182
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
183
+ const recordId = eventSourcingItem.record[schema.idField];
184
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);
185
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);
186
+ const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);
187
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
188
+ return await this.sendResponseSubject(eventSourcingItem, response);
189
+ }
190
+ catch (errorResponse) {
191
+ return this.sendResponseSubject(eventSourcingItem, errorResponse, true);
192
+ }
193
+ }
194
+ diffServerItems(currentUrlDiff) {
195
+ return this.poHttpClient.get(currentUrlDiff);
196
+ }
197
+ getBodyAndDate(schemaName, response) {
198
+ const getDateFieldName = this.config.dataTransform.getDateFieldName();
199
+ const responseSyncDate = response.body[getDateFieldName];
200
+ this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;
201
+ return response.body;
202
+ }
203
+ async getServerDiffRecords(schema, baseUrl) {
204
+ const initialAcumulatorPage = { entity: schema.name, data: [] };
205
+ const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];
206
+ const serverResponse = await this.diffServerItems(diffUrl)
207
+ .pipe(map(response => this.getBodyAndDate(schema.name, response)), expand(data => this.paginateSchemaData(data, schema, baseUrl)), reduce((pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody), initialAcumulatorPage))
208
+ .toPromise();
209
+ return serverResponse.data;
210
+ }
211
+ async httpOperation(eventSourcingItem) {
212
+ try {
213
+ const requestData = await this.createPoHttpRequestData(eventSourcingItem.record.url, eventSourcingItem.record.method, eventSourcingItem.record, eventSourcingItem.record.headers);
214
+ const response = await this.poHttpClient.createRequest(requestData).toPromise();
215
+ const poHttpCommandResponse = {
216
+ id: eventSourcingItem.id,
217
+ customRequestId: eventSourcingItem.customRequestId,
218
+ request: eventSourcingItem.record,
219
+ response: response
220
+ };
221
+ this.responseSubject.next(poHttpCommandResponse);
222
+ return this.removeEventSourcingValidItem(response.status, eventSourcingItem);
223
+ }
224
+ catch (errorHttpClient) {
225
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
226
+ }
227
+ }
228
+ async insertEventSourcingQueue(eventSourcingItem) {
229
+ const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(PoEventSourcingService.event_sourcing_name, eventSourcingItem);
230
+ this.notifyEventCreation();
231
+ return Promise.resolve(eventSourcingUpdatedQueue);
232
+ }
233
+ async insertOperation(currentEventSourcingItem) {
234
+ const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);
235
+ const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);
236
+ try {
237
+ const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);
238
+ const recordUpdatedByServer = response.body;
239
+ await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);
240
+ const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
241
+ await this.poSchemaService.update(schema, recordUpdatedByServer, id);
242
+ const eventSourcingItems = await this.poStorage.get(PoEventSourcingService.event_sourcing_name);
243
+ await this.updatePendingEventSourcing(currentEventSourcingItem, schema.idField, recordUpdatedByServer, eventSourcingItems);
244
+ return this.sendResponseSubject(currentEventSourcingItem, response);
245
+ }
246
+ catch (errorHttpClient) {
247
+ return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);
248
+ }
249
+ }
250
+ isValidStatus(status) {
251
+ return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);
252
+ }
253
+ notifyEventCreation() {
254
+ if (this.emitter) {
255
+ this.emitter.next();
256
+ }
257
+ }
258
+ paginateSchemaData(data, schema, baseUrl) {
259
+ this.config.dataTransform.transform(data);
260
+ if (this.config.dataTransform.hasNext()) {
261
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, ++this.schemasSyncConfig[schema.name]['page']);
262
+ return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(map(response => this.getBodyAndDate(schema.name, response)));
263
+ }
264
+ return of();
265
+ }
266
+ removeEventSourcingValidItem(status, eventSourcingItem) {
267
+ if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {
268
+ return this.removeEventSourcingItem(eventSourcingItem.id);
269
+ }
270
+ }
271
+ selectOperation(eventSourcingItem) {
272
+ switch (eventSourcingItem.operation) {
273
+ case PoEventSourcingOperation.Insert:
274
+ return this.insertOperation(eventSourcingItem);
275
+ case PoEventSourcingOperation.Update:
276
+ return this.updateOperation(eventSourcingItem);
277
+ case PoEventSourcingOperation.Delete:
278
+ return this.deleteOperation(eventSourcingItem);
279
+ case PoEventSourcingOperation.Http:
280
+ return this.httpOperation(eventSourcingItem);
281
+ }
282
+ }
283
+ sendResponseSubject(eventSourcingItem, response, isSubjectError = false) {
284
+ const poSyncResponse = {
285
+ id: eventSourcingItem.id,
286
+ customRequestId: eventSourcingItem.customRequestId,
287
+ request: eventSourcingItem.record,
288
+ response: response
289
+ };
290
+ this.stoppedQueueEventSourcing = isSubjectError;
291
+ this.responseSubject.next(poSyncResponse);
292
+ return Promise.resolve();
293
+ }
294
+ async sendServerItem(url, method, body) {
295
+ const requestData = await this.createPoHttpRequestData(url, method, body);
296
+ return this.poHttpClient.createRequest(requestData).toPromise();
297
+ }
298
+ async createPoHttpRequestData(url, method, record, headers) {
299
+ let body = record.body ?? record;
300
+ if (record.bodyType === 'File') {
301
+ body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);
302
+ }
303
+ return { url, method, body, headers };
304
+ }
305
+ async createFormData(body, fileName, mimeType, formField = 'file') {
306
+ const file = await toFile(body, fileName, mimeType);
307
+ const formData = new FormData();
308
+ formData.append(formField, file, fileName);
309
+ return formData;
310
+ }
311
+ async updateOperation(eventSourcingItem) {
312
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
313
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);
314
+ try {
315
+ const recordId = eventSourcingItem.record[schema.idField];
316
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);
317
+ const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);
318
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
319
+ return await this.sendResponseSubject(eventSourcingItem, response);
320
+ }
321
+ catch (errorHttpClient) {
322
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
323
+ }
324
+ }
325
+ updatePendingEventSourcing(currentEventSourcingItem, idFieldSchema, inserted, eventSourcingItems) {
326
+ if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {
327
+ eventSourcingItems.forEach((eventSourcingItem, position) => {
328
+ const isCurrentEventSourcingItem = !eventSourcingItem.record[idFieldSchema] &&
329
+ eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===
330
+ currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
331
+ if (isCurrentEventSourcingItem) {
332
+ eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];
333
+ }
334
+ });
335
+ return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);
336
+ }
337
+ else {
338
+ return Promise.resolve();
339
+ }
340
+ }
341
+ async updateRecords(serverRecords, schema) {
342
+ for (const serverRecord of serverRecords) {
343
+ await this.updateRecordByServerRecord(serverRecord, schema);
344
+ }
345
+ }
346
+ async updateRecordByServerRecord(serverRecord, schema) {
347
+ const recordId = serverRecord[schema.idField];
348
+ const storageRecord = await this.poSchemaService.get(schema.name, recordId);
349
+ const existsStorageRecord = !!Object.keys(storageRecord).length;
350
+ if (existsStorageRecord && serverRecord[schema.deletedField]) {
351
+ return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);
352
+ }
353
+ if (existsStorageRecord && !serverRecord[schema.deletedField]) {
354
+ return await this.poSchemaService.update(schema, serverRecord);
355
+ }
356
+ if (!existsStorageRecord && !serverRecord[schema.deletedField]) {
357
+ return await this.poSchemaService.create(schema, serverRecord);
358
+ }
359
+ }
360
+ async updateStorageBySchema(schema) {
361
+ this.createSchemaSyncConfig(schema.name);
362
+ this.schemasSyncConfig[schema.name]['page'] = 1;
363
+ const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;
364
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, this.schemasSyncConfig[schema.name]['page']);
365
+ const serverRecords = await this.getServerDiffRecords(schema, baseUrl);
366
+ await this.updateRecords(serverRecords, schema);
367
+ schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];
368
+ await this.poSchemaDefinition.update(schema);
369
+ }
370
+ updateStorageSchemas(schemas) {
371
+ return schemas.map((schema) => this.updateStorageBySchema(schema));
372
+ }
373
+ static ɵfac = function PoEventSourcingService_Factory(t) { return new (t || PoEventSourcingService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoSchemaService), i0.ɵɵinject(i3.PoStorageService), i0.ɵɵinject(i4.PoHttpClientService)); };
374
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoEventSourcingService, factory: PoEventSourcingService.ɵfac });
375
+ }
376
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoEventSourcingService, [{
377
+ type: Injectable
378
+ }], function () { return [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoSchemaService }, { type: i3.PoStorageService }, { type: i4.PoHttpClientService }]; }, null); })();
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRW5HLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBS3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7OztBQU1sRixNQUFNLE9BQU8sc0JBQXNCO0lBd0J2QjtJQUNBO0lBQ0E7SUFDQTtJQTFCVixNQUFNLENBQVUsbUJBQW1CLEdBQVcsZUFBZSxDQUFDO0lBRXRELE1BQU0sQ0FBVSx1QkFBdUIsR0FBRztRQUNoRCxXQUFXLENBQUMsRUFBRTtRQUNkLFdBQVcsQ0FBQyxPQUFPO1FBQ25CLFdBQVcsQ0FBQyxRQUFRO1FBQ3BCLFdBQVcsQ0FBQyw2QkFBNkI7UUFDekMsV0FBVyxDQUFDLFVB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LENBQUM7UUFFdkUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVoRCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxPQUFPO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQW9CLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7Z0ZBL2hCVSxzQkFBc0I7Z0VBQXRCLHNCQUFzQixXQUF0QixzQkFBc0I7O3VGQUF0QixzQkFBc0I7Y0FEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBSZXNwb25zZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUG9TdG9yYWdlU2VydmljZSB9IGZyb20gJ0Bwby11aS9uZy1zdG9yYWdlJztcclxuXHJcbmltcG9ydCB7IHRvQmFzZTY0LCB0b0ZpbGUgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsJztcclxuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nSXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1pdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbiB9IGZyb20gJy4vZW51bXMvcG8tZXZlbnQtc291cmNpbmctb3BlcmF0aW9uLmVudW0nO1xyXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1zdW1tYXJ5LWl0ZW0uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9IdHRwSGVhZGVyT3B0aW9uIH0gZnJvbSAnLi8uLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1odHRwLWNsaWVudC9wby1odHRwLWNsaWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdERhdGEgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtcmVxdWVzdC1kYXRhLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3RUeXBlIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFBvUmVxdWVzdFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG8tcmVxdWVzdC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBQb1N5bmNDb25maWcgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1jb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9TeW5jUmVzcG9uc2UgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuLy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUG9FdmVudFNvdXJjaW5nU2VydmljZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IGV2ZW50X3NvdXJjaW5nX25hbWU6IHN0cmluZyA9ICdFdmVudFNvdXJjaW5nJztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVkFMSURfSFRUUF9TVEFUVVNfQ09ERVMgPSBbXHJcbiAgICBTdGF0dXNDb2Rlcy5PSywgLy8gMjAwXHJcbiAgICBTdGF0dXNDb2Rlcy5DUkVBVEVELCAvLyAyMDFcclxuICAgIFN0YXR1c0NvZGVzLkFDQ0VQVEVELCAvLyAyMDJcclxuICAgIFN0YXR1c0NvZGVzLk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OLCAvLyAyMDNcclxuICAgIFN0YXR1c0NvZGVzLk5PX0NPTlRFTlQsIC8vIDIwNFxyXG4gICAgU3RhdHVzQ29kZXMuUkVTRVRfQ09OVEVOVCwgLy8gMjA1XHJcbiAgICBTdGF0dXNDb2Rlcy5QQVJUSUFMX0NPTlRFTlQsIC8vIDIwNlxyXG4gICAgU3RhdHVzQ29kZXMuTVVMVElfU1RBVFVTIC8vIDIwN1xyXG4gIF07XHJcblxyXG4gIGNvbmZpZzogUG9TeW5jQ29uZmlnO1xyXG4gIHN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxudWxsPjtcclxuICBwcml2YXRlIHJlc3BvbnNlU3ViamVjdCA9IG5ldyBTdWJqZWN0PFBvU3luY1Jlc3BvbnNlPigpO1xyXG5cclxuICBwcml2YXRlIHNjaGVtYXNTeW5jQ29uZmlnID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb246IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1N0b3JhZ2U6IFBvU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvSHR0cENsaWVudDogUG9IdHRwQ2xpZW50U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VXJsKGV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIHJlcXVlc3RUeXBlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNjaGVtYVVybCA9IFBvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCByZXF1ZXN0VHlwZSk7XHJcbiAgICBjb25zdCBzY2hlbWFJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcblxyXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBQb1JlcXVlc3RUeXBlLkdFVCkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChbUG9SZXF1ZXN0VHlwZS5ERUxFVEUsIFBvUmVxdWVzdFR5cGUuUEFUQ0hdLmluY2x1ZGVzKHJlcXVlc3RUeXBlKSkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hVXJsID8gYCR7c2NoZW1hVXJsfS8ke3NjaGVtYUlkfWAgOiBgJHtQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5HRVQpfS8ke3NjaGVtYUlkfWA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBQb1JlcXVlc3RUeXBlLlBPU1QpIHtcclxuICAgICAgcmV0dXJuIHNjaGVtYVVybCA/IHNjaGVtYVVybCA6IFBvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoc2NoZW1hTmFtZTogc3RyaW5nLCBuZXdJdGVtOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5JbnNlcnQsXHJcbiAgICAgIG5ld0l0ZW0sXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVCYXRjaEV2ZW50cyhzY2hlbWFOYW1lOiBzdHJpbmcsIGV2ZW50TGlzdDogQXJyYXk8UG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0+KSB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nTGlzdCA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0xpc3Qoc2NoZW1hTmFtZSwgZXZlbnRMaXN0KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5hcHBlbmRBcnJheVRvQXJyYXkoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nTGlzdCk7XHJcblxyXG4gICAgdGhpcy5ub3RpZnlFdmVudENyZWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXN0csOzaSBhIGNoYXZlIGRvICpzdG9yYWdlKiBxdWUgY29udMOpbSBhIGZpbGEgZGUgZGFkb3MgcXVlIGVzdMOjbyBlc3BlcmFuZG8gcGFyYSBzZXJlbSBlbnZpYWRvcyBhb1xyXG4gICAqIHNlcnZpZG9yICooRXZlbnRTb3VyY2luZykqLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgY2hhdmUgcmVmZXJlbnRlIGEgZmlsYSBkZSAqRXZlbnRTb3VyY2luZyogZm9yIGRlc3RydcOtZGEuXHJcbiAgICovXHJcbiAgZGVzdHJveUV2ZW50U291cmNpbmdRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5yZW1vdmUoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGh0dHBDb21tYW5kKGh0dHBPcGVyYXRpb25EYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGh0dHBPcGVyYXRpb25EYXRhID0gYXdhaXQgdGhpcy5zZXJpYWxpemVCb2R5KGh0dHBPcGVyYXRpb25EYXRhKTtcclxuXHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwLFxyXG4gICAgICBodHRwT3BlcmF0aW9uRGF0YSxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWRcclxuICAgICk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5pbnNlcnRFdmVudFNvdXJjaW5nUXVldWUoZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gICAgcmV0dXJuIGV2ZW50U291cmNpbmdJdGVtLmlkO1xyXG4gIH1cclxuXHJcbiAgcmVzcG9uc2VzU3ViamVjdCgpOiBPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvblNhdmVEYXRhKCk6IE9ic2VydmFibGU8bnVsbD4ge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+ICh0aGlzLmVtaXR0ZXIgPSBzdWJzY3JpYmVyKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudFN1YjtcclxuICB9XHJcblxyXG4gIHJlbW92ZShzY2hlbWFOYW1lOiBzdHJpbmcsIGl0ZW1Ub0RlbGV0ZTogYW55LCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxyXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlLFxyXG4gICAgICBpdGVtVG9EZWxldGUsXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVFdmVudFNvdXJjaW5nSXRlbShpZEV2ZW50U291cmNpbmdJdGVtKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb1N0b3JhZ2UucmVtb3ZlSXRlbUZyb21BcnJheShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsICdpZCcsIGlkRXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gIH1cclxuXHJcbiAgc3luY0dldCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc3luY0dldEZ1bmN0aW9uID0gYXN5bmMgKCkgPT5cclxuICAgICAgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0QWxsKCkudGhlbihzY2hlbWFzID0+IHtcclxuICAgICAgICBjb25zdCBzY2hlbWFQcm9taXNlcyA9IHRoaXMudXBkYXRlU3RvcmFnZVNjaGVtYXMoc2NoZW1hcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzY2hlbWFQcm9taXNlcyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAoc3luY0dldEZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN5bmNTZW5kKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzeW5jU2VuZEZ1bmN0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1PZlF1ZXVlID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2UuZ2V0Rmlyc3RJdGVtKFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSk7XHJcblxyXG4gICAgICBpZiAoaXRlbU9mUXVldWUpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdE9wZXJhdGlvbihpdGVtT2ZRdWV1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmcgfHwgIWl0ZW1PZlF1ZXVlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc3luY1NlbmRGdW5jdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHN5bmNTZW5kRnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKHNjaGVtYU5hbWU6IHN0cmluZywgaXRlbVVwZGF0ZWQ6IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGV2ZW50U291cmNpbmdJdGVtID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZSxcclxuICAgICAgaXRlbVVwZGF0ZWQsXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICAvKiBBdmFsaWEgc2UgbyBib2R5IMOpIGRvIHRpcG8gRmlsZSBlIHNlIGZvciBjb252ZXJ0ZSBwYXJhIGJhc2U2NCAqL1xyXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplQm9keShyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEpOiBQcm9taXNlPFBvSHR0cFJlcXVlc3REYXRhPiB7XHJcbiAgICBsZXQgeyBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH0gPSByZXF1ZXN0RGF0YTtcclxuXHJcbiAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgYm9keVR5cGUgPSAnRmlsZSc7XHJcbiAgICAgIG1pbWVUeXBlID0gYm9keS50eXBlO1xyXG4gICAgICBmaWxlTmFtZSA9IGJvZHkubmFtZTtcclxuICAgICAgYm9keSA9IGF3YWl0IHRvQmFzZTY0KGJvZHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IC4uLnJlcXVlc3REYXRhLCBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVXJsUGFyYW1zKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBiYXNlVXJsOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XHJcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlTnVtYmVyfWApO1xyXG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBvcGVyYXRpb24pIHtcclxuICAgIGlmICghcmVjb3JkSWQpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0lkZW50aWZpZXIgbm90IGRlZmluZWQnLFxyXG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aHJvdyBuZXcgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZShlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmNhdFBhZ2VJdGVtcyhwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpOiB7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0ge1xyXG4gICAgaWYgKHJlcXVlc3RCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pIHtcclxuICAgICAgcGFnZUFjdW11bGF0b3IuZGF0YSA9IFsuLi5wYWdlQWN1bXVsYXRvci5kYXRhLCAuLi5yZXF1ZXN0Qm9keVt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdlQWN1bXVsYXRvcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICBvcGVyYXRpb246IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbixcclxuICAgIG5ld0l0ZW06IGFueSB8IFBvSHR0cFJlcXVlc3REYXRhLFxyXG4gICAgc2NoZW1hTmFtZT86IHN0cmluZyxcclxuICAgIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyxcclxuICAgIGlkPzogbnVtYmVyXHJcbiAgKTogUG9FdmVudFNvdXJjaW5nSXRlbSB7XHJcbiAgICBpZiAoIXNjaGVtYU5hbWUgJiYgb3BlcmF0aW9uICE9PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvU3luY1NjaGVtYSBpcyBub3QgZGVmaW5lZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogaWQgPyBpZCA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxyXG4gICAgICBkYXRlVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksXHJcbiAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcclxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXHJcbiAgICAgIHJlY29yZDogbmV3SXRlbSxcclxuICAgICAgY3VzdG9tUmVxdWVzdElkOiBjdXN0b21SZXF1ZXN0SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50U291cmNpbmdMaXN0KFxyXG4gICAgc2NoZW1hTmFtZTogc3RyaW5nLFxyXG4gICAgZXZlbnRMaXN0OiBBcnJheTxQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbT5cclxuICApOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiB7XHJcbiAgICByZXR1cm4gZXZlbnRMaXN0Lm1hcCgoZXZlbnRJdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgaW5kZXg7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgICBldmVudEl0ZW0ub3BlcmF0aW9uLFxyXG4gICAgICAgIGV2ZW50SXRlbS5yZWNvcmQsXHJcbiAgICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgICBldmVudEl0ZW0uY3VzdG9tUmVxdWVzdElkLFxyXG4gICAgICAgIGlkXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2NoZW1hU3luY0NvbmZpZyhzY2hlbWFOYW1lKSB7XHJcbiAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYU5hbWVdID0ge1xyXG4gICAgICBwYWdlOiB1bmRlZmluZWQsXHJcbiAgICAgIGN1cnJlbnRVcmxEaWZmOiB1bmRlZmluZWQsXHJcbiAgICAgIHJlc3BvbnNlRGF0ZTogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XHJcblxyXG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcbiAgICAgIHRoaXMuY2hlY2tSZWNvcmRJZEV4aXN0cyhyZWNvcmRJZCwgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkRlbGV0ZSk7XHJcblxyXG4gICAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkRFTEVURSk7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kU2VydmVySXRlbSh1cmwsIFBvSHR0cFJlcXVlc3RUeXBlLkRFTEVURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCByZXNwb25zZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIGVycm9yUmVzcG9uc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaWZmU2VydmVySXRlbXMoY3VycmVudFVybERpZmYpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuZ2V0KGN1cnJlbnRVcmxEaWZmKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Qm9keUFuZERhdGUoc2NoZW1hTmFtZSwgcmVzcG9uc2UpOiBhbnkge1xyXG4gICAgY29uc3QgZ2V0RGF0ZUZpZWxkTmFtZSA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0RGF0ZUZpZWxkTmFtZSgpO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlU3luY0RhdGUgPSByZXNwb25zZS5ib2R5W2dldERhdGVGaWVsZE5hbWVdO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hTmFtZV1bJ3Jlc3BvbnNlRGF0ZSddID0gcmVzcG9uc2VTeW5jRGF0ZTtcclxuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTZXJ2ZXJEaWZmUmVjb3JkcyhzY2hlbWE6IFBvU3luY1NjaGVtYSwgYmFzZVVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGluaXRpYWxBY3VtdWxhdG9yUGFnZSA9IHsgZW50aXR5OiBzY2hlbWEubmFtZSwgZGF0YTogW10gfTtcclxuICAgIGNvbnN0IGRpZmZVcmwgPSB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXTtcclxuXHJcbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuZGlmZlNlcnZlckl0ZW1zKGRpZmZVcmwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmdldEJvZHlBbmREYXRlKHNjaGVtYS5uYW1lLCByZXNwb25zZSkpLFxyXG4gICAgICAgIGV4cGFuZChkYXRhID0+IHRoaXMucGFnaW5hdGVTY2hlbWFEYXRhKGRhdGEsIHNjaGVtYSwgYmFzZVVybCkpLFxyXG4gICAgICAgIHJlZHVjZShcclxuICAgICAgICAgIChwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpID0+IHRoaXMuY29uY2F0UGFnZUl0ZW1zKHBhZ2VBY3VtdWxhdG9yLCByZXF1ZXN0Qm9keSksXHJcbiAgICAgICAgICBpbml0aWFsQWN1bXVsYXRvclBhZ2VcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHJldHVybiBzZXJ2ZXJSZXNwb25zZS5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBodHRwT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiB8IG51bWJlcj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YShcclxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQudXJsLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC5tZXRob2QsXHJcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC5oZWFkZXJzXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb0h0dHBDbGllbnQuY3JlYXRlUmVxdWVzdChyZXF1ZXN0RGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHBvSHR0cENvbW1hbmRSZXNwb25zZTogUG9TeW5jUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgaWQ6IGV2ZW50U291cmNpbmdJdGVtLmlkLFxyXG4gICAgICAgIGN1c3RvbVJlcXVlc3RJZDogZXZlbnRTb3VyY2luZ0l0ZW0uY3VzdG9tUmVxdWVzdElkLFxyXG4gICAgICAgIHJlcXVlc3Q6IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCxcclxuICAgICAgICByZXNwb25zZTogcmVzcG9uc2VcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0Lm5leHQocG9IdHRwQ29tbWFuZFJlc3BvbnNlKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgICB9IGNhdGNoIChlcnJvckh0dHBDbGllbnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPj4ge1xyXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ1VwZGF0ZWRRdWV1ZSA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmFwcGVuZEl0ZW1Ub0FycmF5KFxyXG4gICAgICBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsXHJcbiAgICAgIGV2ZW50U291cmNpbmdJdGVtXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubm90aWZ5RXZlbnRDcmVhdGlvbigpO1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXZlbnRTb3VyY2luZ1VwZGF0ZWRRdWV1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluc2VydE9wZXJhdGlvbihjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5zY2hlbWEpO1xyXG4gICAgY29uc3QgdXJsID0gUG9FdmVudFNvdXJjaW5nU2VydmljZS5nZXRVcmwoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIFBvUmVxdWVzdFR5cGUuUE9TVCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2ZXJJdGVtKHVybCwgUG9IdHRwUmVxdWVzdFR5cGUuUE9TVCwgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZCk7XHJcbiAgICAgIGNvbnN0IHJlY29yZFVwZGF0ZWRCeVNlcnZlciA9IHJlc3BvbnNlLmJvZHk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgY29uc3QgaWQgPSBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV07XHJcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnVwZGF0ZShzY2hlbWEsIHJlY29yZFVwZGF0ZWRCeVNlcnZlciwgaWQpO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW1zOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmdldChcclxuICAgICAgICBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWVcclxuICAgICAgKTtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcclxuICAgICAgICBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sXHJcbiAgICAgICAgc2NoZW1hLmlkRmllbGQsXHJcbiAgICAgICAgcmVjb3JkVXBkYXRlZEJ5U2VydmVyLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNWYWxpZFN0YXR1cyhzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuVkFMSURfSFRUUF9TVEFUVVNfQ09ERVMuaW5jbHVkZXMoc3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm90aWZ5RXZlbnRDcmVhdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVtaXR0ZXIpIHtcclxuICAgICAgdGhpcy5lbWl0dGVyLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFnaW5hdGVTY2hlbWFEYXRhKGRhdGEsIHNjaGVtYSwgYmFzZVVybCk6IE9ic2VydmFibGU8bnVsbD4ge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpKSB7XHJcbiAgICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcclxuICAgICAgICBzY2hlbWEsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICArK3RoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ11cclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmRpZmZTZXJ2ZXJJdGVtcyh0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXSkucGlwZShcclxuICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5nZXRCb2R5QW5kRGF0ZShzY2hlbWEubmFtZSwgcmVzcG9uc2UpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKFxyXG4gICAgc3RhdHVzLFxyXG4gICAgZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW1cclxuICApOiBQcm9taXNlPEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+PiB7XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkU3RhdHVzKHN0YXR1cykgfHwgZXZlbnRTb3VyY2luZ0l0ZW0ub3BlcmF0aW9uID09PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nSXRlbShldmVudFNvdXJjaW5nSXRlbS5pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50U291cmNpbmdJdGVtLm9wZXJhdGlvbikge1xyXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5JbnNlcnQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0T3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZTpcclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVzcG9uc2VTdWJqZWN0KFxyXG4gICAgZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0sXHJcbiAgICByZXNwb25zZTogSHR0cFJlc3BvbnNlPE9iamVjdD4gfCBIdHRwRXJyb3JSZXNwb25zZSB8IFBvRXZlbnRTb3VyY2luZ0Vycm9yUmVzcG9uc2UsXHJcbiAgICBpc1N1YmplY3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHBvU3luY1Jlc3BvbnNlOiBQb1N5bmNSZXNwb25zZSA9IHtcclxuICAgICAgaWQ6IGV2ZW50U291cmNpbmdJdGVtLmlkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWQ6IGV2ZW50U291cmNpbmdJdGVtLmN1c3RvbVJlcXVlc3RJZCxcclxuICAgICAgcmVxdWVzdDogZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxyXG4gICAgICByZXNwb25zZTogcmVzcG9uc2VcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gaXNTdWJqZWN0RXJyb3I7XHJcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdC5uZXh0KHBvU3luY1Jlc3BvbnNlKTtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNlbmRTZXJ2ZXJJdGVtKHVybDogc3RyaW5nLCBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlLCBib2R5PzogUG9FdmVudFNvdXJjaW5nSXRlbVsncmVjb3JkJ10pIHtcclxuICAgIGNvbnN0IHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSA9IGF3YWl0IHRoaXMuY3JlYXRlUG9IdHRwUmVxdWVzdERhdGEodXJsLCBtZXRob2QsIGJvZHkpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvSHR0cENsaWVudC5jcmVhdGVSZXF1ZXN0KHJlcXVlc3REYXRhKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlUG9IdHRwUmVxdWVzdERhdGEoXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIG1ldGhvZDogUG9IdHRwUmVxdWVzdFR5cGUsXHJcbiAgICByZWNvcmQ/OiBQb0V2ZW50U291cmNpbmdJdGVtWydyZWNvcmQnXSxcclxuICAgIGhlYWRlcnM/OiBBcnJheTxQb0h0dHBIZWFkZXJPcHRpb24+XHJcbiAgKTogUHJvbWlzZTxQb0h0dHBSZXF1ZXN0RGF0YT4ge1xyXG4gICAgbGV0IGJvZHkgPSByZWNvcmQuYm9keSA/PyByZWNvcmQ7XHJcblxyXG4gICAgaWYgKHJlY29yZC5ib2R5VHlwZSA9PT0gJ0ZpbGUnKSB7XHJcbiAgICAgIGJvZHkgPSBhd2FpdCB0aGlzLmNyZWF0ZUZvcm1EYXRhKGJvZHksIHJlY29yZC5maWxlTmFtZSwgcmVjb3JkLm1pbWVUeXBlLCByZWNvcmQuZm9ybUZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB1cmwsIG1ldGhvZCwgYm9keSwgaGVhZGVycyB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVGb3JtRGF0YShcclxuICAgIGJvZHk6IHN0cmluZyxcclxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXHJcbiAgICBtaW1lVHlwZTogc3RyaW5nLFxyXG4gICAgZm9ybUZpZWxkOiBzdHJpbmcgPSAnZmlsZSdcclxuICApOiBQcm9taXNlPEZvcm1EYXRhPiB7XHJcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdG9GaWxlKGJvZHksIGZpbGVOYW1lLCBtaW1lVHlwZSk7XHJcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoZm9ybUZpZWxkLCBmaWxlLCBmaWxlTmFtZSk7XHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8QXJyYXk8YW55PiB8IG51bWJlcj4ge1xyXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XHJcbiAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLlBBVENIKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcbiAgICAgIHRoaXMuY2hlY2tSZWNvcmRJZEV4aXN0cyhyZWNvcmRJZCwgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5QVVQsIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcclxuICAgIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSxcclxuICAgIGlkRmllbGRTY2hlbWE6IHN0cmluZyxcclxuICAgIGluc2VydGVkOiBvYmplY3QsXHJcbiAgICBldmVudFNvdXJjaW5nSXRlbXM6IEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+XHJcbiAgKSB7XHJcbiAgICBpZiAoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdKSB7XHJcbiAgICAgIGV2ZW50U291cmNpbmdJdGVtcy5mb3JFYWNoKChldmVudFNvdXJjaW5nSXRlbSwgcG9zaXRpb24pID0+IHtcclxuICAgICAgICBjb25zdCBpc0N1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSA9XHJcbiAgICAgICAgICAhZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW2lkRmllbGRTY2hlbWFdICYmXHJcbiAgICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lXSA9PT1cclxuICAgICAgICAgICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoaXNDdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0pIHtcclxuICAgICAgICAgIGV2ZW50U291cmNpbmdJdGVtc1twb3NpdGlvbl0ucmVjb3JkW2lkRmllbGRTY2hlbWFdID0gaW5zZXJ0ZWRbaWRGaWVsZFNjaGVtYV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5zZXQoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nSXRlbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRzKHNlcnZlclJlY29yZHM6IEFycmF5PGFueT4sIHNjaGVtYTogUG9TeW5jU2NoZW1hKSB7XHJcbiAgICBmb3IgKGNvbnN0IHNlcnZlclJlY29yZCBvZiBzZXJ2ZXJSZWNvcmRzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjb3JkQnlTZXJ2ZXJSZWNvcmQoc2VydmVyUmVjb3JkLCBzY2hlbWEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRCeVNlcnZlclJlY29yZChzZXJ2ZXJSZWNvcmQsIHNjaGVtYSkge1xyXG4gICAgY29uc3QgcmVjb3JkSWQgPSBzZXJ2ZXJSZWNvcmRbc2NoZW1hLmlkRmllbGRdO1xyXG4gICAgY29uc3Qgc3RvcmFnZVJlY29yZCA9IGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmdldChzY2hlbWEubmFtZSwgcmVjb3JkSWQpO1xyXG4gICAgY29uc3QgZXhpc3RzU3RvcmFnZVJlY29yZCA9ICEhT2JqZWN0LmtleXMoc3RvcmFnZVJlY29yZCkubGVuZ3RoO1xyXG5cclxuICAgIGlmIChleGlzdHNTdG9yYWdlUmVjb3JkICYmIHNlcnZlclJlY29yZFtzY2hlbWEuZGVsZXRlZEZpZWxkXSkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UucmVtb3ZlKHNjaGVtYS5uYW1lLCBzZXJ2ZXJSZWNvcmRbc2NoZW1hLmlkRmllbGRdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXhpc3RzU3RvcmFnZVJlY29yZCAmJiAhc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS51cGRhdGUoc2NoZW1hLCBzZXJ2ZXJSZWNvcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZXhpc3RzU3RvcmFnZVJlY29yZCAmJiAhc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5jcmVhdGUoc2NoZW1hLCBzZXJ2ZXJSZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdG9yYWdlQnlTY2hlbWEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5jcmVhdGVTY2hlbWFTeW5jQ29uZmlnKHNjaGVtYS5uYW1lKTtcclxuXHJcbiAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddID0gMTtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5ESUZGKX0vJHtzY2hlbWEubGFzdFN5bmN9YDtcclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcclxuICAgICAgc2NoZW1hLFxyXG4gICAgICBiYXNlVXJsLFxyXG4gICAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNlcnZlclJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFNlcnZlckRpZmZSZWNvcmRzKHNjaGVtYSwgYmFzZVVybCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRzKHNlcnZlclJlY29yZHMsIHNjaGVtYSk7XHJcblxyXG4gICAgc2NoZW1hLmxhc3RTeW5jID0gdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ3Jlc3BvbnNlRGF0ZSddO1xyXG4gICAgYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24udXBkYXRlKHNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN0b3JhZ2VTY2hlbWFzKHNjaGVtYXMpOiBBcnJheTxQcm9taXNlPEFycmF5PGFueT4+PiB7XHJcbiAgICByZXR1cm4gc2NoZW1hcy5tYXAoKHNjaGVtYTogUG9TeW5jU2NoZW1hKSA9PiB0aGlzLnVwZGF0ZVN0b3JhZ2VCeVNjaGVtYShzY2hlbWEpKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,11 +1,11 @@
1
- /**
2
- * @docsPrivate
3
- *
4
- * @usedBy PoHttpClientService
5
- *
6
- * @description
7
- *
8
- * Define o cabeçalho da requisição HTTP.
9
- */
10
- export {};
1
+ /**
2
+ * @docsPrivate
3
+ *
4
+ * @usedBy PoHttpClientService
5
+ *
6
+ * @description
7
+ *
8
+ * Define o cabeçalho da requisição HTTP.
9
+ */
10
+ export {};
11
11
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1oZWFkZXItb3B0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRvY3NQcml2YXRlXHJcbiAqXHJcbiAqIEB1c2VkQnkgUG9IdHRwQ2xpZW50U2VydmljZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogRGVmaW5lIG8gY2FiZcOnYWxobyBkYSByZXF1aXNpw6fDo28gSFRUUC5cclxuICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBvSHR0cEhlYWRlck9wdGlvbiB7XHJcbiAgLyoqIE5vbWUgZG8gY2FiZcOnYWxoby4gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBWYWxvciBkbyBjYWJlw6dhbGhvLiAqL1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb0h0dHBIZWFkZXJPcHRpb24gfSBmcm9tICcuL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0VHlwZSB9IGZyb20gJy4vLi4vcG8taHR0cC1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcblxyXG4vKipcclxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBJbnRlcmZhY2UgcGFyYSBkZWZpbmnDp8OjbyBkZSB1bWEgcmVxdWlzacOnw6NvIEhUVFAuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvSHR0cFJlcXVlc3REYXRhIHtcclxuICAvKiogVVJMIHF1ZSBzZXLDoSB1dGlsaXphZGEgbmEgcmVxdWlzacOnw6NvLiAqL1xyXG4gIHVybDogc3RyaW5nO1xyXG5cclxuICAvKiogQ2FiZcOnYWxobyBkYSByZXF1aXNpw6fDo28uICovXHJcbiAgaGVhZGVycz86IEFycmF5PFBvSHR0cEhlYWRlck9wdGlvbj47XHJcblxyXG4gIC8qKiBNw6l0b2RvIEhUVFAgcXVlIHNlcsOhIHV0aWxpemFkby4gKi9cclxuICBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlO1xyXG5cclxuICAvKiogQ29ycG8gZGEgcmVxdWlzacOnw6NvLiAqL1xyXG4gIGJvZHk/OiBhbnk7XHJcblxyXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBjb250ZXLDoSBvIGFycXVpdm8gZW52aWFkbyBwYXJhIG8gc2Vydmlkb3IgKi9cclxuICBmb3JtRmllbGQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIFRpcG8gZG8gYm9keVxyXG4gIGJvZHlUeXBlPzogc3RyaW5nO1xyXG5cclxuICAvLyBNaW1lVHlwZSBkYSByZXF1aXNpw6fDo28gY2FzbyBzZWphIHVtIGFycXVpdm9cclxuICBtaW1lVHlwZT86IHN0cmluZztcclxuXHJcbiAgLy8gTm9tZSBkbyBhcnF1aXZvXHJcbiAgZmlsZU5hbWU/OiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcmVzcG9uc2UtYXBpLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLXJlc3BvbnNlLWFwaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAdXNlZEJ5IFBvUXVlcnlCdWlsZGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBJbnRlcmZhY2UgcXVlIHJlcHJlc2VudGEgYSBlc3RydXR1cmEgZGUgcmVzcG9zdGEgZGUgdW1hIGNvbGXDp8OjbyBkZSBpdGVucy5cclxuICpcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9SZXNwb25zZUFwaSB7XHJcbiAgLyoqIExpc3RhIGRlIGl0ZW5zIHJldG9ybmFkb3MuICovXHJcbiAgaXRlbXM6IEFycmF5PG9iamVjdD47XHJcblxyXG4gIC8qKiBJbmRpY2Egc2UgZXhpc3RlIHVtYSBwcsOzeGltYSBww6FnaW5hIGNvbSBtYWlzIHJlZ2lzdHJvcyBwYXJhIGFxdWVsYSBjb2xlw6fDo28gZGUgaXRlbnMuICovXHJcbiAgaGFzTmV4dDogYm9vbGVhbjtcclxufVxyXG4iXX0=