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,6 @@
1
+ /**
2
+ * Node for to-do item
3
+ */
4
+ export class TodoItemNode {
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90cmVlLWNvbXBvbmVudC9pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDRixNQUFNLE9BQU8sWUFBWTtDQVN2QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBOb2RlIGZvciB0by1kbyBpdGVtXHJcbiAqL1xyXG4gZXhwb3J0IGNsYXNzIFRvZG9JdGVtTm9kZSB7XHJcbiAgICBcImNoaWxkcmVuXCI6IFRvZG9JdGVtTm9kZVtdO1xyXG4gICAgXCJpdGVtXCI6IHN0cmluZztcclxuICAgIFwicmVmZXJlbmNlXCI6YW55O1xyXG4gICAgXCJjcml0ZXJpYVwiOmFueTtcclxuICAgIFwicElkXCI6c3RyaW5nO1xyXG4gICAgXCJwSW5kZXhcIjpzdHJpbmc7XHJcbiAgICBcIl9pZFwiOnN0cmluZztcclxuICAgIFwiYWN0aW9uXCI6YW55O1xyXG4gIH1cclxuIl19
@@ -0,0 +1,394 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { TodoItemNode } from './interface';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../common-utils/common-function.service";
6
+ import * as i2 from "./../check-if/check-if.service";
7
+ export class TreeComponentService {
8
+ get data() {
9
+ return this.dataChange.value;
10
+ }
11
+ constructor(commonfunctionService, checkIfService) {
12
+ this.commonfunctionService = commonfunctionService;
13
+ this.checkIfService = checkIfService;
14
+ this.dataChange = new BehaviorSubject([]);
15
+ this.applyRelationships = (data) => {
16
+ let levelStack = [], lastNode = null;
17
+ return data.map((curr, index) => {
18
+ const node = { ...curr, id: index + 1 };
19
+ if (levelStack.length === 0) {
20
+ levelStack.push({ level: node.level, parent: 0 });
21
+ }
22
+ else {
23
+ const last = levelStack[levelStack.length - 1];
24
+ if (node.level > last.level) {
25
+ levelStack.push({ level: node.level, parent: lastNode.id });
26
+ }
27
+ else if (node.level < last.level) {
28
+ const levelDiff = last.level - node.level - 1, lastIndex = levelStack.length - 1;
29
+ levelStack.splice(lastIndex - levelDiff, lastIndex);
30
+ }
31
+ }
32
+ node.parentId = levelStack[levelStack.length - 1].parent;
33
+ lastNode = node;
34
+ return node;
35
+ });
36
+ };
37
+ this.listToTree = (arr = []) => {
38
+ let indexMap = new Map();
39
+ arr.forEach((node, index) => {
40
+ indexMap.set(node.id, index);
41
+ node.children = [];
42
+ });
43
+ return arr.reduce((res, node, index, all) => {
44
+ if (node.parentId === 0)
45
+ return [...res, node];
46
+ all[indexMap.get(node.parentId)].children.push(node);
47
+ return res;
48
+ }, []);
49
+ };
50
+ this.treeToObject = (tree = [], result = {}) => {
51
+ tree.forEach((child) => {
52
+ let modifyObj = {};
53
+ modifyObj['reference'] = child.reference;
54
+ if (child && child.criteria) {
55
+ modifyObj['criteria'] = child.criteria;
56
+ }
57
+ if (child.allSelected) {
58
+ modifyObj['reference']['allSelected'] = child.allSelected;
59
+ }
60
+ if (child.select) {
61
+ modifyObj['reference']['select'] = child.select;
62
+ }
63
+ if (child.level == 0) {
64
+ result[child.item] = modifyObj;
65
+ }
66
+ else if (child.expandable) {
67
+ if (!result[child.type])
68
+ result[child.type] = {};
69
+ result[child.type][child.item] = modifyObj;
70
+ }
71
+ else {
72
+ if (!result[child.type])
73
+ result[child.type] = {};
74
+ result[child.type][child.item] = modifyObj;
75
+ }
76
+ if (child.children && child.children.length > 0) {
77
+ this.treeToObject(child.children, child.level == 0 ? result[child.item] : result[child.type][child.item]);
78
+ }
79
+ });
80
+ return result;
81
+ };
82
+ }
83
+ /**
84
+ * Build the file structure tree. The `value` is the Json object, or a sub-tree of a Json object.
85
+ * The return value is the list of `TodoItemNode`.
86
+ */
87
+ buildFileTree(obj, level, keys) {
88
+ return Object.keys(obj).reduce((accumulator, key, i) => {
89
+ const value = obj[key];
90
+ const pId = value['reference']['_id'];
91
+ const node = new TodoItemNode();
92
+ node.item = key;
93
+ node.reference = value['reference'];
94
+ if (value && value.criteria) {
95
+ node['criteria'] = value.criteria;
96
+ }
97
+ node._id = pId;
98
+ if (value['pId']) {
99
+ node.pId = value['pId'];
100
+ }
101
+ if (level == 0) {
102
+ let index = i + 1;
103
+ node.pIndex = '' + index;
104
+ }
105
+ else {
106
+ node.pIndex = value.pIndex;
107
+ }
108
+ if (value != null) {
109
+ let nextKey = keys[level];
110
+ let next = value[nextKey];
111
+ if (next == null) {
112
+ nextKey = keys[level + 1];
113
+ next = value[nextKey];
114
+ }
115
+ if (next && typeof next === 'object') {
116
+ Object.keys(next).forEach((childKey, i) => {
117
+ next[childKey].pIndex = node.pIndex + '.' + (i + 1);
118
+ next[childKey].pId = pId;
119
+ });
120
+ node.children = this.buildFileTree(next, level + 1, keys);
121
+ }
122
+ else {
123
+ node.item = key;
124
+ }
125
+ }
126
+ return accumulator.concat(node);
127
+ }, []);
128
+ }
129
+ convertParentNodeToChildNodeList(list, fields) {
130
+ let parentGroup = [];
131
+ let childList = [];
132
+ let previousIndex = -1;
133
+ let resultList = [];
134
+ for (let i = 0; i < list.length; i++) {
135
+ const node = list[i];
136
+ const pIndex = node.pIndex;
137
+ if (pIndex && pIndex != '') {
138
+ const indexlist = pIndex.split('.');
139
+ if (indexlist && indexlist.length == 3) {
140
+ if (previousIndex != -1) {
141
+ if (previousIndex == indexlist.length) {
142
+ if (parentGroup.length == 3) {
143
+ parentGroup.splice((parentGroup.length - 1), 1);
144
+ }
145
+ childList.push(node);
146
+ }
147
+ else {
148
+ if (parentGroup.length > 0 && childList.length > 0) {
149
+ this.addChildParentList(parentGroup, childList, fields, resultList);
150
+ childList = [];
151
+ parentGroup.splice((parentGroup.length - 1), 1);
152
+ parentGroup.push(node);
153
+ previousIndex = indexlist.length;
154
+ }
155
+ }
156
+ }
157
+ else {
158
+ parentGroup.push(node);
159
+ childList.push(node);
160
+ }
161
+ previousIndex = indexlist.length;
162
+ }
163
+ else if (indexlist && indexlist.length == 4) {
164
+ if (previousIndex == 3) {
165
+ childList = [];
166
+ childList.push(node);
167
+ }
168
+ else {
169
+ childList.push(node);
170
+ }
171
+ previousIndex = indexlist.length;
172
+ }
173
+ else if (indexlist && indexlist.length == 2) {
174
+ if (parentGroup.length > 0 && childList.length > 0) {
175
+ this.addChildParentList(parentGroup, childList, fields, resultList);
176
+ childList = [];
177
+ const firstParent = [];
178
+ firstParent.push(parentGroup[0]);
179
+ parentGroup = [];
180
+ parentGroup.push(firstParent[0]);
181
+ parentGroup.push(node);
182
+ }
183
+ else {
184
+ parentGroup.push(node);
185
+ }
186
+ previousIndex = -1;
187
+ }
188
+ else {
189
+ if (childList.length > 0) {
190
+ this.addChildParentList(parentGroup, childList, fields, resultList);
191
+ childList = [];
192
+ }
193
+ parentGroup = [];
194
+ parentGroup.push(node);
195
+ previousIndex = -1;
196
+ }
197
+ if (list.length == i + 1) {
198
+ if (parentGroup.length > 0 && childList.length > 0) {
199
+ this.addChildParentList(parentGroup, childList, fields, resultList);
200
+ childList = [];
201
+ parentGroup = [];
202
+ }
203
+ }
204
+ }
205
+ }
206
+ return resultList;
207
+ }
208
+ addChildParentList(parentList, ChildList, fields, result) {
209
+ ChildList.forEach((child) => {
210
+ let obj = {};
211
+ if (parentList.length == 2) {
212
+ fields.forEach((field, i) => {
213
+ if (i == 2) {
214
+ obj[field.field_name] = null;
215
+ }
216
+ else if (i == 3) {
217
+ obj[field.field_name] = child.reference;
218
+ }
219
+ else {
220
+ obj[field.field_name] = parentList[i].reference;
221
+ }
222
+ });
223
+ }
224
+ else if (parentList.length == 3) {
225
+ fields.forEach((field, i) => {
226
+ if (i == 3) {
227
+ obj[field.field_name] = child.reference;
228
+ }
229
+ else {
230
+ obj[field.field_name] = parentList[i].reference;
231
+ }
232
+ });
233
+ }
234
+ result.push(obj);
235
+ });
236
+ // if(list && fields && list.length == fields.length){
237
+ // checkSubMenu = false;
238
+ // }
239
+ // let object = {};
240
+ // for (let i = 0; i < list.length; i++) {
241
+ // const element = list[i];
242
+ // let field = fields[i];
243
+ // let fieldName = field.field_name;
244
+ // if(i == 2){
245
+ // if(list && list.length == 3){
246
+ // }
247
+ // }else{
248
+ // object[fieldName] = element.reference;
249
+ // }
250
+ // if(list && list.length == (i+1)){
251
+ // result.push(object);
252
+ // }
253
+ // }
254
+ }
255
+ //this function for get selected node tree
256
+ getSelectedNodeWithParent(allNodes, selectedNodes, keys) {
257
+ let selectedNodesWithParent = [];
258
+ if (allNodes && allNodes.length > 0 && selectedNodes && selectedNodes.length > 0) {
259
+ selectedNodes.forEach((selectNode) => {
260
+ if (selectNode) {
261
+ if ((keys.includes(selectNode.type) || selectNode.level == 0) && selectNode.expandable) {
262
+ selectNode.allSelected = true;
263
+ }
264
+ else {
265
+ selectNode.allSelected = false;
266
+ }
267
+ selectNode.select = true;
268
+ let groupList = [];
269
+ let check = this.checkIfService.checkDataAlreadyAddedInListOrNot({ "field_name": '_id' }, selectNode._id, groupList);
270
+ if (!check.status) {
271
+ groupList.push(selectNode);
272
+ }
273
+ this.findChildToParentNode(allNodes, selectNode, groupList, selectedNodesWithParent);
274
+ }
275
+ });
276
+ }
277
+ return selectedNodesWithParent;
278
+ }
279
+ findChildToParentNode(allNodes, selectNode, groupList, selectedNodesWithParent) {
280
+ if (selectNode && selectNode.pId) {
281
+ let parentIndex = this.commonfunctionService.getIndexInArrayById(allNodes, selectNode.pId, 'reference._id');
282
+ if (parentIndex != -1) {
283
+ let parentNode = allNodes[parentIndex];
284
+ let check = this.checkIfService.checkDataAlreadyAddedInListOrNot({ "field_name": '_id' }, parentNode._id, groupList);
285
+ if (!check.status) {
286
+ groupList.push(parentNode);
287
+ }
288
+ this.findChildToParentNode(allNodes, parentNode, groupList, selectedNodesWithParent);
289
+ }
290
+ }
291
+ else {
292
+ let check = this.checkIfService.checkDataAlreadyAddedInListOrNot({ "field_name": '_id' }, selectNode._id, groupList);
293
+ if (!check.status) {
294
+ groupList.push(selectNode);
295
+ }
296
+ }
297
+ return this.modifyParentChild(selectedNodesWithParent, groupList);
298
+ }
299
+ modifyParentChild(selectedNodesWithParent, groupList) {
300
+ let sortedData = groupList.sort((a, b) => a.level - b.level);
301
+ if (sortedData && sortedData.length > 0) {
302
+ sortedData.forEach((data) => {
303
+ let check = this.checkIfService.checkDataAlreadyAddedInListOrNot({ "field_name": '_id' }, data._id, selectedNodesWithParent);
304
+ if (check.status) {
305
+ let existDataIndex = this.commonfunctionService.getIndexInArrayById(selectedNodesWithParent, data._id);
306
+ let object = selectedNodesWithParent[existDataIndex];
307
+ if (object.pIndex != data.pIndex) {
308
+ check.status = false;
309
+ }
310
+ }
311
+ if (!check.status) {
312
+ selectedNodesWithParent.push(data);
313
+ }
314
+ });
315
+ }
316
+ return selectedNodesWithParent;
317
+ }
318
+ modifySelectedDataWithParentId(selectedData) {
319
+ let modifyList = selectedData.sort((a, b) => a.pIndex.localeCompare(b.pIndex, undefined, { numeric: true }));
320
+ //arr.sort( (a, b) => a.localeCompare(b, undefined, { numeric:true }) );
321
+ return modifyList;
322
+ }
323
+ //this function for get selected node tree
324
+ //This function for convet list to tree map
325
+ convertTreeToList(list, result) {
326
+ if (list && list.length > 0) {
327
+ list.forEach((child) => {
328
+ let childrenList = [];
329
+ if (child && child.children && child.children != null) {
330
+ childrenList = JSON.parse(JSON.stringify(child.children));
331
+ }
332
+ delete child.children;
333
+ result.push(child);
334
+ if (childrenList && childrenList.length > 0) {
335
+ this.convertTreeToList(childrenList, result);
336
+ }
337
+ });
338
+ }
339
+ return result;
340
+ }
341
+ buildTreeObject(arr = []) {
342
+ let relationShip = this.applyRelationships(arr);
343
+ let list = this.listToTree(relationShip);
344
+ let tree = this.treeToObject(list);
345
+ return tree;
346
+ }
347
+ //This function for convet list to tree map
348
+ /** Add an item to to-do list */
349
+ insertItem(parent, name) {
350
+ if (parent.children) {
351
+ parent.children.push({ item: name });
352
+ this.dataChange.next(this.data);
353
+ }
354
+ }
355
+ updateItem(node, name) {
356
+ node.item = name;
357
+ this.dataChange.next(this.data);
358
+ }
359
+ updateTreeViewData(responce, field, treeViewData) {
360
+ let result = {
361
+ treeViewData: treeViewData
362
+ };
363
+ const fieldName = field.field_name;
364
+ let keys = [];
365
+ let fields = [];
366
+ if (field && field.treeViewKeys) {
367
+ keys = field.treeViewKeys;
368
+ }
369
+ if (field && field.fields && field.fields.length > 0) {
370
+ fields = field.fields;
371
+ }
372
+ const treeData = this.buildFileTree(responce, 0, keys);
373
+ //console.log(treeData);
374
+ let selectedNodeList = this.convertTreeToList(JSON.parse(JSON.stringify(treeData)), []);
375
+ let childList = [];
376
+ if (fields && fields.length > 0) {
377
+ childList = this.convertParentNodeToChildNodeList(selectedNodeList, fields);
378
+ }
379
+ //console.log(selectedNodeList);
380
+ //console.log(childList);
381
+ //this.dataSource[fieldName].data = treeData;
382
+ result.treeViewData[fieldName] = childList;
383
+ return result;
384
+ }
385
+ }
386
+ TreeComponentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeComponentService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CheckIfService }], target: i0.ɵɵFactoryTarget.Injectable });
387
+ TreeComponentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeComponentService, providedIn: 'root' });
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeComponentService, decorators: [{
389
+ type: Injectable,
390
+ args: [{
391
+ providedIn: 'root'
392
+ }]
393
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CheckIfService }]; } });
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb21wb25lbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvdHJlZS1jb21wb25lbnQvdHJlZS1jb21wb25lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQzs7OztBQUt6QyxNQUFNLE9BQU8sb0JBQW9CO0lBRy9CLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQ1UscUJBQTJDLEVBQzNDLGNBQTZCO1FBRDdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0MsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFSdkMsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFpQixFQUFFLENBQUMsQ0FBQztRQXdRckQsdUJBQWtCLEdBQUcsQ0FBQyxJQUFRLEVBQUUsRUFBRTtZQUNoQyxJQUFJLFVBQVUsR0FBTyxFQUFFLEVBQUUsUUFBUSxHQUFPLElBQUksQ0FBQztZQUM3QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFRLEVBQUUsS0FBWSxFQUFFLEVBQUU7Z0JBQ3pDLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDM0IsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUs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LENBQUMsQ0FBQztTQUM1RTtRQUNELGdDQUFnQztRQUNoQyx5QkFBeUI7UUFDekIsNkNBQTZDO1FBQzdDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O2tIQXRYVSxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGVja0lmU2VydmljZSB9IGZyb20gJy4vLi4vY2hlY2staWYvY2hlY2staWYuc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RvZG9JdGVtTm9kZX0gZnJvbSAnLi9pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZUNvbXBvbmVudFNlcnZpY2Uge1xyXG4gIGRhdGFDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRvZG9JdGVtTm9kZVtdPihbXSk7XHJcblxyXG4gIGdldCBkYXRhKCk6IFRvZG9JdGVtTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFDaGFuZ2UudmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uZnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hlY2tJZlNlcnZpY2U6Q2hlY2tJZlNlcnZpY2VcclxuICApIHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGZpbGUgc3RydWN0dXJlIHRyZWUuIFRoZSBgdmFsdWVgIGlzIHRoZSBKc29uIG9iamVjdCwgb3IgYSBzdWItdHJlZSBvZiBhIEpzb24gb2JqZWN0LlxyXG4gICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxpc3Qgb2YgYFRvZG9JdGVtTm9kZWAuXHJcbiAgICovXHJcbiAgYnVpbGRGaWxlVHJlZShvYmo6IHtba2V5OiBzdHJpbmddOiBhbnl9LCBsZXZlbDogbnVtYmVyLGtleXM6YW55KTogVG9kb0l0ZW1Ob2RlW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlPFRvZG9JdGVtTm9kZVtdPigoYWNjdW11bGF0b3IsIGtleSxpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgIGNvbnN0IHBJZDphbnkgPSB2YWx1ZVsncmVmZXJlbmNlJ11bJ19pZCddO1xyXG4gICAgICBjb25zdCBub2RlID0gbmV3IFRvZG9JdGVtTm9kZSgpO1xyXG4gICAgICBub2RlLml0ZW0gPSBrZXk7XHJcbiAgICAgIG5vZGUucmVmZXJlbmNlID0gdmFsdWVbJ3JlZmVyZW5jZSddO1xyXG4gICAgICBpZih2YWx1ZSAmJiB2YWx1ZS5jcml0ZXJpYSl7XHJcbiAgICAgICAgbm9kZVsnY3JpdGVyaWEnXSA9IHZhbHVlLmNyaXRlcmlhO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUuX2lkID0gcElkO1xyXG4gICAgICBpZih2YWx1ZVsncElkJ10pe1xyXG4gICAgICAgIG5vZGUucElkID0gdmFsdWVbJ3BJZCddO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGxldmVsID09IDApe1xyXG4gICAgICAgIGxldCBpbmRleCA9IGkrMTtcclxuICAgICAgICBub2RlLnBJbmRleCA9ICcnK2luZGV4O1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBub2RlLnBJbmRleCA9IHZhbHVlLnBJbmRleDtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG5leHRLZXkgPSBrZXlzW2xldmVsXTtcclxuICAgICAgICBsZXQgbmV4dCA9IHZhbHVlW25leHRLZXldO1xyXG4gICAgICAgIGlmKG5leHQgPT0gbnVsbCl7XHJcbiAgICAgICAgICBuZXh0S2V5ID0ga2V5c1tsZXZlbCArIDFdO1xyXG4gICAgICAgICAgbmV4dCA9IHZhbHVlW25leHRLZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dCAmJiB0eXBlb2YgbmV4dCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKG5leHQpLmZvckVhY2goKGNoaWxkS2V5LGkpID0+IHtcclxuICAgICAgICAgICAgbmV4dFtjaGlsZEtleV0ucEluZGV4ID0gbm9kZS5wSW5kZXgrJy4nKyhpKzEpO1xyXG4gICAgICAgICAgICBuZXh0W2NoaWxkS2V5XS5wSWQgPSBwSWQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLmJ1aWxkRmlsZVRyZWUobmV4dCwgbGV2ZWwgKyAxLGtleXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub2RlLml0ZW0gPSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWNjdW11bGF0b3IuY29uY2F0KG5vZGUpO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgY29udmVydFBhcmVudE5vZGVUb0NoaWxkTm9kZUxpc3QobGlzdDphbnksZmllbGRzOmFueSl7XHJcbiAgICBsZXQgcGFyZW50R3JvdXA6YW55ID0gW107XHJcbiAgICBsZXQgY2hpbGRMaXN0OmFueSA9IFtdO1xyXG4gICAgbGV0IHByZXZpb3VzSW5kZXg6bnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcmVzdWx0TGlzdDphbnkgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gbGlzdFtpXTtcclxuICAgICAgY29uc3QgcEluZGV4ID0gbm9kZS5wSW5kZXg7XHJcbiAgICAgIGlmKHBJbmRleCAmJiBwSW5kZXggIT0gJycpe1xyXG4gICAgICAgIGNvbnN0IGluZGV4bGlzdCA9IHBJbmRleC5zcGxpdCgnLicpO1xyXG4gICAgICAgIGlmKGluZGV4bGlzdCAmJiBpbmRleGxpc3QubGVuZ3RoID09IDMpe1xyXG4gICAgICAgICAgaWYocHJldmlvdXNJbmRleCAhPSAtMSl7XHJcbiAgICAgICAgICAgIGlmKHByZXZpb3VzSW5kZXggPT0gaW5kZXhsaXN0Lmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgaWYocGFyZW50R3JvdXAubGVuZ3RoID09IDMpe1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXAuc3BsaWNlKChwYXJlbnRHcm91cC5sZW5ndGgtMSksMSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNoaWxkTGlzdC5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBpZihwYXJlbnRHcm91cC5sZW5ndGggPiAwICYmIGNoaWxkTGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYXJlbnRMaXN0KHBhcmVudEdyb3VwLGNoaWxkTGlzdCxmaWVsZHMscmVzdWx0TGlzdCk7XHJcbiAgICAgICAgICAgICAgICBjaGlsZExpc3QgPSBbXTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwLnNwbGljZSgocGFyZW50R3JvdXAubGVuZ3RoLTEpLDEpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXAucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzSW5kZXggPSBpbmRleGxpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgIGNoaWxkTGlzdC5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4bGlzdC5sZW5ndGg7XHJcbiAgICAgICAgfWVsc2UgaWYoaW5kZXhsaXN0ICYmIGluZGV4bGlzdC5sZW5ndGggPT0gNCl7XHJcbiAgICAgICAgICBpZihwcmV2aW91c0luZGV4ID09IDMpe1xyXG4gICAgICAgICAgICBjaGlsZExpc3QgPSBbXTtcclxuICAgICAgICAgICAgY2hpbGRMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2hpbGRMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwcmV2aW91c0luZGV4ID0gaW5kZXhsaXN0Lmxlbmd0aDtcclxuICAgICAgICB9ZWxzZSBpZihpbmRleGxpc3QgJiYgaW5kZXhsaXN0Lmxlbmd0aCA9PSAyKXtcclxuICAgICAgICAgIGlmKHBhcmVudEdyb3VwLmxlbmd0aCA+IDAgJiYgY2hpbGRMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFyZW50TGlzdChwYXJlbnRHcm91cCxjaGlsZExpc3QsZmllbGRzLHJlc3VsdExpc3QpO1xyXG4gICAgICAgICAgICBjaGlsZExpc3QgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJlbnQgPSBbXTtcclxuICAgICAgICAgICAgZmlyc3RQYXJlbnQucHVzaChwYXJlbnRHcm91cFswXSk7XHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwID0gW107XHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwLnB1c2goZmlyc3RQYXJlbnRbMF0pO1xyXG4gICAgICAgICAgICBwYXJlbnRHcm91cC5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwcmV2aW91c0luZGV4ID0gLTE7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBpZihjaGlsZExpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYXJlbnRMaXN0KHBhcmVudEdyb3VwLGNoaWxkTGlzdCxmaWVsZHMscmVzdWx0TGlzdCk7XHJcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGFyZW50R3JvdXAgPSBbXTtcclxuICAgICAgICAgIHBhcmVudEdyb3VwLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICBwcmV2aW91c0luZGV4ID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGxpc3QubGVuZ3RoID09IGkrMSl7XHJcbiAgICAgICAgICBpZihwYXJlbnRHcm91cC5sZW5ndGggPiAwICYmIGNoaWxkTGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhcmVudExpc3QocGFyZW50R3JvdXAsY2hpbGRMaXN0LGZpZWxkcyxyZXN1bHRMaXN0KTtcclxuICAgICAgICAgICAgY2hpbGRMaXN0ID0gW107XHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdExpc3Q7XHJcbiAgfVxyXG4gIGFkZENoaWxkUGFyZW50TGlzdChwYXJlbnRMaXN0OmFueSxDaGlsZExpc3Q6YW55LGZpZWxkczphbnkscmVzdWx0OmFueSl7XHJcbiAgICBDaGlsZExpc3QuZm9yRWFjaCgoY2hpbGQ6YW55KSA9PiB7XHJcbiAgICAgIGxldCBvYmo6YW55ID0ge307XHJcbiAgICAgIGlmKHBhcmVudExpc3QubGVuZ3RoID09IDIpe1xyXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnksaTpudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmKGkgPT0gMil7XHJcbiAgICAgICAgICAgIG9ialtmaWVsZC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICB9ZWxzZSBpZihpID09IDMpe1xyXG4gICAgICAgICAgICBvYmpbZmllbGQuZmllbGRfbmFtZV0gPSBjaGlsZC5yZWZlcmVuY2U7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JqW2ZpZWxkLmZpZWxkX25hbWVdID0gcGFyZW50TGlzdFtpXS5yZWZlcmVuY2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1lbHNlIGlmKHBhcmVudExpc3QubGVuZ3RoID09IDMpe1xyXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnksaTpudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmKGkgPT0gMyl7XHJcbiAgICAgICAgICAgIG9ialtmaWVsZC5maWVsZF9uYW1lXSA9IGNoaWxkLnJlZmVyZW5jZTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBvYmpbZmllbGQuZmllbGRfbmFtZV0gPSBwYXJlbnRMaXN0W2ldLnJlZmVyZW5jZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQucHVzaChvYmopO1xyXG4gICAgfSk7XHJcbiAgICAvLyBpZihsaXN0ICYmIGZpZWxkcyAmJiBsaXN0Lmxlbmd0aCA9PSBmaWVsZHMubGVuZ3RoKXtcclxuICAgIC8vICAgY2hlY2tTdWJNZW51ID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBsZXQgb2JqZWN0ID0ge307XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgY29uc3QgZWxlbWVudCA9IGxpc3RbaV07XHJcbiAgICAvLyAgIGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcclxuICAgIC8vICAgbGV0IGZpZWxkTmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgICAvLyAgIGlmKGkgPT0gMil7XHJcbiAgICAvLyAgICAgaWYobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PSAzKXtcclxuXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9ZWxzZXtcclxuICAgIC8vICAgICBvYmplY3RbZmllbGROYW1lXSA9IGVsZW1lbnQucmVmZXJlbmNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGggPT0gKGkrMSkpe1xyXG4gICAgLy8gICAgIHJlc3VsdC5wdXNoKG9iamVjdCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8vdGhpcyBmdW5jdGlvbiBmb3IgZ2V0IHNlbGVjdGVkIG5vZGUgdHJlZVxyXG4gIGdldFNlbGVjdGVkTm9kZVdpdGhQYXJlbnQoYWxsTm9kZXM6YW55LHNlbGVjdGVkTm9kZXM6YW55LGtleXM6YW55KXtcclxuICAgIGxldCBzZWxlY3RlZE5vZGVzV2l0aFBhcmVudDphbnkgPSBbXTtcclxuICAgIGlmKGFsbE5vZGVzICYmIGFsbE5vZGVzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWROb2RlcyAmJiBzZWxlY3RlZE5vZGVzLmxlbmd0aCA+IDApe1xyXG4gICAgICBzZWxlY3RlZE5vZGVzLmZvckVhY2goKHNlbGVjdE5vZGU6YW55KSA9PiB7XHJcbiAgICAgICAgaWYoc2VsZWN0Tm9kZSl7XHJcbiAgICAgICAgICBpZigoa2V5cy5pbmNsdWRlcyhzZWxlY3ROb2RlLnR5cGUpIHx8IHNlbGVjdE5vZGUubGV2ZWwgPT0gMCkmJiBzZWxlY3ROb2RlLmV4cGFuZGFibGUpe1xyXG4gICAgICAgICAgICBzZWxlY3ROb2RlLmFsbFNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzZWxlY3ROb2RlLmFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZWxlY3ROb2RlLnNlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgZ3JvdXBMaXN0OmFueSA9IFtdO1xyXG4gICAgICAgICAgbGV0IGNoZWNrID0gdGhpcy5jaGVja0lmU2VydmljZS5jaGVja0RhdGFBbHJlYWR5QWRkZWRJbkxpc3RPck5vdCh7XCJmaWVsZF9uYW1lXCI6J19pZCd9LHNlbGVjdE5vZGUuX2lkLGdyb3VwTGlzdCk7XHJcbiAgICAgICAgICBpZighY2hlY2suc3RhdHVzKXtcclxuICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2goc2VsZWN0Tm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmZpbmRDaGlsZFRvUGFyZW50Tm9kZShhbGxOb2RlcyxzZWxlY3ROb2RlLGdyb3VwTGlzdCxzZWxlY3RlZE5vZGVzV2l0aFBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RlZE5vZGVzV2l0aFBhcmVudDtcclxuICB9XHJcblxyXG4gIGZpbmRDaGlsZFRvUGFyZW50Tm9kZShhbGxOb2Rlczphbnksc2VsZWN0Tm9kZTphbnksZ3JvdXBMaXN0OmFueSxzZWxlY3RlZE5vZGVzV2l0aFBhcmVudDphbnkpe1xyXG4gICAgaWYoc2VsZWN0Tm9kZSAmJiBzZWxlY3ROb2RlLnBJZCl7XHJcbiAgICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMuY29tbW9uZnVuY3Rpb25TZXJ2aWNlLmdldEluZGV4SW5BcnJheUJ5SWQoYWxsTm9kZXMsc2VsZWN0Tm9kZS5wSWQsJ3JlZmVyZW5jZS5faWQnKTtcclxuICAgICAgaWYocGFyZW50SW5kZXggIT0gLTEpe1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gYWxsTm9kZXNbcGFyZW50SW5kZXhdO1xyXG4gICAgICAgIGxldCBjaGVjayA9IHRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tEYXRhQWxyZWFkeUFkZGVkSW5MaXN0T3JOb3Qoe1wiZmllbGRfbmFtZVwiOidfaWQnfSxwYXJlbnROb2RlLl9pZCxncm91cExpc3QpO1xyXG4gICAgICAgIGlmKCFjaGVjay5zdGF0dXMpe1xyXG4gICAgICAgICAgZ3JvdXBMaXN0LnB1c2gocGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmluZENoaWxkVG9QYXJlbnROb2RlKGFsbE5vZGVzLHBhcmVudE5vZGUsZ3JvdXBMaXN0LHNlbGVjdGVkTm9kZXNXaXRoUGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGxldCBjaGVjayA9IHRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tEYXRhQWxyZWFkeUFkZGVkSW5MaXN0T3JOb3Qoe1wiZmllbGRfbmFtZVwiOidfaWQnfSxzZWxlY3ROb2RlLl9pZCxncm91cExpc3QpO1xyXG4gICAgICBpZighY2hlY2suc3RhdHVzKXtcclxuICAgICAgICBncm91cExpc3QucHVzaChzZWxlY3ROb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZ5UGFyZW50Q2hpbGQoc2VsZWN0ZWROb2Rlc1dpdGhQYXJlbnQsZ3JvdXBMaXN0KTtcclxuICB9XHJcbiAgbW9kaWZ5UGFyZW50Q2hpbGQoc2VsZWN0ZWROb2Rlc1dpdGhQYXJlbnQ6YW55LGdyb3VwTGlzdDphbnkpe1xyXG4gICAgbGV0IHNvcnRlZERhdGEgPSBncm91cExpc3Quc29ydCgoYTphbnksYjphbnkpID0+ICBhLmxldmVsIC0gYi5sZXZlbCk7XHJcbiAgICBpZihzb3J0ZWREYXRhICYmIHNvcnRlZERhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgIHNvcnRlZERhdGEuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICBsZXQgY2hlY2sgPSB0aGlzLmNoZWNrSWZTZXJ2aWNlLmNoZWNrRGF0YUFscmVhZHlBZGRlZEluTGlzdE9yTm90KHtcImZpZWxkX25hbWVcIjonX2lkJ30sZGF0YS5faWQsc2VsZWN0ZWROb2Rlc1dpdGhQYXJlbnQpO1xyXG4gICAgICAgIGlmKGNoZWNrLnN0YXR1cyl7XHJcbiAgICAgICAgICBsZXQgZXhpc3REYXRhSW5kZXggPSB0aGlzLmNvbW1vbmZ1bmN0aW9uU2VydmljZS5nZXRJbmRleEluQXJyYXlCeUlkKHNlbGVjdGVkTm9kZXNXaXRoUGFyZW50LGRhdGEuX2lkKTtcclxuICAgICAgICAgIGxldCBvYmplY3QgPSBzZWxlY3RlZE5vZGVzV2l0aFBhcmVudFtleGlzdERhdGFJbmRleF07XHJcbiAgICAgICAgICBpZihvYmplY3QucEluZGV4ICE9IGRhdGEucEluZGV4KXtcclxuICAgICAgICAgICAgY2hlY2suc3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCFjaGVjay5zdGF0dXMpe1xyXG4gICAgICAgICAgc2VsZWN0ZWROb2Rlc1dpdGhQYXJlbnQucHVzaChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkTm9kZXNXaXRoUGFyZW50O1xyXG4gIH1cclxuICBtb2RpZnlTZWxlY3RlZERhdGFXaXRoUGFyZW50SWQoc2VsZWN0ZWREYXRhOmFueSl7XHJcbiAgICBsZXQgbW9kaWZ5TGlzdD1zZWxlY3RlZERhdGEuc29ydCgoYTphbnksYjphbnkpID0+IGEucEluZGV4LmxvY2FsZUNvbXBhcmUoYi5wSW5kZXgsIHVuZGVmaW5lZCwgeyBudW1lcmljOnRydWUgfSkpO1xyXG4gICAgLy9hcnIuc29ydCggKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgbnVtZXJpYzp0cnVlIH0pICk7XHJcbiAgICByZXR1cm4gIG1vZGlmeUxpc3Q7XHJcbiAgfVxyXG5cclxuICAvL3RoaXMgZnVuY3Rpb24gZm9yIGdldCBzZWxlY3RlZCBub2RlIHRyZWVcclxuXHJcbiAgLy9UaGlzIGZ1bmN0aW9uIGZvciBjb252ZXQgbGlzdCB0byB0cmVlIG1hcFxyXG4gIGNvbnZlcnRUcmVlVG9MaXN0KGxpc3Q6YW55LHJlc3VsdDphbnkpIHtcclxuICAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgbGlzdC5mb3JFYWNoKChjaGlsZDphbnkpID0+IHtcclxuICAgICAgICBsZXQgY2hpbGRyZW5MaXN0ID0gW107XHJcbiAgICAgICAgaWYoY2hpbGQgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4gIT0gbnVsbCl7XHJcbiAgICAgICAgICBjaGlsZHJlbkxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNoaWxkLmNoaWxkcmVuKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSBjaGlsZC5jaGlsZHJlbjtcclxuICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XHJcbiAgICAgICAgaWYoY2hpbGRyZW5MaXN0ICYmIGNoaWxkcmVuTGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIHRoaXMuY29udmVydFRyZWVUb0xpc3QoY2hpbGRyZW5MaXN0LHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIGFwcGx5UmVsYXRpb25zaGlwcyA9IChkYXRhOmFueSkgPT4ge1xyXG4gICAgbGV0IGxldmVsU3RhY2s6YW55ID0gW10sIGxhc3ROb2RlOmFueSA9IG51bGw7XHJcbiAgICByZXR1cm4gZGF0YS5tYXAoKGN1cnI6YW55LCBpbmRleDpudW1iZXIpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHsgLi4uY3VyciwgaWQ6IGluZGV4ICsgMSB9O1xyXG4gICAgICBpZiAobGV2ZWxTdGFjay5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBsZXZlbFN0YWNrLnB1c2goeyBsZXZlbDogbm9kZS5sZXZlbCwgcGFyZW50OiAwIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGxhc3QgPSBsZXZlbFN0YWNrW2xldmVsU3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKG5vZGUubGV2ZWwgPiBsYXN0LmxldmVsKSB7XHJcbiAgICAgICAgICBsZXZlbFN0YWNrLnB1c2goeyBsZXZlbDogbm9kZS5sZXZlbCwgcGFyZW50OiBsYXN0Tm9kZS5pZCB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubGV2ZWwgPCBsYXN0LmxldmVsKSB7XHJcbiAgICAgICAgICBjb25zdFxyXG4gICAgICAgICAgICBsZXZlbERpZmYgPSBsYXN0LmxldmVsIC0gbm9kZS5sZXZlbCAtIDEsXHJcbiAgICAgICAgICAgIGxhc3RJbmRleCA9IGxldmVsU3RhY2subGVuZ3RoIC0gMTtcclxuICAgICAgICAgIGxldmVsU3RhY2suc3BsaWNlKGxhc3RJbmRleCAtIGxldmVsRGlmZiwgbGFzdEluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbm9kZS5wYXJlbnRJZCA9IGxldmVsU3RhY2tbbGV2ZWxTdGFjay5sZW5ndGggLSAxXS5wYXJlbnQ7XHJcbiAgICAgIGxhc3ROb2RlID0gbm9kZTtcclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBsaXN0VG9UcmVlID0gKGFyciA9IFtdKSA9PiB7XHJcbiAgICAgbGV0IGluZGV4TWFwID0gbmV3IE1hcCgpO1xyXG4gICAgIGFyci5mb3JFYWNoKChub2RlOmFueSwgaW5kZXg6bnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaW5kZXhNYXAuc2V0KG5vZGUuaWQsIGluZGV4KVxyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSBbXTtcclxuICAgICB9KTtcclxuICAgICByZXR1cm4gYXJyLnJlZHVjZSgocmVzOmFueSwgbm9kZTphbnksIGluZGV4Om51bWJlciwgYWxsOmFueSkgPT4ge1xyXG4gICAgICAgIGlmIChub2RlLnBhcmVudElkID09PSAwKSByZXR1cm4gWy4uLnJlcywgbm9kZV07XHJcbiAgICAgICAgYWxsW2luZGV4TWFwLmdldChub2RlLnBhcmVudElkKV0uY2hpbGRyZW4ucHVzaChub2RlKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgIH0sIFtdKTtcclxuICB9O1xyXG5cclxuICB0cmVlVG9PYmplY3QgPSAodHJlZTphbnkgPSBbXSwgcmVzdWx0OmFueSA9IHt9KSA9PiB7XHJcbiAgICB0cmVlLmZvckVhY2goKGNoaWxkOmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBtb2RpZnlPYmo6YW55ID0ge307XHJcbiAgICAgICAgbW9kaWZ5T2JqWydyZWZlcmVuY2UnXSA9IGNoaWxkLnJlZmVyZW5jZTtcclxuICAgICAgICBpZihjaGlsZCAmJiBjaGlsZC5jcml0ZXJpYSl7XHJcbiAgICAgICAgICBtb2RpZnlPYmpbJ2NyaXRlcmlhJ10gPSBjaGlsZC5jcml0ZXJpYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2hpbGQuYWxsU2VsZWN0ZWQpe1xyXG4gICAgICAgICAgbW9kaWZ5T2JqWydyZWZlcmVuY2UnXVsnYWxsU2VsZWN0ZWQnXSA9IGNoaWxkLmFsbFNlbGVjdGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjaGlsZC5zZWxlY3Qpe1xyXG4gICAgICAgICAgbW9kaWZ5T2JqWydyZWZlcmVuY2UnXVsnc2VsZWN0J10gPSBjaGlsZC5zZWxlY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNoaWxkLmxldmVsID09IDApe1xyXG4gICAgICAgICAgcmVzdWx0W2NoaWxkLml0ZW1dID0gbW9kaWZ5T2JqO1xyXG4gICAgICAgIH1lbHNlIGlmKGNoaWxkLmV4cGFuZGFibGUpe1xyXG4gICAgICAgICAgaWYoIXJlc3VsdFtjaGlsZC50eXBlXSkgcmVzdWx0W2NoaWxkLnR5cGVdID0ge31cclxuICAgICAgICAgIHJlc3VsdFtjaGlsZC50eXBlXVtjaGlsZC5pdGVtXSA9IG1vZGlmeU9iajtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGlmKCFyZXN1bHRbY2hpbGQudHlwZV0pIHJlc3VsdFtjaGlsZC50eXBlXSA9IHt9XHJcbiAgICAgICAgICByZXN1bHRbY2hpbGQudHlwZV1bY2hpbGQuaXRlbV0gPSBtb2RpZnlPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGhpcy50cmVlVG9PYmplY3QoY2hpbGQuY2hpbGRyZW4sIGNoaWxkLmxldmVsID09IDAgPyByZXN1bHRbY2hpbGQuaXRlbV0gOiByZXN1bHRbY2hpbGQudHlwZV1bY2hpbGQuaXRlbV0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9O1xyXG4gIGJ1aWxkVHJlZU9iamVjdChhcnIgPSBbXSkge1xyXG4gICAgbGV0IHJlbGF0aW9uU2hpcCA9IHRoaXMuYXBwbHlSZWxhdGlvbnNoaXBzKGFycik7XHJcbiAgICBsZXQgbGlzdCA9IHRoaXMubGlzdFRvVHJlZShyZWxhdGlvblNoaXApO1xyXG4gICAgbGV0IHRyZWUgPSB0aGlzLnRyZWVUb09iamVjdChsaXN0KTtcclxuICAgIHJldHVybiB0cmVlO1xyXG4gIH1cclxuICAvL1RoaXMgZnVuY3Rpb24gZm9yIGNvbnZldCBsaXN0IHRvIHRyZWUgbWFwXHJcblxyXG4gIC8qKiBBZGQgYW4gaXRlbSB0byB0by1kbyBsaXN0ICovXHJcbiAgaW5zZXJ0SXRlbShwYXJlbnQ6IFRvZG9JdGVtTm9kZSwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAocGFyZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHtpdGVtOiBuYW1lfSBhcyBUb2RvSXRlbU5vZGUpO1xyXG4gICAgICB0aGlzLmRhdGFDaGFuZ2UubmV4dCh0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlSXRlbShub2RlOiBUb2RvSXRlbU5vZGUsIG5hbWU6IHN0cmluZykge1xyXG4gICAgbm9kZS5pdGVtID0gbmFtZTtcclxuICAgIHRoaXMuZGF0YUNoYW5nZS5uZXh0KHRoaXMuZGF0YSk7XHJcbiAgfVxyXG4gIHVwZGF0ZVRyZWVWaWV3RGF0YShyZXNwb25jZTphbnksZmllbGQ6YW55LHRyZWVWaWV3RGF0YTphbnkpe1xyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgdHJlZVZpZXdEYXRhOnRyZWVWaWV3RGF0YVxyXG4gICAgfVxyXG4gICAgY29uc3QgZmllbGROYW1lID0gZmllbGQuZmllbGRfbmFtZTtcclxuICAgIGxldCBrZXlzID0gW107XHJcbiAgICBsZXQgZmllbGRzID0gW107XHJcbiAgICBpZihmaWVsZCAmJiBmaWVsZC50cmVlVmlld0tleXMpe1xyXG4gICAgICBrZXlzID0gZmllbGQudHJlZVZpZXdLZXlzO1xyXG4gICAgfVxyXG4gICAgaWYoZmllbGQgJiYgZmllbGQuZmllbGRzICYmIGZpZWxkLmZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgZmllbGRzID0gZmllbGQuZmllbGRzO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHJlZURhdGEgPSB0aGlzLmJ1aWxkRmlsZVRyZWUocmVzcG9uY2UsMCxrZXlzKTtcclxuICAgIC8vY29uc29sZS5sb2codHJlZURhdGEpO1xyXG4gICAgbGV0IHNlbGVjdGVkTm9kZUxpc3QgPSB0aGlzLmNvbnZlcnRUcmVlVG9MaXN0KEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJlZURhdGEpKSxbXSk7XHJcbiAgICBsZXQgY2hpbGRMaXN0ID0gW107XHJcbiAgICBpZihmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICBjaGlsZExpc3QgPSB0aGlzLmNvbnZlcnRQYXJlbnROb2RlVG9DaGlsZE5vZGVMaXN0KHNlbGVjdGVkTm9kZUxpc3QsZmllbGRzKTtcclxuICAgIH1cclxuICAgIC8vY29uc29sZS5sb2coc2VsZWN0ZWROb2RlTGlzdCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKGNoaWxkTGlzdCk7XHJcbiAgICAvL3RoaXMuZGF0YVNvdXJjZVtmaWVsZE5hbWVdLmRhdGEgPSB0cmVlRGF0YTtcclxuICAgIHJlc3VsdC50cmVlVmlld0RhdGFbZmllbGROYW1lXSA9IGNoaWxkTGlzdDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=