@techextensor/tab-core-utility 2.2.180 → 2.2.184

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 (75) hide show
  1. package/esm2022/index.mjs +5 -1
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +24 -13
  3. package/esm2022/lib/tab-core-utility/app/constants/common.mjs +14 -50
  4. package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
  5. package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +38 -49
  6. package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +81 -30
  7. package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +141 -12
  8. package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +136 -35
  9. package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +89 -38
  10. package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +152 -131
  11. package/esm2022/lib/tab-core-utility/app/crud/tab-workflow.service.mjs +7 -9
  12. package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
  13. package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +6 -17
  14. package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +9 -11
  15. package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
  16. package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +7 -45
  17. package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +79 -76
  18. package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +38 -0
  19. package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +8 -4
  20. package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +8 -33
  21. package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
  22. package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +42 -0
  23. package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +39 -1
  24. package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +36 -7
  25. package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +84 -47
  26. package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +24 -13
  27. package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +57 -23
  28. package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +21 -10
  29. package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +12 -6
  30. package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +11 -4
  31. package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +17 -16
  32. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +1 -55
  33. package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +1 -164
  34. package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +64 -15
  35. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +82 -0
  36. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +252 -0
  37. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +207 -0
  38. package/index.d.ts +4 -0
  39. package/lib/tab-core-utility/app/constants/api-constants.d.ts +13 -10
  40. package/lib/tab-core-utility/app/constants/common.d.ts +9 -0
  41. package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
  42. package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +8 -1
  43. package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +20 -10
  44. package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +33 -6
  45. package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +45 -3
  46. package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +16 -21
  47. package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +34 -19
  48. package/lib/tab-core-utility/app/crud/tab-workflow.service.d.ts +3 -1
  49. package/lib/tab-core-utility/app/enums/query.enum.d.ts +3 -6
  50. package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +3 -8
  51. package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +3 -0
  52. package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
  53. package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +7 -51
  54. package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +1 -0
  55. package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +22 -0
  56. package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +2 -1
  57. package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +1 -0
  58. package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +50 -2
  59. package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +80 -0
  60. package/lib/tab-core-utility/app/models/api-query.class.d.ts +54 -9
  61. package/lib/tab-core-utility/app/models/app-field.model.d.ts +4 -2
  62. package/lib/tab-core-utility/app/models/app-object.model.d.ts +5 -3
  63. package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
  64. package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +7 -2
  65. package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
  66. package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
  67. package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
  68. package/lib/tab-core-utility/app/utils/json.util.d.ts +3 -2
  69. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +1 -9
  70. package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +0 -61
  71. package/lib/tab-core-utility/core/http-client/api.service.d.ts +37 -9
  72. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +40 -0
  73. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +68 -0
  74. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +122 -0
  75. package/package.json +3 -2
@@ -2,11 +2,11 @@
2
2
  import { Injectable, inject } from '@angular/core';
3
3
  import { ApiService } from '../../core/http-client/api.service';
4
4
  import { DSQHelper } from '../helpers/common/dsq.helpers';
5
+ import { MetadataHelper } from '../helpers/common/meta-data.helpers';
5
6
  import { getHeaders } from '../utils/req-res.util';
6
- import { API } from '../constants/api-constants';
7
- import { getAppObject } from '../utils/tab-app.util';
7
+ import { API, APIServices } from '../constants/api-constants';
8
+ import { CRUDFilter, CRUDPager, CRUDSelectPayload, CRUDSort, CRUDWhereClause } from '../models/api-query.class';
8
9
  import { FilterValueType } from '../enums/dsq.enum';
9
- import { QueryType } from '../enums/query.enum';
10
10
  import { AppObjectsConstants, DataSourceQueriesConstants, } from '../constants/app-object-constants';
11
11
  import { switchMap } from 'rxjs';
12
12
  import * as i0 from "@angular/core";
@@ -14,15 +14,18 @@ export class TabGetService {
14
14
  constructor() {
15
15
  this.apiService = inject(ApiService);
16
16
  this.dsqHelper = inject(DSQHelper);
17
+ this.metadataHelper = inject(MetadataHelper);
17
18
  }
18
19
  /**
19
20
  * Execute RAW DSQ with Name
21
+ * NEW: Uses new backend endpoint and CRUD microservice
20
22
  * @param data - Object containing AppObjectName and DSQName
21
23
  * @returns Response from the API
22
24
  */
23
25
  executeRAWDSQWithName(data, headers) {
24
26
  const header = getHeaders(headers);
25
- return this.apiService.post(`${API.getDSQ}/${data.AppObjectName}/${data.DSQName}`, data, header);
27
+ // NEW API: POST /Queries/execute/{objectName}/{dsqName} via CRUD service
28
+ return this.apiService.postToService(APIServices.crudService, `${API.QueriesExecute}/${data.AppObjectName}/${data.DSQName}`, data, header);
26
29
  }
27
30
  /**
28
31
  * Get Record
@@ -49,17 +52,17 @@ export class TabGetService {
49
52
  // return null;
50
53
  // }
51
54
  /**
52
- * Get History
55
+ * Get History from Kibana microservice
53
56
  * @param appObjectId - ID of the application object
54
57
  * @param recordIds - Array of record IDs
55
58
  * @returns Response from the API
56
59
  */
57
60
  getHistory(payload) {
58
- const appObjectName = getAppObject(payload.appObjectId)?.ObjectName;
61
+ const appObjectName = this.metadataHelper.getAppObjectByIdOrName(payload.appObjectId)?.ObjectName;
59
62
  const headers = getHeaders();
60
- return this.apiService.post(`${API.getHistory}`, {
61
- ObjectName: appObjectName,
63
+ return this.apiService.postToService(APIServices.kibanaService, API.auditGetHistory, {
62
64
  RecordIds: payload.recordIds,
65
+ entityName: appObjectName
63
66
  }, headers);
64
67
  }
65
68
  /**
@@ -73,25 +76,44 @@ export class TabGetService {
73
76
  }
74
77
  /**
75
78
  * Executes a select query with optional parameters
76
- * @param data - The select query data
79
+ * NEW: Uses new CRUD microservice endpoint with transformed payload
80
+ * @param data - The select query data (old format)
77
81
  * @param parameters - Optional parameters to be applied to the query
82
+ * @param additionalConfig - Optional additional configuration
78
83
  * @returns Result of the select query execution
79
84
  */
80
85
  selectExecutor(data, parameters, additionalConfig) {
86
+ // Prepare query data with parameters and config
87
+ const preparedData = this.prepareSelectQueryData(data, parameters, additionalConfig);
88
+ // Transform to new CRUD API payload format
89
+ const crudPayload = this.transformToCRUDPayload(preparedData);
90
+ // Call new CRUD microservice endpoint
91
+ const headers = getHeaders();
92
+ return this.apiService.postToService(APIServices.crudService, API.QueriesSelect, crudPayload, headers);
93
+ }
94
+ /**
95
+ * Prepares select query data by applying parameters and additional configuration
96
+ * @param data - The select query data
97
+ * @param parameters - Optional parameters to replace in filters
98
+ * @param additionalConfig - Optional additional configuration to merge
99
+ * @returns Prepared APISelectQuery with parameters applied
100
+ */
101
+ prepareSelectQueryData(data, parameters, additionalConfig) {
102
+ // Initialize WhereClause if parameters provided
81
103
  if (parameters && Object.keys(parameters).length) {
82
- data.WhereClause.FilterLogic = data.WhereClause.FilterLogic || '[]';
83
- data.WhereClause.Filters = data.WhereClause.Filters || [];
104
+ data.WhereClause.filterLogic = data.WhereClause.filterLogic || '[]';
105
+ data.WhereClause.filters = data.WhereClause.filters || [];
84
106
  data.WhereClause.SQLQuery = data.WhereClause.SQLQuery || '';
85
107
  /**
86
108
  * Replaces values from parameters if matched and in format of {{key}}.
87
- * Example: if filter.Value is "{{userId}}" and
88
- * this._value.parameters.userId is 123, then filter.Value will be replaced with
109
+ * Example: if filter.value is "{{userId}}" and
110
+ * this._value.parameters.userId is 123, then filter.value will be replaced with
89
111
  * "123".
90
112
  */
91
- data.WhereClause.Filters.forEach((filter) => {
92
- // filter.ValueType is 1 (literal)
93
- if (filter.Value && filter.ValueType == FilterValueType.Literal) {
94
- // filter.Value = filter.Value.replace(
113
+ data.WhereClause.filters.forEach((filter) => {
114
+ // filter.valueType is 1 (literal)
115
+ if (filter.value && filter.valueType == FilterValueType.Literal) {
116
+ // filter.value = filter.value.replace(
95
117
  // /{{([^}]+)}}/g,
96
118
  // (match: string, key: string) => {
97
119
  // const value = parameters[key];
@@ -101,25 +123,104 @@ export class TabGetService {
101
123
  }
102
124
  // if valueType = 2 (Parameters)
103
125
  // then we need to replace the value with parameters and change the valueType to 1 (Literal)
104
- else if (filter.ValueType == FilterValueType.Parameter) {
105
- filter.Value = filter.Value.replace(/([^}]+)/g, (match, key) => {
126
+ else if (filter.valueType == FilterValueType.Parameter) {
127
+ filter.value = filter.value.replace(/([^}]+)/g, (match, key) => {
106
128
  const value = parameters[key];
107
129
  return value !== undefined ? value : null;
108
130
  });
109
- filter.ValueType = FilterValueType.Literal;
131
+ filter.valueType = FilterValueType.Literal;
110
132
  }
111
133
  });
112
- (data?.WhereClause?.Filters || []).forEach((element) => {
113
- if (element.ValueType === FilterValueType.Parameter &&
114
- parameters[element.FieldID]) {
115
- element.Value = parameters[element.FieldID];
134
+ (data?.WhereClause?.filters || []).forEach((element) => {
135
+ if (element.valueType === FilterValueType.Parameter &&
136
+ parameters[element.fieldName]) {
137
+ element.value = parameters[element.fieldName];
116
138
  }
117
139
  });
118
140
  }
119
- if (additionalConfig && typeof additionalConfig === 'object') {
120
- data = { ...data, ...additionalConfig };
121
- }
122
- return this.dsqHelper.executeQuery(data, QueryType.Select);
141
+ return data;
142
+ }
143
+ /**
144
+ * Transforms old APISelectQuery format to new CRUD API format
145
+ * @param apiSelectQuery - The old format select query
146
+ * @returns CRUDSelectPayload - The new format payload
147
+ */
148
+ transformToCRUDPayload(apiSelectQuery) {
149
+ const payload = new CRUDSelectPayload();
150
+ // Basic properties transformation
151
+ payload.EntityName = this.getEntityName(apiSelectQuery.QueryObjectID);
152
+ payload.SelectedFields = apiSelectQuery.ResultField_AppfieldIds || [];
153
+ payload.Distinct = apiSelectQuery.Distinct || false;
154
+ // Transform complex properties
155
+ payload.includes = this.transformJoinsToIncludes(apiSelectQuery.Joins);
156
+ payload.Pager = this.transformPager(apiSelectQuery.TopCount);
157
+ payload.whereClause = this.transformWhereClause(apiSelectQuery.WhereClause);
158
+ payload.Sort = this.transformSort(apiSelectQuery.Sort);
159
+ return payload;
160
+ }
161
+ /**
162
+ * Gets entity name from QueryObjectID
163
+ */
164
+ getEntityName(queryObjectId) {
165
+ const appObject = this.metadataHelper.getAppObjectByIdOrName(queryObjectId);
166
+ return appObject?.ObjectName || queryObjectId;
167
+ }
168
+ /**
169
+ * Transforms Joins to includes array
170
+ */
171
+ transformJoinsToIncludes(joins) {
172
+ if (!joins || joins.length === 0)
173
+ return undefined;
174
+ return joins.map((join) => join.Relationship?.childDetails?.LookupObject || join);
175
+ }
176
+ /**
177
+ * Transforms TopCount to Pager object
178
+ */
179
+ transformPager(topCount) {
180
+ if (!topCount)
181
+ return undefined;
182
+ const pager = new CRUDPager();
183
+ pager.pageNumber = 1;
184
+ pager.pageSize = topCount;
185
+ pager.returnTotalCount = true;
186
+ return pager;
187
+ }
188
+ /**
189
+ * Transforms WhereClause to new format
190
+ */
191
+ transformWhereClause(whereClause) {
192
+ if (!whereClause?.Filters || whereClause.Filters.length === 0)
193
+ return undefined;
194
+ const crudWhereClause = new CRUDWhereClause();
195
+ crudWhereClause.filters = whereClause.Filters.map((filter) => this.transformFilter(filter));
196
+ return crudWhereClause;
197
+ }
198
+ /**
199
+ * Transforms a single filter to new format
200
+ */
201
+ transformFilter(filter) {
202
+ const crudFilter = new CRUDFilter();
203
+ crudFilter.fieldName = filter.FieldID;
204
+ crudFilter.operator = filter.RelationalOperator;
205
+ crudFilter.value = filter.Value || filter.value;
206
+ crudFilter.valueType = filter.ValueType;
207
+ crudFilter.conjunction = filter.ConjuctionClause;
208
+ crudFilter.groupId = filter.GroupID;
209
+ crudFilter.sequence = filter.Sequence;
210
+ return crudFilter;
211
+ }
212
+ /**
213
+ * Transforms Sort array to new format
214
+ */
215
+ transformSort(sorts) {
216
+ if (!sorts || sorts.length === 0)
217
+ return undefined;
218
+ return sorts.map((sort) => {
219
+ const crudSort = new CRUDSort();
220
+ crudSort.FieldName = sort.FieldID;
221
+ crudSort.Direction = sort.SortSequence;
222
+ return crudSort;
223
+ });
123
224
  }
124
225
  /**
125
226
  * Executes a select query by its ID, using the provided parameters.
@@ -137,15 +238,15 @@ export class TabGetService {
137
238
  ID: selectQueryId,
138
239
  },
139
240
  }).pipe(switchMap((res) => {
140
- if (res.StatusCode === '200') {
241
+ if (res.IsSuccess && res.Result.length) {
141
242
  const Configuration = JSON.parse(res.Result[0].Configuration || '{}');
142
- if (Configuration.WhereClause?.Filters) {
143
- Configuration.WhereClause.Filters = this.removeWhereClauseForEmptyParams(Configuration.WhereClause.Filters, parameters || {});
243
+ if (Configuration.WhereClause?.filters) {
244
+ Configuration.WhereClause.filters = this.removeWhereClauseForEmptyParams(Configuration.WhereClause.filters, parameters || {});
144
245
  }
145
246
  return this.selectExecutor(Configuration, parameters, additionalConfig);
146
247
  }
147
248
  else {
148
- throw new Error(res.Message);
249
+ throw new Error(res.Message || 'Failed to fetch select query configuration.');
149
250
  }
150
251
  }));
151
252
  }
@@ -180,14 +281,14 @@ export class TabGetService {
180
281
  // return null;
181
282
  // }
182
283
  /**
183
- * Get Search Data
284
+ * Get Search Data from Kibana microservice
184
285
  * @param searchQuery - Search Query string
185
286
  * @param limit - Limit of search results
186
287
  * @returns Response from the API
187
288
  */
188
289
  getSearchData(payload, params) {
189
290
  const headers = getHeaders();
190
- return this.apiService.get(`${API.search}?searchQuery=${payload.searchQuery}&limit=${payload.limit}${payload?.appObjectId ? `&appObjectId=${payload.appObjectId}` : ''}`, params, headers);
291
+ return this.apiService.getFromService(APIServices.kibanaService, `${API.globalSearch}?searchQuery=${payload.searchQuery}&limit=${payload.limit}${payload?.appObjectId ? `&appObjectId=${payload.appObjectId}` : ''}`, params, headers);
191
292
  }
192
293
  /**
193
294
  * Executes an HTTP request with the specified method, URL, headers, and body.
@@ -234,4 +335,4 @@ export class TabGetService {
234
335
  type: Injectable,
235
336
  args: [{ providedIn: 'root' }]
236
337
  }], null, null); })();
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWdldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQkFBMEIsR0FDM0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUk3QyxNQUFNLE9BQU8sYUFBYTtJQUQxQjtRQUVtQixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FpUGhEO0lBL09DOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxJQUFTLEVBQUMsT0FBWTtRQUMxQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FD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bnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRFNRSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb21tb24vZHNxLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBnZXRIZWFkZXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVxLXJlcy51dGlsJztcclxuaW1wb3J0IHsgQVBJIH0gZnJvbSAnLi4vY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBnZXRBcHBPYmplY3QgfSBmcm9tICcuLi91dGlscy90YWItYXBwLnV0aWwnO1xyXG5pbXBvcnQgeyBBUElTZWxlY3RRdWVyeSB9IGZyb20gJy4uL21vZGVscy9hcGktcXVlcnkuY2xhc3MnO1xyXG5pbXBvcnQgeyBGaWx0ZXJWYWx1ZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kc3EuZW51bSc7XHJcbmltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL2VudW1zL3F1ZXJ5LmVudW0nO1xyXG5pbXBvcnQge1xyXG4gIEFwcE9iamVjdHNDb25zdGFudHMsXHJcbiAgRGF0YVNvdXJjZVF1ZXJpZXNDb25zdGFudHMsXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2FwcC1vYmplY3QtY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbW1vbkFwaVJlc3BvbnNlLCBIdHRwRXhlY3V0ZVJlcXVlc3RQYXlsb2FkLCBJbXByb3REYXRhUGF5bG9hZCwgUmNvcmRIaXN0b3J5UGF5bG9hZCwgU2VhcmNoRGF0YVBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkdldFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpU2VydmljZSA9IGluamVjdChBcGlTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRzcUhlbHBlciA9IGluamVjdChEU1FIZWxwZXIpO1xyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlIFJBVyBEU1Egd2l0aCBOYW1lXHJcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBBcHBPYmplY3ROYW1lIGFuZCBEU1FOYW1lXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKGRhdGE6IGFueSxoZWFkZXJzPzphbnkpOiBhbnkge1xyXG4gICAgY29uc3QgaGVhZGVyID0gZ2V0SGVhZGVycyhoZWFkZXJzKTtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KFxyXG4gICAgICAgIGAke0FQSS5nZXREU1F9LyR7ZGF0YS5BcHBPYmplY3ROYW1lfS8ke2RhdGEuRFNRTmFtZX1gLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgaGVhZGVyXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgUmVjb3JkXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0XHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0UmVjb3JkKHBhcmFtczogYW55KTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICBpZiAoaGVhZGVycykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChgJHtBUEkuZ2V0cmVjb3JkfWAsIHBhcmFtcywgaGVhZGVycyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIEV4ZWN1dGUgUmF3IFNRTFxyXG4gIC8vICAqIEBwYXJhbSBkYXRhIC0gRGF0YSBmb3IgdGhlIHJlcXVlc3RcclxuICAvLyAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAvLyAgKi9cclxuICAvLyBleGVjdXRlUmF3U3FsKGRhdGE6IGFueSk6IGFueSB7XHJcbiAgLy8gICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gIC8vICAgaWYgKGhlYWRlcnMpIHtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KGAke0FQSS5yYXdTUUx9P3F1ZXJ5PSR7ZGF0YX1gLCAnJywgaGVhZGVycyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbnVsbDtcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBIaXN0b3J5XHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gSUQgb2YgdGhlIGFwcGxpY2F0aW9uIG9iamVjdFxyXG4gICAqIEBwYXJhbSByZWNvcmRJZHMgLSBBcnJheSBvZiByZWNvcmQgSURzXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0SGlzdG9yeShwYXlsb2FkOiBSY29yZEhpc3RvcnlQYXlsb2FkKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgYXBwT2JqZWN0TmFtZSA9IGdldEFwcE9iamVjdChwYXlsb2FkLmFwcE9iamVjdElkKT8uT2JqZWN0TmFtZTtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoYCR7QVBJLmdldEhpc3Rvcnl9YCwge1xyXG4gICAgICBPYmplY3ROYW1lOiBhcHBPYmplY3ROYW1lLFxyXG4gICAgICBSZWNvcmRJZHM6IHBheWxvYWQucmVjb3JkSWRzLFxyXG4gICAgfSwgaGVhZGVycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQTUpBWSBJbXBvcnRcclxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgZm9yIFBNSkFZIGltcG9ydFxyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIHBtamF5SW1wb3J0KGRhdGE6IEltcHJvdERhdGFQYXlsb2FkKTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoYCR7QVBJLnBtamF5SW1wb3J0fWAsIGRhdGEsIGhlYWRlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc2VsZWN0IHF1ZXJ5IGRhdGFcclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnlcclxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIHNlbGVjdCBxdWVyeSBleGVjdXRpb25cclxuICAgKi9cclxuICBzZWxlY3RFeGVjdXRvcihkYXRhOiBBUElTZWxlY3RRdWVyeSwgcGFyYW1ldGVycz86IGFueSwgYWRkaXRpb25hbENvbmZpZz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGlmIChwYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCkge1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlckxvZ2ljID0gZGF0YS5XaGVyZUNsYXVzZS5GaWx0ZXJMb2dpYyB8fCAnW10nO1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlcnMgPSBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlcnMgfHwgW107XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuU1FMUXVlcnkgPSBkYXRhLldoZXJlQ2xhdXNlLlNRTFF1ZXJ5IHx8ICcnO1xyXG4gICAgICAvKipcclxuICAgICAgICogUmVwbGFjZXMgdmFsdWVzIGZyb20gcGFyYW1ldGVycyBpZiBtYXRjaGVkIGFuZCBpbiBmb3JtYXQgb2Yge3trZXl9fS5cclxuICAgICAgICogRXhhbXBsZTogaWYgZmlsdGVyLlZhbHVlIGlzIFwie3t1c2VySWR9fVwiIGFuZFxyXG4gICAgICAgKiB0aGlzLl92YWx1ZS5wYXJhbWV0ZXJzLnVzZXJJZCBpcyAxMjMsIHRoZW4gZmlsdGVyLlZhbHVlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aFxyXG4gICAgICAgKiBcIjEyM1wiLlxyXG4gICAgICAgKi9cclxuICAgICAgZGF0YS5XaGVyZUNsYXVzZS5GaWx0ZXJzLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gZmlsdGVyLlZhbHVlVHlwZSBpcyAxIChsaXRlcmFsKVxyXG4gICAgICAgIGlmIChmaWx0ZXIuVmFsdWUgJiYgZmlsdGVyLlZhbHVlVHlwZSA9PSBGaWx0ZXJWYWx1ZVR5cGUuTGl0ZXJhbCkge1xyXG4gICAgICAgICAgLy8gZmlsdGVyLlZhbHVlID0gZmlsdGVyLlZhbHVlLnJlcGxhY2UoXHJcbiAgICAgICAgICAvLyAgIC97eyhbXn1dKyl9fS9nLFxyXG4gICAgICAgICAgLy8gICAobWF0Y2g6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIC8vICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlcnNba2V5XTtcclxuICAgICAgICAgIC8vICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogbnVsbDtcclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdmFsdWVUeXBlID0gMiAoUGFyYW1ldGVycylcclxuICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCBwYXJhbWV0ZXJzIGFuZCBjaGFuZ2UgdGhlIHZhbHVlVHlwZSB0byAxIChMaXRlcmFsKVxyXG4gICAgICAgIGVsc2UgaWYgKGZpbHRlci5WYWx1ZVR5cGUgPT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgICAgZmlsdGVyLlZhbHVlID0gZmlsdGVyLlZhbHVlLnJlcGxhY2UoXHJcbiAgICAgICAgICAgIC8oW159XSspL2csXHJcbiAgICAgICAgICAgIChtYXRjaDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xyXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZmlsdGVyLlZhbHVlVHlwZSA9IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIChkYXRhPy5XaGVyZUNsYXVzZT8uRmlsdGVycyB8fCBbXSkuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZWxlbWVudC5WYWx1ZVR5cGUgPT09IEZpbHRlclZhbHVlVHlwZS5QYXJhbWV0ZXIgJiZcclxuICAgICAgICAgIHBhcmFtZXRlcnNbZWxlbWVudC5GaWVsZElEXVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZWxlbWVudC5WYWx1ZSA9IHBhcmFtZXRlcnNbZWxlbWVudC5GaWVsZElEXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGFkZGl0aW9uYWxDb25maWcgJiYgdHlwZW9mIGFkZGl0aW9uYWxDb25maWcgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIC4uLmFkZGl0aW9uYWxDb25maWcgfTsgIFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRzcUhlbHBlci5leGVjdXRlUXVlcnkoZGF0YSwgUXVlcnlUeXBlLlNlbGVjdCkgYXMgT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhIHNlbGVjdCBxdWVyeSBieSBpdHMgSUQsIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlbGVjdFF1ZXJ5SWQgLSBUaGUgSUQgb2YgdGhlIHNlbGVjdCBxdWVyeSB0byBiZSBleGVjdXRlZC5cclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnkuXHJcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IHF1ZXJ5IGV4ZWN1dGlvbi5cclxuICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBBUEkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgbm90ICcyMDAnLlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVTZWxlY3RRdWVyeUJ5SWQoc2VsZWN0UXVlcnlJZDogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBhZGRpdGlvbmFsQ29uZmlnPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKHtcclxuICAgICAgQXBwT2JqZWN0TmFtZTogQXBwT2JqZWN0c0NvbnN0YW50cy5UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIERTUU5hbWU6IERhdGFTb3VyY2VRdWVyaWVzQ29uc3RhbnRzLkRldGFpbF9UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIFJlcXRva2Vuczoge1xyXG4gICAgICAgIElEOiBzZWxlY3RRdWVyeUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuU3RhdHVzQ29kZSA9PT0gJzIwMCcpIHtcclxuICAgICAgICAgIGNvbnN0IENvbmZpZ3VyYXRpb24gPSBKU09OLnBhcnNlKHJlcy5SZXN1bHRbMF0uQ29uZmlndXJhdGlvbiB8fCAne30nKTtcclxuICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlPy5GaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uV2hlcmVDbGF1c2UuRmlsdGVycyA9IHRoaXMucmVtb3ZlV2hlcmVDbGF1c2VGb3JFbXB0eVBhcmFtcyhDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlLkZpbHRlcnMsIHBhcmFtZXRlcnMgfHwge30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0RXhlY3V0b3IoQ29uZmlndXJhdGlvbiwgcGFyYW1ldGVycywgYWRkaXRpb25hbENvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVtb3ZlV2hlcmVDbGF1c2VGb3JFbXB0eVBhcmFtcyhmaWx0ZXJzOiBhbnlbXSwgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55Pik6IGFueVtdIHtcclxuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gZmlsdGVyLlZhbHVlO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSBpbiBwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFJlbW92ZSBmaWx0ZXJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSkubGVuZ3RoID09PSAwICYmIGZpbHRlci5WYWx1ZVR5cGUgPT09IEZpbHRlclZhbHVlVHlwZS5QYXJhbWV0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZW1vdmUgZmlsdGVyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGZpbHRlclxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIEdldCBSZXNvdXJjZSBMYW5ndWFnZSBCeSBMYW5ndWFnZSBDb2RlXHJcbiAgLy8gICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIExhbmd1YWdlIENvZGVcclxuICAvLyAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAvLyAgKi9cclxuICAvLyBnZXRSZXNvdXJjZUxhbmd1YWdlQnlMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlOiBudW1iZXIpOiBhbnkge1xyXG4gIC8vICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAvLyAgIGlmIChoZWFkZXJzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChcclxuICAvLyAgICAgICBgJHtBUEkubGFuZ3VhZ2VSZXNvdXJjZX1gLFxyXG4gIC8vICAgICAgIHsgTGFuZ3VhZ2VDb2RlOiBsYW5ndWFnZUNvZGUgfSxcclxuICAvLyAgICAgICBoZWFkZXJzXHJcbiAgLy8gICAgICk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbnVsbDtcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBTZWFyY2ggRGF0YVxyXG4gICAqIEBwYXJhbSBzZWFyY2hRdWVyeSAtIFNlYXJjaCBRdWVyeSBzdHJpbmdcclxuICAgKiBAcGFyYW0gbGltaXQgLSBMaW1pdCBvZiBzZWFyY2ggcmVzdWx0c1xyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIGdldFNlYXJjaERhdGEocGF5bG9hZDogU2VhcmNoRGF0YVBheWxvYWQsIHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLnNlYXJjaH0/c2VhcmNoUXVlcnk9JHtwYXlsb2FkLnNlYXJjaFF1ZXJ5fSZsaW1pdD0ke3BheWxvYWQubGltaXR9JHtwYXlsb2FkPy5hcHBPYmplY3RJZCA/IGAmYXBwT2JqZWN0SWQ9JHtwYXlsb2FkLmFwcE9iamVjdElkfWAgOiAnJ31gLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhbiBIVFRQIHJlcXVlc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBhbmQgYm9keS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdWxsVXJsIC1UaGUgZnVsbCBVUkwgb2YgdGhlIHJlcXVlc3QgY29udGFpbmluZyB0aGUgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIEhUVFAgbWV0aG9kIHRvIGJlIHVzZWQgKCdHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJykuXHJcbiAgICogQHBhcmFtIGhlYWRlcnMgLSBUaGUgaGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSBib2R5IC0gVGhlIGJvZHkgY29udGVudCBmb3IgbWV0aG9kcyBsaWtlIFBPU1QgYW5kIFBVVC5cclxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHJlc3BvbnNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3QuXHJcbiAgICovXHJcbiAgZXhlY3V0ZUh0dHBSZXF1ZXN0KHBheWxvYWQ6IEh0dHBFeGVjdXRlUmVxdWVzdFBheWxvYWQpOiBhbnkge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgLi4uKHBheWxvYWQ/LmhlYWRlcnMgfHwge30pLFxyXG4gICAgICAnWC1Ta2lwLUludGVyY2VwdG9yJzogJ3RydWUnLFxyXG4gICAgICAnWC1Ta2lwLUF1dGgnOiAndHJ1ZScsXHJcbiAgICAgICdYLVRyYWNrLUFQSS1EZXRhaWxzJzogJ3RydWUnLFxyXG4gICAgfTtcclxuICAgIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnR0VUJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldEJ5VXJsKHBheWxvYWQuZnVsbFVybCwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnUE9TVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0QnlVcmwocGF5bG9hZC5mdWxsVXJsLCBwYXlsb2FkLmJvZHksIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ1BVVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wdXRCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHBheWxvYWQuYm9keSwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnREVMRVRFJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZUJ5VXJsKHBheWxvYWQuZnVsbFVybCwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGFuIEhUVFAgUmVxdWVzdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgRGF0YVNvdXJjZVF1ZXJ5IG5hbWVcclxuICAgKiBAcGFyYW0gUXVlcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIERhdGFTb3VyY2VRdWVyeVxyXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGdlbmVyYXRlZCBIVFRQIHJlcXVlc3RcclxuICAgKi9cclxuICBnZW5lcmF0ZUh0dHBSZXF1ZXN0KGRhdGFTb3VyY2VRdWVyeU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLkdlbmVyYXRlSHR0cFJlcXVlc3R9P2RzcU5hbWU9JHtkYXRhU291cmNlUXVlcnlOYW1lfWAsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWdldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQWtCLFVBQVUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDBCQUEwQixHQUMzQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSTdDLE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztLQWlYMUQ7SUEvV0M7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxJQUFT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dUVBQWIsYUFBYSxXQUFiLGFBQWEsbUJBREEsTUFBTTs7aUZBQ25CLGFBQWE7Y0FEekIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9odHRwLWNsaWVudC9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IERTUUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL2RzcS5oZWxwZXJzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2NvbW1vbi9tZXRhLWRhdGEuaGVscGVycyc7XHJcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tICcuLi91dGlscy9yZXEtcmVzLnV0aWwnO1xyXG5pbXBvcnQgeyBBUEksIEFQSVNlcnZpY2VzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBUElTZWxlY3RRdWVyeSwgQ1JVREZpbHRlciwgQ1JVRFBhZ2VyLCBDUlVEU2VsZWN0UGF5bG9hZCwgQ1JVRFNvcnQsIENSVURXaGVyZUNsYXVzZSB9IGZyb20gJy4uL21vZGVscy9hcGktcXVlcnkuY2xhc3MnO1xyXG5pbXBvcnQgeyBGaWx0ZXJWYWx1ZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kc3EuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgQXBwT2JqZWN0c0NvbnN0YW50cyxcclxuICBEYXRhU291cmNlUXVlcmllc0NvbnN0YW50cyxcclxufSBmcm9tICcuLi9jb25zdGFudHMvYXBwLW9iamVjdC1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tbW9uQXBpUmVzcG9uc2UsIEh0dHBFeGVjdXRlUmVxdWVzdFBheWxvYWQsIEltcHJvdERhdGFQYXlsb2FkLCBSY29yZEhpc3RvcnlQYXlsb2FkLCBTZWFyY2hEYXRhUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29tbW9uLmludGVyZmFjZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVGFiR2V0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHNxSGVscGVyID0gaW5qZWN0KERTUUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUhlbHBlciA9IGluamVjdChNZXRhZGF0YUhlbHBlcik7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4ZWN1dGUgUkFXIERTUSB3aXRoIE5hbWVcclxuICAgKiBORVc6IFVzZXMgbmV3IGJhY2tlbmQgZW5kcG9pbnQgYW5kIENSVUQgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBBcHBPYmplY3ROYW1lIGFuZCBEU1FOYW1lXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKGRhdGE6IGFueSwgaGVhZGVycz86IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgLy8gTkVXIEFQSTogUE9TVCAvUXVlcmllcy9leGVjdXRlL3tvYmplY3ROYW1lfS97ZHNxTmFtZX0gdmlhIENSVUQgc2VydmljZVxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5jcnVkU2VydmljZSxcclxuICAgICAgYCR7QVBJLlF1ZXJpZXNFeGVjdXRlfS8ke2RhdGEuQXBwT2JqZWN0TmFtZX0vJHtkYXRhLkRTUU5hbWV9YCxcclxuICAgICAgZGF0YSxcclxuICAgICAgaGVhZGVyXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IFJlY29yZFxyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIGdldFJlY29yZChwYXJhbXM6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgaWYgKGhlYWRlcnMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXQoYCR7QVBJLmdldHJlY29yZH1gLCBwYXJhbXMsIGhlYWRlcnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBFeGVjdXRlIFJhdyBTUUxcclxuICAvLyAgKiBAcGFyYW0gZGF0YSAtIERhdGEgZm9yIHRoZSByZXF1ZXN0XHJcbiAgLy8gICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgLy8gICovXHJcbiAgLy8gZXhlY3V0ZVJhd1NxbChkYXRhOiBhbnkpOiBhbnkge1xyXG4gIC8vICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAvLyAgIGlmIChoZWFkZXJzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChgJHtBUEkucmF3U1FMfT9xdWVyeT0ke2RhdGF9YCwgJycsIGhlYWRlcnMpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG51bGw7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgSGlzdG9yeSBmcm9tIEtpYmFuYSBtaWNyb3NlcnZpY2VcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBJRCBvZiB0aGUgYXBwbGljYXRpb24gb2JqZWN0XHJcbiAgICogQHBhcmFtIHJlY29yZElkcyAtIEFycmF5IG9mIHJlY29yZCBJRHNcclxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAgKi9cclxuICBnZXRIaXN0b3J5KHBheWxvYWQ6IFJjb3JkSGlzdG9yeVBheWxvYWQpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBhcHBPYmplY3ROYW1lID0gdGhpcy5tZXRhZGF0YUhlbHBlci5nZXRBcHBPYmplY3RCeUlkT3JOYW1lKHBheWxvYWQuYXBwT2JqZWN0SWQpPy5PYmplY3ROYW1lO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdFRvU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMua2liYW5hU2VydmljZSxcclxuICAgICAgQVBJLmF1ZGl0R2V0SGlzdG9yeSxcclxuICAgICAge1xyXG4gICAgICAgIFJlY29yZElkczogcGF5bG9hZC5yZWNvcmRJZHMsXHJcbiAgICAgICAgZW50aXR5TmFtZTogYXBwT2JqZWN0TmFtZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUE1KQVkgSW1wb3J0XHJcbiAgICogQHBhcmFtIGRhdGEgLSBEYXRhIGZvciBQTUpBWSBpbXBvcnRcclxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAgKi9cclxuICBwbWpheUltcG9ydChkYXRhOiBJbXByb3REYXRhUGF5bG9hZCk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KGAke0FQSS5wbWpheUltcG9ydH1gLCBkYXRhLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4ZWN1dGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAqIE5FVzogVXNlcyBuZXcgQ1JVRCBtaWNyb3NlcnZpY2UgZW5kcG9pbnQgd2l0aCB0cmFuc2Zvcm1lZCBwYXlsb2FkXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc2VsZWN0IHF1ZXJ5IGRhdGEgKG9sZCBmb3JtYXQpXHJcbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHF1ZXJ5XHJcbiAgICogQHBhcmFtIGFkZGl0aW9uYWxDb25maWcgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIHNlbGVjdCBxdWVyeSBleGVjdXRpb25cclxuICAgKi9cclxuICBzZWxlY3RFeGVjdXRvcihkYXRhOiBBUElTZWxlY3RRdWVyeSwgcGFyYW1ldGVycz86IGFueSwgYWRkaXRpb25hbENvbmZpZz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIC8vIFByZXBhcmUgcXVlcnkgZGF0YSB3aXRoIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ1xyXG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBhbnkgPSB0aGlzLnByZXBhcmVTZWxlY3RRdWVyeURhdGEoZGF0YSwgcGFyYW1ldGVycywgYWRkaXRpb25hbENvbmZpZyk7XHJcblxyXG4gICAgLy8gVHJhbnNmb3JtIHRvIG5ldyBDUlVEIEFQSSBwYXlsb2FkIGZvcm1hdFxyXG4gICAgY29uc3QgY3J1ZFBheWxvYWQgPSB0aGlzLnRyYW5zZm9ybVRvQ1JVRFBheWxvYWQocHJlcGFyZWREYXRhKTtcclxuXHJcbiAgICAvLyBDYWxsIG5ldyBDUlVEIG1pY3Jvc2VydmljZSBlbmRwb2ludFxyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdFRvU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMuY3J1ZFNlcnZpY2UsXHJcbiAgICAgIEFQSS5RdWVyaWVzU2VsZWN0LFxyXG4gICAgICBjcnVkUGF5bG9hZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXBhcmVzIHNlbGVjdCBxdWVyeSBkYXRhIGJ5IGFwcGx5aW5nIHBhcmFtZXRlcnMgYW5kIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvblxyXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHNlbGVjdCBxdWVyeSBkYXRhXHJcbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHJlcGxhY2UgaW4gZmlsdGVyc1xyXG4gICAqIEBwYXJhbSBhZGRpdGlvbmFsQ29uZmlnIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIG1lcmdlXHJcbiAgICogQHJldHVybnMgUHJlcGFyZWQgQVBJU2VsZWN0UXVlcnkgd2l0aCBwYXJhbWV0ZXJzIGFwcGxpZWRcclxuICAgKi9cclxuICBwcml2YXRlIHByZXBhcmVTZWxlY3RRdWVyeURhdGEoZGF0YTogQVBJU2VsZWN0UXVlcnksIHBhcmFtZXRlcnM/OiBhbnksIGFkZGl0aW9uYWxDb25maWc/OiBhbnkpIHtcclxuICAgIC8vIEluaXRpYWxpemUgV2hlcmVDbGF1c2UgaWYgcGFyYW1ldGVycyBwcm92aWRlZFxyXG4gICAgaWYgKHBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoKSB7XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVyTG9naWMgPSBkYXRhLldoZXJlQ2xhdXNlLmZpbHRlckxvZ2ljIHx8ICdbXSc7XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVycyA9IGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVycyB8fCBbXTtcclxuICAgICAgZGF0YS5XaGVyZUNsYXVzZS5TUUxRdWVyeSA9IGRhdGEuV2hlcmVDbGF1c2UuU1FMUXVlcnkgfHwgJyc7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBSZXBsYWNlcyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXJzIGlmIG1hdGNoZWQgYW5kIGluIGZvcm1hdCBvZiB7e2tleX19LlxyXG4gICAgICAgKiBFeGFtcGxlOiBpZiBmaWx0ZXIudmFsdWUgaXMgXCJ7e3VzZXJJZH19XCIgYW5kXHJcbiAgICAgICAqIHRoaXMuX3ZhbHVlLnBhcmFtZXRlcnMudXNlcklkIGlzIDEyMywgdGhlbiBmaWx0ZXIudmFsdWUgd2lsbCBiZSByZXBsYWNlZCB3aXRoXHJcbiAgICAgICAqIFwiMTIzXCIuXHJcbiAgICAgICAqL1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBmaWx0ZXIudmFsdWVUeXBlIGlzIDEgKGxpdGVyYWwpXHJcbiAgICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiBmaWx0ZXIudmFsdWVUeXBlID09IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsKSB7XHJcbiAgICAgICAgICAvLyBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWUucmVwbGFjZShcclxuICAgICAgICAgIC8vICAgL3t7KFtefV0rKX19L2csXHJcbiAgICAgICAgICAvLyAgIChtYXRjaDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xyXG4gICAgICAgICAgLy8gICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsO1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB2YWx1ZVR5cGUgPSAyIChQYXJhbWV0ZXJzKVxyXG4gICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIHBhcmFtZXRlcnMgYW5kIGNoYW5nZSB0aGUgdmFsdWVUeXBlIHRvIDEgKExpdGVyYWwpXHJcbiAgICAgICAgZWxzZSBpZiAoZmlsdGVyLnZhbHVlVHlwZSA9PSBGaWx0ZXJWYWx1ZVR5cGUuUGFyYW1ldGVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWUucmVwbGFjZShcclxuICAgICAgICAgICAgLyhbXn1dKykvZyxcclxuICAgICAgICAgICAgKG1hdGNoOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXJzW2tleV07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVUeXBlID0gRmlsdGVyVmFsdWVUeXBlLkxpdGVyYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgKGRhdGE/LldoZXJlQ2xhdXNlPy5maWx0ZXJzIHx8IFtdKS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlbGVtZW50LnZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlciAmJlxyXG4gICAgICAgICAgcGFyYW1ldGVyc1tlbGVtZW50LmZpZWxkTmFtZV1cclxuICAgICAgICApIHtcclxuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBwYXJhbWV0ZXJzW2VsZW1lbnQuZmllbGROYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBvbGQgQVBJU2VsZWN0UXVlcnkgZm9ybWF0IHRvIG5ldyBDUlVEIEFQSSBmb3JtYXRcclxuICAgKiBAcGFyYW0gYXBpU2VsZWN0UXVlcnkgLSBUaGUgb2xkIGZvcm1hdCBzZWxlY3QgcXVlcnlcclxuICAgKiBAcmV0dXJucyBDUlVEU2VsZWN0UGF5bG9hZCAtIFRoZSBuZXcgZm9ybWF0IHBheWxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybVRvQ1JVRFBheWxvYWQoYXBpU2VsZWN0UXVlcnk6IEFQSVNlbGVjdFF1ZXJ5KTogQ1JVRFNlbGVjdFBheWxvYWQge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBDUlVEU2VsZWN0UGF5bG9hZCgpO1xyXG5cclxuICAgIC8vIEJhc2ljIHByb3BlcnRpZXMgdHJhbnNmb3JtYXRpb25cclxuICAgIHBheWxvYWQuRW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZShhcGlTZWxlY3RRdWVyeS5RdWVyeU9iamVjdElEKTtcclxuICAgIHBheWxvYWQuU2VsZWN0ZWRGaWVsZHMgPSBhcGlTZWxlY3RRdWVyeS5SZXN1bHRGaWVsZF9BcHBmaWVsZElkcyB8fCBbXTtcclxuICAgIHBheWxvYWQuRGlzdGluY3QgPSBhcGlTZWxlY3RRdWVyeS5EaXN0aW5jdCB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyBUcmFuc2Zvcm0gY29tcGxleCBwcm9wZXJ0aWVzXHJcbiAgICBwYXlsb2FkLmluY2x1ZGVzID0gdGhpcy50cmFuc2Zvcm1Kb2luc1RvSW5jbHVkZXMoYXBpU2VsZWN0UXVlcnkuSm9pbnMpO1xyXG4gICAgcGF5bG9hZC5QYWdlciA9IHRoaXMudHJhbnNmb3JtUGFnZXIoYXBpU2VsZWN0UXVlcnkuVG9wQ291bnQpO1xyXG4gICAgcGF5bG9hZC53aGVyZUNsYXVzZSA9IHRoaXMudHJhbnNmb3JtV2hlcmVDbGF1c2UoYXBpU2VsZWN0UXVlcnkuV2hlcmVDbGF1c2UpO1xyXG4gICAgcGF5bG9hZC5Tb3J0ID0gdGhpcy50cmFuc2Zvcm1Tb3J0KGFwaVNlbGVjdFF1ZXJ5LlNvcnQpO1xyXG5cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBlbnRpdHkgbmFtZSBmcm9tIFF1ZXJ5T2JqZWN0SURcclxuICAgKi9cclxuICBwcml2YXRlIGdldEVudGl0eU5hbWUocXVlcnlPYmplY3RJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGFwcE9iamVjdCA9IHRoaXMubWV0YWRhdGFIZWxwZXIuZ2V0QXBwT2JqZWN0QnlJZE9yTmFtZShxdWVyeU9iamVjdElkKTtcclxuICAgIHJldHVybiBhcHBPYmplY3Q/Lk9iamVjdE5hbWUgfHwgcXVlcnlPYmplY3RJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgSm9pbnMgdG8gaW5jbHVkZXMgYXJyYXlcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybUpvaW5zVG9JbmNsdWRlcyhqb2lucz86IGFueVtdKTogYW55W10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgcmV0dXJuIGpvaW5zLm1hcCgoam9pbjogYW55KSA9PlxyXG4gICAgICBqb2luLlJlbGF0aW9uc2hpcD8uY2hpbGREZXRhaWxzPy5Mb29rdXBPYmplY3QgfHwgam9pblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgVG9wQ291bnQgdG8gUGFnZXIgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1QYWdlcih0b3BDb3VudD86IG51bWJlcik6IENSVURQYWdlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXRvcENvdW50KSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IHBhZ2VyID0gbmV3IENSVURQYWdlcigpO1xyXG4gICAgcGFnZXIucGFnZU51bWJlciA9IDE7XHJcbiAgICBwYWdlci5wYWdlU2l6ZSA9IHRvcENvdW50O1xyXG4gICAgcGFnZXIucmV0dXJuVG90YWxDb3VudCA9IHRydWU7XHJcbiAgICByZXR1cm4gcGFnZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm1zIFdoZXJlQ2xhdXNlIHRvIG5ldyBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybVdoZXJlQ2xhdXNlKHdoZXJlQ2xhdXNlPzogYW55KTogQ1JVRFdoZXJlQ2xhdXNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghd2hlcmVDbGF1c2U/LkZpbHRlcnMgfHwgd2hlcmVDbGF1c2UuRmlsdGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgY3J1ZFdoZXJlQ2xhdXNlID0gbmV3IENSVURXaGVyZUNsYXVzZSgpO1xyXG4gICAgY3J1ZFdoZXJlQ2xhdXNlLmZpbHRlcnMgPSB3aGVyZUNsYXVzZS5GaWx0ZXJzLm1hcCgoZmlsdGVyOiBhbnkpID0+XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtRmlsdGVyKGZpbHRlcilcclxuICAgICk7XHJcbiAgICByZXR1cm4gY3J1ZFdoZXJlQ2xhdXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBhIHNpbmdsZSBmaWx0ZXIgdG8gbmV3IGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJhbnNmb3JtRmlsdGVyKGZpbHRlcjogYW55KTogQ1JVREZpbHRlciB7XHJcbiAgICBjb25zdCBjcnVkRmlsdGVyID0gbmV3IENSVURGaWx0ZXIoKTtcclxuICAgIGNydWRGaWx0ZXIuZmllbGROYW1lID0gZmlsdGVyLkZpZWxkSUQ7XHJcbiAgICBjcnVkRmlsdGVyLm9wZXJhdG9yID0gZmlsdGVyLlJlbGF0aW9uYWxPcGVyYXRvcjtcclxuICAgIGNydWRGaWx0ZXIudmFsdWUgPSBmaWx0ZXIuVmFsdWUgfHwgZmlsdGVyLnZhbHVlO1xyXG4gICAgY3J1ZEZpbHRlci52YWx1ZVR5cGUgPSBmaWx0ZXIuVmFsdWVUeXBlO1xyXG4gICAgY3J1ZEZpbHRlci5jb25qdW5jdGlvbiA9IGZpbHRlci5Db25qdWN0aW9uQ2xhdXNlO1xyXG4gICAgY3J1ZEZpbHRlci5ncm91cElkID0gZmlsdGVyLkdyb3VwSUQ7XHJcbiAgICBjcnVkRmlsdGVyLnNlcXVlbmNlID0gZmlsdGVyLlNlcXVlbmNlO1xyXG4gICAgcmV0dXJuIGNydWRGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm1zIFNvcnQgYXJyYXkgdG8gbmV3IGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJhbnNmb3JtU29ydChzb3J0cz86IGFueVtdKTogQ1JVRFNvcnRbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXNvcnRzIHx8IHNvcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4gc29ydHMubWFwKChzb3J0OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgY3J1ZFNvcnQgPSBuZXcgQ1JVRFNvcnQoKTtcclxuICAgICAgY3J1ZFNvcnQuRmllbGROYW1lID0gc29ydC5GaWVsZElEO1xyXG4gICAgICBjcnVkU29ydC5EaXJlY3Rpb24gPSBzb3J0LlNvcnRTZXF1ZW5jZTtcclxuICAgICAgcmV0dXJuIGNydWRTb3J0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhIHNlbGVjdCBxdWVyeSBieSBpdHMgSUQsIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlbGVjdFF1ZXJ5SWQgLSBUaGUgSUQgb2YgdGhlIHNlbGVjdCBxdWVyeSB0byBiZSBleGVjdXRlZC5cclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnkuXHJcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IHF1ZXJ5IGV4ZWN1dGlvbi5cclxuICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBBUEkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgbm90ICcyMDAnLlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVTZWxlY3RRdWVyeUJ5SWQoc2VsZWN0UXVlcnlJZDogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBhZGRpdGlvbmFsQ29uZmlnPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKHtcclxuICAgICAgQXBwT2JqZWN0TmFtZTogQXBwT2JqZWN0c0NvbnN0YW50cy5UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIERTUU5hbWU6IERhdGFTb3VyY2VRdWVyaWVzQ29uc3RhbnRzLkRldGFpbF9UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIFJlcXRva2Vuczoge1xyXG4gICAgICAgIElEOiBzZWxlY3RRdWVyeUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuSXNTdWNjZXNzICYmIHJlcy5SZXN1bHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zdCBDb25maWd1cmF0aW9uID0gSlNPTi5wYXJzZShyZXMuUmVzdWx0WzBdLkNvbmZpZ3VyYXRpb24gfHwgJ3t9Jyk7XHJcbiAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5XaGVyZUNsYXVzZT8uZmlsdGVycykge1xyXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlLmZpbHRlcnMgPSB0aGlzLnJlbW92ZVdoZXJlQ2xhdXNlRm9yRW1wdHlQYXJhbXMoQ29uZmlndXJhdGlvbi5XaGVyZUNsYXVzZS5maWx0ZXJzLCBwYXJhbWV0ZXJzIHx8IHt9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEV4ZWN1dG9yKENvbmZpZ3VyYXRpb24sIHBhcmFtZXRlcnMsIGFkZGl0aW9uYWxDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLk1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBmZXRjaCBzZWxlY3QgcXVlcnkgY29uZmlndXJhdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICByZW1vdmVXaGVyZUNsYXVzZUZvckVtcHR5UGFyYW1zKGZpbHRlcnM6IGFueVtdLCBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55W10ge1xyXG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSBmaWx0ZXIuVmFsdWU7XHJcbiAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUgaW4gcGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzW3BhcmFtZXRlck5hbWVdID09PSAnJykge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZW1vdmUgZmlsdGVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbWV0ZXJzIHx8IHt9KS5sZW5ndGggPT09IDAgJiYgZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gUmVtb3ZlIGZpbHRlclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGZpbHRlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBHZXQgUmVzb3VyY2UgTGFuZ3VhZ2UgQnkgTGFuZ3VhZ2UgQ29kZVxyXG4gIC8vICAqIEBwYXJhbSBsYW5ndWFnZUNvZGUgLSBMYW5ndWFnZSBDb2RlXHJcbiAgLy8gICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgLy8gICovXHJcbiAgLy8gZ2V0UmVzb3VyY2VMYW5ndWFnZUJ5TGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZTogbnVtYmVyKTogYW55IHtcclxuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgLy8gICBpZiAoaGVhZGVycykge1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoXHJcbiAgLy8gICAgICAgYCR7QVBJLmxhbmd1YWdlUmVzb3VyY2V9YCxcclxuICAvLyAgICAgICB7IExhbmd1YWdlQ29kZTogbGFuZ3VhZ2VDb2RlIH0sXHJcbiAgLy8gICAgICAgaGVhZGVyc1xyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG51bGw7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgU2VhcmNoIERhdGEgZnJvbSBLaWJhbmEgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlYXJjaFF1ZXJ5IC0gU2VhcmNoIFF1ZXJ5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBsaW1pdCAtIExpbWl0IG9mIHNlYXJjaCByZXN1bHRzXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0U2VhcmNoRGF0YShwYXlsb2FkOiBTZWFyY2hEYXRhUGF5bG9hZCwgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0RnJvbVNlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLmtpYmFuYVNlcnZpY2UsXHJcbiAgICAgIGAke0FQSS5nbG9iYWxTZWFyY2h9P3NlYXJjaFF1ZXJ5PSR7cGF5bG9hZC5zZWFyY2hRdWVyeX0mbGltaXQ9JHtwYXlsb2FkLmxpbWl0fSR7cGF5bG9hZD8uYXBwT2JqZWN0SWQgPyBgJmFwcE9iamVjdElkPSR7cGF5bG9hZC5hcHBPYmplY3RJZH1gIDogJyd9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgYW4gSFRUUCByZXF1ZXN0IHdpdGggdGhlIHNwZWNpZmllZCBtZXRob2QsIFVSTCwgaGVhZGVycywgYW5kIGJvZHkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZnVsbFVybCAtVGhlIGZ1bGwgVVJMIG9mIHRoZSByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBIVFRQIG1ldGhvZCB0byBiZSB1c2VkICgnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScpLlxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIC0gVGhlIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IGNvbnRlbnQgZm9yIG1ldGhvZHMgbGlrZSBQT1NUIGFuZCBQVVQuXHJcbiAgICogQHJldHVybnMgVGhlIEFQSSByZXNwb25zZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0LlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVIdHRwUmVxdWVzdChwYXlsb2FkOiBIdHRwRXhlY3V0ZVJlcXVlc3RQYXlsb2FkKTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgIC4uLihwYXlsb2FkPy5oZWFkZXJzIHx8IHt9KSxcclxuICAgICAgJ1gtU2tpcC1JbnRlcmNlcHRvcic6ICd0cnVlJyxcclxuICAgICAgJ1gtU2tpcC1BdXRoJzogJ3RydWUnLFxyXG4gICAgICAnWC1UcmFjay1BUEktRGV0YWlscyc6ICd0cnVlJyxcclxuICAgIH07XHJcbiAgICBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ0dFVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXRCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ1BPU1QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdEJ5VXJsKHBheWxvYWQuZnVsbFVybCwgcGF5bG9hZC5ib2R5LCB7IGhlYWRlcnMgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubWV0aG9kID09ICdQVVQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucHV0QnlVcmwocGF5bG9hZC5mdWxsVXJsLCBwYXlsb2FkLmJvZHksIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ0RFTEVURScpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5kZWxldGVCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHsgaGVhZGVycyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBIVFRQIFJlcXVlc3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIERhdGFTb3VyY2VRdWVyeSBuYW1lXHJcbiAgICogQHBhcmFtIFF1ZXJ5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBEYXRhU291cmNlUXVlcnlcclxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBnZW5lcmF0ZWQgSFRUUCByZXF1ZXN0XHJcbiAgICovXHJcbiAgZ2VuZXJhdGVIdHRwUmVxdWVzdChkYXRhU291cmNlUXVlcnlOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXQoXHJcbiAgICAgIGAke0FQSS5HZW5lcmF0ZUh0dHBSZXF1ZXN0fT9kc3FOYW1lPSR7ZGF0YVNvdXJjZVF1ZXJ5TmFtZX1gLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,20 +1,22 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { Injectable, inject } from '@angular/core';
3
- import { DSQHelper } from '../helpers/common/dsq.helpers';
3
+ import { of, throwError } from 'rxjs';
4
+ import { switchMap, map, catchError } from 'rxjs/operators';
4
5
  import { ScreenHelper } from '../helpers/screen/screen.helpers';
5
- import { WhereClauseHelper } from '../helpers/common/where-clause.helpers';
6
- import { RequestResponseHelper } from '../helpers/common/req-res.helpers';
7
- import { getAppObject, getDataFromDataSourceQueryID, syncAppObjectFields } from '../utils/tab-app.util';
8
- import { getPrimaryKeyFields, removeMultiplePrimaryKey, removePrimaryKey } from '../utils/req-res.util';
9
- import { createDynamicData, removeBlankValue } from '../utils/json.util';
10
- import { QueryType } from '../enums/query.enum';
6
+ import { MetadataHelper } from '../helpers/common/meta-data.helpers';
7
+ import { syncAppObjectFields } from '../utils/tab-app.util';
8
+ import { getPrimaryKeyFields, removeMultiplePrimaryKey, removePrimaryKey, getHeaders } from '../utils/req-res.util';
9
+ import { removeBlankValue, createDynamicData } from '../utils/json.util';
10
+ import { ApiService } from '../../core/http-client/api.service';
11
+ import { SignalRService } from '../../core/service/signalr/signalr.service';
12
+ import { API, APIServices } from '../constants/api-constants';
11
13
  import * as i0 from "@angular/core";
12
14
  export class TabInsertService {
13
15
  constructor() {
14
- this.dsqHelper = inject(DSQHelper);
15
16
  this.screenHelper = inject(ScreenHelper);
16
- this.whereClauseHelper = inject(WhereClauseHelper);
17
- this.requestResponseHelper = inject(RequestResponseHelper);
17
+ this.apiService = inject(ApiService);
18
+ this.signalRService = inject(SignalRService);
19
+ this.metadataHelper = inject(MetadataHelper);
18
20
  }
19
21
  /**
20
22
  * Inserts data by screen ID.
@@ -24,28 +26,28 @@ export class TabInsertService {
24
26
  */
25
27
  insertByScreenId(screenId, data) {
26
28
  const screen = this.screenHelper.getScreen(screenId);
27
- const screenDataSource = getDataFromDataSourceQueryID(screen.DataSourceQuery);
28
- return this.insertByObjectId(screenDataSource.ObjectID_Tosave, data);
29
+ const screenDataSource = this.metadataHelper.getDataSourceQueryByIdOrName(screen.DataSourceQuery);
30
+ return this.insertByObjectId(screenDataSource?.ObjectID_Tosave || '', data);
29
31
  }
30
32
  /**
31
- * Inserts data by object ID.
32
- * @param objectId The ID of the object.
33
- * @param data The data to insert.
34
- * @returns An Observable with the insert result.
33
+ * Insert using /records/insert endpoint with SYNC/ASYNC support
34
+ * @param objectId The ID of the object
35
+ * @param data The data to insert
36
+ * @param headers Optional headers
37
+ * @returns Observable with insertedId
35
38
  */
36
39
  insertByObjectId(objectId, data, headers) {
37
- const appObject = getAppObject(objectId);
38
- return this.prepareInsert(appObject, data, headers);
39
- }
40
- /**
41
- * Prepares data for insertion.
42
- * @param appObject The app object.
43
- * @param data The data to insert.
44
- * @returns An Observable with the prepared data.
45
- */
46
- prepareInsert(appObject, data, headers) {
47
- const crudTableName = appObject.SystemDBTableName;
40
+ // Get AppObject metadata
41
+ const appObjectModel = this.metadataHelper.getAppObjectByIdOrName(objectId);
42
+ const appObject = appObjectModel?.toJSON();
43
+ if (!appObjectModel?.ID) {
44
+ return throwError(() => new Error(`AppObject not found: ${objectId}`));
45
+ }
46
+ // Get entity name (table name)
47
+ const entityName = appObjectModel.SystemDBTableName;
48
+ // Sync and filter data
48
49
  syncAppObjectFields(data.data, appObject);
50
+ // Remove primary keys
49
51
  const PrimaryKeyFields = getPrimaryKeyFields(appObject);
50
52
  if (PrimaryKeyFields && PrimaryKeyFields.length === 1) {
51
53
  removePrimaryKey(data.data, PrimaryKeyFields[0]?.FieldName);
@@ -53,19 +55,68 @@ export class TabInsertService {
53
55
  else if (PrimaryKeyFields && PrimaryKeyFields.length > 1) {
54
56
  removeMultiplePrimaryKey(data.data, PrimaryKeyFields);
55
57
  }
56
- const whereClause = this.whereClauseHelper.bindWhereClauseForInsert();
57
- const dataObj = createDynamicData(data.data);
58
- removeBlankValue(dataObj);
59
- const requestPayload = this.requestResponseHelper.insertPayload(crudTableName, whereClause, dataObj);
60
- return this.insert(requestPayload, headers);
58
+ // Remove blank values
59
+ const filteredData = { ...data.data };
60
+ removeBlankValue(filteredData);
61
+ // Transform to new API format using createDynamicData utility
62
+ const requestBody = {
63
+ entityName: entityName,
64
+ fields: createDynamicData(filteredData)
65
+ };
66
+ const header = getHeaders(headers);
67
+ // POST to new endpoint
68
+ return this.apiService.postToService(APIServices.crudService, API.recordsInsert, requestBody, header).pipe(switchMap((response) => {
69
+ if (!response?.IsSuccess) {
70
+ console.error('[TabInsertService] Insert failed:', response?.Errors);
71
+ return of(response);
72
+ }
73
+ // CASE 1: SYNC - Has insertedId immediately
74
+ if (response?.Result?.length) {
75
+ return of({
76
+ ...response,
77
+ Result: response.Result
78
+ });
79
+ }
80
+ // CASE 2: ASYNC - Has correlationId
81
+ else if (response?.CorrelationId) {
82
+ return this.handleAsyncInsert(response);
83
+ }
84
+ // CASE 3: Unknown response format
85
+ return of(response);
86
+ }), catchError((error) => {
87
+ console.error('[TabInsertService] Insert error:', error);
88
+ return throwError(() => error);
89
+ }));
61
90
  }
62
91
  /**
63
- * Inserts data.
64
- * @param data The data to insert.
65
- * @returns An Observable with the insert result.
92
+ * Handle async insert - wait for SignalR notification
93
+ * @param response Initial response with correlationId
94
+ * @returns Observable with insertedId from SignalR notification
66
95
  */
67
- insert(data, headers) {
68
- return this.dsqHelper.executeQuery(data, QueryType.Insert, headers);
96
+ handleAsyncInsert(response) {
97
+ const correlationId = response?.CorrelationId;
98
+ if (!correlationId) {
99
+ console.error('[TabInsertService] Missing correlationId in async response');
100
+ return of(response);
101
+ }
102
+ // Wait for SignalR notification with matching correlationId
103
+ return this.signalRService.waitForOperation(correlationId).pipe(map((notification) => {
104
+ // Check if operation succeeded
105
+ if (!notification.isSuccess) {
106
+ throw new Error(notification.errorMessage || 'Insert operation failed');
107
+ }
108
+ // Return response with insertedId from notification (match old API format)
109
+ return {
110
+ ...response,
111
+ Result: notification.recordId, // Just the ID string
112
+ RecordAffectted: notification.affectedRecords || 1
113
+ };
114
+ }), catchError((error) => {
115
+ if (error.message === 'Operation timed out') {
116
+ return throwError(() => new Error('Insert operation timed out. The operation may still complete in the background. Please refresh to see the result.'));
117
+ }
118
+ return throwError(() => error);
119
+ }));
69
120
  }
70
121
  static { this.ɵfac = function TabInsertService_Factory(t) { return new (t || TabInsertService)(); }; }
71
122
  static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TabInsertService, factory: TabInsertService.ɵfac, providedIn: 'root' }); }
@@ -74,4 +125,4 @@ export class TabInsertService {
74
125
  type: Injectable,
75
126
  args: [{ providedIn: 'root' }]
76
127
  }], null, null); })();
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWluc2VydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWluc2VydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsNEJBQTRCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBSWhELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QywwQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQXVEeEU7SUFyREM7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLElBQVM7UUFDMUMsTUFBTSxNQUFNLEdBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBUyxFQUFFLE9BQWE7UUFDekQsTUFBTSxTQUFTLEdBQWMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxTQUFvQixFQUFFLElBQVMsRUFBRyxPQUFhO1FBQzNELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNsRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0Qsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBc0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDekYsTUFBTSxPQUFPLEdBQVEsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLElBQVMsRUFBRyxPQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztpRkExRFUsZ0JBQWdCO3VFQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCLG1CQURILE1BQU07O2lGQUNuQixnQkFBZ0I7Y0FENUIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERTUUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL2RzcS5oZWxwZXJzJztcclxuaW1wb3J0IHsgU2NyZWVuSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zY3JlZW4vc2NyZWVuLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBXaGVyZUNsYXVzZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL3doZXJlLWNsYXVzZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgUmVxdWVzdFJlc3BvbnNlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb21tb24vcmVxLXJlcy5oZWxwZXJzJztcclxuaW1wb3J0IHsgZ2V0QXBwT2JqZWN0LCBnZXREYXRhRnJvbURhdGFTb3VyY2VRdWVyeUlELCBzeW5jQXBwT2JqZWN0RmllbGRzIH0gZnJvbSAnLi4vdXRpbHMvdGFiLWFwcC51dGlsJztcclxuaW1wb3J0IHsgQXBwT2JqZWN0LCBBcHBTY3JlZW4gfSBmcm9tICcuLi9tb2RlbHMvYXBwLW9iamVjdC5jbGFzcyc7XHJcbmltcG9ydCB7IGdldFByaW1hcnlLZXlGaWVsZHMsIHJlbW92ZU11bHRpcGxlUHJpbWFyeUtleSwgcmVtb3ZlUHJpbWFyeUtleSB9IGZyb20gJy4uL3V0aWxzL3JlcS1yZXMudXRpbCc7XHJcbmltcG9ydCB7IEFQSUZpbHRlckNyaXRlcmlhIH0gZnJvbSAnLi4vbW9kZWxzL2FwaS1xdWVyeS5jbGFzcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNEYXRhLCByZW1vdmVCbGFua1ZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvanNvbi51dGlsJztcclxuaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vZW51bXMvcXVlcnkuZW51bSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkluc2VydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHNxSGVscGVyID0gaW5qZWN0KERTUUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JlZW5IZWxwZXIgPSBpbmplY3QoU2NyZWVuSGVscGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdoZXJlQ2xhdXNlSGVscGVyID0gaW5qZWN0KFdoZXJlQ2xhdXNlSGVscGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RSZXNwb25zZUhlbHBlciA9IGluamVjdChSZXF1ZXN0UmVzcG9uc2VIZWxwZXIpO1xyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnRzIGRhdGEgYnkgc2NyZWVuIElELlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCBUaGUgSUQgb2YgdGhlIHNjcmVlbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbnNlcnQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSBpbnNlcnQgcmVzdWx0LlxyXG4gICAqL1xyXG4gIGluc2VydEJ5U2NyZWVuSWQoc2NyZWVuSWQ6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBzY3JlZW46IEFwcFNjcmVlbiA9IHRoaXMuc2NyZWVuSGVscGVyLmdldFNjcmVlbihzY3JlZW5JZCk7XHJcbiAgICBjb25zdCBzY3JlZW5EYXRhU291cmNlID0gZ2V0RGF0YUZyb21EYXRhU291cmNlUXVlcnlJRChzY3JlZW4uRGF0YVNvdXJjZVF1ZXJ5KTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEJ5T2JqZWN0SWQoc2NyZWVuRGF0YVNvdXJjZS5PYmplY3RJRF9Ub3NhdmUsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyBkYXRhIGJ5IG9iamVjdCBJRC5cclxuICAgKiBAcGFyYW0gb2JqZWN0SWQgVGhlIElEIG9mIHRoZSBvYmplY3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5zZXJ0LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgaW5zZXJ0IHJlc3VsdC5cclxuICAgKi9cclxuICBpbnNlcnRCeU9iamVjdElkKG9iamVjdElkOiBzdHJpbmcsIGRhdGE6IGFueSwgaGVhZGVycz86IGFueSkge1xyXG4gICAgY29uc3QgYXBwT2JqZWN0OiBBcHBPYmplY3QgPSBnZXRBcHBPYmplY3Qob2JqZWN0SWQpO1xyXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZUluc2VydChhcHBPYmplY3QsIGRhdGEgLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXBhcmVzIGRhdGEgZm9yIGluc2VydGlvbi5cclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0IFRoZSBhcHAgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluc2VydC5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHdpdGggdGhlIHByZXBhcmVkIGRhdGEuXHJcbiAgICovXHJcbiAgcHJlcGFyZUluc2VydChhcHBPYmplY3Q6IEFwcE9iamVjdCwgZGF0YTogYW55ICwgaGVhZGVycz86IGFueSkge1xyXG4gICAgY29uc3QgY3J1ZFRhYmxlTmFtZSA9IGFwcE9iamVjdC5TeXN0ZW1EQlRhYmxlTmFtZTtcclxuICAgIHN5bmNBcHBPYmplY3RGaWVsZHMoZGF0YS5kYXRhLCBhcHBPYmplY3QpO1xyXG4gICAgY29uc3QgUHJpbWFyeUtleUZpZWxkcyA9IGdldFByaW1hcnlLZXlGaWVsZHMoYXBwT2JqZWN0KTtcclxuICAgIGlmIChQcmltYXJ5S2V5RmllbGRzICYmIFByaW1hcnlLZXlGaWVsZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJlbW92ZVByaW1hcnlLZXkoZGF0YS5kYXRhLCBQcmltYXJ5S2V5RmllbGRzWzBdPy5GaWVsZE5hbWUpO1xyXG4gICAgfSBlbHNlIGlmIChQcmltYXJ5S2V5RmllbGRzICYmIFByaW1hcnlLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICByZW1vdmVNdWx0aXBsZVByaW1hcnlLZXkoZGF0YS5kYXRhLCBQcmltYXJ5S2V5RmllbGRzKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBBUElGaWx0ZXJDcml0ZXJpYSA9IHRoaXMud2hlcmVDbGF1c2VIZWxwZXIuYmluZFdoZXJlQ2xhdXNlRm9ySW5zZXJ0KCk7XHJcbiAgICBjb25zdCBkYXRhT2JqOiBhbnkgPSBjcmVhdGVEeW5hbWljRGF0YShkYXRhLmRhdGEpO1xyXG4gICAgcmVtb3ZlQmxhbmtWYWx1ZShkYXRhT2JqKTtcclxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gdGhpcy5yZXF1ZXN0UmVzcG9uc2VIZWxwZXIuaW5zZXJ0UGF5bG9hZChjcnVkVGFibGVOYW1lLCB3aGVyZUNsYXVzZSwgZGF0YU9iaik7XHJcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQocmVxdWVzdFBheWxvYWQgLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgZGF0YS5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbnNlcnQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSBpbnNlcnQgcmVzdWx0LlxyXG4gICAqL1xyXG4gIGluc2VydChkYXRhOiBhbnkgLCBoZWFkZXJzPzogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kc3FIZWxwZXIuZXhlY3V0ZVF1ZXJ5KGRhdGEsIFF1ZXJ5VHlwZS5JbnNlcnQsIGhlYWRlcnMpO1xyXG4gIH1cclxufVxyXG4iXX0=
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWluc2VydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWluc2VydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBSzlELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxtQkFB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TSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUscUJBQXFCO2dCQUNwRCxlQUFlLEVBQUUsWUFBWSxDQUFDLGVBQWUsSUFBSSxDQUFDO2FBQ25ELENBQUM7UUFDSixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQy9CLG1IQUFtSCxDQUNwSCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7aUZBcklVLGdCQUFnQjt1RUFBaEIsZ0JBQWdCLFdBQWhCLGdCQUFnQixtQkFESCxNQUFNOztpRkFDbkIsZ0JBQWdCO2NBRDVCLFVBQVU7ZUFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2NyZWVuSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zY3JlZW4vc2NyZWVuLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL21ldGEtZGF0YS5oZWxwZXJzJztcclxuaW1wb3J0IHsgc3luY0FwcE9iamVjdEZpZWxkcyB9IGZyb20gJy4uL3V0aWxzL3RhYi1hcHAudXRpbCc7XHJcbmltcG9ydCB7IEFwcE9iamVjdCwgQXBwU2NyZWVuIH0gZnJvbSAnLi4vbW9kZWxzL2FwcC1vYmplY3QuY2xhc3MnO1xyXG5pbXBvcnQgeyBnZXRQcmltYXJ5S2V5RmllbGRzLCByZW1vdmVNdWx0aXBsZVByaW1hcnlLZXksIHJlbW92ZVByaW1hcnlLZXksIGdldEhlYWRlcnMgfSBmcm9tICcuLi91dGlscy9yZXEtcmVzLnV0aWwnO1xyXG5pbXBvcnQgeyByZW1vdmVCbGFua1ZhbHVlLCBjcmVhdGVEeW5hbWljRGF0YSB9IGZyb20gJy4uL3V0aWxzL2pzb24udXRpbCc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2Uvc2lnbmFsci9zaWduYWxyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBUEksIEFQSVNlcnZpY2VzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29tbW9uLmludGVyZmFjZSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkluc2VydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyZWVuSGVscGVyID0gaW5qZWN0KFNjcmVlbkhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsUlNlcnZpY2UgPSBpbmplY3QoU2lnbmFsUlNlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGFIZWxwZXIgPSBpbmplY3QoTWV0YWRhdGFIZWxwZXIpO1xyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnRzIGRhdGEgYnkgc2NyZWVuIElELlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCBUaGUgSUQgb2YgdGhlIHNjcmVlbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbnNlcnQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSBpbnNlcnQgcmVzdWx0LlxyXG4gICAqL1xyXG4gIGluc2VydEJ5U2NyZWVuSWQoc2NyZWVuSWQ6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBzY3JlZW46IEFwcFNjcmVlbiA9IHRoaXMuc2NyZWVuSGVscGVyLmdldFNjcmVlbihzY3JlZW5JZCk7XHJcbiAgICBjb25zdCBzY3JlZW5EYXRhU291cmNlID0gdGhpcy5tZXRhZGF0YUhlbHBlci5nZXREYXRhU291cmNlUXVlcnlCeUlkT3JOYW1lKHNjcmVlbi5EYXRhU291cmNlUXVlcnkpO1xyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnlPYmplY3RJZChzY3JlZW5EYXRhU291cmNlPy5PYmplY3RJRF9Ub3NhdmUgfHwgJycsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0IHVzaW5nIC9yZWNvcmRzL2luc2VydCBlbmRwb2ludCB3aXRoIFNZTkMvQVNZTkMgc3VwcG9ydFxyXG4gICAqIEBwYXJhbSBvYmplY3RJZCBUaGUgSUQgb2YgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluc2VydFxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnNcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHdpdGggaW5zZXJ0ZWRJZFxyXG4gICAqL1xyXG4gIGluc2VydEJ5T2JqZWN0SWQob2JqZWN0SWQ6IHN0cmluZywgZGF0YTogYW55LCBoZWFkZXJzPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgLy8gR2V0IEFwcE9iamVjdCBtZXRhZGF0YVxyXG4gICAgY29uc3QgYXBwT2JqZWN0TW9kZWwgPSB0aGlzLm1ldGFkYXRhSGVscGVyLmdldEFwcE9iamVjdEJ5SWRPck5hbWUob2JqZWN0SWQpO1xyXG4gICAgY29uc3QgYXBwT2JqZWN0OiBBcHBPYmplY3QgPSBhcHBPYmplY3RNb2RlbD8udG9KU09OKCk7XHJcblxyXG4gICAgaWYgKCFhcHBPYmplY3RNb2RlbD8uSUQpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBBcHBPYmplY3Qgbm90IGZvdW5kOiAke29iamVjdElkfWApKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgZW50aXR5IG5hbWUgKHRhYmxlIG5hbWUpXHJcbiAgICBjb25zdCBlbnRpdHlOYW1lID0gYXBwT2JqZWN0TW9kZWwuU3lzdGVtREJUYWJsZU5hbWU7XHJcblxyXG4gICAgLy8gU3luYyBhbmQgZmlsdGVyIGRhdGFcclxuICAgIHN5bmNBcHBPYmplY3RGaWVsZHMoZGF0YS5kYXRhLCBhcHBPYmplY3QpO1xyXG5cclxuICAgIC8vIFJlbW92ZSBwcmltYXJ5IGtleXNcclxuICAgIGNvbnN0IFByaW1hcnlLZXlGaWVsZHMgPSBnZXRQcmltYXJ5S2V5RmllbGRzKGFwcE9iamVjdCk7XHJcbiAgICBpZiAoUHJpbWFyeUtleUZpZWxkcyAmJiBQcmltYXJ5S2V5RmllbGRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZW1vdmVQcmltYXJ5S2V5KGRhdGEuZGF0YSwgUHJpbWFyeUtleUZpZWxkc1swXT8uRmllbGROYW1lKTtcclxuICAgIH0gZWxzZSBpZiAoUHJpbWFyeUtleUZpZWxkcyAmJiBQcmltYXJ5S2V5RmllbGRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgcmVtb3ZlTXVsdGlwbGVQcmltYXJ5S2V5KGRhdGEuZGF0YSwgUHJpbWFyeUtleUZpZWxkcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGJsYW5rIHZhbHVlc1xyXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0geyAuLi5kYXRhLmRhdGEgfTtcclxuICAgIHJlbW92ZUJsYW5rVmFsdWUoZmlsdGVyZWREYXRhKTtcclxuXHJcbiAgICAvLyBUcmFuc2Zvcm0gdG8gbmV3IEFQSSBmb3JtYXQgdXNpbmcgY3JlYXRlRHluYW1pY0RhdGEgdXRpbGl0eVxyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgIGVudGl0eU5hbWU6IGVudGl0eU5hbWUsXHJcbiAgICAgIGZpZWxkczogY3JlYXRlRHluYW1pY0RhdGEoZmlsdGVyZWREYXRhKVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJzKGhlYWRlcnMpO1xyXG5cclxuICAgIC8vIFBPU1QgdG8gbmV3IGVuZHBvaW50XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3RUb1NlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLmNydWRTZXJ2aWNlLFxyXG4gICAgICBBUEkucmVjb3Jkc0luc2VydCxcclxuICAgICAgcmVxdWVzdEJvZHksXHJcbiAgICAgIGhlYWRlclxyXG4gICAgKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2U/LklzU3VjY2Vzcykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RhYkluc2VydFNlcnZpY2VdIEluc2VydCBmYWlsZWQ6JywgcmVzcG9uc2U/LkVycm9ycyk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAxOiBTWU5DIC0gSGFzIGluc2VydGVkSWQgaW1tZWRpYXRlbHlcclxuICAgICAgICBpZiAocmVzcG9uc2U/LlJlc3VsdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoe1xyXG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcclxuICAgICAgICAgICAgUmVzdWx0OiByZXNwb25zZS5SZXN1bHRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAyOiBBU1lOQyAtIEhhcyBjb3JyZWxhdGlvbklkXHJcbiAgICAgICAgZWxzZSBpZiAocmVzcG9uc2U/LkNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFzeW5jSW5zZXJ0KHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMzogVW5rbm93biByZXNwb25zZSBmb3JtYXRcclxuICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFiSW5zZXJ0U2VydmljZV0gSW5zZXJ0IGVycm9yOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGFzeW5jIGluc2VydCAtIHdhaXQgZm9yIFNpZ25hbFIgbm90aWZpY2F0aW9uXHJcbiAgICogQHBhcmFtIHJlc3BvbnNlIEluaXRpYWwgcmVzcG9uc2Ugd2l0aCBjb3JyZWxhdGlvbklkXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSB3aXRoIGluc2VydGVkSWQgZnJvbSBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlQXN5bmNJbnNlcnQocmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJlc3BvbnNlPy5Db3JyZWxhdGlvbklkO1xyXG5cclxuICAgIGlmICghY29ycmVsYXRpb25JZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbVGFiSW5zZXJ0U2VydmljZV0gTWlzc2luZyBjb3JyZWxhdGlvbklkIGluIGFzeW5jIHJlc3BvbnNlJyk7XHJcbiAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb24gd2l0aCBtYXRjaGluZyBjb3JyZWxhdGlvbklkXHJcbiAgICByZXR1cm4gdGhpcy5zaWduYWxSU2VydmljZS53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQpLnBpcGUoXHJcbiAgICAgIG1hcCgobm90aWZpY2F0aW9uKSA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgb3BlcmF0aW9uIHN1Y2NlZWRlZFxyXG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmlzU3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5vdGlmaWNhdGlvbi5lcnJvck1lc3NhZ2UgfHwgJ0luc2VydCBvcGVyYXRpb24gZmFpbGVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXR1cm4gcmVzcG9uc2Ugd2l0aCBpbnNlcnRlZElkIGZyb20gbm90aWZpY2F0aW9uIChtYXRjaCBvbGQgQVBJIGZvcm1hdClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4ucmVzcG9uc2UsXHJcbiAgICAgICAgICBSZXN1bHQ6IG5vdGlmaWNhdGlvbi5yZWNvcmRJZCwgLy8gSnVzdCB0aGUgSUQgc3RyaW5nXHJcbiAgICAgICAgICBSZWNvcmRBZmZlY3R0ZWQ6IG5vdGlmaWNhdGlvbi5hZmZlY3RlZFJlY29yZHMgfHwgMVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnT3BlcmF0aW9uIHRpbWVkIG91dCcpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgJ0luc2VydCBvcGVyYXRpb24gdGltZWQgb3V0LiBUaGUgb3BlcmF0aW9uIG1heSBzdGlsbCBjb21wbGV0ZSBpbiB0aGUgYmFja2dyb3VuZC4gUGxlYXNlIHJlZnJlc2ggdG8gc2VlIHRoZSByZXN1bHQuJ1xyXG4gICAgICAgICAgKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59Il19