@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.32 → 0.0.2-ang-17-20

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 (122) hide show
  1. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +710 -189
  2. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
  3. package/index.d.ts +1052 -3
  4. package/index.d.ts.map +1 -0
  5. package/package.json +13 -15
  6. package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
  7. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -42
  8. package/esm2022/lib/components/approval/approval.component.mjs +0 -20
  9. package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -65
  10. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -45
  11. package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -56
  12. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -75
  13. package/esm2022/lib/components/connector/connector.component.mjs +0 -60
  14. package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -84
  15. package/esm2022/lib/components/create-term/create-term.component.mjs +0 -848
  16. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -825
  17. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -224
  18. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -65
  19. package/esm2022/lib/components/term-card/term-card.component.mjs +0 -343
  20. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -357
  21. package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -862
  22. package/esm2022/lib/constants/app-constant.mjs +0 -40
  23. package/esm2022/lib/constants/data.mjs +0 -6972
  24. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -93
  25. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -15
  26. package/esm2022/lib/labels/strings.mjs +0 -40
  27. package/esm2022/lib/models/approval.model.mjs +0 -2
  28. package/esm2022/lib/models/connection-type.model.mjs +0 -2
  29. package/esm2022/lib/models/connection.model.mjs +0 -2
  30. package/esm2022/lib/models/framework.model.mjs +0 -2
  31. package/esm2022/lib/models/variable-type.model.mjs +0 -2
  32. package/esm2022/lib/pipes/order-by.pipe.mjs +0 -36
  33. package/esm2022/lib/services/approval.service.mjs +0 -48
  34. package/esm2022/lib/services/connection.service.mjs +0 -3
  35. package/esm2022/lib/services/connector.service.mjs +0 -287
  36. package/esm2022/lib/services/framework.service.mjs +0 -532
  37. package/esm2022/lib/services/local-connection.service.mjs +0 -76
  38. package/esm2022/lib/services/odcs.service.mjs +0 -24
  39. package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -44
  40. package/esm2022/lib/tree-hierarchy.component.mjs +0 -25
  41. package/esm2022/lib/tree-hierarchy.module.mjs +0 -146
  42. package/esm2022/lib/tree-hierarchy.service.mjs +0 -62
  43. package/esm2022/material.module.mjs +0 -200
  44. package/esm2022/public-api.mjs +0 -9
  45. package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
  46. package/lib/components/action-bar/action-bar.component.d.ts +0 -17
  47. package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
  48. package/lib/components/approval/approval.component.d.ts +0 -10
  49. package/lib/components/approval/approval.component.d.ts.map +0 -1
  50. package/lib/components/approve-view/approve-view.component.d.ts +0 -27
  51. package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
  52. package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
  53. package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
  54. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
  55. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
  56. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
  57. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
  58. package/lib/components/connector/connector.component.d.ts +0 -23
  59. package/lib/components/connector/connector.component.d.ts.map +0 -1
  60. package/lib/components/create-categories/create-categories.component.d.ts +0 -26
  61. package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
  62. package/lib/components/create-term/create-term.component.d.ts +0 -148
  63. package/lib/components/create-term/create-term.component.d.ts.map +0 -1
  64. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
  65. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
  66. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
  67. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
  68. package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
  69. package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
  70. package/lib/components/term-card/term-card.component.d.ts +0 -54
  71. package/lib/components/term-card/term-card.component.d.ts.map +0 -1
  72. package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -57
  73. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
  74. package/lib/components/tree-view/tree-view.component.d.ts +0 -103
  75. package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
  76. package/lib/constants/app-constant.d.ts +0 -44
  77. package/lib/constants/app-constant.d.ts.map +0 -1
  78. package/lib/constants/data.d.ts +0 -117
  79. package/lib/constants/data.d.ts.map +0 -1
  80. package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
  81. package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
  82. package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
  83. package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
  84. package/lib/labels/strings.d.ts +0 -40
  85. package/lib/labels/strings.d.ts.map +0 -1
  86. package/lib/models/approval.model.d.ts +0 -11
  87. package/lib/models/approval.model.d.ts.map +0 -1
  88. package/lib/models/connection-type.model.d.ts +0 -6
  89. package/lib/models/connection-type.model.d.ts.map +0 -1
  90. package/lib/models/connection.model.d.ts +0 -7
  91. package/lib/models/connection.model.d.ts.map +0 -1
  92. package/lib/models/framework.model.d.ts +0 -89
  93. package/lib/models/framework.model.d.ts.map +0 -1
  94. package/lib/models/variable-type.model.d.ts +0 -46
  95. package/lib/models/variable-type.model.d.ts.map +0 -1
  96. package/lib/pipes/order-by.pipe.d.ts +0 -10
  97. package/lib/pipes/order-by.pipe.d.ts.map +0 -1
  98. package/lib/services/approval.service.d.ts +0 -21
  99. package/lib/services/approval.service.d.ts.map +0 -1
  100. package/lib/services/connection.service.d.ts +0 -4
  101. package/lib/services/connection.service.d.ts.map +0 -1
  102. package/lib/services/connector.service.d.ts +0 -18
  103. package/lib/services/connector.service.d.ts.map +0 -1
  104. package/lib/services/framework.service.d.ts +0 -89
  105. package/lib/services/framework.service.d.ts.map +0 -1
  106. package/lib/services/local-connection.service.d.ts +0 -18
  107. package/lib/services/local-connection.service.d.ts.map +0 -1
  108. package/lib/services/odcs.service.d.ts +0 -11
  109. package/lib/services/odcs.service.d.ts.map +0 -1
  110. package/lib/tree-hierarchy-routing.module.d.ts +0 -8
  111. package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
  112. package/lib/tree-hierarchy.component.d.ts +0 -13
  113. package/lib/tree-hierarchy.component.d.ts.map +0 -1
  114. package/lib/tree-hierarchy.module.d.ts +0 -33
  115. package/lib/tree-hierarchy.module.d.ts.map +0 -1
  116. package/lib/tree-hierarchy.service.d.ts +0 -22
  117. package/lib/tree-hierarchy.service.d.ts.map +0 -1
  118. package/material.module.d.ts +0 -52
  119. package/material.module.d.ts.map +0 -1
  120. package/public-api.d.ts +0 -9
  121. package/public-api.d.ts.map +0 -1
  122. package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
@@ -1,357 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as _ from 'lodash';
3
- import { UntypedFormControl, Validators } from '@angular/forms';
4
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/framework.service";
7
- import * as i2 from "../../services/connector.service";
8
- import * as i3 from "../../services/approval.service";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/material/icon";
11
- import * as i6 from "@angular/forms";
12
- import * as i7 from "../term-card/term-card.component";
13
- class TreeColumnViewComponent {
14
- constructor(frameworkService, connectorService, approvalService) {
15
- this.frameworkService = frameworkService;
16
- this.connectorService = connectorService;
17
- this.approvalService = approvalService;
18
- this.isChildOrg = false;
19
- this.connectorMapping = {};
20
- this.updateTaxonomyTerm = new EventEmitter(true);
21
- this.updateTermList = new EventEmitter();
22
- this.cardsCount = new EventEmitter();
23
- this.cardAction = new EventEmitter();
24
- this.columnData = [];
25
- this.termshafall = [];
26
- this.searchValue = new UntypedFormControl('', [Validators.required]);
27
- this.startIndex = 0;
28
- this.limitToAdd = 50;
29
- this.currentLastIndex = 50;
30
- this.columnItems = [];
31
- this.filteredColumnItems = [];
32
- }
33
- ngOnChanges() { }
34
- ngOnInit() {
35
- this.subscribeEvents();
36
- this.setColumnItems();
37
- this.searchValue.valueChanges.pipe(debounceTime(700), distinctUntilChanged()).subscribe((ele) => {
38
- this.searchFilterData(ele);
39
- });
40
- if (this.column.index === 1) {
41
- this.approvalService.getUpdateList().subscribe((list) => {
42
- this.approvalTerm = list.filter((item) => this.column.code === item.category);
43
- if (this.approvalTerm) {
44
- this.approvalTerm.forEach((term, _i) => {
45
- this.column.children.forEach((lel, _j) => {
46
- if (lel.identifier === term.identifier) {
47
- if (!this.isExists(term)) {
48
- this.termshafall.push(lel);
49
- }
50
- }
51
- });
52
- });
53
- this.column.children.forEach((tr, _i) => {
54
- if (!this.isExists(tr)) {
55
- this.termshafall.push(tr);
56
- }
57
- });
58
- this.columnData = this.transform(this.termshafall);
59
- this.setColumnItems();
60
- if (this.columnData && this.columnData.length) {
61
- this.cardsCount.emit({ category: this.columnData[0].category || this.column.code, count: this.columnData.length });
62
- }
63
- }
64
- });
65
- }
66
- this.connectorMapping = this.connectorService.connectorMap;
67
- }
68
- isExists(e) {
69
- let temp;
70
- if (this.termshafall && this.termshafall.length) {
71
- temp = this.termshafall.map(t => t.identifier);
72
- return temp.includes(e.identifier);
73
- }
74
- return false;
75
- }
76
- subscribeEvents() {
77
- if (this.childSubscription) {
78
- this.childSubscription.unsubscribe();
79
- }
80
- this.childSubscription = this.frameworkService.currentSelection.subscribe(e => {
81
- if (!e) {
82
- return;
83
- }
84
- else if (e.type === this.column.code) {
85
- const selectedTerm = { ...e.data, cardRef: e.cardRef };
86
- if (e.isUpdate) {
87
- this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm, isUpdate: true });
88
- }
89
- else {
90
- this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm });
91
- }
92
- this.columnData = this.transform((this.columnData || []).map(item => {
93
- if (item.code === e.data.code) {
94
- item.selected = true;
95
- }
96
- else {
97
- item.selected = false;
98
- }
99
- return item;
100
- }));
101
- this.setColumnItems();
102
- this.setConnectors(e.cardRef, this.columnItems, 'SINGLE');
103
- return;
104
- }
105
- else {
106
- const next = this.frameworkService.getNextCategory(e.type);
107
- if (next && next.code === this.column.code) {
108
- setTimeout(() => {
109
- this.setConnectors(e.cardRef, next && next.index < this.column.index ? [] : this.columnItems, 'ALL');
110
- }, 100);
111
- }
112
- if (next && next.index < this.column.index) {
113
- this.columnData = [];
114
- this.setColumnItems();
115
- }
116
- }
117
- });
118
- if (this.newTermSubscription) {
119
- this.newTermSubscription.unsubscribe();
120
- }
121
- this.newTermSubscription = this.frameworkService.insertUpdateDeleteNotifier.subscribe(e => {
122
- if (e && e.action) {
123
- const next = this.frameworkService.getNextCategory(e.action);
124
- if (next) {
125
- if (this.column.code === next.code && e.type === 'select') {
126
- this.insertUpdateHandler(e, next);
127
- }
128
- if (e.type === 'update') {
129
- if (this.column.code === next.code && e.type === 'update') {
130
- const selectedParent = this.frameworkService.getPreviousCategory(e.action);
131
- const selectedParentData = this.frameworkService.list.get(selectedParent.code);
132
- const selectedParentCardRef = this.frameworkService.selectionList.get(selectedParent.code) &&
133
- this.frameworkService.selectionList.get(selectedParent.code).cardRef;
134
- if (selectedParent && selectedParentData && selectedParentData.children && selectedParentData.children.length > 0) {
135
- this.frameworkService.currentSelection.next({ type: selectedParent.code, data: selectedParentData.children[0], cardRef: selectedParentCardRef, isUpdate: true });
136
- }
137
- }
138
- }
139
- }
140
- }
141
- });
142
- }
143
- insertUpdateHandler(e, _next, isUpdate) {
144
- const back = this.frameworkService.getPreviousCategory(this.column.code);
145
- const localTerms = [];
146
- this.frameworkService.getLocalTermsByCategory(this.column.code).forEach(f => {
147
- const selectedParent = back ? this.frameworkService.selectionList.get(back.code) : null;
148
- if (selectedParent && ((f.parent.code === selectedParent.code) || (f.parent.identifier && (f.parent.identifier === selectedParent.identifier)))) {
149
- localTerms.push(f.term);
150
- }
151
- });
152
- if (!isUpdate) {
153
- if (e && e.data) {
154
- this.columnData = this.transform([...localTerms, ...(e.data.children || [])])
155
- .filter((x) => {
156
- return x.category == this.column.code;
157
- }).map((mer) => {
158
- this.column.children = this.column.children.map((col) => { col.selected = false; return col; });
159
- mer.selected = false;
160
- mer.children = ([...this.column.children.filter((x) => { return x.code === mer.code; }).map((a) => a.children)].shift() || []);
161
- return mer;
162
- });
163
- }
164
- this.setColumnItems();
165
- if (this.columnData.length > 0) {
166
- this.cardsCount.emit({ category: this.columnData[0].category || '', count: this.columnData.length });
167
- }
168
- else {
169
- this.cardsCount.emit({ category: this.column.code, count: 0 });
170
- }
171
- }
172
- }
173
- updateSelection1(_data) {
174
- }
175
- updateSelection(_selection) {
176
- }
177
- setColumnItems() {
178
- let localSearchValue = this.searchValue.value && this.searchValue.value.toLowerCase() || '';
179
- let filteredColumnData = [];
180
- this.columnItems = [];
181
- if (localSearchValue) {
182
- filteredColumnData = this.columnData.filter((child) => {
183
- if (child.name.toLowerCase().includes(localSearchValue) ||
184
- (_.get(child, 'refId') && _.get(child, 'refId').toLowerCase().includes(localSearchValue)) ||
185
- (_.get(child, 'description') && _.get(child, 'description').toLowerCase().includes(localSearchValue)) ||
186
- (_.get(child, 'additionalProperties.displayName') && _.get(child, 'additionalProperties.displayName').toLowerCase().includes(localSearchValue))) {
187
- return child;
188
- }
189
- });
190
- }
191
- else {
192
- filteredColumnData = this.columnData;
193
- }
194
- this.filteredColumnItems = filteredColumnData;
195
- this.columnItems = filteredColumnData ? filteredColumnData.slice(this.startIndex, this.currentLastIndex) : [];
196
- }
197
- transform(value, sortBy = 'timeStamp') {
198
- if (!sortBy) {
199
- if (value) {
200
- return value.slice().reverse();
201
- }
202
- else {
203
- return null;
204
- }
205
- }
206
- else {
207
- if (Array.isArray(value)) {
208
- return value.sort((a, b) => {
209
- const timestampA = a.additionalProperties && a.additionalProperties.timeStamp ? new Date(Number(a.additionalProperties.timeStamp)).getTime() : 0;
210
- const timestampB = b.additionalProperties && b.additionalProperties.timeStamp ? new Date(Number(b.additionalProperties.timeStamp)).getTime() : 0;
211
- return timestampB - timestampA;
212
- });
213
- }
214
- }
215
- }
216
- searchFilterData(_ele) {
217
- this.setColumnItems();
218
- const back = this.frameworkService.getPreviousCategory(this.column.code);
219
- if (back && back.code) {
220
- let backColumData = this.frameworkService.selectionList.get(back.code);
221
- if (backColumData.category) {
222
- this.frameworkService.removeOldLine();
223
- setTimeout(() => {
224
- this.frameworkService.currentSelection.next({ type: backColumData.category, data: backColumData, cardRef: backColumData.cardRef });
225
- }, 200);
226
- }
227
- }
228
- else {
229
- if (this.columnItems?.length === 0) {
230
- this.frameworkService.removeOldLine();
231
- }
232
- else {
233
- setTimeout(() => {
234
- this.makeFirstTermSelected();
235
- }, 500);
236
- }
237
- }
238
- }
239
- clearSearch() {
240
- this.searchValue.setValue('');
241
- }
242
- loadMore() {
243
- this.currentLastIndex = this.currentLastIndex + this.limitToAdd;
244
- this.searchFilterData(this.searchValue.value);
245
- }
246
- setConnectors(elementClicked, columnItem, mode) {
247
- this.removeConnectors(elementClicked, 'box' + (this.column.index - 1), this.column.index - 1);
248
- if (mode === 'ALL') {
249
- const ids = columnItem.map((_c, i) => {
250
- return this.column.code + 'Card' + (i + 1);
251
- });
252
- this.connectorMapping['box' + (this.column.index - 1)] = { source: elementClicked, lines: (ids || []).map((id) => { return { target: id, line: '', targetType: 'id' }; }) };
253
- this.connectorService.updateConnectorsMap(this.connectorMapping);
254
- const connectionLines = this.connectorService._drawLine(this.connectorMapping['box' + (this.column.index - 1)].source, this.connectorMapping['box' + (this.column.index - 1)].lines, null, '#box' + (this.column.index - 1), '#box' + this.column.index);
255
- this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
256
- }
257
- else {
258
- if (this.column.index > 1 && this.connectorMapping['box' + (this.column.index - 1)]) {
259
- this.connectorMapping['box' + (this.column.index - 1)].lines = [{ target: elementClicked, line: '', targetType: 'element' }];
260
- this.connectorService.updateConnectorsMap(this.connectorMapping);
261
- const connectionLines = this.connectorService._drawLine(this.connectorMapping['box' + (this.column.index - 1)].source, this.connectorMapping['box' + (this.column.index - 1)].lines, null, '#box' + (this.column.index - 1), '#box' + this.column.index);
262
- this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
263
- }
264
- }
265
- this.connectorService.updateConnectorsMap(this.connectorMapping);
266
- }
267
- removeConnectors(currentElement, prevCol, currentIndex) {
268
- if (this.connectorMapping) {
269
- for (const key in this.connectorMapping) {
270
- if (this.connectorMapping[key] && this.connectorMapping[key].lines && this.connectorMapping[key].lines.length > 0) {
271
- const lines = this.connectorMapping[key].lines;
272
- lines.forEach(async (element, index) => {
273
- if (element != currentElement && prevCol == key) {
274
- await element.line && element.line.remove();
275
- lines.splice(index, 1);
276
- }
277
- });
278
- this.connectorMapping[key].lines = lines;
279
- }
280
- let count = currentIndex + 2;
281
- let nextCol = `box${count}`;
282
- if (this.connectorMapping[nextCol] && this.connectorMapping[nextCol].lines && this.connectorMapping[nextCol].lines.length > 0) {
283
- const lines = this.connectorMapping[nextCol].lines;
284
- lines.forEach(async (element, index) => {
285
- await element.line && element.line.remove();
286
- lines.splice(index, 1);
287
- });
288
- this.connectorMapping[nextCol].lines = null;
289
- }
290
- }
291
- }
292
- }
293
- selectedCard(event) {
294
- this.updateTermList.emit(event);
295
- }
296
- get showLoadMoreBtn() {
297
- if (this.column && this.column.config && this.column.config.categoryDisplayName !== 'Organisation'
298
- && this.column.name !== 'Organisation' && this.columnItems && this.columnItems.length > 0) {
299
- return true;
300
- }
301
- return false;
302
- }
303
- get disableLoadButton() {
304
- if (this.filteredColumnItems && this.filteredColumnItems.length < this.currentLastIndex) {
305
- return true;
306
- }
307
- return false;
308
- }
309
- ngOnDestroy() {
310
- if (this.childSubscription) {
311
- this.childSubscription.unsubscribe();
312
- }
313
- if (this.newTermSubscription) {
314
- this.newTermSubscription.unsubscribe();
315
- }
316
- }
317
- cardActionEmit(event) {
318
- this.cardAction.emit(event);
319
- }
320
- makeFirstTermSelected() {
321
- const firstListItem = this.frameworkService.list.entries().next().value;
322
- if (firstListItem && firstListItem.length >= 2) {
323
- if (firstListItem[1] && firstListItem[1].children && firstListItem[1].children.length) {
324
- const firstTerm = firstListItem[1].children[0];
325
- const cardRef = document.getElementById(firstTerm.name);
326
- firstTerm.selected = true;
327
- this.frameworkService.cardClkData = firstTerm;
328
- this.frameworkService.CurrentCardClk.next(firstTerm.category);
329
- this.frameworkService.currentSelection.next({ type: firstTerm.category, data: firstTerm, cardRef });
330
- }
331
- }
332
- }
333
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeColumnViewComponent, deps: [{ token: i1.FrameworkService }, { token: i2.ConnectorService }, { token: i3.ApprovalService }], target: i0.ɵɵFactoryTarget.Component }); }
334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TreeColumnViewComponent, selector: "lib-tree-column-view", inputs: { column: "column", containerId: "containerId", isChildOrg: "isChildOrg", childOrg: "childOrg" }, outputs: { updateTaxonomyTerm: "updateTaxonomyTerm", updateTermList: "updateTermList", cardsCount: "cardsCount", cardAction: "cardAction" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-5\">\n <div class=\"rsearch\">\n <div class=\"sinput mat-field-rounded flex flex-middle\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input type=\"search\" [formControl]=\"searchValue\" placeholder=\"Search\" #search>\n <button *ngIf=\"search.value\" class=\"clear-btn flex\" (click)=\"clearSearch()\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"columnItems && columnItems.length > 0; else noDataTemplate;\">\n <ng-container *ngFor=\"let child of columnItems; let j = index\">\n <div #cardEle id=\"{{column.code}}Card{{j+1}}\" >\n <lib-term-card\n [data]=\"{'children': child, 'selected' : false, 'category':column.code, cardSubType: 'minimal', isViewOnly:false,'index':column.index, columnInfo: column}\"\n [enableThreeDots]=\"(isChildOrg && childOrg.channel === child.name) ? true : (isChildOrg) ? false : true\"\n [checkIfChildOrg]=\"isChildOrg\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate >\n <ng-container *ngIf=\"searchValue?.value\">\n <div>No Data found</div>\n </ng-container>\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"!disableLoadButton\">\n <button (click)=\"loadMore()\" class=\"mat-raised-button mat-button-base loadMore\" [ngClass]=\"{'disablBtn': disableLoadButton}\"\n [disabled]=\"disableLoadButton\">Load more...</button>\n</div>\n", styles: [".flex{display:flex}.w-full{width:100%}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100vh;overflow:hidden}.cat-columns:hover{overflow-y:scroll}.container{overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.container::-webkit-scrollbar{width:0;height:0}#this{display:none}#this:target{display:block}.search{width:100%;box-sizing:border-box}.search .search-icon{font-size:20px;width:20px;height:20px}.search .rsearch{display:flex;position:relative;flex:1 1 auto;border:1px solid #e0e0e0;border-radius:20px}.search .sinput{width:100%;padding:4px 8px;box-sizing:border-box}.search .sinput input{border:0!important;outline:none!important;margin-top:2px}input[type=search]::-webkit-search-decoration:hover,input[type=search]::-webkit-search-cancel-button:hover{cursor:pointer}input[type=search]::-webkit-search-cancel-button{appearance:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:#888;font-size:16px;cursor:pointer;display:none}.sinput:valid~.clear-btn{display:block}.clear-btn:hover{color:#333}.sticky{position:sticky;top:0;z-index:46}.loadMore{background:#1b4ca1!important;color:#fff!important;font-family:Lato;font-size:14px;font-weight:700}.disablBtn{opacity:.6;pointer-events:none}.w-full.sticky{position:sticky;top:0;z-index:100;background-color:#fff}.category-heading-sticky{position:sticky;top:0;z-index:10;background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i7.TermCardComponent, selector: "lib-term-card", inputs: ["enableThreeDots", "checkIfChildOrg", "data"], outputs: ["isSelected", "selectedCard", "cardAction"] }] }); }
335
- }
336
- export { TreeColumnViewComponent };
337
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeColumnViewComponent, decorators: [{
338
- type: Component,
339
- args: [{ selector: 'lib-tree-column-view', template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-5\">\n <div class=\"rsearch\">\n <div class=\"sinput mat-field-rounded flex flex-middle\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input type=\"search\" [formControl]=\"searchValue\" placeholder=\"Search\" #search>\n <button *ngIf=\"search.value\" class=\"clear-btn flex\" (click)=\"clearSearch()\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"columnItems && columnItems.length > 0; else noDataTemplate;\">\n <ng-container *ngFor=\"let child of columnItems; let j = index\">\n <div #cardEle id=\"{{column.code}}Card{{j+1}}\" >\n <lib-term-card\n [data]=\"{'children': child, 'selected' : false, 'category':column.code, cardSubType: 'minimal', isViewOnly:false,'index':column.index, columnInfo: column}\"\n [enableThreeDots]=\"(isChildOrg && childOrg.channel === child.name) ? true : (isChildOrg) ? false : true\"\n [checkIfChildOrg]=\"isChildOrg\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate >\n <ng-container *ngIf=\"searchValue?.value\">\n <div>No Data found</div>\n </ng-container>\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"!disableLoadButton\">\n <button (click)=\"loadMore()\" class=\"mat-raised-button mat-button-base loadMore\" [ngClass]=\"{'disablBtn': disableLoadButton}\"\n [disabled]=\"disableLoadButton\">Load more...</button>\n</div>\n", styles: [".flex{display:flex}.w-full{width:100%}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100vh;overflow:hidden}.cat-columns:hover{overflow-y:scroll}.container{overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.container::-webkit-scrollbar{width:0;height:0}#this{display:none}#this:target{display:block}.search{width:100%;box-sizing:border-box}.search .search-icon{font-size:20px;width:20px;height:20px}.search .rsearch{display:flex;position:relative;flex:1 1 auto;border:1px solid #e0e0e0;border-radius:20px}.search .sinput{width:100%;padding:4px 8px;box-sizing:border-box}.search .sinput input{border:0!important;outline:none!important;margin-top:2px}input[type=search]::-webkit-search-decoration:hover,input[type=search]::-webkit-search-cancel-button:hover{cursor:pointer}input[type=search]::-webkit-search-cancel-button{appearance:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:#888;font-size:16px;cursor:pointer;display:none}.sinput:valid~.clear-btn{display:block}.clear-btn:hover{color:#333}.sticky{position:sticky;top:0;z-index:46}.loadMore{background:#1b4ca1!important;color:#fff!important;font-family:Lato;font-size:14px;font-weight:700}.disablBtn{opacity:.6;pointer-events:none}.w-full.sticky{position:sticky;top:0;z-index:100;background-color:#fff}.category-heading-sticky{position:sticky;top:0;z-index:10;background-color:#fff}\n"] }]
340
- }], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.ConnectorService }, { type: i3.ApprovalService }]; }, propDecorators: { column: [{
341
- type: Input
342
- }], containerId: [{
343
- type: Input
344
- }], isChildOrg: [{
345
- type: Input
346
- }], childOrg: [{
347
- type: Input
348
- }], updateTaxonomyTerm: [{
349
- type: Output
350
- }], updateTermList: [{
351
- type: Output
352
- }], cardsCount: [{
353
- type: Output
354
- }], cardAction: [{
355
- type: Output
356
- }] } });
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFHcEUsTUFLYSx1QkFBdUI7SUFxQmxDLFlBQ1UsZ0JBQWtDLEVBQ2xDLGdCQUFrQyxFQUNsQyxlQUFpQztRQUZqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBckJsQyxlQUFVLEdBQUcsS0FBSyxDQUFBO1FBRTNCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQTtRQUNoQix1QkFBa0IsR0FBRyxJQUFJLFlBQVksQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDM0QsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ2pELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFB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QUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFRLENBQUE7Z0JBQ3JELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUV2RCxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTthQUNwRztTQUNGO0lBQ0gsQ0FBQzsrR0E3WlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsd1VDaEJwQyxnNURBcUNBOztTRHJCYSx1QkFBdUI7NEZBQXZCLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7b0tBS3ZCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Nvbm5lY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcHJvdmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcHJvdmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FyZENoZWNrZWQsIENhcmRTZWxlY3Rpb24sIENhcmRzQ291bnQsIENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmRlY2xhcmUgdmFyIExlYWRlckxpbmU6IGFueTtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi10cmVlLWNvbHVtbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtY29sdW1uLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVlLWNvbHVtbi12aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVHJlZUNvbHVtblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sdW1uOiBhbnk7XG4gIEBJbnB1dCgpIGNvbnRhaW5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgaXNDaGlsZE9yZyA9IGZhbHNlXG4gIEBJbnB1dCgpIGNoaWxkT3JnOiBhbnlcbiAgY29ubmVjdG9yTWFwcGluZzogYW55ID0ge31cbiAgQE91dHB1dCgpIHVwZGF0ZVRheG9ub215VGVybSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZFNlbGVjdGlvbj4odHJ1ZSk7XG4gIEBPdXRwdXQoKSB1cGRhdGVUZXJtTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZENoZWNrZWQ+KCk7XG4gIEBPdXRwdXQoKSBjYXJkc0NvdW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDYXJkc0NvdW50PigpO1xuICBAT3V0cHV0KCkgY2FyZEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZFNlbGVjdGlvbj4oKTtcbiAgY29sdW1uRGF0YTogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgY2hpbGRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgbmV3VGVybVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBhcHByb3ZhbFRlcm06IGFueTtcbiAgdGVybXNoYWZhbGw6IEFycmF5PENhcmQ+ID0gW107XG4gIHNlYXJjaFZhbHVlID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgc3RhcnRJbmRleCA9IDBcbiAgbGltaXRUb0FkZCA9IDUwXG4gIGN1cnJlbnRMYXN0SW5kZXggPSA1MFxuICBjb2x1bW5JdGVtczogYW55ID0gW11cbiAgZmlsdGVyZWRDb2x1bW5JdGVtczogYW55ID0gW11cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29ubmVjdG9yU2VydmljZTogQ29ubmVjdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGFwcHJvdmFsU2VydmljZSA6IEFwcHJvdmFsU2VydmljZVxuICApIHtcbiAgfVxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHt9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpXG4gICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG4gICAgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg3MDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICApLnN1YnNjcmliZSgoZWxlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoRmlsdGVyRGF0YShlbGUpXG4gICAgfSlcbiAgICBpZiAodGhpcy5jb2x1bW4uaW5kZXggPT09IDEpIHtcbiAgICAgIHRoaXMuYXBwcm92YWxTZXJ2aWNlLmdldFVwZGF0ZUxpc3QoKS5zdWJzY3JpYmUoKGxpc3Q6YW55KSA9PiB7XG4gICAgICAgIHRoaXMuYXBwcm92YWxUZXJtID0gbGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gdGhpcy5jb2x1bW4uY29kZSA9PT0gaXRlbS5jYXRlZ29yeSlcbiAgICAgICAgaWYodGhpcy5hcHByb3ZhbFRlcm0pe1xuICAgICAgICAgIHRoaXMuYXBwcm92YWxUZXJtLmZvckVhY2goKHRlcm06IGFueSwgX2k6IG51bWJlcik9PiB7XG4gICAgICAgICAgICAgdGhpcy5jb2x1bW4uY2hpbGRyZW4uZm9yRWFjaCgobGVsOiBhbnksIF9qOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZihsZWwuaWRlbnRpZmllciA9PT0gdGVybS5pZGVudGlmaWVyKXtcbiAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzRXhpc3RzKHRlcm0pKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXJtc2hhZmFsbC5wdXNoKGxlbClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIHRoaXMudGVybXNoYWZhbGwgPSBbLi4udGhpcy50ZXJtc2hhZmFsbF1cbiAgICAgICAgICB0aGlzLmNvbHVtbi5jaGlsZHJlbi5mb3JFYWNoKCh0cjogYW55LCBfaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5pc0V4aXN0cyh0cikpe1xuICAgICAgICAgICAgICB0aGlzLnRlcm1zaGFmYWxsLnB1c2godHIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmNvbHVtbkRhdGEgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnRlcm1zaGFmYWxsKTtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICAgICAgICBpZih0aGlzLmNvbHVtbkRhdGEgJiYgdGhpcy5jb2x1bW5EYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jYXJkc0NvdW50LmVtaXQoe2NhdGVnb3J5OiB0aGlzLmNvbHVtbkRhdGFbMF0uY2F0ZWdvcnkgfHwgdGhpcy5jb2x1bW4uY29kZSxjb3VudDp0aGlzLmNvbHVtbkRhdGEubGVuZ3RofSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmcgPSB0aGlzLmNvbm5lY3RvclNlcnZpY2UuY29ubmVjdG9yTWFwXG4gICAgLy8gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmlzRGF0YVVwZGF0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAvLyAgIHRoaXMubmdPbkluaXQoKVxuICAgIC8vIH0pXG4gICAgXG4gIH1cbiBcbiAgaXNFeGlzdHMoZTphbnkpe1xuICAgIGxldCB0ZW1wO1xuICAgIGlmKHRoaXMudGVybXNoYWZhbGwgJiYgdGhpcy50ZXJtc2hhZmFsbC5sZW5ndGgpIHtcbiAgICAgIHRlbXAgPSB0aGlzLnRlcm1zaGFmYWxsLm1hcCh0ID0+IHQuaWRlbnRpZmllcilcbiAgICAgIHJldHVybiB0ZW1wLmluY2x1ZGVzKGUuaWRlbnRpZmllcilcbiAgICB9IHJldHVybiBmYWxzZVxuICB9XG4gIFxuICBzdWJzY3JpYmVFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpbGRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLmNoaWxkU3Vic2NyaXB0aW9uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24uc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgaWYgKCFlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09IHRoaXMuY29sdW1uLmNvZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXJtID0gey4uLmUuZGF0YSwgY2FyZFJlZjogZS5jYXJkUmVmIH1cbiAgICAgICAgaWYoZS5pc1VwZGF0ZSl7XG4gICAgICAgICAgdGhpcy51cGRhdGVUYXhvbm9teVRlcm0uZW1pdCh7IGlzU2VsZWN0ZWQ6IHRydWUsIHNlbGVjdGVkVGVybSwgaXNVcGRhdGU6IHRydWUgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRheG9ub215VGVybS5lbWl0KHsgaXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWRUZXJtIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5EYXRhID0gdGhpcy50cmFuc2Zvcm0oKHRoaXMuY29sdW1uRGF0YSB8fCBbXSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmNvZGUgPT09IGUuZGF0YS5jb2RlKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICAgICAgdGhpcy5zZXRDb25uZWN0b3JzKGUuY2FyZFJlZiwgdGhpcy5jb2x1bW5JdGVtcywgJ1NJTkdMRScpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZS50eXBlKTtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5jb2RlID09PSB0aGlzLmNvbHVtbi5jb2RlKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldENvbm5lY3RvcnMoZS5jYXJkUmVmLCBuZXh0ICYmIG5leHQuaW5kZXggPCB0aGlzLmNvbHVtbi5pbmRleCA/IFtdIDogdGhpcy5jb2x1bW5JdGVtcywgJ0FMTCcpXG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQuaW5kZXggPCB0aGlzLmNvbHVtbi5pbmRleCkge1xuICAgICAgICAgIHRoaXMuY29sdW1uRGF0YSA9IFtdO1xuICAgICAgICAgIHRoaXMuc2V0Q29sdW1uSXRlbXMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodGhpcy5uZXdUZXJtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuaW5zZXJ0VXBkYXRlRGVsZXRlTm90aWZpZXIuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgaWYgKGUgJiYgZS5hY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZS5hY3Rpb24pO1xuICAgICAgICBpZihuZXh0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmNvZGUgPT09IG5leHQuY29kZSAmJiBlLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFVwZGF0ZUhhbmRsZXIoZSwgbmV4dClcbiAgICAgICAgICB9IFxuICAgICAgICAgIGlmKGUudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuY29sdW1uLmNvZGUgPT09IG5leHQuY29kZSAmJiBlLnR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGUuYWN0aW9uKVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50OiBhbnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShlLmFjdGlvbik7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChzZWxlY3RlZFBhcmVudC5jb2RlKVxuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcmVudENhcmRSZWYgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQoc2VsZWN0ZWRQYXJlbnQuY29kZSkgJiYgXG4gICAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChzZWxlY3RlZFBhcmVudC5jb2RlKS5jYXJkUmVmXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZihzZWxlY3RlZFBhcmVudCAmJiBzZWxlY3RlZFBhcmVudERhdGEgJiYgc2VsZWN0ZWRQYXJlbnREYXRhLmNoaWxkcmVuICYmIHNlbGVjdGVkUGFyZW50RGF0YS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbnNlcnRVcGRhdGVIYW5kbGVyKGUsIG5leHQsICd1cGRhdGUnKVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGUuYWN0aW9uKVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KClcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogc2VsZWN0ZWRQYXJlbnQuY29kZSwgZGF0YTpzZWxlY3RlZFBhcmVudERhdGEuY2hpbGRyZW5bMF0sIGNhcmRSZWY6c2VsZWN0ZWRQYXJlbnRDYXJkUmVmLCBpc1VwZGF0ZTogdHJ1ZX0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGluc2VydFVwZGF0ZUhhbmRsZXIoZTogYW55LCBfbmV4dDogYW55LCBpc1VwZGF0ZT86IGFueSkge1xuICAgIGNvbnN0IGJhY2sgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmNvbHVtbi5jb2RlKVxuICAgIFxuICAgIGNvbnN0IGxvY2FsVGVybXM6YW55ID0gW11cbiAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TG9jYWxUZXJtc0J5Q2F0ZWdvcnkodGhpcy5jb2x1bW4uY29kZSkuZm9yRWFjaChmID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50ID0gYmFjayA/IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChiYWNrLmNvZGUpIDogbnVsbDsgLy9jYW4gdXNlIGN1cnJlbnRcbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdGVkUGFyZW50ICYmICgoZi5wYXJlbnQuY29kZSA9PT0gc2VsZWN0ZWRQYXJlbnQuY29kZSkgfHwgKGYucGFyZW50LmlkZW50aWZpZXIgJiYgKGYucGFyZW50LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkUGFyZW50LmlkZW50aWZpZXIpKSkpIHtcbiAgICAgICAgbG9jYWxUZXJtcy5wdXNoKGYudGVybSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmKCFpc1VwZGF0ZSkge1xuICAgIC8vIGdldCBsYXN0IHBhcmVudCBhbmQgZmlsdGVyIEFib3ZlXG4gICAgaWYoZSAmJiBlLmRhdGEpIHtcbiAgICB0aGlzLmNvbHVtbkRhdGEgPSB0aGlzLnRyYW5zZm9ybShbLi4ubG9jYWxUZXJtcywgLi4uKGUuZGF0YS5jaGlsZHJlbiB8fCBbXSldKVxuICAgICAgLmZpbHRlcigoeDphbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHguY2F0ZWdvcnkgPT0gdGhpcy5jb2x1bW4uY29kZVxuICAgICAgfSkubWFwKChtZXI6YW55KSA9PiB7XG4gICAgICAgIC8vKipyZWFkIGxvY2FsIGNoaWxkcmVuIGZvciBuZXh0ICovXG4gICAgICAgIC8vIGNvbnN0IG5leHRDaGlsZHJlbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRMb2NhbFRlcm1zQnlQYXJlbnQodGhpcy5jb2x1bW4uY29kZSlcbiAgICAgICAgXG4gICAgICAgIC8qKnJlc2V0IE5leHQgbGV2ZWwgY2hpbGRyZW4gKi9cbiAgICAgICAgdGhpcy5jb2x1bW4uY2hpbGRyZW4gPSB0aGlzLmNvbHVtbi5jaGlsZHJlbi5tYXAoKGNvbDphbnkpID0+IHsgY29sLnNlbGVjdGVkID0gZmFsc2U7IHJldHVybiBjb2wgfSlcbiAgICAgICAgbWVyLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgbWVyLmNoaWxkcmVuID0gKFsuLi50aGlzLmNvbHVtbi5jaGlsZHJlbi5maWx0ZXIoKHg6YW55KSA9PiB7IHJldHVybiB4LmNvZGUgPT09IG1lci5jb2RlIH0pLm1hcCgoYTogYW55KSA9PiBhLmNoaWxkcmVuKV0uc2hpZnQoKSB8fCBbXSlcbiAgICAgICAgcmV0dXJuIG1lclxuICAgICAgfSk7XG4gICAgfVxuICAgICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG5cbiAgICBpZih0aGlzLmNvbHVtbkRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jYXJkc0NvdW50LmVtaXQoe2NhdGVnb3J5OiB0aGlzLmNvbHVtbkRhdGFbMF0uY2F0ZWdvcnkgfHwgJycsY291bnQ6dGhpcy5jb2x1bW5EYXRhLmxlbmd0aH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcmRzQ291bnQuZW1pdCh7Y2F0ZWdvcnk6IHRoaXMuY29sdW1uLmNvZGUsY291bnQ6IDB9KTtcbiAgICB9XG4gICAgLy8gdGhpcy51cGRhdGVUZXJtcygpXG5cbiAgICB9XG4gIH1cbiAgdXBkYXRlU2VsZWN0aW9uMShfZGF0YTogYW55KSB7IFxuICB9XG4gIHVwZGF0ZVNlbGVjdGlvbihfc2VsZWN0aW9uOiBhbnkpIHtcbiAgICAvLyBpZih0aGlzLmNvbHVtbi5jb2RlPT09J21lZGl1bScpe1xuICAgIC8vIH1cbiAgICAvLyBpZiAoc2VsZWN0aW9uLmVsZW1lbnQuY2F0ZWdvcnkgPT09IHRoaXMuY29sdW1uLmNvZGUpIHtcbiAgICAvLyAgIHRoaXMudXBkYXRlVGF4b25vbXlUZXJtLmVtaXQoeyBpc1NlbGVjdGVkOiBzZWxlY3Rpb24uaXNTZWxlY3RlZCwgc2VsZWN0ZWRUZXJtOiBzZWxlY3Rpb24uZWxlbWVudCB9KVxuICAgIC8vIH1cbiAgICAvLyB0aGlzLmNvbHVtbi5jaGlsZHJlbiA9IHRoaXMuY29sdW1uLmNoaWxkcmVuLm1hcChjb2wgPT4ge1xuICAgIC8vICAgaWYgKGNvbC5jb2RlID09PSBzZWxlY3Rpb24uZWxlbWVudC5jb2RlKSB7XG4gICAgLy8gICAgIGNvbC5zZWxlY3RlZCA9IHRydWVcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGNvbC5zZWxlY3RlZCA9IGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gY29sXG4gICAgLy8gfSlcbiAgfVxuXG4gIHNldENvbHVtbkl0ZW1zKCkge1xuICAgIC8vIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jb2x1bW4uY2hpbGRyZW4uZmlsdGVyKGYgPT4geyByZXR1cm4gZi5zZWxlY3RlZCB9KVxuICAgIC8vIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgLy8gICBjb25zdCBkYXRhID0gdGhpcy5jb2x1bW5EYXRhLm1hcChjZCA9PiB7XG4gICAgLy8gICAgIGNkLnNlbGVjdGVkID0gdGhpcy5jb2x1bW4uY2hpbGRyZW4uZmlsdGVyKGYgPT4geyByZXR1cm4gY2QuaWRlbnRpZmllciA9PT0gZi5pZGVudGlmaWVyIH0pLm1hcChzID0+IHMuc2VsZWN0ZWQpWzBdXG4gICAgLy8gICAgIHJldHVybiBjZFxuICAgIC8vICAgfSlcbiAgICAvLyAgIHJldHVybiBkYXRhXG4gICAgLy8gfSBlbHNlIHtcbiAgICBsZXQgbG9jYWxTZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWUudmFsdWUgJiYgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgbGV0IGZpbHRlcmVkQ29sdW1uRGF0YSA9IFtdXG4gICAgdGhpcy5jb2x1bW5JdGVtcyA9IFtdXG4gICAgaWYobG9jYWxTZWFyY2hWYWx1ZSkge1xuICAgICAgZmlsdGVyZWRDb2x1bW5EYXRhID0gdGhpcy5jb2x1bW5EYXRhLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkgfHwgXG4gICAgICAgIChfLmdldChjaGlsZCwgJ3JlZklkJykgJiYgXy5nZXQoY2hpbGQsICdyZWZJZCcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkpIHx8IFxuICAgICAgICAoXy5nZXQoY2hpbGQsICdkZXNjcmlwdGlvbicpICYmIF8uZ2V0KGNoaWxkLCAnZGVzY3JpcHRpb24nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvY2FsU2VhcmNoVmFsdWUpKXx8XG4gICAgICAgIChfLmdldChjaGlsZCwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lJykgJiYgXy5nZXQoY2hpbGQsICdhZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5TmFtZScpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbHRlcmVkQ29sdW1uRGF0YSA9IHRoaXMuY29sdW1uRGF0YVxuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1uSXRlbXMgPSBmaWx0ZXJlZENvbHVtbkRhdGFcbiAgICB0aGlzLmNvbHVtbkl0ZW1zID0gZmlsdGVyZWRDb2x1bW5EYXRhID8gZmlsdGVyZWRDb2x1bW5EYXRhLnNsaWNlKHRoaXMuc3RhcnRJbmRleCwgdGhpcy5jdXJyZW50TGFzdEluZGV4KSA6IFtdXG4gICAgLy8gfVxuICB9XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIHNvcnRCeSA9ICd0aW1lU3RhbXAnKTogYW55e1xuICAgIGlmKCFzb3J0QnkpIHtcbiAgICAgIGlmKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBBID0gYS5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCA/IG5ldyBEYXRlKE51bWJlcihhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCkpLmdldFRpbWUoKSA6IDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBCID0gYi5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBiLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCA/IG5ldyBEYXRlKE51bWJlcihiLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCkpLmdldFRpbWUoKSA6IDA7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gIHRpbWVzdGFtcEIgLSB0aW1lc3RhbXBBO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgXG4gICAgICB9XG4gICAgfVxuICAgICBcbiAgfVxuXG4gIHNlYXJjaEZpbHRlckRhdGEoX2VsZTogYW55KXtcblxuICAgIHRoaXMuc2V0Q29sdW1uSXRlbXMoKVxuICAgIGNvbnN0IGJhY2sgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmNvbHVtbi5jb2RlKVxuICAgIGlmKGJhY2sgJiYgYmFjay5jb2RlKSB7XG4gICAgICBsZXQgYmFja0NvbHVtRGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChiYWNrLmNvZGUpXG4gICAgICBpZihiYWNrQ29sdW1EYXRhLmNhdGVnb3J5KSB7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgIFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogYmFja0NvbHVtRGF0YS5jYXRlZ29yeSwgZGF0YTogYmFja0NvbHVtRGF0YSwgY2FyZFJlZjogYmFja0NvbHVtRGF0YS5jYXJkUmVmIH0pXG4gICAgICAgIH0sIDIwMClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYodGhpcy5jb2x1bW5JdGVtcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFrZUZpcnN0VGVybVNlbGVjdGVkKClcbiAgICAgICAgfSw1MDApXG4gICAgICB9XG4gICAgfVxuICAgfVxuXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0VmFsdWUoJycpXG4gIH1cblxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLmN1cnJlbnRMYXN0SW5kZXggPSB0aGlzLmN1cnJlbnRMYXN0SW5kZXggKyB0aGlzLmxpbWl0VG9BZGRcbiAgICB0aGlzLnNlYXJjaEZpbHRlckRhdGEodGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSlcbiAgfVxuXG4gIHNldENvbm5lY3RvcnMoZWxlbWVudENsaWNrZWQ6IGFueSwgY29sdW1uSXRlbTogYW55LCBtb2RlOiBhbnkpIHtcbiAgICB0aGlzLnJlbW92ZUNvbm5lY3RvcnMoZWxlbWVudENsaWNrZWQsICdib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSksIHRoaXMuY29sdW1uLmluZGV4IC0gMSlcbiAgICBcbiAgICBpZiAobW9kZSA9PT0gJ0FMTCcpIHtcbiAgICAgIC8vIGxldCB0ZW1wY29ubmVjdG9yTWFwcGluZyA9IHt9XG4gICAgICAvLyB0aGlzLmNvbm5lY3RvclNlcnZpY2UudXBkYXRlQ29ubmVjdG9yc01hcCh0ZW1wY29ubmVjdG9yTWFwcGluZylcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgWydjb2x1bW4nICsgKHRoaXMuY29sdW1uLmluZGV4LSAxKV06ICcnXG5cbiAgICAgIC8vIH1cbiAgICAgIGNvbnN0IGlkcyA9IGNvbHVtbkl0ZW0ubWFwKChfYzogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmNvZGUgKyAnQ2FyZCcgKyAoaSArIDEpXG4gICAgICB9KVxuICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldID0geyBzb3VyY2U6IGVsZW1lbnRDbGlja2VkLCBsaW5lczogKGlkcyB8fCBbXSkubWFwKChpZDogYW55KSA9PiB7IHJldHVybiB7IHRhcmdldDogaWQsIGxpbmU6ICcnLCB0YXJnZXRUeXBlOiAnaWQnIH0gfSkgfVxuICAgICAgdGhpcy5jb25uZWN0b3JTZXJ2aWNlLnVwZGF0ZUNvbm5lY3RvcnNNYXAodGhpcy5jb25uZWN0b3JNYXBwaW5nKVxuICAgICAgXG4gICAgICBjb25zdCBjb25uZWN0aW9uTGluZXMgPSB0aGlzLmNvbm5lY3RvclNlcnZpY2UuX2RyYXdMaW5lKFxuICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0uc291cmNlLFxuICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0ubGluZXMsXG4gICAgICAgIG51bGwsXG4gICAgICAgICcjYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpLFxuICAgICAgICAnI2JveCcgKyB0aGlzLmNvbHVtbi5pbmRleFxuICAgICAgKVxuICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLmxpbmVzID0gY29ubmVjdGlvbkxpbmVzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5pbmRleCA+IDEgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IFt7IHRhcmdldDogZWxlbWVudENsaWNrZWQsIGxpbmU6ICcnLCB0YXJnZXRUeXBlOiAnZWxlbWVudCcgfV1cblxuICAgICAgICB0aGlzLmNvbm5lY3RvclNlcnZpY2UudXBkYXRlQ29ubmVjdG9yc01hcCh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaW5lcyA9IHRoaXMuY29ubmVjdG9yU2VydmljZS5fZHJhd0xpbmUoXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLnNvdXJjZSxcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0ubGluZXMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAnI2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKSxcbiAgICAgICAgICAnI2JveCcgKyB0aGlzLmNvbHVtbi5pbmRleFxuICAgICAgICApXG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IGNvbm5lY3Rpb25MaW5lc1xuICAgICAgfVxuXG4gICAgfVxuICAgIHRoaXMuY29ubmVjdG9yU2VydmljZS51cGRhdGVDb25uZWN0b3JzTWFwKHRoaXMuY29ubmVjdG9yTWFwcGluZylcblxuICB9XG4gIHJlbW92ZUNvbm5lY3RvcnMoY3VycmVudEVsZW1lbnQ6IGFueSwgcHJldkNvbDogYW55LCBjdXJyZW50SW5kZXg6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29ubmVjdG9yTWFwcGluZykge1xuICAgICAgICAvLyBSZW1vdmUgYWxsIG4tMSBsaW5lcyBhbmQga2VlcCBvbmx5IGN1cnJlbnQgc2VsZWN0aW9uLCBhbHNvIGNsZWFyIG4rMSBsaW5lc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0gJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXNcbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGFzeW5jIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50ICYmIHByZXZDb2wgPT0ga2V5KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGVsZW1lbnQubGluZSAmJiBlbGVtZW50LmxpbmUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgPSBsaW5lc1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBuKzIgbGluZXMsIGlmIGNsaWNrcyBwcmV2aW91cyBjb2x1bW5zIGFuZCB0cmVlIHdhcyBhbHJlYWR5IGRyaWxsZWQgZG93blxuICAgICAgICBsZXQgY291bnQgPSBjdXJyZW50SW5kZXggKyAyO1xuICAgICAgICBsZXQgbmV4dENvbCA9IGBib3gke2NvdW50fWBcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXSAmJiB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW25leHRDb2xdLmxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXS5saW5lc1xuICAgICAgICAgIGxpbmVzLmZvckVhY2goYXN5bmMgKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgZWxlbWVudC5saW5lICYmIGVsZW1lbnQubGluZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cbiAgfVxuICBzZWxlY3RlZENhcmQoZXZlbnQ6IGFueSl7XG4gICAgdGhpcy51cGRhdGVUZXJtTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGdldCBzaG93TG9hZE1vcmVCdG4oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uY29uZmlnICYmIHRoaXMuY29sdW1uLmNvbmZpZy5jYXRlZ29yeURpc3BsYXlOYW1lICE9PSAnT3JnYW5pc2F0aW9uJyBcbiAgICAgICYmIHRoaXMuY29sdW1uLm5hbWUgIT09ICdPcmdhbmlzYXRpb24nICYmIHRoaXMuY29sdW1uSXRlbXMgJiYgdGhpcy5jb2x1bW5JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZGlzYWJsZUxvYWRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5maWx0ZXJlZENvbHVtbkl0ZW1zICYmIHRoaXMuZmlsdGVyZWRDb2x1bW5JdGVtcy5sZW5ndGggPCB0aGlzLmN1cnJlbnRMYXN0SW5kZXgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hpbGRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpbGRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZih0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubmV3VGVybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgY2FyZEFjdGlvbkVtaXQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY2FyZEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG1ha2VGaXJzdFRlcm1TZWxlY3RlZCgpIHtcbiAgICBjb25zdCBmaXJzdExpc3RJdGVtID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZW50cmllcygpLm5leHQoKS52YWx1ZSBhcyBhbnlcbiAgICBpZihmaXJzdExpc3RJdGVtICYmIGZpcnN0TGlzdEl0ZW0ubGVuZ3RoID49IDIpe1xuICAgICAgaWYoZmlyc3RMaXN0SXRlbVsxXSAmJiBmaXJzdExpc3RJdGVtWzFdLmNoaWxkcmVuICYmIGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGVybSA9IGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW5bMF0gYXMgYW55XG4gICAgICAgIGNvbnN0IGNhcmRSZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaXJzdFRlcm0ubmFtZSlcbiAgICAgICAgLy8gdGhpcy5jYXRlZ29yeUxpc3QgPSBbXVxuICAgICAgICBmaXJzdFRlcm0uc2VsZWN0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXJkQ2xrRGF0YSA9IGZpcnN0VGVybTtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLkN1cnJlbnRDYXJkQ2xrLm5leHQoZmlyc3RUZXJtLmNhdGVnb3J5KVxuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogZmlyc3RUZXJtLmNhdGVnb3J5LCBkYXRhOiBmaXJzdFRlcm0sIGNhcmRSZWYgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG59IiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5zaG93U2VhcmNoXCI+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBzdGlja3lcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBtYi01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnNlYXJjaFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5wdXQgbWF0LWZpZWxkLXJvdW5kZWQgZmxleCBmbGV4LW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzZWFyY2gtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiAjc2VhcmNoPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VhcmNoLnZhbHVlXCIgY2xhc3M9XCJjbGVhci1idG4gZmxleFwiIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkl0ZW1zICYmIGNvbHVtbkl0ZW1zLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhVGVtcGxhdGU7XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgY29sdW1uSXRlbXM7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiAjY2FyZEVsZSBpZD1cInt7Y29sdW1uLmNvZGV9fUNhcmR7e2orMX19XCIgPlxuICAgICAgICAgICAgPGxpYi10ZXJtLWNhcmRcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJ7J2NoaWxkcmVuJzogY2hpbGQsICdzZWxlY3RlZCcgOiBmYWxzZSwgJ2NhdGVnb3J5Jzpjb2x1bW4uY29kZSwgY2FyZFN1YlR5cGU6ICdtaW5pbWFsJywgaXNWaWV3T25seTpmYWxzZSwnaW5kZXgnOmNvbHVtbi5pbmRleCwgY29sdW1uSW5mbzogY29sdW1ufVwiXG4gICAgICAgICAgICAgICAgW2VuYWJsZVRocmVlRG90c109XCIoaXNDaGlsZE9yZyAmJiBjaGlsZE9yZy5jaGFubmVsID09PSBjaGlsZC5uYW1lKSA/IHRydWUgOiAoaXNDaGlsZE9yZykgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgIFtjaGVja0lmQ2hpbGRPcmddPVwiaXNDaGlsZE9yZ1wiXG4gICAgICAgICAgICAgICAgKGlzU2VsZWN0ZWQpPVwidXBkYXRlU2VsZWN0aW9uMSgkZXZlbnQpXCIgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmQoJGV2ZW50KVwiIChjYXJkQWN0aW9uKT1cImNhcmRBY3Rpb25FbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbGliLXRlcm0tY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhVGVtcGxhdGUgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hWYWx1ZT8udmFsdWVcIj5cbiAgICA8ZGl2Pk5vIERhdGEgZm91bmQ8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIWRpc2FibGVMb2FkQnV0dG9uXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibWF0LXJhaXNlZC1idXR0b24gbWF0LWJ1dHRvbi1iYXNlIGxvYWRNb3JlXCIgW25nQ2xhc3NdPVwieydkaXNhYmxCdG4nOiBkaXNhYmxlTG9hZEJ1dHRvbn1cIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlTG9hZEJ1dHRvblwiPkxvYWQgbW9yZS4uLjwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=