client-core-services 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,875 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../common-utils/common-function.service";
4
+ import * as i2 from "../../common-utils/core-function/core-function.service";
5
+ import * as i3 from "../../fileHandler/file-handler.service";
6
+ import * as i4 from "../../check-if/check-if.service";
7
+ import * as i5 from "../../storage/storage.service";
8
+ import * as i6 from "@angular/common";
9
+ import * as i7 from "../../data-share/data-share.service";
10
+ import * as i8 from "../../api/api-call/api-call.service";
11
+ import * as i9 from "../../api/api.service";
12
+ export class GridCommonFunctionService {
13
+ constructor(CommonFunctionService, coreFunctionService, fileHandlerService, checkIfService, storageService, datePipe, CurrencyPipe, dataShareService, apiCallService, apiService) {
14
+ this.CommonFunctionService = CommonFunctionService;
15
+ this.coreFunctionService = coreFunctionService;
16
+ this.fileHandlerService = fileHandlerService;
17
+ this.checkIfService = checkIfService;
18
+ this.storageService = storageService;
19
+ this.datePipe = datePipe;
20
+ this.CurrencyPipe = CurrencyPipe;
21
+ this.dataShareService = dataShareService;
22
+ this.apiCallService = apiCallService;
23
+ this.apiService = apiService;
24
+ }
25
+ modifyGridData(gridData, gridColumns, field, editableGridColumns, typographyCrList) {
26
+ let modifiedData = [];
27
+ if (gridColumns.length > 0) {
28
+ for (let i = 0; i < gridData.length; i++) {
29
+ const row = gridData[i];
30
+ let modifyRow = this.rowModify(row, field, gridColumns, editableGridColumns, typographyCrList);
31
+ modifiedData.push(modifyRow);
32
+ }
33
+ }
34
+ return modifiedData;
35
+ }
36
+ rowModify(row, field, gridColumns, editableGridColumns, typographyCrList) {
37
+ let modifyRow = JSON.parse(JSON.stringify(row));
38
+ modifyRow["disabled"] = this.checkIfService.checkRowIf(row, field);
39
+ for (let j = 0; j < gridColumns.length; j++) {
40
+ const column = gridColumns[j];
41
+ if (!column.editable || editableGridColumns.length == 0) {
42
+ modifyRow[column.field_name] = this.getValueForGrid(column, row);
43
+ }
44
+ modifyRow[column.field_name + "_tooltip"] = this.getValueForGridTooltip(column, row);
45
+ if (column.editable) {
46
+ modifyRow[column.field_name + "_disabled"] = this.checkIfService.isDisableRow(column, row);
47
+ if (column.type == 'file' && editableGridColumns.length > 0) {
48
+ if (row && row[column.field_name] && this.CommonFunctionService.isArray(row[column.field_name]) && row[column.field_name].length > 0) {
49
+ modifyRow[column.field_name] = this.fileHandlerService.modifyUploadFiles(row[column.field_name]);
50
+ }
51
+ else {
52
+ modifyRow[column.field_name] = row[column.field_name];
53
+ }
54
+ }
55
+ }
56
+ }
57
+ if (editableGridColumns && (editableGridColumns.length == 1 || (field && !field.grid_row_selection) || row.selected)) {
58
+ modifyRow["column_edit"] = true;
59
+ }
60
+ else {
61
+ modifyRow["column_edit"] = false;
62
+ }
63
+ if (editableGridColumns && editableGridColumns.length == 0 && field && Object.keys(field).length > 0) {
64
+ modifyRow['actionBtnDisplay'] = this.checkRowDisabledIf(field, row);
65
+ }
66
+ if (typographyCrList && typographyCrList.length > 0) {
67
+ modifyRow['background-color'] = this.checkTypgraphCondition(typographyCrList, row, 'background-color');
68
+ }
69
+ return modifyRow;
70
+ }
71
+ getListByKeyValueToList(list, key, value) {
72
+ let getlist = [];
73
+ for (let i = 0; i < list.length; i++) {
74
+ const element = list[i];
75
+ if (element && element[key] == value) {
76
+ getlist.push(element);
77
+ }
78
+ }
79
+ return getlist;
80
+ }
81
+ modifyGridColumns(gridColumns, parentObject) {
82
+ let modifyGridColumns = [];
83
+ if (gridColumns && gridColumns.length > 0) {
84
+ modifyGridColumns = this.CommonFunctionService.updateFieldInList('display', gridColumns);
85
+ for (let i = 0; i < modifyGridColumns.length; i++) {
86
+ const field = modifyGridColumns[i];
87
+ if (this.coreFunctionService.isNotBlank(field.show_if)) {
88
+ if (!this.checkIfService.showIf(field, parentObject)) {
89
+ field['display'] = false;
90
+ field['show'] = true;
91
+ }
92
+ else {
93
+ if (field.hide != undefined && field.hide) {
94
+ field['display'] = false;
95
+ }
96
+ else {
97
+ field['display'] = true;
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ if (field && field.hide) {
103
+ field['display'] = false;
104
+ }
105
+ else {
106
+ field['display'] = true;
107
+ }
108
+ }
109
+ if (field['field_class']) {
110
+ field['field_class'] = field['field_class'].trim();
111
+ }
112
+ field['width'] = this.getGridColumnWidth(field, gridColumns);
113
+ if (field && field.type && field.type != '') {
114
+ switch (field.type.toLowerCase()) {
115
+ case "info":
116
+ case "html":
117
+ case "file":
118
+ case "template":
119
+ case "image":
120
+ case "icon":
121
+ case "download_file":
122
+ case "redirect":
123
+ case "color":
124
+ field['hideCopy'] = true;
125
+ break;
126
+ default:
127
+ break;
128
+ }
129
+ }
130
+ }
131
+ ;
132
+ }
133
+ return modifyGridColumns;
134
+ }
135
+ getGridColumnWidth(column, listOfGridFieldName) {
136
+ if (column.width && column.width != '0') {
137
+ return column.width;
138
+ }
139
+ // else {
140
+ // if (listOfGridFieldName.length > 8) {
141
+ // return '150px';
142
+ // }
143
+ else {
144
+ return '';
145
+ }
146
+ // }
147
+ }
148
+ updateGridDataToModifiedData(grid_row_selection, gridData, modifiedGridData, listOfGridFieldName) {
149
+ let gridSelectedData = [];
150
+ let modifiedSelectedData = [];
151
+ if (grid_row_selection == false) {
152
+ gridSelectedData = [...gridData];
153
+ modifiedSelectedData = [...modifiedGridData];
154
+ }
155
+ else {
156
+ gridSelectedData = this.getListByKeyValueToList(gridData, "selected", true);
157
+ modifiedSelectedData = this.getListByKeyValueToList(modifiedGridData, "selected", true);
158
+ }
159
+ if (listOfGridFieldName.length > 0) {
160
+ gridSelectedData.forEach((data, i) => {
161
+ listOfGridFieldName.forEach((column) => {
162
+ if (column.editable || column.type == 'number') {
163
+ switch (column.type) {
164
+ case 'file':
165
+ gridSelectedData[i][column.field_name] = this.fileHandlerService.modifyUploadFiles(modifiedSelectedData[i][column.field_name]);
166
+ break;
167
+ default:
168
+ gridSelectedData[i][column.field_name] = modifiedSelectedData[i][column.field_name];
169
+ break;
170
+ }
171
+ }
172
+ });
173
+ });
174
+ }
175
+ return gridSelectedData;
176
+ }
177
+ applyOnGridFilter(field) {
178
+ if (field && field.etc_fields && field.etc_fields.on_grid_filter === 'false') {
179
+ return false;
180
+ }
181
+ return true;
182
+ }
183
+ applyOnGridFilterLabel(field) {
184
+ if (field && field.etc_fields && field.etc_fields.on_grid_filter_label != '') {
185
+ return field.etc_fields.on_grid_filter_label;
186
+ }
187
+ return "Search Parameter ...";
188
+ }
189
+ modifyTableFields(tablefields) {
190
+ }
191
+ gridDataModify(modifyData, data, fields, field_name, key, object) {
192
+ let modifyObject = {
193
+ "modifyData": modifyData,
194
+ "fields": fields,
195
+ "field_index": -1
196
+ };
197
+ if (fields && fields.length > 0) {
198
+ for (let i = 0; i < fields.length; i++) {
199
+ const element = fields[i];
200
+ const type = element.type;
201
+ const fieldName = element.field_name;
202
+ if (type && type.startsWith(key) && field_name == fieldName) {
203
+ if (element && fieldName && data && data[fieldName]) {
204
+ const cData = data[fieldName];
205
+ if (Array.isArray(cData) && cData.length > 0) {
206
+ const gridColumns = element.gridColumns;
207
+ let typographyCrList = [];
208
+ if (element['colorCriteria'] && element['colorCriteria'].length > 0) {
209
+ typographyCrList = element['colorCriteria'];
210
+ }
211
+ const modifyList = this.modifyGridData(cData, gridColumns, element, [], typographyCrList);
212
+ modifyData[fieldName] = modifyList;
213
+ element.gridColumns = this.modifyGridColumns(gridColumns, object);
214
+ modifyObject.field_index = i;
215
+ }
216
+ else {
217
+ modifyData[fieldName] = cData;
218
+ }
219
+ }
220
+ }
221
+ else if (type && type.startsWith('list_of_fields') && element.datatype == "list_of_object_with_popup" && field_name == fieldName) {
222
+ if (element && fieldName && data && data[fieldName]) {
223
+ const cData = data[fieldName];
224
+ if (Array.isArray(cData) && cData.length > 0) {
225
+ const gridColumns = element.list_of_fields;
226
+ const modifyList = this.modifyListofFieldsData({}, cData, gridColumns)['data'];
227
+ modifyData[fieldName] = modifyList;
228
+ modifyObject.field_index = i;
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ modifyObject.modifyData = modifyData;
235
+ modifyObject.fields = fields;
236
+ return modifyObject;
237
+ }
238
+ modifyListofFieldsData(parentField, data, fields) {
239
+ let modifyListoffieldObject = {};
240
+ let modifyData = [];
241
+ if (fields && fields.length > 0 && data && data.length > 0) {
242
+ for (let index = 0; index < data.length; index++) {
243
+ const object = data[index];
244
+ const mObject = this.getModifyListOfFieldsObject(parentField, object, fields);
245
+ modifyData.push(mObject);
246
+ }
247
+ modifyListoffieldObject['data'] = modifyData;
248
+ }
249
+ return modifyListoffieldObject;
250
+ }
251
+ getModifyListOfFieldsObject(parentField, object, fields) {
252
+ let mObject = {};
253
+ if (fields && fields.length > 0) {
254
+ for (let index = 0; index < fields.length; index++) {
255
+ const element = fields[index];
256
+ let fieldName = element.field_name;
257
+ mObject[fieldName] = this.showListFieldValue(object, element);
258
+ }
259
+ mObject['actionBtnDisplay'] = this.checkRowDisabledIf(parentField, object);
260
+ }
261
+ return mObject;
262
+ }
263
+ showListFieldValue(listOfField, item) {
264
+ switch (item.type) {
265
+ case "typeahead":
266
+ if (item.datatype == "list_of_object") {
267
+ if (Array.isArray(listOfField[item.field_name]) && listOfField[item.field_name].length > 0 && listOfField[item.field_name] != null && listOfField[item.field_name] != undefined && listOfField[item.field_name] != '') {
268
+ item['hideCopy'] = true;
269
+ return '<i class="fa fa-eye cursor-pointer"></i>';
270
+ }
271
+ else {
272
+ return '-';
273
+ }
274
+ }
275
+ else if (item.datatype == "object") {
276
+ if (item.display_name && item.display_name != "") {
277
+ return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
278
+ }
279
+ else {
280
+ return listOfField[item.field_name];
281
+ }
282
+ }
283
+ else if (item.datatype == "text") {
284
+ if (item.display_name && item.display_name != "") {
285
+ return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
286
+ }
287
+ else {
288
+ return listOfField[item.field_name];
289
+ }
290
+ }
291
+ break;
292
+ case "list_of_string":
293
+ case "list_of_checkbox":
294
+ case "grid_selection":
295
+ case "list_of_fields":
296
+ if (Array.isArray(listOfField[item.field_name]) && listOfField[item.field_name].length > 0 && listOfField[item.field_name] != null && listOfField[item.field_name] != undefined && listOfField[item.field_name] != '') {
297
+ item['hideCopy'] = true;
298
+ if (this.storageService.checkPlatForm() == 'mobile') {
299
+ return '<span class="material-symbols-outlined cursor-pointer">visibility</span>';
300
+ }
301
+ else {
302
+ return '<i class="fa fa-eye cursor-pointer"></i>';
303
+ }
304
+ }
305
+ else {
306
+ return '-';
307
+ }
308
+ case "checkbox":
309
+ let value = false;
310
+ if (item.display_name && item.display_name != "") {
311
+ value = this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
312
+ }
313
+ else {
314
+ value = this.getValueForGrid(item, listOfField);
315
+ }
316
+ return value ? "Yes" : "No";
317
+ default:
318
+ if (item.display_name && item.display_name != "") {
319
+ return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
320
+ }
321
+ else {
322
+ return this.getValueForGrid(item, listOfField);
323
+ }
324
+ }
325
+ }
326
+ checkRowDisabledIf(field, data) {
327
+ if (field && field.disableRowIf && field.disableRowIf != '') {
328
+ const condition = field.disableRowIf;
329
+ if (condition) {
330
+ if (field.disableRowIfOnlySelection) {
331
+ return true;
332
+ }
333
+ else {
334
+ return !this.checkIfService.checkDisableRowIf(condition, data);
335
+ }
336
+ }
337
+ }
338
+ return true;
339
+ }
340
+ checkTypgraphCondition(typographyCrList, object, name) {
341
+ let background = '';
342
+ if (typographyCrList && typographyCrList.length >= 1) {
343
+ let criteriaMatched = false;
344
+ let matchedelement = {};
345
+ for (let index = 0; index < typographyCrList.length; index++) {
346
+ const element = typographyCrList[index];
347
+ let crList = element['crList'];
348
+ let childConditionsMatched = false;
349
+ for (let j = 0; j < crList.length; j++) {
350
+ const child = crList[j];
351
+ let modify = child.replaceAll(';', "#");
352
+ if (!this.checkIfService.checkIfConditionForArrayListValue(modify, object)) {
353
+ childConditionsMatched = false;
354
+ break;
355
+ }
356
+ else {
357
+ childConditionsMatched = true;
358
+ }
359
+ }
360
+ if (childConditionsMatched) {
361
+ matchedelement = typographyCrList[index];
362
+ criteriaMatched = true;
363
+ break;
364
+ }
365
+ else {
366
+ criteriaMatched = false;
367
+ }
368
+ }
369
+ if (criteriaMatched) {
370
+ let typograpy = matchedelement['typoGraphy'];
371
+ let value = '';
372
+ switch (name) {
373
+ case 'background-color':
374
+ value = typograpy['background_color'];
375
+ break;
376
+ default:
377
+ break;
378
+ }
379
+ background = value;
380
+ }
381
+ }
382
+ return background;
383
+ }
384
+ modifiedGridColumns(gridColumns, selectedRow, formValue) {
385
+ if (gridColumns.length > 0) {
386
+ gridColumns.forEach((field) => {
387
+ if (this.coreFunctionService.isNotBlank(field.show_if)) {
388
+ if (!this.checkIfService.checkShowIf(field, selectedRow, formValue)) {
389
+ field['display'] = false;
390
+ }
391
+ else {
392
+ field['display'] = true;
393
+ }
394
+ }
395
+ else {
396
+ field['display'] = true;
397
+ }
398
+ });
399
+ }
400
+ return gridColumns;
401
+ }
402
+ checkGridSelectionMendetory(gridSelectionMendetoryList, selectedRow, formValue, custmizedFormValue) {
403
+ let validation = {
404
+ 'status': true,
405
+ 'msg': ''
406
+ };
407
+ if (gridSelectionMendetoryList && gridSelectionMendetoryList.length > 0) {
408
+ let check = 0;
409
+ gridSelectionMendetoryList.forEach((field) => {
410
+ let data = [];
411
+ if (custmizedFormValue[field.field_name]) {
412
+ data = custmizedFormValue[field.field_name];
413
+ }
414
+ if (field.mendetory_fields && field.mendetory_fields.length > 0) {
415
+ field.mendetory_fields = this.modifiedGridColumns(field.mendetory_fields, selectedRow, formValue);
416
+ if (data && data.length > 0) {
417
+ field.mendetory_fields.forEach((mField) => {
418
+ const fieldName = mField.field_name;
419
+ if (mField.display) {
420
+ data.forEach((row) => {
421
+ if (row && row[fieldName] == undefined || row[fieldName] == '' || row[fieldName] == null) {
422
+ if (validation.msg == '') {
423
+ validation.msg = mField.label + ' of ' + field.label + ' is required.';
424
+ }
425
+ check = 1;
426
+ }
427
+ });
428
+ }
429
+ });
430
+ }
431
+ }
432
+ });
433
+ if (check != 0) {
434
+ validation.status = false;
435
+ return validation;
436
+ }
437
+ else {
438
+ return validation;
439
+ }
440
+ }
441
+ else {
442
+ return validation;
443
+ }
444
+ }
445
+ getGridSelectedData(data, field) {
446
+ let responce = {
447
+ gridSelectedData: [],
448
+ customEntryData: []
449
+ };
450
+ if (data && data.length > 0 && field.add_new_enabled) {
451
+ data.forEach((grid) => {
452
+ if (grid && grid.customEntry) {
453
+ responce.customEntryData[field.field_name].push(grid);
454
+ }
455
+ else {
456
+ responce.gridSelectedData.push(grid);
457
+ }
458
+ });
459
+ }
460
+ else {
461
+ responce.gridSelectedData = data;
462
+ }
463
+ return responce;
464
+ }
465
+ getModifiedGridColumns(gridColumns, object) {
466
+ if (gridColumns.length > 0) {
467
+ gridColumns.forEach((field) => {
468
+ if (this.coreFunctionService.isNotBlank(field.show_if)) {
469
+ if (!this.checkIfService.showIf(field, object)) {
470
+ field['display'] = false;
471
+ }
472
+ else {
473
+ field['display'] = true;
474
+ }
475
+ }
476
+ else {
477
+ field['display'] = true;
478
+ }
479
+ });
480
+ }
481
+ return gridColumns;
482
+ }
483
+ isDate(date) {
484
+ let dateValue = new Date(date);
485
+ return (dateValue !== "Invalid Date") && !isNaN(dateValue);
486
+ }
487
+ getValueForGrid(field, object) {
488
+ let value = '';
489
+ let fieldName = '';
490
+ if (field) {
491
+ if (this.coreFunctionService.isNotBlank(field.display_name)) {
492
+ fieldName = field.display_name;
493
+ }
494
+ else if (this.coreFunctionService.isNotBlank(field.field_name)) {
495
+ fieldName = field.field_name;
496
+ }
497
+ }
498
+ if (fieldName != '') {
499
+ value = this.CommonFunctionService.getObjectValue(fieldName, object);
500
+ }
501
+ if (!field.type)
502
+ field.type = "Text";
503
+ let returnValue = '';
504
+ switch (field.type.toLowerCase()) {
505
+ case 'datetime':
506
+ if (value && value != '') {
507
+ if (this.storageService.checkPlatForm() == 'mobile') {
508
+ returnValue = this.datePipe.transform(value, 'medium');
509
+ }
510
+ else {
511
+ returnValue = this.datePipe.transform(value, 'dd/MM/yyyy h:mm a');
512
+ }
513
+ }
514
+ return returnValue;
515
+ case 'date':
516
+ case 'daterange':
517
+ if (value && value != '') {
518
+ if (this.storageService.checkPlatForm() == 'mobile') {
519
+ returnValue = this.datePipe.transform(value, 'mediumDate');
520
+ }
521
+ else {
522
+ returnValue = this.datePipe.transform(value, 'dd/MM/yyyy');
523
+ }
524
+ }
525
+ return returnValue;
526
+ case 'time': return this.isDate(value) ? this.datePipe.transform(value, 'h:mm a') : value;
527
+ case "boolean": return value ? "Yes" : "No";
528
+ case "currency": return this.CurrencyPipe.transform(value, 'INR');
529
+ case "dropdown": return value && value.name ? value.name : value;
530
+ case "typeahead": return value && value.name ? value.name : value;
531
+ case "info":
532
+ if (value && value != '') {
533
+ if (this.storageService.checkPlatForm() == 'mobile') {
534
+ return '<span class="material-symbols-outlined cursor-pointer">visibility</span>';
535
+ }
536
+ else {
537
+ return '<i class="fa fa-eye cursor-pointer"></i>';
538
+ }
539
+ }
540
+ else {
541
+ return '-';
542
+ }
543
+ case "html":
544
+ if (value && value != '') {
545
+ return '<span class="material-icons cursor-pointer">preview</span>';
546
+ }
547
+ else {
548
+ return '-';
549
+ }
550
+ case "file":
551
+ case "file_with_preview":
552
+ case "file_with_print":
553
+ if (value && value != '') {
554
+ if (this.storageService.checkPlatForm() == 'mobile') {
555
+ return '<span class="material-symbols-outlined cursor-pointer">text_snippet</span>';
556
+ }
557
+ else {
558
+ return '<span class="material-icons cursor-pointer">text_snippet</span>';
559
+ }
560
+ }
561
+ else {
562
+ return '-';
563
+ }
564
+ case "template":
565
+ if (value && value != '') {
566
+ if (this.storageService.checkPlatForm() == 'mobile') {
567
+ return '<span class="material-symbols-outlined">description</span>';
568
+ }
569
+ else {
570
+ return '<i class="fa fa-file cursor-pointer" aria-hidden="true"></i>';
571
+ }
572
+ }
573
+ else {
574
+ return '-';
575
+ }
576
+ case "image":
577
+ return '<img src="data:image/jpg;base64,' + value + '" />';
578
+ case "icon":
579
+ if (this.storageService.checkPlatForm() == 'mobile') {
580
+ return '<span class="material-symbols-outlined cursor-pointer">' + field.field_class + '</span>';
581
+ }
582
+ else {
583
+ return '<span class="material-icons cursor-pointer">' + field.field_class + '</span>';
584
+ }
585
+ case "redirect":
586
+ if (value) {
587
+ if (this.storageService.checkPlatForm() == 'mobile') {
588
+ return '<span class="fa fa-external-link" aria-hidden="true"></span>';
589
+ }
590
+ else {
591
+ return '<i class="fa fa-external-link" aria-hidden="true"></i>';
592
+ }
593
+ }
594
+ else {
595
+ return '-';
596
+ }
597
+ case "download_file":
598
+ if (value && value != '') {
599
+ if (this.storageService.checkPlatForm() == 'mobile') {
600
+ return '<span class="material-symbols-outlined cursor-pointer">' + field.field_class + '</span>';
601
+ }
602
+ else {
603
+ return '<span class="material-icons cursor-pointer">' + field.field_class + '</span>';
604
+ }
605
+ }
606
+ else {
607
+ return '-';
608
+ }
609
+ case "trim_of_string":
610
+ if (value != undefined && value != null && value != '') {
611
+ if (typeof value == 'string') {
612
+ let stringObject = value.split('/');
613
+ if (stringObject.length > 0) {
614
+ return stringObject[0];
615
+ }
616
+ else {
617
+ return value;
618
+ }
619
+ }
620
+ else {
621
+ return value;
622
+ }
623
+ }
624
+ else {
625
+ return value;
626
+ }
627
+ case "color":
628
+ break;
629
+ case "pattern":
630
+ if (object != null) {
631
+ return this.CommonFunctionService.getConvertedString(object, field.field_name);
632
+ }
633
+ break;
634
+ case "chips":
635
+ if (this.coreFunctionService.isNotBlank(value) && this.CommonFunctionService.isArray(value)) {
636
+ let name = "";
637
+ for (let i = 0; i < value.length; i++) {
638
+ if (this.coreFunctionService.isNotBlank(value[i]['name'])) {
639
+ name = name + ', ' + value[i]['name'];
640
+ }
641
+ else {
642
+ name = name + ', ' + value[i];
643
+ }
644
+ }
645
+ return name.substring(2);
646
+ ;
647
+ }
648
+ return "-";
649
+ case "reference_names":
650
+ if (this.coreFunctionService.isNotBlank(value) && this.CommonFunctionService.isArray(value)) {
651
+ let name = '';
652
+ for (let i = 0; i < value.length; i++) {
653
+ if (this.coreFunctionService.isNotBlank(value[i]['name'])) {
654
+ name = name + ', ' + value[i]['name'];
655
+ }
656
+ }
657
+ if (name.length > 1) {
658
+ name = name.substring(2);
659
+ }
660
+ return name;
661
+ }
662
+ else {
663
+ return "-";
664
+ }
665
+ default: return value;
666
+ }
667
+ }
668
+ getValueForGridTooltip(field, object) {
669
+ let value = '';
670
+ if (field.field_name != undefined && field.field_name != null && field.field_name != '') {
671
+ value = this.CommonFunctionService.getObjectValue(field.field_name, object);
672
+ }
673
+ if (!field.type)
674
+ field.type = "Text";
675
+ switch (field.type.toLowerCase()) {
676
+ case 'datetime': return this.datePipe.transform(value, 'dd/MM/yyyy h:mm a');
677
+ case 'date': return this.datePipe.transform(value, 'dd/MM/yyyy');
678
+ case 'time': return this.isDate(value) ? this.datePipe.transform(value, 'h:mm a') : value;
679
+ case "boolean": return value ? "Yes" : "No";
680
+ case "currency": return this.CurrencyPipe.transform(value, 'INR');
681
+ case "info":
682
+ case "file":
683
+ case "template":
684
+ case "image":
685
+ case "icon":
686
+ case "html":
687
+ return '';
688
+ default: return value;
689
+ }
690
+ }
691
+ getNoOfItems(grid, defaultNoOfItem) {
692
+ if (grid && grid.details && grid.details.numberOfItems) {
693
+ defaultNoOfItem = grid.details.numberOfItems;
694
+ }
695
+ return defaultNoOfItem;
696
+ }
697
+ setOldTabCount(tab) {
698
+ let dataCount = {};
699
+ let count = {};
700
+ let totalDataCount = {};
701
+ const currentTabName = this.storageService.GetActiveMenu()['name'];
702
+ const key = currentTabName + "_" + tab.name;
703
+ totalDataCount = this.dataShareService.getGridCountData();
704
+ let oldDataSize = totalDataCount[key];
705
+ count[key] = oldDataSize;
706
+ dataCount['count'] = count;
707
+ dataCount['gridCountData'] = totalDataCount;
708
+ this.dataShareService.shareGridCountData(dataCount);
709
+ }
710
+ compareAuditHistoryData(formFieldsData, currentObjectData, previousObjectData) {
711
+ let formFields = formFieldsData;
712
+ let currentObj = {};
713
+ let previousObject = {};
714
+ for (let i = 0; i < formFields.length; i++) {
715
+ let field = formFields[i];
716
+ let isChanged = false;
717
+ if (field && field.field_name) {
718
+ currentObj = currentObjectData[field.field_name];
719
+ previousObject = previousObjectData[field.field_name];
720
+ if (currentObj != null && currentObj != undefined && typeof currentObj == 'object') {
721
+ currentObj = currentObjectData[field.field_name].name;
722
+ previousObject = previousObjectData[field.field_name].name;
723
+ if (currentObj != previousObject) {
724
+ isChanged = true;
725
+ }
726
+ }
727
+ else {
728
+ if (currentObj != previousObject) {
729
+ isChanged = true;
730
+ }
731
+ }
732
+ field['isChanged'] = isChanged;
733
+ formFieldsData[i] = field;
734
+ }
735
+ }
736
+ }
737
+ copmareListOfFields(fields, currentObjectData, previousObjectData) {
738
+ let currentData = currentObjectData[fields.field_name];
739
+ let previousData = previousObjectData[fields.field_name];
740
+ let currentObj;
741
+ let previousObject;
742
+ if (currentObjectData[fields.field_name] && currentObjectData[fields.field_name].length > 0) {
743
+ for (let i = 0; i < fields.list_of_fields.length; i++) {
744
+ let isChanged = false;
745
+ const field = fields.list_of_fields[i];
746
+ for (let j = 0; j < currentData.length; j++) {
747
+ let comparecurrentObj = currentData[j];
748
+ comparecurrentObj = comparecurrentObj[field.field_name];
749
+ let comparepreviousObject = previousData[j];
750
+ comparepreviousObject = comparepreviousObject[field.field_name];
751
+ if (comparecurrentObj != null && comparecurrentObj != undefined && typeof comparecurrentObj == 'object') {
752
+ currentObj = comparecurrentObj[field.field_name].name;
753
+ previousObject = comparepreviousObject[field.field_name].name;
754
+ if (comparecurrentObj != comparepreviousObject) {
755
+ isChanged = true;
756
+ }
757
+ }
758
+ else {
759
+ if (comparecurrentObj != comparepreviousObject) {
760
+ if (comparecurrentObj != null && comparecurrentObj != undefined && comparepreviousObject != null && comparepreviousObject != undefined) {
761
+ isChanged = true;
762
+ }
763
+ else {
764
+ isChanged = false;
765
+ }
766
+ }
767
+ }
768
+ }
769
+ field['isChanged'] = isChanged;
770
+ fields[i] = field;
771
+ }
772
+ }
773
+ }
774
+ getPage(page, selectContact, tabFilterData, tab, currentMenu, headElements, filterFormValue, sortingColumnName, recordId, rowId, queryParams, itemNumOfGrid, gridDisable, modifyGridData, elements) {
775
+ let responce = {
776
+ "pageNumber": page,
777
+ "modifyGridData": modifyGridData,
778
+ "elements": elements
779
+ };
780
+ // this.pageNumber = page;
781
+ let contact = {};
782
+ let leadId = '';
783
+ if (selectContact != '') {
784
+ tabFilterData.forEach((element) => {
785
+ if (element._id == selectContact['_id']) {
786
+ contact = element;
787
+ }
788
+ });
789
+ if (contact['lead'] && contact['lead']._id) {
790
+ leadId = contact['lead']._id;
791
+ }
792
+ }
793
+ const pagePayload = this.apiCallService.getPage(page, tab, currentMenu, headElements, filterFormValue, leadId);
794
+ if (sortingColumnName) {
795
+ pagePayload["path"] = sortingColumnName;
796
+ }
797
+ let crList = pagePayload.data.crList;
798
+ let criteriaList = [];
799
+ if (recordId) {
800
+ let criteria = "_id;eq;" + recordId + ";STATIC";
801
+ criteriaList.push(criteria);
802
+ }
803
+ if (rowId) {
804
+ let criteria = "serialId;eq;" + rowId + ";STATIC";
805
+ criteriaList.push(criteria);
806
+ }
807
+ if (Object.keys(queryParams).length > 0) {
808
+ Object.keys(queryParams).forEach(key => {
809
+ let criteria = key + ";eq;" + queryParams[key] + ";STATIC";
810
+ criteriaList.push(criteria);
811
+ });
812
+ }
813
+ if (criteriaList.length > 0) {
814
+ this.apiCallService.getCriteriaList(criteriaList, {}).forEach((element) => {
815
+ crList.push(element);
816
+ });
817
+ pagePayload.data.crList = crList;
818
+ }
819
+ pagePayload.data.pageSize = itemNumOfGrid;
820
+ this.getGridPayloadData(pagePayload, filterFormValue, gridDisable, tab, responce);
821
+ return responce;
822
+ }
823
+ onSort(columnObject, filterFormValue, gridDisable, tab, sortingColumnName, sortIcon, orderBy, headElements, currentMenu, pageNumber) {
824
+ let responce = {
825
+ "sortingColumnName": sortingColumnName,
826
+ "sortIcon": sortIcon,
827
+ "orderBy": orderBy
828
+ };
829
+ responce.sortingColumnName = responce.orderBy + columnObject.field_name;
830
+ const getSortData = this.apiCallService.getDataForGridFilter(pageNumber, tab, currentMenu, headElements, filterFormValue);
831
+ getSortData['path'] = responce.sortingColumnName;
832
+ this.getGridPayloadData(getSortData, filterFormValue, gridDisable, tab, responce);
833
+ if (responce.orderBy == '-') {
834
+ responce.orderBy = '';
835
+ }
836
+ else {
837
+ responce.orderBy = '-';
838
+ }
839
+ responce.sortIcon == "down" ? (responce.sortIcon = "up-alt") : (responce.sortIcon = "down");
840
+ return responce;
841
+ }
842
+ applyFilter(modifyGridData, elements, tab, currentMenu, headElements, filterValue, selectContact, itemNumOfGrid, gridDisable, sortingColumnName) {
843
+ let responce = {
844
+ "modifyGridData": modifyGridData,
845
+ "elements": elements,
846
+ "pageNumber": 1
847
+ };
848
+ let pagePayload = this.apiCallService.getDataForGrid(responce.pageNumber, tab, currentMenu, headElements, filterValue, selectContact);
849
+ if (sortingColumnName) {
850
+ pagePayload["path"] = sortingColumnName;
851
+ }
852
+ pagePayload.data.pageSize = itemNumOfGrid;
853
+ this.getGridPayloadData(pagePayload, filterValue, gridDisable, tab, responce);
854
+ return responce;
855
+ }
856
+ getGridPayloadData(pagePayload, value, gridDisable, tab, responce) {
857
+ if (this.checkIfService.checkCallGridData(value, gridDisable)) {
858
+ this.apiService.getGridData(pagePayload);
859
+ }
860
+ else {
861
+ responce.modifyGridData = [];
862
+ responce.elements = [];
863
+ this.setOldTabCount(tab);
864
+ }
865
+ }
866
+ }
867
+ GridCommonFunctionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CoreFunctionService }, { token: i3.FileHandlerService }, { token: i4.CheckIfService }, { token: i5.StorageService }, { token: i6.DatePipe }, { token: i6.CurrencyPipe }, { token: i7.DataShareService }, { token: i8.ApiCallService }, { token: i9.ApiService }], target: i0.ɵɵFactoryTarget.Injectable });
868
+ GridCommonFunctionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, providedIn: 'root' });
869
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, decorators: [{
870
+ type: Injectable,
871
+ args: [{
872
+ providedIn: 'root'
873
+ }]
874
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CoreFunctionService }, { type: i3.FileHandlerService }, { type: i4.CheckIfService }, { type: i5.StorageService }, { type: i6.DatePipe }, { type: i6.CurrencyPipe }, { type: i7.DataShareService }, { type: i8.ApiCallService }, { type: i9.ApiService }]; } });
875
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1jb21tb24tZnVuY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvZ3JpZC9ncmlkLWNvbW1vbi1mdW5jdGlvbi9ncmlkLWNvbW1vbi1mdW5jdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBYTNDLE1BQU0sT0FBTyx5QkFBeUI7SUFFdEMsWUFDVSxxQkFBMkMsRUFDM0MsbUJBQXVDLEVBQ3ZDLGtCQUFzQyxFQUN0QyxjQUE2QixFQUM3QixjQUE2QixFQUM3QixRQUFrQixFQUNsQixZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBNkIsRUFDN0IsVUFBcUI7UUFUckIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGVBQVUsR0FBVixVQUFVLENBQVc7SUFDM0IsQ0FBQztJQUNILGNBQWMsQ0FBQyxRQUFZLEVBQUMsV0FBZSxFQUFDLEtBQVMsRUFBQyxtQkFBdUIsRUFBQyxnQkFBb0I7UUFDaEcsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FB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USxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7dUhBNXlCVSx5QkFBeUI7MkhBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzRGQUVQLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlSGFuZGxlci9maWxlLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENoZWNrSWZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2hlY2staWYvY2hlY2staWYuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSxDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEYXRhU2hhcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGF0YS1zaGFyZS9kYXRhLXNoYXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlDYWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGktY2FsbC9hcGktY2FsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGkuc2VydmljZSc7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRDb21tb25GdW5jdGlvblNlcnZpY2Uge1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBDb21tb25GdW5jdGlvblNlcnZpY2U6Q29tbW9uRnVuY3Rpb25TZXJ2aWNlLFxyXG4gIHByaXZhdGUgY29yZUZ1bmN0aW9uU2VydmljZTpDb3JlRnVuY3Rpb25TZXJ2aWNlLFxyXG4gIHByaXZhdGUgZmlsZUhhbmRsZXJTZXJ2aWNlOiBGaWxlSGFuZGxlclNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBjaGVja0lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gIHByaXZhdGUgQ3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGUsXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOiBEYXRhU2hhcmVTZXJ2aWNlLFxyXG4gIHByaXZhdGUgYXBpQ2FsbFNlcnZpY2U6QXBpQ2FsbFNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2VcclxuKSB7IH1cclxuICBtb2RpZnlHcmlkRGF0YShncmlkRGF0YTphbnksZ3JpZENvbHVtbnM6YW55LGZpZWxkOmFueSxlZGl0YWJsZUdyaWRDb2x1bW5zOmFueSx0eXBvZ3JhcGh5Q3JMaXN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZpZWREYXRhID0gW107XHJcbiAgICBpZihncmlkQ29sdW1ucy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGdyaWREYXRhW2ldO1xyXG4gICAgICAgIGxldCBtb2RpZnlSb3cgPSB0aGlzLnJvd01vZGlmeShyb3csZmllbGQsZ3JpZENvbHVtbnMsZWRpdGFibGVHcmlkQ29sdW1ucyx0eXBvZ3JhcGh5Q3JMaXN0KTtcclxuICAgICAgICBtb2RpZmllZERhdGEucHVzaChtb2RpZnlSb3cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kaWZpZWREYXRhO1xyXG4gIH1cclxuICByb3dNb2RpZnkocm93OmFueSxmaWVsZDphbnksZ3JpZENvbHVtbnM6YW55LGVkaXRhYmxlR3JpZENvbHVtbnM6YW55LHR5cG9ncmFwaHlDckxpc3Q6YW55KXtcclxuICAgIGxldCBtb2RpZnlSb3cgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvdykpO1xyXG4gICAgbW9kaWZ5Um93W1wiZGlzYWJsZWRcIl0gPSB0aGlzLmNoZWNrSWZTZXJ2aWNlLmNoZWNrUm93SWYocm93LGZpZWxkKTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZENvbHVtbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgY29uc3QgY29sdW1uID0gZ3JpZENvbHVtbnNbal07XHJcbiAgICAgIGlmKCFjb2x1bW4uZWRpdGFibGUgfHwgZWRpdGFibGVHcmlkQ29sdW1ucy5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgbW9kaWZ5Um93W2NvbHVtbi5maWVsZF9uYW1lXSA9IHRoaXMuZ2V0VmFsdWVGb3JHcmlkKGNvbHVtbixyb3cpO1xyXG4gICAgICB9XHJcbiAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZStcIl90b29sdGlwXCJdID0gdGhpcy5nZXRWYWx1ZUZvckdyaWRUb29sdGlwKGNvbHVtbixyb3cpO1xyXG4gICAgICBpZihjb2x1bW4uZWRpdGFibGUpe1xyXG4gICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZStcIl9kaXNhYmxlZFwiXSA9IHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNEaXNhYmxlUm93KGNvbHVtbixyb3cpO1xyXG4gICAgICAgIGlmKGNvbHVtbi50eXBlID09ICdmaWxlJyAmJiBlZGl0YWJsZUdyaWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmKHJvdyAmJiByb3dbY29sdW1uLmZpZWxkX25hbWVdICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkocm93W2NvbHVtbi5maWVsZF9uYW1lXSkgJiYgcm93W2NvbHVtbi5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhyb3dbY29sdW1uLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZV0gPSByb3dbY29sdW1uLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoZWRpdGFibGVHcmlkQ29sdW1ucyAmJiAoZWRpdGFibGVHcmlkQ29sdW1ucy5sZW5ndGggPT0gMSB8fCAoZmllbGQgJiYgIWZpZWxkLmdyaWRfcm93X3NlbGVjdGlvbikgfHwgcm93LnNlbGVjdGVkKSl7XHJcbiAgICAgIG1vZGlmeVJvd1tcImNvbHVtbl9lZGl0XCJdID0gdHJ1ZTtcclxuICAgIH1lbHNle1xyXG4gICAgICBtb2RpZnlSb3dbXCJjb2x1bW5fZWRpdFwiXSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYoZWRpdGFibGVHcmlkQ29sdW1ucyAmJiBlZGl0YWJsZUdyaWRDb2x1bW5zLmxlbmd0aCA9PSAwICYmIGZpZWxkICYmIE9iamVjdC5rZXlzKGZpZWxkKS5sZW5ndGggPiAwKXtcclxuICAgICAgbW9kaWZ5Um93WydhY3Rpb25CdG5EaXNwbGF5J10gPSB0aGlzLmNoZWNrUm93RGlzYWJsZWRJZihmaWVsZCxyb3cpO1xyXG4gICAgfVxyXG4gICAgaWYodHlwb2dyYXBoeUNyTGlzdCAmJiB0eXBvZ3JhcGh5Q3JMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBtb2RpZnlSb3dbJ2JhY2tncm91bmQtY29sb3InXSA9IHRoaXMuY2hlY2tUeXBncmFwaENvbmRpdGlvbih0eXBvZ3JhcGh5Q3JMaXN0LHJvdywnYmFja2dyb3VuZC1jb2xvcicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeVJvdztcclxuICB9XHJcblxyXG4gIGdldExpc3RCeUtleVZhbHVlVG9MaXN0KGxpc3Q6YW55LGtleTpzdHJpbmcsdmFsdWU6YW55KXtcclxuICAgIGxldCBnZXRsaXN0ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGxpc3RbaV07XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudFtrZXldID09IHZhbHVlKXtcclxuICAgICAgICBnZXRsaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBnZXRsaXN0O1xyXG4gIH1cclxuICBtb2RpZnlHcmlkQ29sdW1ucyhncmlkQ29sdW1uczphbnkscGFyZW50T2JqZWN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZ5R3JpZENvbHVtbnMgPSBbXTtcclxuICAgIGlmKGdyaWRDb2x1bW5zICYmIGdyaWRDb2x1bW5zLmxlbmd0aCA+IDApe1xyXG4gICAgICBtb2RpZnlHcmlkQ29sdW1ucyA9IHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkSW5MaXN0KCdkaXNwbGF5JyxncmlkQ29sdW1ucyk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZ5R3JpZENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IG1vZGlmeUdyaWRDb2x1bW5zW2ldO1xyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhmaWVsZC5zaG93X2lmKSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWZTZXJ2aWNlLnNob3dJZihmaWVsZCwgcGFyZW50T2JqZWN0KSkge1xyXG4gICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZpZWxkWydzaG93J10gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYoZmllbGQuaGlkZSAhPSB1bmRlZmluZWQgJiYgZmllbGQuaGlkZSl7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmKGZpZWxkICYmICBmaWVsZC5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZmllbGRbJ2ZpZWxkX2NsYXNzJ10pe1xyXG4gICAgICAgICAgZmllbGRbJ2ZpZWxkX2NsYXNzJ10gPSBmaWVsZFsnZmllbGRfY2xhc3MnXS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpZWxkWyd3aWR0aCddID0gdGhpcy5nZXRHcmlkQ29sdW1uV2lkdGgoZmllbGQsZ3JpZENvbHVtbnMpO1xyXG4gICAgICAgIGlmKGZpZWxkICYmIGZpZWxkLnR5cGUgJiYgZmllbGQudHlwZSAhPScnKXtcclxuICAgICAgICAgIHN3aXRjaChmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCkpe1xyXG4gICAgICAgICAgICBjYXNlIFwiaW5mb1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwiaHRtbFwiIDpcclxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiaWNvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiZG93bmxvYWRfZmlsZVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwicmVkaXJlY3RcIjpcclxuICAgICAgICAgICAgY2FzZSBcImNvbG9yXCI6XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2hpZGVDb3B5J109dHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb2RpZnlHcmlkQ29sdW1ucztcclxuICB9XHJcbiAgZ2V0R3JpZENvbHVtbldpZHRoKGNvbHVtbjphbnksbGlzdE9mR3JpZEZpZWxkTmFtZTphbnkpIHtcclxuICAgIGlmIChjb2x1bW4ud2lkdGggJiYgY29sdW1uLndpZHRoICE9ICcwJykge1xyXG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIGlmIChsaXN0T2ZHcmlkRmllbGROYW1lLmxlbmd0aCA+IDgpIHtcclxuICAgIC8vICAgICByZXR1cm4gJzE1MHB4JztcclxuICAgIC8vICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIC8vIH1cclxuICB9XHJcbiAgdXBkYXRlR3JpZERhdGFUb01vZGlmaWVkRGF0YShncmlkX3Jvd19zZWxlY3Rpb246YW55LGdyaWREYXRhOmFueSxtb2RpZmllZEdyaWREYXRhOmFueSxsaXN0T2ZHcmlkRmllbGROYW1lOmFueSl7XHJcbiAgICBsZXQgZ3JpZFNlbGVjdGVkRGF0YTphbnkgPSBbXTtcclxuICAgIGxldCBtb2RpZmllZFNlbGVjdGVkRGF0YTphbnkgPSBbXTtcclxuICAgIGlmIChncmlkX3Jvd19zZWxlY3Rpb24gPT0gZmFsc2UpIHtcclxuICAgICAgZ3JpZFNlbGVjdGVkRGF0YSA9IFsuLi5ncmlkRGF0YV07XHJcbiAgICAgIG1vZGlmaWVkU2VsZWN0ZWREYXRhID0gWy4uLm1vZGlmaWVkR3JpZERhdGFdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyaWRTZWxlY3RlZERhdGEgPSB0aGlzLmdldExpc3RCeUtleVZhbHVlVG9MaXN0KGdyaWREYXRhLFwic2VsZWN0ZWRcIix0cnVlKTtcclxuICAgICAgbW9kaWZpZWRTZWxlY3RlZERhdGEgPSB0aGlzLmdldExpc3RCeUtleVZhbHVlVG9MaXN0KG1vZGlmaWVkR3JpZERhdGEsXCJzZWxlY3RlZFwiLHRydWUpO1xyXG4gICAgfVxyXG4gICAgaWYobGlzdE9mR3JpZEZpZWxkTmFtZS5sZW5ndGggPiAwKXtcclxuICAgICAgZ3JpZFNlbGVjdGVkRGF0YS5mb3JFYWNoKChkYXRhOmFueSxpOm51bWJlcikgPT4ge1xyXG4gICAgICAgIGxpc3RPZkdyaWRGaWVsZE5hbWUuZm9yRWFjaCgoY29sdW1uOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYoY29sdW1uLmVkaXRhYmxlIHx8IGNvbHVtbi50eXBlID09ICdudW1iZXInKXtcclxuICAgICAgICAgICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgICAgICAgICAgZ3JpZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhtb2RpZmllZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZ3JpZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0gPSBtb2RpZmllZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncmlkU2VsZWN0ZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlPbkdyaWRGaWx0ZXIoZmllbGQ6YW55KSB7XHJcbiAgICBpZiAoZmllbGQgJiYgZmllbGQuZXRjX2ZpZWxkcyAmJiBmaWVsZC5ldGNfZmllbGRzLm9uX2dyaWRfZmlsdGVyID09PSAnZmFsc2UnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICBhcHBseU9uR3JpZEZpbHRlckxhYmVsKGZpZWxkOmFueSkge1xyXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLmV0Y19maWVsZHMgJiYgZmllbGQuZXRjX2ZpZWxkcy5vbl9ncmlkX2ZpbHRlcl9sYWJlbCAhPSAnJykge1xyXG4gICAgICByZXR1cm4gZmllbGQuZXRjX2ZpZWxkcy5vbl9ncmlkX2ZpbHRlcl9sYWJlbDtcclxuICAgIH1cclxuICAgIHJldHVybiBcIlNlYXJjaCBQYXJhbWV0ZXIgLi4uXCI7XHJcbiAgfVxyXG4gIG1vZGlmeVRhYmxlRmllbGRzKHRhYmxlZmllbGRzOmFueSl7XHJcblxyXG4gIH1cclxuICBncmlkRGF0YU1vZGlmeShtb2RpZnlEYXRhOmFueSxkYXRhOmFueSxmaWVsZHM6YW55LGZpZWxkX25hbWU6YW55LGtleTphbnksb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZ5T2JqZWN0ID0ge1xyXG4gICAgICBcIm1vZGlmeURhdGFcIiA6IG1vZGlmeURhdGEsXHJcbiAgICAgIFwiZmllbGRzXCIgOiBmaWVsZHMsXHJcbiAgICAgIFwiZmllbGRfaW5kZXhcIiA6IC0xXHJcbiAgICB9O1xyXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LnR5cGU7XHJcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGlmKHR5cGUgJiYgdHlwZS5zdGFydHNXaXRoKGtleSkgJiYgZmllbGRfbmFtZSA9PSBmaWVsZE5hbWUpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBmaWVsZE5hbWUgJiYgZGF0YSAmJiBkYXRhW2ZpZWxkTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zdCBjRGF0YSA9IGRhdGFbZmllbGROYW1lXTtcclxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjRGF0YSkgJiYgY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBlbGVtZW50LmdyaWRDb2x1bW5zO1xyXG4gICAgICAgICAgICAgIGxldCB0eXBvZ3JhcGh5Q3JMaXN0ID0gW107XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudFsnY29sb3JDcml0ZXJpYSddICYmIGVsZW1lbnRbJ2NvbG9yQ3JpdGVyaWEnXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIHR5cG9ncmFwaHlDckxpc3QgPSBlbGVtZW50Wydjb2xvckNyaXRlcmlhJ107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IG1vZGlmeUxpc3QgPSB0aGlzLm1vZGlmeUdyaWREYXRhKGNEYXRhLGdyaWRDb2x1bW5zLGVsZW1lbnQsW10sdHlwb2dyYXBoeUNyTGlzdCk7XHJcbiAgICAgICAgICAgICAgbW9kaWZ5RGF0YVtmaWVsZE5hbWVdID0gbW9kaWZ5TGlzdDtcclxuICAgICAgICAgICAgICBlbGVtZW50LmdyaWRDb2x1bW5zID0gdGhpcy5tb2RpZnlHcmlkQ29sdW1ucyhncmlkQ29sdW1ucyxvYmplY3QpO1xyXG4gICAgICAgICAgICAgIG1vZGlmeU9iamVjdC5maWVsZF9pbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICBtb2RpZnlEYXRhW2ZpZWxkTmFtZV0gPSBjRGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGUgJiYgdHlwZS5zdGFydHNXaXRoKCdsaXN0X29mX2ZpZWxkcycpICYmIGVsZW1lbnQuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdF93aXRoX3BvcHVwXCIgJiYgZmllbGRfbmFtZSA9PSBmaWVsZE5hbWUpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBmaWVsZE5hbWUgJiYgZGF0YSAmJiBkYXRhW2ZpZWxkTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zdCBjRGF0YSA9IGRhdGFbZmllbGROYW1lXTtcclxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjRGF0YSkgJiYgY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG1vZGlmeUxpc3QgPSB0aGlzLm1vZGlmeUxpc3RvZkZpZWxkc0RhdGEoe30sY0RhdGEsZ3JpZENvbHVtbnMpWydkYXRhJ107XHJcbiAgICAgICAgICAgICAgbW9kaWZ5RGF0YVtmaWVsZE5hbWVdID0gbW9kaWZ5TGlzdDtcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3QuZmllbGRfaW5kZXggPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtb2RpZnlPYmplY3QubW9kaWZ5RGF0YSA9IG1vZGlmeURhdGE7XHJcbiAgICBtb2RpZnlPYmplY3QuZmllbGRzID0gZmllbGRzO1xyXG4gICAgcmV0dXJuIG1vZGlmeU9iamVjdDtcclxuICB9XHJcblxyXG4gIG1vZGlmeUxpc3RvZkZpZWxkc0RhdGEocGFyZW50RmllbGQ6YW55LGRhdGE6YW55LGZpZWxkczphbnkpe1xyXG4gICAgbGV0IG1vZGlmeUxpc3RvZmZpZWxkT2JqZWN0OmFueSA9IHt9O1xyXG4gICAgbGV0IG1vZGlmeURhdGEgPSBbXTtcclxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCAmJiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IGRhdGFbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IG1PYmplY3QgPSB0aGlzLmdldE1vZGlmeUxpc3RPZkZpZWxkc09iamVjdChwYXJlbnRGaWVsZCxvYmplY3QsZmllbGRzKTtcclxuICAgICAgICBtb2RpZnlEYXRhLnB1c2gobU9iamVjdCk7XHJcbiAgICAgIH1cclxuICAgICAgbW9kaWZ5TGlzdG9mZmllbGRPYmplY3RbJ2RhdGEnXSA9IG1vZGlmeURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kaWZ5TGlzdG9mZmllbGRPYmplY3Q7XHJcbiAgfVxyXG4gIGdldE1vZGlmeUxpc3RPZkZpZWxkc09iamVjdChwYXJlbnRGaWVsZDphbnksb2JqZWN0OmFueSxmaWVsZHM6YW55KXtcclxuICAgIGxldCBtT2JqZWN0OmFueSA9IHt9O1xyXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGRzW2luZGV4XTtcclxuICAgICAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIG1PYmplY3RbZmllbGROYW1lXSA9IHRoaXMuc2hvd0xpc3RGaWVsZFZhbHVlKG9iamVjdCxlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICBtT2JqZWN0WydhY3Rpb25CdG5EaXNwbGF5J10gPSB0aGlzLmNoZWNrUm93RGlzYWJsZWRJZihwYXJlbnRGaWVsZCxvYmplY3QpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1PYmplY3Q7XHJcbiAgfVxyXG4gIHNob3dMaXN0RmllbGRWYWx1ZShsaXN0T2ZGaWVsZDphbnksIGl0ZW06YW55KSB7XHJcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xyXG4gICAgICBjYXNlIFwidHlwZWFoZWFkXCI6XHJcbiAgICAgICAgaWYoaXRlbS5kYXRhdHlwZSA9PSBcImxpc3Rfb2Zfb2JqZWN0XCIpe1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSkgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXS5sZW5ndGggPiAwICYmIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9ICcnKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bJ2hpZGVDb3B5J109dHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuICc8aSBjbGFzcz1cImZhIGZhLWV5ZSBjdXJzb3ItcG9pbnRlclwiPjwvaT4nO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICctJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZSBpZihpdGVtLmRhdGF0eXBlID09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgaWYgKGl0ZW0uZGlzcGxheV9uYW1lICYmIGl0ZW0uZGlzcGxheV9uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGl0ZW0uZGlzcGxheV9uYW1lLCBsaXN0T2ZGaWVsZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihpdGVtLmRhdGF0eXBlID09IFwidGV4dFwiKXtcclxuICAgICAgICAgIGlmIChpdGVtLmRpc3BsYXlfbmFtZSAmJiBpdGVtLmRpc3BsYXlfbmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShpdGVtLmRpc3BsYXlfbmFtZSwgbGlzdE9mRmllbGQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgY2FzZSBcImxpc3Rfb2ZfY2hlY2tib3hcIjpcclxuICAgICAgY2FzZSBcImdyaWRfc2VsZWN0aW9uXCI6XHJcbiAgICAgIGNhc2UgXCJsaXN0X29mX2ZpZWxkc1wiOlxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0pICYmIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0ubGVuZ3RoID4gMCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9IG51bGwgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSAhPSAnJykge1xyXG4gICAgICAgICAgaXRlbVsnaGlkZUNvcHknXT10cnVlO1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnZpc2liaWxpdHk8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZXllIGN1cnNvci1wb2ludGVyXCI+PC9pPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiY2hlY2tib3hcIjpcclxuICAgICAgICBsZXQgdmFsdWU6YW55ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGl0ZW0uZGlzcGxheV9uYW1lICYmIGl0ZW0uZGlzcGxheV9uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5Db21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoaXRlbS5kaXNwbGF5X25hbWUsIGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRm9yR3JpZChpdGVtLGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gXCJZZXNcIiA6IFwiTm9cIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5X25hbWUgJiYgaXRlbS5kaXNwbGF5X25hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGl0ZW0uZGlzcGxheV9uYW1lLCBsaXN0T2ZGaWVsZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlRm9yR3JpZChpdGVtLGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBjaGVja1Jvd0Rpc2FibGVkSWYoZmllbGQ6YW55LGRhdGE6YW55KXtcclxuICAgIGlmKGZpZWxkICYmIGZpZWxkLmRpc2FibGVSb3dJZiAmJiBmaWVsZC5kaXNhYmxlUm93SWYgIT0gJycpe1xyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBmaWVsZC5kaXNhYmxlUm93SWY7XHJcbiAgICAgIGlmKGNvbmRpdGlvbil7XHJcbiAgICAgICAgaWYoZmllbGQuZGlzYWJsZVJvd0lmT25seVNlbGVjdGlvbil7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAhdGhpcy5jaGVja0lmU2VydmljZS5jaGVja0Rpc2FibGVSb3dJZihjb25kaXRpb24sZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgY2hlY2tUeXBncmFwaENvbmRpdGlvbih0eXBvZ3JhcGh5Q3JMaXN0OmFueSxvYmplY3Q6YW55LG5hbWU6YW55KXtcclxuICAgIGxldCBiYWNrZ3JvdW5kID0gJyc7XHJcbiAgICBpZih0eXBvZ3JhcGh5Q3JMaXN0ICYmIHR5cG9ncmFwaHlDckxpc3QubGVuZ3RoID49IDEpe1xyXG4gICAgICBsZXQgY3JpdGVyaWFNYXRjaGVkID0gZmFsc2U7XHJcbiAgICAgIGxldCBtYXRjaGVkZWxlbWVudDphbnkgPSB7fTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR5cG9ncmFwaHlDckxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHR5cG9ncmFwaHlDckxpc3RbaW5kZXhdO1xyXG4gICAgICAgIGxldCBjckxpc3QgPSBlbGVtZW50Wydjckxpc3QnXTtcclxuICAgICAgICBsZXQgY2hpbGRDb25kaXRpb25zTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3JMaXN0Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNyTGlzdFtqXTtcclxuICAgICAgICAgIGxldCBtb2RpZnkgPSBjaGlsZC5yZXBsYWNlQWxsKCc7JywgXCIjXCIpO1xyXG4gICAgICAgICAgaWYoIXRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tJZkNvbmRpdGlvbkZvckFycmF5TGlzdFZhbHVlKG1vZGlmeSxvYmplY3QpKXtcclxuICAgICAgICAgICAgY2hpbGRDb25kaXRpb25zTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjaGlsZENvbmRpdGlvbnNNYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2hpbGRDb25kaXRpb25zTWF0Y2hlZCl7XHJcbiAgICAgICAgICBtYXRjaGVkZWxlbWVudCA9IHR5cG9ncmFwaHlDckxpc3RbaW5kZXhdXHJcbiAgICAgICAgICBjcml0ZXJpYU1hdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjcml0ZXJpYU1hdGNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoY3JpdGVyaWFNYXRjaGVkKXtcclxuICAgICAgICBsZXQgdHlwb2dyYXB5ID0gbWF0Y2hlZGVsZW1lbnRbJ3R5cG9HcmFwaHknXTtcclxuICAgICAgICBsZXQgdmFsdWUgPSAnJztcclxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ2JhY2tncm91bmQtY29sb3InOlxyXG4gICAgICAgICAgICB2YWx1ZSA9IHR5cG9ncmFweVsnYmFja2dyb3VuZF9jb2xvciddO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiYWNrZ3JvdW5kID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xyXG4gIH1cclxuICBtb2RpZmllZEdyaWRDb2x1bW5zKGdyaWRDb2x1bW5zOmFueSxzZWxlY3RlZFJvdzphbnksZm9ybVZhbHVlOmFueSl7XHJcbiAgICBpZihncmlkQ29sdW1ucy5sZW5ndGggPiAwKXtcclxuICAgICAgZ3JpZENvbHVtbnMuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZmllbGQuc2hvd19pZikpe1xyXG4gICAgICAgICAgaWYoIXRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tTaG93SWYoZmllbGQsc2VsZWN0ZWRSb3csZm9ybVZhbHVlKSl7XHJcbiAgICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSBmYWxzZTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JpZENvbHVtbnM7XHJcbiAgfVxyXG4gIGNoZWNrR3JpZFNlbGVjdGlvbk1lbmRldG9yeShncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdDphbnksc2VsZWN0ZWRSb3c6YW55LGZvcm1WYWx1ZTphbnksY3VzdG1pemVkRm9ybVZhbHVlOmFueSl7XHJcbiAgICBsZXQgdmFsaWRhdGlvbiA9IHtcclxuICAgICAgJ3N0YXR1cycgOiB0cnVlLFxyXG4gICAgICAnbXNnJyA6ICcnXHJcbiAgICB9XHJcbiAgICBpZihncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdCAmJiBncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IGNoZWNrID0gMDtcclxuICAgICAgZ3JpZFNlbGVjdGlvbk1lbmRldG9yeUxpc3QuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGE6YW55ID0gW107XHJcbiAgICAgICAgaWYoY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdKXtcclxuICAgICAgICAgIGRhdGEgPSBjdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZpZWxkLm1lbmRldG9yeV9maWVsZHMgJiYgZmllbGQubWVuZGV0b3J5X2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGZpZWxkLm1lbmRldG9yeV9maWVsZHMgPSB0aGlzLm1vZGlmaWVkR3JpZENvbHVtbnMoZmllbGQubWVuZGV0b3J5X2ZpZWxkcyxzZWxlY3RlZFJvdyxmb3JtVmFsdWUpXHJcbiAgICAgICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGZpZWxkLm1lbmRldG9yeV9maWVsZHMuZm9yRWFjaCgobUZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1GaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgICAgICAgIGlmKG1GaWVsZC5kaXNwbGF5KXtcclxuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgocm93OmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZihyb3cgJiYgcm93W2ZpZWxkTmFtZV0gPT0gdW5kZWZpbmVkIHx8IHJvd1tmaWVsZE5hbWVdID09ICcnIHx8IHJvd1tmaWVsZE5hbWVdID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb24ubXNnID09ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24ubXNnID0gbUZpZWxkLmxhYmVsICsgJyBvZiAnICsgZmllbGQubGFiZWwrJyBpcyByZXF1aXJlZC4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoY2hlY2sgIT0gMCl7XHJcbiAgICAgICAgdmFsaWRhdGlvbi5zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGlvbjtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25cclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFNlbGVjdGVkRGF0YShkYXRhOmFueSxmaWVsZDphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlOmFueSA9e1xyXG4gICAgICBncmlkU2VsZWN0ZWREYXRhOltdLFxyXG4gICAgICBjdXN0b21FbnRyeURhdGE6W11cclxuICAgIH1cclxuICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGZpZWxkLmFkZF9uZXdfZW5hYmxlZCl7XHJcbiAgICAgIGRhdGEuZm9yRWFjaCgoZ3JpZDphbnkpID0+IHtcclxuICAgICAgICBpZihncmlkICYmIGdyaWQuY3VzdG9tRW50cnkpe1xyXG4gICAgICAgICAgcmVzcG9uY2UuY3VzdG9tRW50cnlEYXRhW2ZpZWxkLmZpZWxkX25hbWVdLnB1c2goZ3JpZCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXNwb25jZS5ncmlkU2VsZWN0ZWREYXRhLnB1c2goZ3JpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgcmVzcG9uY2UuZ3JpZFNlbGVjdGVkRGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGdldE1vZGlmaWVkR3JpZENvbHVtbnMoZ3JpZENvbHVtbnM6YW55LG9iamVjdDphbnkpe1xyXG4gICAgaWYoZ3JpZENvbHVtbnMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGdyaWRDb2x1bW5zLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGZpZWxkLnNob3dfaWYpKXtcclxuICAgICAgICAgIGlmKCF0aGlzLmNoZWNrSWZTZXJ2aWNlLnNob3dJZihmaWVsZCxvYmplY3QpKXtcclxuICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncmlkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIGlzRGF0ZShkYXRlOmFueSkge1xyXG4gICAgbGV0IGRhdGVWYWx1ZTphbnkgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHJldHVybiAoZGF0ZVZhbHVlICE9PSBcIkludmFsaWQgRGF0ZVwiKSAmJiAhaXNOYU4oZGF0ZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlRm9yR3JpZChmaWVsZDphbnksIG9iamVjdDphbnkpIHtcclxuICAgIGxldCB2YWx1ZTphbnkgPSAnJztcclxuICAgIGxldCBmaWVsZE5hbWU6IGFueT0gJyc7XHJcbiAgICBpZiAoZmllbGQpIHtcclxuICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZmllbGQuZGlzcGxheV9uYW1lKSl7XHJcbiAgICAgICAgZmllbGROYW1lPSBmaWVsZC5kaXNwbGF5X25hbWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhmaWVsZC5maWVsZF9uYW1lKSl7XHJcbiAgICAgICAgZmllbGROYW1lPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihmaWVsZE5hbWUgIT0nJyl7XHJcbiAgICAgIHZhbHVlPSB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShmaWVsZE5hbWUsIG9iamVjdClcclxuICAgIH1cclxuICAgIGlmICghZmllbGQudHlwZSkgZmllbGQudHlwZSA9IFwiVGV4dFwiO1xyXG4gICAgbGV0IHJldHVyblZhbHVlOmFueSA9ICcnO1xyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxyXG4gICAgICAgIGlmKHZhbHVlICYmIHZhbHVlICE9ICcnKXtcclxuICAgICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdtZWRpdW0nKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eSBoOm1tIGEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICBjYXNlICdkYXRlcmFuZ2UnOlxyXG4gICAgICAgIGlmKHZhbHVlICYmIHZhbHVlICE9ICcnKXtcclxuICAgICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdtZWRpdW1EYXRlJyk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICBjYXNlICd0aW1lJzogcmV0dXJuIHRoaXMuaXNEYXRlKHZhbHVlKSA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnaDptbSBhJykgOiB2YWx1ZTtcclxuICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIHZhbHVlID8gXCJZZXNcIiA6IFwiTm9cIjtcclxuICAgICAgY2FzZSBcImN1cnJlbmN5XCI6IHJldHVybiB0aGlzLkN1cnJlbmN5UGlwZS50cmFuc2Zvcm0odmFsdWUsICdJTlInKTtcclxuICBcdCAgY2FzZSBcImRyb3Bkb3duXCI6IHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5uYW1lID8gdmFsdWUubmFtZSA6IHZhbHVlO1xyXG4gICAgICBjYXNlIFwidHlwZWFoZWFkXCI6IHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5uYW1lID8gdmFsdWUubmFtZSA6IHZhbHVlO1xyXG4gICAgICBjYXNlIFwiaW5mb1wiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnZpc2liaWxpdHk8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZXllIGN1cnNvci1wb2ludGVyXCI+PC9pPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBcImh0bWxcIiA6XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3Vyc29yLXBvaW50ZXJcIj5wcmV2aWV3PC9zcGFuPic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiZmlsZVwiOlxyXG4gICAgICBjYXNlIFwiZmlsZV93aXRoX3ByZXZpZXdcIjpcclxuICAgICAgY2FzZSBcImZpbGVfd2l0aF9wcmludFwiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnRleHRfc25pcHBldDwvc3Bhbj4nO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXJzb3ItcG9pbnRlclwiPnRleHRfc25pcHBldDwvc3Bhbj4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNoZWNrUGxhdEZvcm0oKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+ZGVzY3JpcHRpb248L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZmlsZSBjdXJzb3ItcG9pbnRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcImltYWdlXCI6XHJcbiAgICAgICAgcmV0dXJuICc8aW1nIHNyYz1cImRhdGE6aW1hZ2UvanBnO2Jhc2U2NCwnICsgdmFsdWUgKyAnXCIgLz4nO1xyXG4gICAgICBjYXNlIFwiaWNvblwiOlxyXG4gICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyXCI+JyArIGZpZWxkLmZpZWxkX2NsYXNzICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGN1cnNvci1wb2ludGVyXCI+JyArIGZpZWxkLmZpZWxkX2NsYXNzICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNoZWNrUGxhdEZvcm0oKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJmYSBmYS1leHRlcm5hbC1saW5rXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPic7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICc8aSBjbGFzcz1cImZhIGZhLWV4dGVybmFsLWxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+JztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiZG93bmxvYWRfZmlsZVwiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPicgKyBmaWVsZC5maWVsZF9jbGFzcyArICc8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3Vyc29yLXBvaW50ZXJcIj4nICsgZmllbGQuZmllbGRfY2xhc3MgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInRyaW1fb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgaWYodmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gJycpe1xyXG4gICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgbGV0IHN0cmluZ09iamVjdCA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGlmKHN0cmluZ09iamVjdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nT2JqZWN0WzBdXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwiY29sb3JcIjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldENvbnZlcnRlZFN0cmluZyhvYmplY3QsZmllbGQuZmllbGRfbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImNoaXBzXCI6XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWUpICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkodmFsdWUpKXtcclxuICAgICAgICAgIGxldCBuYW1lID0gXCJcIjtcclxuICAgICAgICAgIGZvcihsZXQgaT0wIDtpPHZhbHVlLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWVbaV1bJ25hbWUnXSkpe1xyXG4gICAgICAgICAgICAgIG5hbWUgPSBuYW1lKycsICcrdmFsdWVbaV1bJ25hbWUnXTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUrJywgJyt2YWx1ZVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDIpOztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiLVwiO1xyXG4gICAgICBjYXNlIFwicmVmZXJlbmNlX25hbWVzXCI6XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWUpICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkodmFsdWUpKXtcclxuICAgICAgICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICAgICAgICBmb3IobGV0IGk9MCA7aTx2YWx1ZS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHZhbHVlW2ldWyduYW1lJ10pKXtcclxuICAgICAgICAgICAgICBuYW1lID0gbmFtZSsnLCAnK3ZhbHVlW2ldWyduYW1lJ107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKG5hbWUubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuIFwiLVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgZGVmYXVsdDogcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRWYWx1ZUZvckdyaWRUb29sdGlwKGZpZWxkOmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IHZhbHVlID0gJyc7XHJcbiAgICBpZiAoZmllbGQuZmllbGRfbmFtZSAhPSB1bmRlZmluZWQgJiYgZmllbGQuZmllbGRfbmFtZSAhPSBudWxsICYmIGZpZWxkLmZpZWxkX25hbWUgIT0gJycpIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShmaWVsZC5maWVsZF9uYW1lLCBvYmplY3QpXHJcbiAgICB9XHJcbiAgICBpZiAoIWZpZWxkLnR5cGUpIGZpZWxkLnR5cGUgPSBcIlRleHRcIjtcclxuICAgIHN3aXRjaCAoZmllbGQudHlwZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzogcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eSBoOm1tIGEnKTtcclxuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgY2FzZSAndGltZSc6IHJldHVybiB0aGlzLmlzRGF0ZSh2YWx1ZSkgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2g6bW0gYScpIDogdmFsdWU7XHJcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6IHJldHVybiB2YWx1ZSA/IFwiWWVzXCIgOiBcIk5vXCI7XHJcbiAgICAgIGNhc2UgXCJjdXJyZW5jeVwiOiByZXR1cm4gdGhpcy5DdXJyZW5jeVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnSU5SJyk7XHJcbiAgICAgIGNhc2UgXCJpbmZvXCI6XHJcbiAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgIGNhc2UgXCJ0ZW1wbGF0ZVwiOlxyXG4gICAgICBjYXNlIFwiaW1hZ2VcIjpcclxuICAgICAgY2FzZSBcImljb25cIjpcclxuICAgICAgY2FzZSBcImh0bWxcIjpcclxuICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXROb09mSXRlbXMoZ3JpZDphbnksIGRlZmF1bHROb09mSXRlbTphbnkpIHtcclxuICAgIGlmKGdyaWQgJiYgZ3JpZC5kZXRhaWxzICYmIGdyaWQuZGV0YWlscy5udW1iZXJPZkl0ZW1zKSB7XHJcbiAgICAgIGRlZmF1bHROb09mSXRlbSA9IGdyaWQuZGV0YWlscy5udW1iZXJPZkl0ZW1zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlZmF1bHROb09mSXRlbTtcclxuICB9XHJcbiAgc2V0T2xkVGFiQ291bnQodGFiOmFueSkge1xyXG4gICAgbGV0IGRhdGFDb3VudDphbnkgPSB7fTtcclxuICAgIGxldCBjb3VudDphbnkgPSB7fTtcclxuICAgIGxldCB0b3RhbERhdGFDb3VudDphbnkgPSB7fTtcclxuICAgIGNvbnN0IGN1cnJlbnRUYWJOYW1lID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY3RpdmVNZW51KClbJ25hbWUnXTtcclxuICAgIGNvbnN0IGtleSA9IGN1cnJlbnRUYWJOYW1lK1wiX1wiK3RhYi5uYW1lO1xyXG4gICAgdG90YWxEYXRhQ291bnQgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0R3JpZENvdW50RGF0YSgpO1xyXG4gICAgbGV0IG9sZERhdGFTaXplID0gdG90YWxEYXRhQ291bnRba2V5XTtcclxuICAgIGNvdW50W2tleV0gPSBvbGREYXRhU2l6ZTtcclxuICAgIGRhdGFDb3VudFsnY291bnQnXSA9IGNvdW50O1xyXG4gICAgZGF0YUNvdW50WydncmlkQ291bnREYXRhJ10gPSB0b3RhbERhdGFDb3VudDtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWRDb3VudERhdGEoZGF0YUNvdW50KTtcclxuICB9XHJcbiAgY29tcGFyZUF1ZGl0SGlzdG9yeURhdGEoZm9ybUZpZWxkc0RhdGE6YW55LGN1cnJlbnRPYmplY3REYXRhOmFueSxwcmV2aW91c09iamVjdERhdGE6YW55KXtcclxuICAgICAgbGV0IGZvcm1GaWVsZHMgPSBmb3JtRmllbGRzRGF0YTtcclxuICAgICAgbGV0IGN1cnJlbnRPYmogPSB7fTtcclxuICAgICAgbGV0IHByZXZpb3VzT2JqZWN0ID0ge307XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUZpZWxkcy5sZW5ndGg7IGkrKyApIHtcclxuICAgICAgICBsZXQgZmllbGQgPSBmb3JtRmllbGRzW2ldO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICBpZihmaWVsZCAmJiBmaWVsZC5maWVsZF9uYW1lKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRPYmogPSBjdXJyZW50T2JqZWN0RGF0YVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgcHJldmlvdXNPYmplY3QgPSBwcmV2aW91c09iamVjdERhdGFbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgIGlmKGN1cnJlbnRPYmogIT0gbnVsbCAmJiBjdXJyZW50T2JqICE9IHVuZGVmaW5lZCAmJiB0eXBlb2YgY3VycmVudE9iaiA9PSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgY3VycmVudE9iaiA9IGN1cnJlbnRPYmplY3REYXRhW2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgICAgcHJldmlvdXNPYmplY3QgPSBwcmV2aW91c09iamVjdERhdGFbZmllbGQuZmllbGRfbmFtZV0ubmFtZTtcclxuICAgICAgICAgICAgICBpZihjdXJyZW50T2JqICE9IHByZXZpb3VzT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmKGN1cnJlbnRPYmogIT0gcHJldmlvdXNPYmplY3Qpe1xyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmllbGRbJ2lzQ2hhbmdlZCddID0gaXNDaGFuZ2VkO1xyXG4gICAgICAgICAgICBmb3JtRmllbGRzRGF0YVtpXSA9IGZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuICBjb3BtYXJlTGlzdE9mRmllbGRzKGZpZWxkczphbnksY3VycmVudE9iamVjdERhdGE6YW55LHByZXZpb3VzT2JqZWN0RGF0YTphbnkpe1xyXG4gICAgbGV0IGN1cnJlbnREYXRhOmFueVtdID0gY3VycmVudE9iamVjdERhdGFbZmllbGRzLmZpZWxkX25hbWVdO1xyXG4gICAgbGV0IHByZXZpb3VzRGF0YTphbnlbXSA9IHByZXZpb3VzT2JqZWN0RGF0YVtmaWVsZHMuZmllbGRfbmFtZV07XHJcbiAgICBsZXQgY3VycmVudE9iajphbnk7XHJcbiAgICBsZXQgcHJldmlvdXNPYmplY3Q6YW55O1xyXG4gICAgaWYoY3VycmVudE9iamVjdERhdGFbZmllbGRzLmZpZWxkX25hbWVdICYmIGN1cnJlbnRPYmplY3REYXRhW2ZpZWxkcy5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzLmxpc3Rfb2ZfZmllbGRzW2ldXHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGF0YS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgbGV0IGNvbXBhcmVjdXJyZW50T2JqID0gY3VycmVudERhdGFbal07XHJcbiAgICAgICAgICAgIGNvbXBhcmVjdXJyZW50T2JqID0gY29tcGFyZWN1cnJlbnRPYmpbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBsZXQgY29tcGFyZXByZXZpb3VzT2JqZWN0ID0gcHJldmlvdXNEYXRhW2pdO1xyXG4gICAgICAgICAgICBjb21wYXJlcHJldmlvdXNPYmplY3QgPSBjb21wYXJlcHJldmlvdXNPYmplY3RbZmllbGQuZmllbGRfbmFtZV07XHJcblxyXG4gICAgICAgICAgaWYoY29tcGFyZWN1cnJlbnRPYmogIT0gbnVsbCAmJiBjb21wYXJlY3VycmVudE9iaiAhPSB1bmRlZmluZWQgJiYgdHlwZW9mIGNvbXBhcmVjdXJyZW50T2JqID09ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgY3VycmVudE9iaiA9IGNvbXBhcmVjdXJyZW50T2JqW2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgIHByZXZpb3VzT2JqZWN0ID0gY29tcGFyZXByZXZpb3VzT2JqZWN0W2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgIGlmKGNvbXBhcmVjdXJyZW50T2JqICE9IGNvbXBhcmVwcmV2aW91c09iamVjdCkge1xyXG4gICAgICAgICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgaWYoY29tcGFyZWN1cnJlbnRPYmogIT0gY29tcGFyZXByZXZpb3VzT2JqZWN0KXtcclxuICAgICAgICAgICAgICBpZihjb21wYXJlY3VycmVudE9iaiAhPSBudWxsICYmIGNvbXBhcmVjdXJyZW50T2JqICE9IHVuZGVmaW5lZCAmJiBjb21wYXJlcHJldmlvdXNPYmplY3QgIT0gbnVsbCAmJiBjb21wYXJlcHJldmlvdXNPYmplY3QgIT0gdW5kZWZpbmVkICkge1xyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGRbJ2lzQ2hhbmdlZCddID0gaXNDaGFuZ2VkO1xyXG4gICAgICAgIGZpZWxkc1tpXSA9IGZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFBhZ2UocGFnZTogbnVtYmVyLHNlbGVjdENvbnRhY3Q6YW55LHRhYkZpbHRlckRhdGE6YW55LHRhYjphbnksY3VycmVudE1lbnU6YW55LGhlYWRFbGVtZW50czphbnksZmlsdGVyRm9ybVZhbHVlOmFueSxzb3J0aW5nQ29sdW1uTmFtZTpzdHJpbmcscmVjb3JkSWQ6YW55LHJvd0lkOmFueSxxdWVyeVBhcmFtczphbnksaXRlbU51bU9mR3JpZDphbnksZ3JpZERpc2FibGU6YW55LG1vZGlmeUdyaWREYXRhOmFueSxlbGVtZW50czphbnkpIHtcclxuICAgIGxldCByZXNwb25jZSA9IHtcclxuICAgICAgXCJwYWdlTnVtYmVyXCI6cGFnZSxcclxuICAgICAgXCJtb2RpZnlHcmlkRGF0YVwiOm1vZGlmeUdyaWREYXRhLFxyXG4gICAgICBcImVsZW1lbnRzXCI6ZWxlbWVudHNcclxuICAgIH1cclxuICAgIC8vIHRoaXMucGFnZU51bWJlciA9IHBhZ2U7XHJcbiAgICBsZXQgY29udGFjdDphbnkgPSB7fTtcclxuICAgIGxldCBsZWFkSWQgPSAnJztcclxuICAgIGlmKHNlbGVjdENvbnRhY3QgIT0gJycpe1xyXG4gICAgICB0YWJGaWx0ZXJEYXRhLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudC5faWQgPT0gc2VsZWN0Q29udGFjdFsnX2lkJ10pe1xyXG4gICAgICAgICAgY29udGFjdCAgPSBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGNvbnRhY3RbJ2xlYWQnXSAmJiBjb250YWN0WydsZWFkJ10uX2lkKXtcclxuICAgICAgICBsZWFkSWQgPSBjb250YWN0WydsZWFkJ10uX2lkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWdlUGF5bG9hZDphbnkgPSB0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBhZ2UocGFnZSx0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlckZvcm1WYWx1ZSxsZWFkSWQpXHJcbiAgICBpZihzb3J0aW5nQ29sdW1uTmFtZSl7XHJcbiAgICAgIHBhZ2VQYXlsb2FkW1wicGF0aFwiXSA9IHNvcnRpbmdDb2x1bW5OYW1lO1xyXG4gICAgfVxyXG4gICAgbGV0IGNyTGlzdCA9IHBhZ2VQYXlsb2FkLmRhdGEuY3JMaXN0O1xyXG4gICAgbGV0IGNyaXRlcmlhTGlzdCA9IFtdO1xyXG4gICAgaWYocmVjb3JkSWQpe1xyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBcIl9pZDtlcTtcIityZWNvcmRJZCtcIjtTVEFUSUNcIjtcclxuICAgICAgY3JpdGVyaWFMaXN0LnB1c2goY3JpdGVyaWEpO1xyXG4gICAgfVxyXG4gICAgaWYocm93SWQpe1xyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBcInNlcmlhbElkO2VxO1wiK3Jvd0lkK1wiO1NUQVRJQ1wiO1xyXG4gICAgICBjcml0ZXJpYUxpc3QucHVzaChjcml0ZXJpYSk7XHJcbiAgICB9XHJcbiAgICBpZihPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubGVuZ3RoID4gMCl7XHJcbiAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5mb3JFYWNoKGtleSA9PntcclxuICAgICAgICBsZXQgY3JpdGVyaWEgPSBrZXkrXCI7ZXE7XCIrcXVlcnlQYXJhbXNba2V5XStcIjtTVEFUSUNcIjtcclxuICAgICAgICBjcml0ZXJpYUxpc3QucHVzaChjcml0ZXJpYSk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZihjcml0ZXJpYUxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhTGlzdCx7fSkuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBjckxpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBhZ2VQYXlsb2FkLmRhdGEuY3JMaXN0ID0gY3JMaXN0O1xyXG4gICAgfVxyXG4gICAgcGFnZVBheWxvYWQuZGF0YS5wYWdlU2l6ZSA9IGl0ZW1OdW1PZkdyaWQ7XHJcbiAgICB0aGlzLmdldEdyaWRQYXlsb2FkRGF0YShwYWdlUGF5bG9hZCxmaWx0ZXJGb3JtVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgb25Tb3J0KGNvbHVtbk9iamVjdDphbnksZmlsdGVyRm9ybVZhbHVlOmFueSxncmlkRGlzYWJsZTpib29sZWFuLHRhYjphbnksc29ydGluZ0NvbHVtbk5hbWU6YW55LHNvcnRJY29uOmFueSxvcmRlckJ5OmFueSxoZWFkRWxlbWVudHM6YW55LGN1cnJlbnRNZW51OmFueSxwYWdlTnVtYmVyOm51bWJlcikge1xyXG4gICAgbGV0IHJlc3BvbmNlID0ge1xyXG4gICAgICBcInNvcnRpbmdDb2x1bW5OYW1lXCI6c29ydGluZ0NvbHVtbk5hbWUsXHJcbiAgICAgIFwic29ydEljb25cIjpzb3J0SWNvbixcclxuICAgICAgXCJvcmRlckJ5XCI6b3JkZXJCeVxyXG4gICAgfVxyXG4gICAgcmVzcG9uY2Uuc29ydGluZ0NvbHVtbk5hbWUgPSByZXNwb25jZS5vcmRlckJ5ICsgY29sdW1uT2JqZWN0LmZpZWxkX25hbWU7XHJcbiAgICBjb25zdCBnZXRTb3J0RGF0YSA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0RGF0YUZvckdyaWRGaWx0ZXIocGFnZU51bWJlcix0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlckZvcm1WYWx1ZSk7XHJcbiAgICBnZXRTb3J0RGF0YVsncGF0aCddID0gcmVzcG9uY2Uuc29ydGluZ0NvbHVtbk5hbWU7XHJcbiAgICB0aGlzLmdldEdyaWRQYXlsb2FkRGF0YShnZXRTb3J0RGF0YSxmaWx0ZXJGb3JtVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIGlmIChyZXNwb25jZS5vcmRlckJ5ID09ICctJykge1xyXG4gICAgICByZXNwb25jZS5vcmRlckJ5ID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNwb25jZS5vcmRlckJ5ID0gJy0nO1xyXG4gICAgfVxyXG4gICAgcmVzcG9uY2Uuc29ydEljb249PVwiZG93blwiPyAocmVzcG9uY2Uuc29ydEljb249XCJ1cC1hbHRcIik6IChyZXNwb25jZS5zb3J0SWNvbj1cImRvd25cIik7XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGFwcGx5RmlsdGVyKG1vZGlmeUdyaWREYXRhOmFueSxlbGVtZW50czphbnksdGFiOmFueSxjdXJyZW50TWVudTphbnksaGVhZEVsZW1lbnRzOmFueSxmaWx0ZXJWYWx1ZTphbnksc2VsZWN0Q29udGFjdDphbnksaXRlbU51bU9mR3JpZDphbnksZ3JpZERpc2FibGU6Ym9vbGVhbixzb3J0aW5nQ29sdW1uTmFtZTphbnkpIHtcclxuICAgIGxldCByZXNwb25jZSA9IHtcclxuICAgICAgXCJtb2RpZnlHcmlkRGF0YVwiOm1vZGlmeUdyaWREYXRhLFxyXG4gICAgICBcImVsZW1lbnRzXCI6ZWxlbWVudHMsXHJcbiAgICAgIFwicGFnZU51bWJlclwiOjFcclxuICAgIH1cclxuICAgIGxldCBwYWdlUGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0RGF0YUZvckdyaWQocmVzcG9uY2UucGFnZU51bWJlcix0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlclZhbHVlLHNlbGVjdENvbnRhY3QpO1xyXG4gICAgaWYoc29ydGluZ0NvbHVtbk5hbWUpe1xyXG4gICAgICBwYWdlUGF5bG9hZFtcInBhdGhcIl0gPSBzb3J0aW5nQ29sdW1uTmFtZTtcclxuICAgIH1cclxuICAgIHBhZ2VQYXlsb2FkLmRhdGEucGFnZVNpemUgPSBpdGVtTnVtT2ZHcmlkO1xyXG4gICAgdGhpcy5nZXRHcmlkUGF5bG9hZERhdGEocGFnZVBheWxvYWQsZmlsdGVyVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgZ2V0R3JpZFBheWxvYWREYXRhKHBhZ2VQYXlsb2FkOmFueSx2YWx1ZTphbnksZ3JpZERpc2FibGU6Ym9vbGVhbix0YWI6YW55LHJlc3BvbmNlOmFueSkge1xyXG4gICAgaWYodGhpcy5jaGVja0lmU2VydmljZS5jaGVja0NhbGxHcmlkRGF0YSh2YWx1ZSxncmlkRGlzYWJsZSkpe1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0R3JpZERhdGEocGFnZVBheWxvYWQpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICByZXNwb25jZS5tb2RpZnlHcmlkRGF0YSA9IFtdO1xyXG4gICAgICByZXNwb25jZS5lbGVtZW50cyA9IFtdO1xyXG4gICAgICB0aGlzLnNldE9sZFRhYkNvdW50KHRhYik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==