@libs-ui/services-diagram-draw 0.2.356-37

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 (33) hide show
  1. package/README.md +279 -0
  2. package/canvas.service.d.ts +42 -0
  3. package/diagram-draw.service.d.ts +91 -0
  4. package/direction.service.d.ts +43 -0
  5. package/esm2022/canvas.service.mjs +628 -0
  6. package/esm2022/diagram-draw.service.mjs +711 -0
  7. package/esm2022/direction.service.mjs +255 -0
  8. package/esm2022/index.mjs +6 -0
  9. package/esm2022/interfaces/canvas.interface.mjs +2 -0
  10. package/esm2022/interfaces/coordinates.interface.mjs +2 -0
  11. package/esm2022/interfaces/diagram.interface.mjs +2 -0
  12. package/esm2022/libs-ui-services-diagram-draw.mjs +5 -0
  13. package/esm2022/utils/calculator-branch.util.mjs +187 -0
  14. package/esm2022/utils/calculator-element.util.mjs +335 -0
  15. package/esm2022/utils/canvas.util.mjs +176 -0
  16. package/esm2022/utils/diagram.util.mjs +54 -0
  17. package/esm2022/utils/direction.util.mjs +103 -0
  18. package/esm2022/utils/horizontal/calculator-branch.util.mjs +243 -0
  19. package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +315 -0
  20. package/fesm2022/libs-ui-services-diagram-draw.mjs +2982 -0
  21. package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/interfaces/canvas.interface.d.ts +21 -0
  24. package/interfaces/coordinates.interface.d.ts +40 -0
  25. package/interfaces/diagram.interface.d.ts +109 -0
  26. package/package.json +27 -0
  27. package/utils/calculator-branch.util.d.ts +16 -0
  28. package/utils/calculator-element.util.d.ts +24 -0
  29. package/utils/canvas.util.d.ts +21 -0
  30. package/utils/diagram.util.d.ts +6 -0
  31. package/utils/direction.util.d.ts +6 -0
  32. package/utils/horizontal/calculator-branch.util.d.ts +67 -0
  33. package/utils/horizontal/calculator-coordinates.util.d.ts +42 -0
@@ -0,0 +1,255 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { LibsUiDiagramDrawCanvasService } from './canvas.service';
4
+ import { canvasConfigReadonly } from './diagram-draw.service';
5
+ import { findAndDeleteElementFromContainer, getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';
6
+ import { buildFlatElement } from './utils/diagram.util';
7
+ import { buildElementDirectionTo, collectNextChainElements } from './utils/direction.util';
8
+ import * as i0 from "@angular/core";
9
+ export class LibsUiDiagramDrawDirectionService {
10
+ elementDirection;
11
+ branchDirection;
12
+ elementViewDirectionId;
13
+ onViewDirection = new Subject();
14
+ canvasService = inject(LibsUiDiagramDrawCanvasService);
15
+ set ElementDirection(element) {
16
+ this.elementDirection = element;
17
+ }
18
+ get ElementDirection() {
19
+ return this.elementDirection;
20
+ }
21
+ set BranchDirection(branch) {
22
+ this.branchDirection = branch;
23
+ }
24
+ get BranchDirection() {
25
+ return this.branchDirection;
26
+ }
27
+ set ElementViewDirectionId(id) {
28
+ this.elementViewDirectionId = id;
29
+ }
30
+ get ElementViewDirectionId() {
31
+ return this.elementViewDirectionId;
32
+ }
33
+ get OnViewDirection() {
34
+ return this.onViewDirection;
35
+ }
36
+ checkRuleDirectionToElement(element, elementConnectTo) {
37
+ const ruleAfterItemDrag = this.canvasService.RuleConnectableElements.find((item) => elementConnectTo && item.elementCode === elementConnectTo.code);
38
+ if (!ruleAfterItemDrag) {
39
+ return true;
40
+ }
41
+ if (ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === element?.code)) {
42
+ return true;
43
+ }
44
+ return false;
45
+ }
46
+ buildElementConnectTo(element, flatElements, branch, checkRule) {
47
+ const checkRuleDirectionToElement = checkRule ?? this.checkRuleDirectionToElement.bind(this);
48
+ return buildElementDirectionTo(element, flatElements, checkRuleDirectionToElement, branch);
49
+ }
50
+ /**Xóa các element nằm phía sau khi nhánh được điều hướng */
51
+ deleteElementsBehindBranchConnectTo(branch) {
52
+ const flatElements = this.canvasService.FlatElements ?? [];
53
+ const flatElementInElementCurrent = [];
54
+ const listElementDelete = [];
55
+ buildFlatElement(branch.elements, flatElementInElementCurrent);
56
+ listElementDelete.push(...flatElementInElementCurrent);
57
+ this.deleteLineConnectFromElement(listElementDelete, flatElements);
58
+ listElementDelete.forEach((elementDelete) => {
59
+ findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);
60
+ });
61
+ }
62
+ /**xóa line đến và xóa line đi ở toàn bộ các khối và nhánh bị xóa */
63
+ deleteLineConnectFromElement(elements, flatElements) {
64
+ elements.forEach((item) => {
65
+ if (item.branches && item.branches.length) {
66
+ item.branches.forEach((branch) => {
67
+ if (branch.next_other_id && branch.next_other_id.length) {
68
+ this.deletePreOtherId(item.id ?? '', branch.next_other_id, flatElements);
69
+ }
70
+ });
71
+ }
72
+ if (item.next_other_id && item.next_other_id.length) {
73
+ this.deletePreOtherId(item.id ?? '', item.next_other_id, flatElements);
74
+ }
75
+ if (item.pre_other_id && item.pre_other_id.length) {
76
+ // nhánh chỉ lưu id next đi thôi chứ không lưu được pre => chỉ cần xóa pre trong khối.
77
+ this.deleteNextOtherId(item.id ?? '', item.pre_other_id, flatElements);
78
+ }
79
+ });
80
+ }
81
+ /** Xóa pre_other_id từ khác khối mà khối bị xóa nối đến BlockDelete => Other*/
82
+ deletePreOtherId(itemId, nextOtherId, flatElements) {
83
+ nextOtherId.forEach((nextToId) => {
84
+ const nextElement = flatElements.find((item) => item.id === nextToId);
85
+ if (!nextElement || !nextElement.pre_other_id || !nextElement.pre_other_id.length) {
86
+ return;
87
+ }
88
+ const indexIdPre = nextElement.pre_other_id.findIndex((id) => id === itemId);
89
+ if (indexIdPre !== -1) {
90
+ nextElement.pre_other_id.splice(indexIdPre, 1);
91
+ }
92
+ });
93
+ }
94
+ /** Xóa next_other_id từ khác khối nối đến khối bị xóa Other => BlockDelete và kiểm tra + thêm khối thoát cho những khối nối tới BlockDelete*/
95
+ deleteNextOtherId(itemId, preOtherId, flatElements) {
96
+ preOtherId.forEach((nextToId) => {
97
+ const preElement = flatElements.find((item) => item.id === nextToId);
98
+ if (!preElement) {
99
+ return;
100
+ }
101
+ if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
102
+ preElement.branches?.forEach((branch) => {
103
+ if (!branch.next_other_id || !branch.next_other_id.length) {
104
+ return;
105
+ }
106
+ const indexIdNextInBranch = branch.next_other_id.findIndex((id) => id === itemId);
107
+ if (indexIdNextInBranch !== -1) {
108
+ branch.next_other_id.splice(indexIdNextInBranch, 1);
109
+ }
110
+ if (!branch.next_other_id || !branch.next_other_id.length) {
111
+ branch.nodeOtherConfig = undefined;
112
+ this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);
113
+ }
114
+ });
115
+ return;
116
+ }
117
+ if (!preElement.next_other_id || !preElement.next_other_id.length) {
118
+ return;
119
+ }
120
+ const indexIdNext = preElement.next_other_id.findIndex((id) => id === itemId);
121
+ if (indexIdNext !== -1) {
122
+ preElement.next_other_id.splice(indexIdNext, 1);
123
+ }
124
+ if (!preElement.next_other_id || !preElement.next_other_id.length) {
125
+ // thêm khối thoát vì không còn khối nào connect tới nó
126
+ if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
127
+ const getConfigDefaultBranches = this.canvasService.HandlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;
128
+ getConfigDefaultBranches(preElement.code ?? '', preElement);
129
+ }
130
+ const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(preElement.id ?? '', flatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);
131
+ this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);
132
+ preElement.subCodeOfElement = undefined;
133
+ preElement.attributeSvgD = undefined;
134
+ preElement.position_end = undefined;
135
+ }
136
+ });
137
+ }
138
+ addBranchDirection(targetId, element, branch, flatElements) {
139
+ if (!branch.next_other_id) {
140
+ branch.next_other_id = [];
141
+ }
142
+ branch.next_other_id.push(targetId);
143
+ const elementTo = flatElements.find((item) => item.id === targetId);
144
+ if (elementTo) {
145
+ if (!elementTo.pre_other_id) {
146
+ elementTo.pre_other_id = [];
147
+ }
148
+ elementTo.pre_other_id.push(element.id ?? '');
149
+ }
150
+ }
151
+ addElementDirection(targetId, element, flatElements) {
152
+ if (!element.next_other_id) {
153
+ element.next_other_id = [];
154
+ }
155
+ element.next_other_id.push(targetId);
156
+ const elementTo = flatElements.find((item) => item.id === targetId);
157
+ if (elementTo) {
158
+ if (!elementTo.pre_other_id) {
159
+ elementTo.pre_other_id = [];
160
+ }
161
+ elementTo.pre_other_id.push(element.id ?? '');
162
+ }
163
+ }
164
+ deleteElementsBehindElementConnectTo(element, flatElements) {
165
+ const listElementDelete = [];
166
+ let flatElementInElementCurrent = [];
167
+ if (element.branches && element.branches.length) {
168
+ buildFlatElement([element], flatElementInElementCurrent);
169
+ flatElementInElementCurrent = flatElementInElementCurrent.filter((item) => item.id !== element.id);
170
+ }
171
+ delete element.branches;
172
+ listElementDelete.push(...flatElementInElementCurrent);
173
+ collectNextChainElements(element, flatElements, listElementDelete);
174
+ this.deleteLineConnectFromElement(listElementDelete, flatElements);
175
+ listElementDelete.forEach((elementDelete) => {
176
+ this.findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);
177
+ });
178
+ }
179
+ findAndDeleteElementFromContainer(containerElement, elementDelete) {
180
+ for (const index in containerElement) {
181
+ const elementOfIndex = containerElement[index];
182
+ if (elementOfIndex.id === elementDelete.id) {
183
+ containerElement.splice(+index, 1);
184
+ return true;
185
+ }
186
+ if (!elementOfIndex.branches || !elementOfIndex.branches.length) {
187
+ continue;
188
+ }
189
+ for (const branch of elementOfIndex.branches) {
190
+ if (!branch.elements || !branch.elements.length) {
191
+ continue;
192
+ }
193
+ if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {
194
+ return true;
195
+ }
196
+ }
197
+ }
198
+ return false;
199
+ }
200
+ editDirection(flatElements, targetId, element, branch) {
201
+ if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && branch) {
202
+ this.editDirectionWithBranch(flatElements, branch, targetId, element);
203
+ return;
204
+ }
205
+ const idOldNextTo = element.next_other_id?.[0];
206
+ const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);
207
+ // xóa line cũ
208
+ if (elementOldTo && elementOldTo.pre_other_id) {
209
+ const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);
210
+ if (itemIndex !== -1) {
211
+ elementOldTo.pre_other_id?.splice(itemIndex, 1);
212
+ }
213
+ }
214
+ element.attributeSvgD = undefined;
215
+ element.position_end = undefined;
216
+ // update line mới
217
+ const elementNewTo = flatElements?.find((item) => item.id === targetId);
218
+ if (elementNewTo) {
219
+ if (!elementNewTo.pre_other_id) {
220
+ elementNewTo.pre_other_id = [];
221
+ }
222
+ elementNewTo.pre_other_id.push(element.id ?? '');
223
+ }
224
+ element.next_other_id = [];
225
+ element.next_other_id.push(targetId);
226
+ }
227
+ editDirectionWithBranch(flatElements, branch, targetId, element) {
228
+ const idOldNextTo = branch.next_other_id?.[0];
229
+ const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);
230
+ // xóa line cũ
231
+ if (elementOldTo && elementOldTo.pre_other_id) {
232
+ const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);
233
+ if (itemIndex !== -1) {
234
+ elementOldTo.pre_other_id?.splice(itemIndex, 1);
235
+ }
236
+ }
237
+ // update line mới
238
+ const elementNewTo = flatElements?.find((item) => item.id === targetId);
239
+ if (elementNewTo) {
240
+ if (!elementNewTo.pre_other_id) {
241
+ elementNewTo.pre_other_id = [];
242
+ }
243
+ elementNewTo.pre_other_id.push(element.id ?? '');
244
+ }
245
+ branch.next_other_id = [];
246
+ branch.next_other_id.push(targetId);
247
+ }
248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawDirectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
249
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawDirectionService, providedIn: 'root' });
250
+ }
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawDirectionService, decorators: [{
252
+ type: Injectable,
253
+ args: [{ providedIn: 'root' }]
254
+ }] });
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvZGlyZWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsbUNBQW1DLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFHM0YsTUFBTSxPQUFPLGlDQUFpQztJQUNwQyxnQkFBZ0IsQ0FBOEI7SUFDOUMsZUFBZSxDQUErRDtJQUM5RSxzQkFBc0IsQ0FBcUI7SUFDM0MsZUFBZSxHQUE0QixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRXpELGFBQWEsR0FBRyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUUvRCxJQUFXLGdCQUFnQixDQUFDLE9BQW9DO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLGVBQWUsQ0FBQyxNQUFvRTtRQUM3RixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBVyxl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QyxDQUFDO0lBQ3RDLENBQUM7d0dBclNVLGlDQUFpQzs0R0FBakMsaUNBQWlDLGNBRHBCLE1BQU07OzRGQUNuQixpQ0FBaUM7a0JBRDdDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1NlcnZpY2UgfSBmcm9tICcuL2NhbnZhcy5zZXJ2aWNlJztcbmltcG9ydCB7IGNhbnZhc0NvbmZpZ1JlYWRvbmx5IH0gZnJvbSAnLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQsIElEaWFncmFtRWxlbWVudEJyYW5jaCB9IGZyb20gJy4vaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBmaW5kQW5kRGVsZXRlRWxlbWVudEZyb21Db250YWluZXIsIGdldERlZmF1bHRDb25maWdDb25zdGl0dWVudEJyYW5jaGVzLCBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwgfSBmcm9tICcuL3V0aWxzL2NhbnZhcy51dGlsJztcbmltcG9ydCB7IGJ1aWxkRmxhdEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2RpYWdyYW0udXRpbCc7XG5pbXBvcnQgeyBidWlsZEVsZW1lbnREaXJlY3Rpb25UbywgY29sbGVjdE5leHRDaGFpbkVsZW1lbnRzIH0gZnJvbSAnLi91dGlscy9kaXJlY3Rpb24udXRpbCc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTGlic1VpRGlhZ3JhbURyYXdEaXJlY3Rpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBlbGVtZW50RGlyZWN0aW9uOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgYnJhbmNoRGlyZWN0aW9uOiB7IGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoOyBpbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZWxlbWVudFZpZXdEaXJlY3Rpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9uVmlld0RpcmVjdGlvbjogU3ViamVjdDx7IGlkOiBzdHJpbmcgfT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgY2FudmFzU2VydmljZSA9IGluamVjdChMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1NlcnZpY2UpO1xuXG4gIHB1YmxpYyBzZXQgRWxlbWVudERpcmVjdGlvbihlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmVsZW1lbnREaXJlY3Rpb24gPSBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBFbGVtZW50RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnREaXJlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IEJyYW5jaERpcmVjdGlvbihicmFuY2g6IHsgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2g7IGluZGV4OiBudW1iZXIgfSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYnJhbmNoRGlyZWN0aW9uID0gYnJhbmNoO1xuICB9XG5cbiAgcHVibGljIGdldCBCcmFuY2hEaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYnJhbmNoRGlyZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBFbGVtZW50Vmlld0RpcmVjdGlvbklkKGlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmVsZW1lbnRWaWV3RGlyZWN0aW9uSWQgPSBpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRWxlbWVudFZpZXdEaXJlY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Vmlld0RpcmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBPblZpZXdEaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub25WaWV3RGlyZWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1J1bGVEaXJlY3Rpb25Ub0VsZW1lbnQoZWxlbWVudDogSURpYWdyYW1FbGVtZW50IHwgdW5kZWZpbmVkLCBlbGVtZW50Q29ubmVjdFRvOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBydWxlQWZ0ZXJJdGVtRHJhZyA9IHRoaXMuY2FudmFzU2VydmljZS5SdWxlQ29ubmVjdGFibGVFbGVtZW50cy5maW5kKChpdGVtKSA9PiBlbGVtZW50Q29ubmVjdFRvICYmIGl0ZW0uZWxlbWVudENvZGUgPT09IGVsZW1lbnRDb25uZWN0VG8uY29kZSk7XG5cbiAgICBpZiAoIXJ1bGVBZnRlckl0ZW1EcmFnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocnVsZUFmdGVySXRlbURyYWcuZWxlbWVudENvZGVDb25uZWN0YWJsZUJlZm9yZS5maW5kKChjb2RlKSA9PiBjb2RlID09PSBlbGVtZW50Py5jb2RlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYnVpbGRFbGVtZW50Q29ubmVjdFRvKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzOiBJRGlhZ3JhbUVsZW1lbnRbXSwgYnJhbmNoPzogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBjaGVja1J1bGU/OiAoZWxlbWVudDogSURpYWdyYW1FbGVtZW50IHwgdW5kZWZpbmVkLCBlbGVtZW50Q29ubmVjdFRvOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQpID0+IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjaGVja1J1bGVEaXJlY3Rpb25Ub0VsZW1lbnQgPSBjaGVja1J1bGUgPz8gdGhpcy5jaGVja1J1bGVEaXJlY3Rpb25Ub0VsZW1lbnQuYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYnVpbGRFbGVtZW50RGlyZWN0aW9uVG8oZWxlbWVudCwgZmxhdEVsZW1lbnRzLCBjaGVja1J1bGVEaXJlY3Rpb25Ub0VsZW1lbnQsIGJyYW5jaCk7XG4gIH1cblxuICAvKipYw7NhIGPDoWMgZWxlbWVudCBu4bqxbSBwaMOtYSBzYXUga2hpIG5ow6FuaCDEkcaw4bujYyDEkWnhu4F1IGjGsOG7m25nICovXG4gIHB1YmxpYyBkZWxldGVFbGVtZW50c0JlaGluZEJyYW5jaENvbm5lY3RUbyhicmFuY2g6IElEaWFncmFtRWxlbWVudEJyYW5jaCkge1xuICAgIGNvbnN0IGZsYXRFbGVtZW50cyA9IHRoaXMuY2FudmFzU2VydmljZS5GbGF0RWxlbWVudHMgPz8gW107XG4gICAgY29uc3QgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50OiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGxpc3RFbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgYnVpbGRGbGF0RWxlbWVudChicmFuY2guZWxlbWVudHMsIGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudCk7XG4gICAgbGlzdEVsZW1lbnREZWxldGUucHVzaCguLi5mbGF0RWxlbWVudEluRWxlbWVudEN1cnJlbnQpO1xuXG4gICAgdGhpcy5kZWxldGVMaW5lQ29ubmVjdEZyb21FbGVtZW50KGxpc3RFbGVtZW50RGVsZXRlLCBmbGF0RWxlbWVudHMpO1xuICAgIGxpc3RFbGVtZW50RGVsZXRlLmZvckVhY2goKGVsZW1lbnREZWxldGUpID0+IHtcbiAgICAgIGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcih0aGlzLmNhbnZhc1NlcnZpY2UuRWxlbWVudHMgYXMgQXJyYXk8SURpYWdyYW1FbGVtZW50PiwgZWxlbWVudERlbGV0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKip4w7NhIGxpbmUgxJHhur9uIHbDoCB4w7NhIGxpbmUgxJFpIOG7nyB0b8OgbiBi4buZIGPDoWMga2jhu5FpIHbDoCBuaMOhbmggYuG7iyB4w7NhICovXG4gIHByaXZhdGUgZGVsZXRlTGluZUNvbm5lY3RGcm9tRWxlbWVudChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10sIGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pIHtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5icmFuY2hlcyAmJiBpdGVtLmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICBpdGVtLmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICAgIGlmIChicmFuY2gubmV4dF9vdGhlcl9pZCAmJiBicmFuY2gubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJlT3RoZXJJZChpdGVtLmlkID8/ICcnLCBicmFuY2gubmV4dF9vdGhlcl9pZCwgZmxhdEVsZW1lbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0ubmV4dF9vdGhlcl9pZCAmJiBpdGVtLm5leHRfb3RoZXJfaWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlUHJlT3RoZXJJZChpdGVtLmlkID8/ICcnLCBpdGVtLm5leHRfb3RoZXJfaWQsIGZsYXRFbGVtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5wcmVfb3RoZXJfaWQgJiYgaXRlbS5wcmVfb3RoZXJfaWQubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5ow6FuaCBjaOG7iSBsxrB1IGlkIG5leHQgxJFpIHRow7RpIGNo4bupIGtow7RuZyBsxrB1IMSRxrDhu6NjIHByZSA9PiBjaOG7iSBj4bqnbiB4w7NhIHByZSB0cm9uZyBraOG7kWkuXG4gICAgICAgIHRoaXMuZGVsZXRlTmV4dE90aGVySWQoaXRlbS5pZCA/PyAnJywgaXRlbS5wcmVfb3RoZXJfaWQsIGZsYXRFbGVtZW50cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogWMOzYSBwcmVfb3RoZXJfaWQgdOG7qyBraMOhYyBraOG7kWkgbcOgIGto4buRaSBi4buLIHjDs2EgbuG7kWkgxJHhur9uIEJsb2NrRGVsZXRlID0+IE90aGVyKi9cbiAgcHJpdmF0ZSBkZWxldGVQcmVPdGhlcklkKGl0ZW1JZDogc3RyaW5nLCBuZXh0T3RoZXJJZDogQXJyYXk8c3RyaW5nPiwgZmxhdEVsZW1lbnRzOiBJRGlhZ3JhbUVsZW1lbnRbXSkge1xuICAgIG5leHRPdGhlcklkLmZvckVhY2goKG5leHRUb0lkKSA9PiB7XG4gICAgICBjb25zdCBuZXh0RWxlbWVudCA9IGZsYXRFbGVtZW50cy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBuZXh0VG9JZCk7XG5cbiAgICAgIGlmICghbmV4dEVsZW1lbnQgfHwgIW5leHRFbGVtZW50LnByZV9vdGhlcl9pZCB8fCAhbmV4dEVsZW1lbnQucHJlX290aGVyX2lkLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleElkUHJlID0gbmV4dEVsZW1lbnQucHJlX290aGVyX2lkLmZpbmRJbmRleCgoaWQpID0+IGlkID09PSBpdGVtSWQpO1xuXG4gICAgICBpZiAoaW5kZXhJZFByZSAhPT0gLTEpIHtcbiAgICAgICAgbmV4dEVsZW1lbnQucHJlX290aGVyX2lkLnNwbGljZShpbmRleElkUHJlLCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBYw7NhIG5leHRfb3RoZXJfaWQgdOG7qyBraMOhYyBraOG7kWkgbuG7kWkgxJHhur9uIGto4buRaSBi4buLIHjDs2EgT3RoZXIgPT4gQmxvY2tEZWxldGUgdsOgIGtp4buDbSB0cmEgKyB0aMOqbSBraOG7kWkgdGhvw6F0IGNobyBuaOG7r25nIGto4buRaSBu4buRaSB04bubaSBCbG9ja0RlbGV0ZSovXG4gIHByaXZhdGUgZGVsZXRlTmV4dE90aGVySWQoaXRlbUlkOiBzdHJpbmcsIHByZU90aGVySWQ6IEFycmF5PHN0cmluZz4sIGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pIHtcbiAgICBwcmVPdGhlcklkLmZvckVhY2goKG5leHRUb0lkKSA9PiB7XG4gICAgICBjb25zdCBwcmVFbGVtZW50ID0gZmxhdEVsZW1lbnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IG5leHRUb0lkKTtcblxuICAgICAgaWYgKCFwcmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZUVsZW1lbnQuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVykge1xuICAgICAgICBwcmVFbGVtZW50LmJyYW5jaGVzPy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgICBpZiAoIWJyYW5jaC5uZXh0X290aGVyX2lkIHx8ICFicmFuY2gubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5kZXhJZE5leHRJbkJyYW5jaCA9IGJyYW5jaC5uZXh0X290aGVyX2lkLmZpbmRJbmRleCgoaWQpID0+IGlkID09PSBpdGVtSWQpO1xuXG4gICAgICAgICAgaWYgKGluZGV4SWROZXh0SW5CcmFuY2ggIT09IC0xKSB7XG4gICAgICAgICAgICBicmFuY2gubmV4dF9vdGhlcl9pZC5zcGxpY2UoaW5kZXhJZE5leHRJbkJyYW5jaCwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFicmFuY2gubmV4dF9vdGhlcl9pZCB8fCAhYnJhbmNoLm5leHRfb3RoZXJfaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jYW52YXNTZXJ2aWNlLmFkZEVsZW1lbnRFeGl0V2hlbkRlbGV0ZURpcmVjdGlvbkxpbmUocHJlRWxlbWVudCwgYnJhbmNoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmVFbGVtZW50Lm5leHRfb3RoZXJfaWQgfHwgIXByZUVsZW1lbnQubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhJZE5leHQgPSBwcmVFbGVtZW50Lm5leHRfb3RoZXJfaWQuZmluZEluZGV4KChpZCkgPT4gaWQgPT09IGl0ZW1JZCk7XG5cbiAgICAgIGlmIChpbmRleElkTmV4dCAhPT0gLTEpIHtcbiAgICAgICAgcHJlRWxlbWVudC5uZXh0X290aGVyX2lkLnNwbGljZShpbmRleElkTmV4dCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJlRWxlbWVudC5uZXh0X290aGVyX2lkIHx8ICFwcmVFbGVtZW50Lm5leHRfb3RoZXJfaWQubGVuZ3RoKSB7XG4gICAgICAgIC8vIHRow6ptIGto4buRaSB0aG/DoXQgdsOsIGtow7RuZyBjw7JuIGto4buRaSBuw6BvIGNvbm5lY3QgdOG7m2kgbsOzXG4gICAgICAgIGlmIChwcmVFbGVtZW50LmVsZW1lbnRfdHlwZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cpIHtcbiAgICAgICAgICBjb25zdCBnZXRDb25maWdEZWZhdWx0QnJhbmNoZXMgPSB0aGlzLmNhbnZhc1NlcnZpY2UuSGFuZGxlckZ1bmN0aW9uPy5nZXRDb25maWdEZWZhdWx0QnJhbmNoZXMgPz8gZ2V0RGVmYXVsdENvbmZpZ0NvbnN0aXR1ZW50QnJhbmNoZXM7XG4gICAgICAgICAgZ2V0Q29uZmlnRGVmYXVsdEJyYW5jaGVzKHByZUVsZW1lbnQuY29kZSA/PyAnJywgcHJlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnJhbmNoID0gTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEJyYW5jaE9mRWxlbWVudChwcmVFbGVtZW50LmlkID8/ICcnLCBmbGF0RWxlbWVudHMsIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKTtcblxuICAgICAgICB0aGlzLmNhbnZhc1NlcnZpY2UuYWRkRWxlbWVudEV4aXRXaGVuRGVsZXRlRGlyZWN0aW9uTGluZShwcmVFbGVtZW50LCBicmFuY2gpO1xuICAgICAgICBwcmVFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHByZUVsZW1lbnQuYXR0cmlidXRlU3ZnRCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcHJlRWxlbWVudC5wb3NpdGlvbl9lbmQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnJhbmNoRGlyZWN0aW9uKHRhcmdldElkOiBzdHJpbmcsIGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pIHtcbiAgICBpZiAoIWJyYW5jaC5uZXh0X290aGVyX2lkKSB7XG4gICAgICBicmFuY2gubmV4dF9vdGhlcl9pZCA9IFtdO1xuICAgIH1cbiAgICBicmFuY2gubmV4dF9vdGhlcl9pZC5wdXNoKHRhcmdldElkKTtcblxuICAgIGNvbnN0IGVsZW1lbnRUbyA9IGZsYXRFbGVtZW50cy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0YXJnZXRJZCk7XG5cbiAgICBpZiAoZWxlbWVudFRvKSB7XG4gICAgICBpZiAoIWVsZW1lbnRUby5wcmVfb3RoZXJfaWQpIHtcbiAgICAgICAgZWxlbWVudFRvLnByZV9vdGhlcl9pZCA9IFtdO1xuICAgICAgfVxuICAgICAgZWxlbWVudFRvLnByZV9vdGhlcl9pZC5wdXNoKGVsZW1lbnQuaWQgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRFbGVtZW50RGlyZWN0aW9uKHRhcmdldElkOiBzdHJpbmcsIGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzOiBJRGlhZ3JhbUVsZW1lbnRbXSkge1xuICAgIGlmICghZWxlbWVudC5uZXh0X290aGVyX2lkKSB7XG4gICAgICBlbGVtZW50Lm5leHRfb3RoZXJfaWQgPSBbXTtcbiAgICB9XG4gICAgZWxlbWVudC5uZXh0X290aGVyX2lkLnB1c2godGFyZ2V0SWQpO1xuXG4gICAgY29uc3QgZWxlbWVudFRvID0gZmxhdEVsZW1lbnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRhcmdldElkKTtcblxuICAgIGlmIChlbGVtZW50VG8pIHtcbiAgICAgIGlmICghZWxlbWVudFRvLnByZV9vdGhlcl9pZCkge1xuICAgICAgICBlbGVtZW50VG8ucHJlX290aGVyX2lkID0gW107XG4gICAgICB9XG4gICAgICBlbGVtZW50VG8ucHJlX290aGVyX2lkLnB1c2goZWxlbWVudC5pZCA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUVsZW1lbnRzQmVoaW5kRWxlbWVudENvbm5lY3RUbyhlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pIHtcbiAgICBjb25zdCBsaXN0RWxlbWVudERlbGV0ZTogSURpYWdyYW1FbGVtZW50W10gPSBbXTtcbiAgICBsZXQgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50OiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgaWYgKGVsZW1lbnQuYnJhbmNoZXMgJiYgZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgIGJ1aWxkRmxhdEVsZW1lbnQoW2VsZW1lbnRdLCBmbGF0RWxlbWVudEluRWxlbWVudEN1cnJlbnQpO1xuICAgICAgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50ID0gZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pZCAhPT0gZWxlbWVudC5pZCk7XG4gICAgfVxuICAgIGRlbGV0ZSBlbGVtZW50LmJyYW5jaGVzO1xuICAgIGxpc3RFbGVtZW50RGVsZXRlLnB1c2goLi4uZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50KTtcbiAgICBjb2xsZWN0TmV4dENoYWluRWxlbWVudHMoZWxlbWVudCwgZmxhdEVsZW1lbnRzLCBsaXN0RWxlbWVudERlbGV0ZSk7XG4gICAgdGhpcy5kZWxldGVMaW5lQ29ubmVjdEZyb21FbGVtZW50KGxpc3RFbGVtZW50RGVsZXRlLCBmbGF0RWxlbWVudHMpO1xuICAgIGxpc3RFbGVtZW50RGVsZXRlLmZvckVhY2goKGVsZW1lbnREZWxldGUpID0+IHtcbiAgICAgIHRoaXMuZmluZEFuZERlbGV0ZUVsZW1lbnRGcm9tQ29udGFpbmVyKHRoaXMuY2FudmFzU2VydmljZS5FbGVtZW50cyBhcyBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEFuZERlbGV0ZUVsZW1lbnRGcm9tQ29udGFpbmVyKGNvbnRhaW5lckVsZW1lbnQ6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIGVsZW1lbnREZWxldGU6IElEaWFncmFtRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgaW5kZXggaW4gY29udGFpbmVyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudE9mSW5kZXggPSBjb250YWluZXJFbGVtZW50W2luZGV4XTtcblxuICAgICAgaWYgKGVsZW1lbnRPZkluZGV4LmlkID09PSBlbGVtZW50RGVsZXRlLmlkKSB7XG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuc3BsaWNlKCtpbmRleCwgMSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIWVsZW1lbnRPZkluZGV4LmJyYW5jaGVzIHx8ICFlbGVtZW50T2ZJbmRleC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIGVsZW1lbnRPZkluZGV4LmJyYW5jaGVzKSB7XG4gICAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmluZEFuZERlbGV0ZUVsZW1lbnRGcm9tQ29udGFpbmVyKGJyYW5jaC5lbGVtZW50cywgZWxlbWVudERlbGV0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0RGlyZWN0aW9uKGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10sIHRhcmdldElkOiBzdHJpbmcsIGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgYnJhbmNoPzogSURpYWdyYW1FbGVtZW50QnJhbmNoKSB7XG4gICAgaWYgKGVsZW1lbnQuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVyAmJiBicmFuY2gpIHtcbiAgICAgIHRoaXMuZWRpdERpcmVjdGlvbldpdGhCcmFuY2goZmxhdEVsZW1lbnRzLCBicmFuY2gsIHRhcmdldElkLCBlbGVtZW50KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkT2xkTmV4dFRvID0gZWxlbWVudC5uZXh0X290aGVyX2lkPy5bMF07XG4gICAgY29uc3QgZWxlbWVudE9sZFRvID0gZmxhdEVsZW1lbnRzPy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZE9sZE5leHRUbyk7XG5cbiAgICAvLyB4w7NhIGxpbmUgY8WpXG4gICAgaWYgKGVsZW1lbnRPbGRUbyAmJiBlbGVtZW50T2xkVG8ucHJlX290aGVyX2lkKSB7XG4gICAgICBjb25zdCBpdGVtSW5kZXggPSBlbGVtZW50T2xkVG8ucHJlX290aGVyX2lkPy5maW5kSW5kZXgoKGlkKSA9PiBpZCA9PT0gZWxlbWVudC5pZCk7XG5cbiAgICAgIGlmIChpdGVtSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVsZW1lbnRPbGRUby5wcmVfb3RoZXJfaWQ/LnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50LmF0dHJpYnV0ZVN2Z0QgPSB1bmRlZmluZWQ7XG4gICAgZWxlbWVudC5wb3NpdGlvbl9lbmQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyB1cGRhdGUgbGluZSBt4bubaVxuICAgIGNvbnN0IGVsZW1lbnROZXdUbyA9IGZsYXRFbGVtZW50cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gdGFyZ2V0SWQpO1xuXG4gICAgaWYgKGVsZW1lbnROZXdUbykge1xuICAgICAgaWYgKCFlbGVtZW50TmV3VG8ucHJlX290aGVyX2lkKSB7XG4gICAgICAgIGVsZW1lbnROZXdUby5wcmVfb3RoZXJfaWQgPSBbXTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnROZXdUby5wcmVfb3RoZXJfaWQucHVzaChlbGVtZW50LmlkID8/ICcnKTtcbiAgICB9XG4gICAgZWxlbWVudC5uZXh0X290aGVyX2lkID0gW107XG4gICAgZWxlbWVudC5uZXh0X290aGVyX2lkLnB1c2godGFyZ2V0SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlZGl0RGlyZWN0aW9uV2l0aEJyYW5jaChmbGF0RWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdLCBicmFuY2g6IElEaWFncmFtRWxlbWVudEJyYW5jaCwgdGFyZ2V0SWQ6IHN0cmluZywgZWxlbWVudDogSURpYWdyYW1FbGVtZW50KSB7XG4gICAgY29uc3QgaWRPbGROZXh0VG8gPSBicmFuY2gubmV4dF9vdGhlcl9pZD8uWzBdO1xuICAgIGNvbnN0IGVsZW1lbnRPbGRUbyA9IGZsYXRFbGVtZW50cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWRPbGROZXh0VG8pO1xuXG4gICAgLy8geMOzYSBsaW5lIGPFqVxuICAgIGlmIChlbGVtZW50T2xkVG8gJiYgZWxlbWVudE9sZFRvLnByZV9vdGhlcl9pZCkge1xuICAgICAgY29uc3QgaXRlbUluZGV4ID0gZWxlbWVudE9sZFRvLnByZV9vdGhlcl9pZD8uZmluZEluZGV4KChpZCkgPT4gaWQgPT09IGVsZW1lbnQuaWQpO1xuXG4gICAgICBpZiAoaXRlbUluZGV4ICE9PSAtMSkge1xuICAgICAgICBlbGVtZW50T2xkVG8ucHJlX290aGVyX2lkPy5zcGxpY2UoaXRlbUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgbGluZSBt4bubaVxuICAgIGNvbnN0IGVsZW1lbnROZXdUbyA9IGZsYXRFbGVtZW50cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gdGFyZ2V0SWQpO1xuXG4gICAgaWYgKGVsZW1lbnROZXdUbykge1xuICAgICAgaWYgKCFlbGVtZW50TmV3VG8ucHJlX290aGVyX2lkKSB7XG4gICAgICAgIGVsZW1lbnROZXdUby5wcmVfb3RoZXJfaWQgPSBbXTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnROZXdUby5wcmVfb3RoZXJfaWQucHVzaChlbGVtZW50LmlkID8/ICcnKTtcbiAgICB9XG4gICAgYnJhbmNoLm5leHRfb3RoZXJfaWQgPSBbXTtcbiAgICBicmFuY2gubmV4dF9vdGhlcl9pZC5wdXNoKHRhcmdldElkKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export * from './canvas.service';
2
+ export * from './diagram-draw.service';
3
+ export * from './direction.service';
4
+ export * from './interfaces/canvas.interface';
5
+ export * from './interfaces/diagram.interface';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jYW52YXMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2RpYWdyYW0tZHJhdy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzL2NhbnZhcy5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzL2RpYWdyYW0uaW50ZXJmYWNlJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZGlhZ3JhbS1kcmF3L3NyYy9pbnRlcmZhY2VzL2NhbnZhcy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaWFncmFtRWxlbWVudCwgSURpYWdyYW1FbGVtZW50QnJhbmNoIH0gZnJvbSAnLi9kaWFncmFtLmludGVyZmFjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyYW5jaEVuZENvdW50IHtcbiAgYnJhbmNoQ29udGFpbmVyPzogSURpYWdyYW1FbGVtZW50QnJhbmNoO1xuICBjb3VudDogbnVtYmVyO1xuICBicmFuY2hFbXB0eTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElIYW5kbGVyRnVuY3Rpb24ge1xuICBnZXRDb25maWdEZWZhdWx0QnJhbmNoZXMoY29kZTogc3RyaW5nLCBkYXRhRGVmYXVsdDogSURpYWdyYW1FbGVtZW50KTogSURpYWdyYW1FbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSdWxlQ29ubmVjdGFibGUge1xuICBlbGVtZW50Q29kZTogc3RyaW5nO1xuICBlbGVtZW50Q29kZUNvbm5lY3RhYmxlQmVmb3JlOiBBcnJheTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gxJHhu4MgaGnhu4NuIHRo4buLIGRyb3Agem9uZSB04bqhaSBt4buZdCBlbGVtZW50L2JyYW5jaC5cbiAqIFRy4bqjIHbhu4EgdHJ1ZSDihpIgaGnhu4NuIHRo4buLIFwiK1wiLCBmYWxzZSDihpIg4bqpbi5cbiAqIC0gYmVmb3JlRWxlbWVudERyYWc6IGVsZW1lbnQgdHLGsOG7m2MgZWxlbWVudCDEkWFuZyB4w6l0IMSR4buDIGhp4buDbiB0aOG7iyBkcm9wIHpvbmVcbiAqIC0gY3VycmVudEVsZW1lbnREcmFnOiBlbGVtZW50IMSRYW5nIHjDqXQgxJHhu4MgaGnhu4NuIHRo4buLIGRyb3Agem9uZVxuICogLSBhZnRlckVsZW1lbnREcmFnOiBlbGVtZW50IHNhdSBlbGVtZW50IMSRYW5nIHjDqXQgxJHhu4MgaGnhu4NuIHRo4buLIGRyb3Agem9uZVxuICovXG5leHBvcnQgdHlwZSBURHJvcFpvbmVDYW5Ecm9wRm4gPSAoYmVmb3JlRWxlbWVudERyYWc6IElEaWFncmFtRWxlbWVudCB8IHVuZGVmaW5lZCwgY3VycmVudEVsZW1lbnREcmFnOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQsIGFmdGVyRWxlbWVudERyYWc6IElEaWFncmFtRWxlbWVudCB8IHVuZGVmaW5lZCwgcnVsZUNvbm5lY3RhYmxlRWxlbWVudHM6IEFycmF5PElSdWxlQ29ubmVjdGFibGU+KSA9PiBib29sZWFuO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29vcmRpbmF0ZXMuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9kaWFncmFtLWRyYXcvc3JjL2ludGVyZmFjZXMvY29vcmRpbmF0ZXMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElDb25maWdDb29yZGluYXRlc1BhcmFtIHtcbiAgRUxFTUVOVF9XSURUSF9ERUZBVUxUX0JSQU5DSF9XSEVOX05PVF9FTEVNRU5UPzogbnVtYmVyO1xuICBFTEVNRU5UX01BUkdJTl9ERUZBVUxUPzogbnVtYmVyOyAvLyBraG/huqNuZyBjw6FjaCBnaeG7r2EgY8OhYyBraOG7kWlcbiAgRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g/OiBudW1iZXI7IC8vIGtob+G6o25nIGPDoWNoIHThu6sga2jhu5FpIGPDsyBuaMOhbmggxJHhur9uIMSRxrDhu51uZyBy4bq9XG4gIEVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQ/OiBudW1iZXI7IC8vIHThu5FpIHRoaeG7g3UgbMOgIDMyIG5ow6ksIGTGsOG7oWkgMzJweCBjaMawYSBzdXBwb3J0IGxpbmUgbmF2aWdhdGlvblxuICBERUZBVUxUX0JSQU5DSF9XSEVOX05PX0VMRU1FTlQ/OiBudW1iZXI7IC8vIMSR4buZIHLhu5luZyBj4bunYSBuaMOhbmgga2hpIGtow7RuZyBjw7MgZWxlbWVudCBuw6BvXG4gIEVMRU1FTlRfSEVJR0hUX0NVUlZFPzogbnVtYmVyOyAvLyBjaGnDqnUgY2FvIGPhu6dhIMSRxrDhu51uZyBjb25nXG4gIEVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIX1RPX0VMRU1FTlRfRklSU1Q/OiBudW1iZXI7IC8vIGtob+G6o25nIGPDoWNoIHThu6sgbmjDoW5oIHLhur0gdOG7m2kga2jhu5FpIMSR4bqndSB0acOqblxuXG4gIEVMRU1FTlRfU1ZHX1NUUk9LRV9DT0xPUj86IHN0cmluZztcbiAgRUxFTUVOVF9TVkdfU1RST0tFX1dJRFRIPzogc3RyaW5nO1xuXG4gIERJU1RBTkNFX1RPX1dBSVQ/OiBudW1iZXI7IC8vIGtob+G6o25nIGPDoWNoIHThu6sga2jhu5FpIMSR4bq/biBj4bqldSBow6xuaCBjaOG7nVxuICBXQUlUX1RPX0VMRU1FTlQ/OiBudW1iZXI7IC8vIGtob+G6o25nIGPDoWNoIHThu6sgY+G6pXUgaMOsbmggY2jhu50gdOG7m2kgbm9kZSB0aeG6v3AgdGhlb1xuICBFTEVNRU5UX1dBSVRfREVGQVVMVD86IG51bWJlcjsgLy8gY2hp4buBdSBjYW8gbeG6t2MgxJHhu4tuaCBj4bunYSBj4bqldSBow6xuaCBjaOG7nSwgbuG6v3UgbsOzIGzDoCBk4bqhbmcgY2jhu50gYmFvIG5oacOqdSBwaMO6dCB0aMOsIHPhur0ga2jDoWNcbiAgRElTVEFOQ0VfV0FJVF9UT19ORVhUX0xJTkU/OiBudW1iZXI7IC8vIGtob+G6o25nIGPDoWNoIHThu6sga2jhu5FpIMSR4bq/biBsaW5lIHRp4bq/cCB0aGVvLCBjw6FjaCByYSAxIMSRb+G6oW5cblxuICBUWVBFX0NPTlNUSVRVRU5UX09USEVSX0VYSVQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFEaWFncmFtQ29uZmlnU3ZnIHtcbiAgdXBkYXRlU1ZHPzogYm9vbGVhbjtcbiAgbW9kZT86ICdwcmV2aWV3JyB8ICdjb25maWcnO1xuICBwb3NpdGlvbk1heExlZnQ6IG51bWJlcjtcbiAgcG9zaXRpb25NYXhUb3A6IG51bWJlcjtcbiAgd2lkdGhIZWlnaHRTdmdDYW52YXM6IHsgaGVpZ2h0U3ZnOiBudW1iZXI7IHdpZHRoU3ZnOiBudW1iZXIgfTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFEaWFncmFtU3ZnIHtcbiAgZWxlbWVudFN2Zz86IFNWR1BhdGhFbGVtZW50O1xuICBhdHRyaWJ1dGVTdmdEPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb29yZGluYXRlc0RpYWdyYW1Tdmcge1xuICBteD86IG51bWJlcjtcbiAgbXk/OiBudW1iZXI7XG4gIHgxPzogbnVtYmVyO1xuICB5MT86IG51bWJlcjtcbiAgeD86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcbiAgbHg/OiBudW1iZXI7XG4gIGx5PzogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ3JhbS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgVHlwZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEaWFncmFtRWxlbWVudCB7XG4gIC8vIGNvbmZpZyDEkeG7gyB24bq9IGRpYWdyYW1cbiAgY29kZT86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgYnJhbmNoZXM/OiBBcnJheTxJRGlhZ3JhbUVsZW1lbnRCcmFuY2g+O1xuICBzcGVjaWZpY194PzogbnVtYmVyO1xuICBzcGVjaWZpY195PzogbnVtYmVyO1xuICBzcGVjaWZpY193aWR0aD86IG51bWJlcjtcbiAgc3BlY2lmaWNfaGVpZ2h0PzogbnVtYmVyO1xuICBlbGVtZW50U3ZnPzogU1ZHUGF0aEVsZW1lbnQ7XG4gIGF0dHJpYnV0ZVN2Z0Q/OiBzdHJpbmc7XG4gIG1heEhlaWdodEJyYW5jaD86IG51bWJlcjtcbiAgcG9zaXRpb25fZW5kX2JyYW5jaD86IG51bWJlcjtcbiAgcG9zaXRpb25fZW5kPzogbnVtYmVyO1xuICB0cmFuc2xhdGVYPzogbnVtYmVyO1xuICB0cmFuc2xhdGVZPzogbnVtYmVyO1xuICBhdHRyaWJ1dGVTdmdEQ29ubmVjdFRvT3RoZXJFbGVtZW50PzogQXJyYXk8e1xuICAgIGVsZW1lbnRTdmc/OiBTVkdQYXRoRWxlbWVudDtcbiAgICBwYXRoOiBzdHJpbmc7XG4gIH0+O1xuICBwcmVfb3RoZXJfaWQ/OiBBcnJheTxzdHJpbmc+O1xuICBuZXh0X290aGVyX2lkPzogQXJyYXk8c3RyaW5nPjtcbiAgc3ViQ29kZU9mRWxlbWVudD86IHN0cmluZztcbiAgbmV4dF9pZD86IHN0cmluZztcbiAgbm9kZU90aGVyQ29uZmlnPzogSURpYWdyYW1FbGVtZW50O1xuICBkaXNhYmxlPzogYm9vbGVhbjtcblxuICAvLyBjb25maWcgY+G7p2EgZWxlbWVudCBj4bqnbiBjw7NcbiAgaWQ/OiBzdHJpbmc7XG4gIGVsZW1lbnRfdHlwZT86IHN0cmluZztcbiAgc3BlY2lmaWNfY291bnRlcl9jdXJyZW50X2NvZGU/OiBudW1iZXI7IC8vIGzGsHUgbOG6oWkgxJHhu4MgdMSDbmcgY2hvIGPDoWMga2jhu5FpIHRp4bq/cCB0aGVvIGtoaSBrw6lvIHbDoG87XG4gIHByZV9pZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gge1xuICBjb2RlPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZzsgLy8gTGFiZWwgaGnhu4NuIHRo4buLIHRyw6puIGJyYW5jaCAodmQ6IFwiMTAwIFByb2ZpbGVzXCIsIFwiQ8OybiBs4bqhaVwiKVxuICBsYWJlbEJnQ29sb3I/OiBzdHJpbmc7IC8vIEJhY2tncm91bmQgY29sb3IgY+G7p2EgbGFiZWwgKHZkOiBcIiNmM2Y0ZjZcIilcbiAgZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD47XG4gIGVsZW1lbnRTdmc/OiBTVkdQYXRoRWxlbWVudDtcbiAgYXR0cmlidXRlU3ZnRD86IHN0cmluZztcbiAgb25UaGVTaWRlPzogJ2Fib3ZlJyB8ICd1bmRlcicgfCAnY2VudGVyJztcbiAgcG9zaXRpb25NYXhMZWZ0PzogbnVtYmVyO1xuICBwb3NpdGlvbk1heFRvcD86IG51bWJlcjtcbiAgc3BlY2lmaWNfc3RhcnRfYnJhbmNoX3g/OiBudW1iZXI7XG4gIHNwZWNpZmljX3N0YXJ0X2JyYW5jaF95PzogbnVtYmVyO1xuICB3aWR0aEJyYW5jaD86IHtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBhYm92ZT86IG51bWJlcjtcbiAgICB1bmRlcj86IG51bWJlcjtcbiAgfTtcbiAgbmV4dF9vdGhlcl9pZD86IEFycmF5PHN0cmluZz47XG4gIGlzRGlyZWN0aW9uPzogYm9vbGVhbjsgLy8gYmnhur9uIG7DoHkgZMO5bmcgc+G7rSBk4bulbmcgdOG6oW0gxJHhu4MgY2hlY2sgeGVtIG5ow6FuaCBjw7MgxJHGsOG7o2MgxJFp4buBdSBoxrDhu5tuZyBoYXkga2jDtG5nO1xuXG4gIG5vZGVPdGhlckNvbmZpZz86IElEaWFncmFtRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2FudmFzQ29uZmlnIHtcbiAgRUxFTUVOVF9XSURUSF9ERUZBVUxUX0JSQU5DSF9XSEVOX05PVF9FTEVNRU5UOiBudW1iZXI7XG4gIEVMRU1FTlRfTUFSR0lOX0RFRkFVTFQ6IG51bWJlcjtcbiAgRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g6IG51bWJlcjtcbiAgRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDogbnVtYmVyO1xuICBERUZBVUxUX0JSQU5DSF9XSEVOX05PX0VMRU1FTlQ6IG51bWJlcjtcbiAgRUxFTUVOVF9IRUlHSFRfQ1VSVkU6IG51bWJlcjtcbiAgRUxFTUVOVF9TVkdfU1RST0tFX0NPTE9SOiBzdHJpbmc7XG4gIEVMRU1FTlRfU1ZHX1NUUk9LRV9XSURUSDogc3RyaW5nO1xuICBFTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSF9UT19FTEVNRU5UX0ZJUlNUOiBudW1iZXI7XG5cbiAgLy8gY29uZmlnIG90aGVyIG5vZGVcbiAgRElTVEFOQ0VfVE9fV0FJVDogbnVtYmVyO1xuICBXQUlUX1RPX0VMRU1FTlQ6IG51bWJlcjtcbiAgRUxFTUVOVF9XQUlUX0RFRkFVTFQ6IG51bWJlcjtcbiAgRElTVEFOQ0VfV0FJVF9UT19ORVhUX0xJTkU6IG51bWJlcjtcblxuICAvLyBjb25maWcgZWxlbWVudFxuICBUWVBFX0VMRU1FTlRfRVhJVDogc3RyaW5nO1xuICBUWVBFX0VMRU1FTlRfV09SS0ZMT1c6IHN0cmluZztcbiAgV0lEVEhfRUxFTUVOVF9ERUZBVUxUOiBudW1iZXI7XG4gIEhFSUdIVF9FTEVNRU5UX0RFRkFVTFQ6IG51bWJlcjtcblxuICBBRERfSUNPTl9ESUFNRVRFUjogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0eWxlIGNvbmZpZyBjaG8gaW5kaWNhdG9yIChuw7p0IFwiK1wiKSBj4bunYSBkcm9wIHpvbmUuXG4gKiBU4bqldCBj4bqjIGPDoWMgZmllbGQgxJHhu4F1IG9wdGlvbmFsIOKAkyBnacOhIHRy4buLIG7DoG8ga2jDtG5nIHRydXnhu4FuIHPhur0gZMO5bmcgbeG6t2MgxJHhu4tuaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJvcFpvbmVJbmRpY2F0b3JTdHlsZSB7XG4gIGJvcmRlclJhZGl1cz86IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICBpY29uQ29sb3I/OiBzdHJpbmc7XG4gIG9wYWNpdHk/OiBudW1iZXI7XG4gIGhvdmVyQmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICBob3ZlckJvcmRlckNvbG9yPzogc3RyaW5nO1xuICBob3ZlckJvcmRlclN0eWxlPzogc3RyaW5nO1xuICBob3ZlckJvcmRlclJhZGl1cz86IG51bWJlcjtcblxuICAvKiogSMOgbSByZW5kZXIgKirEkeG7mW5nKiogbuG7mWkgZHVuZyBpbmRpY2F0b3Ig4bufIHRy4bqhbmcgdGjDoWkgYsOsbmggdGjGsOG7nW5nLiAqL1xuICByZW5kZXJJbmRpY2F0b3I/OiAoc2l6ZTogbnVtYmVyKSA9PiBzdHJpbmc7XG5cbiAgLyoqIEjDoG0gcmVuZGVyICoqxJHhu5luZyoqIG7hu5lpIGR1bmcgaW5kaWNhdG9yIOG7nyB0cuG6oW5nIHRow6FpIGhvdmVyL2RyYWctZW50ZXIuKi9cbiAgcmVuZGVySG92ZXJJbmRpY2F0b3I/OiAoKSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZyB7XG4gIHN0b3JlRGF0YURlZmluZTogSURpYWdyYW1TdG9yZURhdGE7XG4gIHN2Z0NvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBub2Rlc0NvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICB2aWV3Q29udGFpbmVyUmVmPzogVmlld0NvbnRhaW5lclJlZjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbm9kZUNvbXBvbmVudFR5cGU/OiBUeXBlPGFueT47IC8vIENvbXBvbmVudCBjaG8gbWFpbiBub2Rlc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBub2RlT3RoZXJDb25maWdDb21wb25lbnRUeXBlPzogVHlwZTxhbnk+OyAvLyBDb21wb25lbnQgY2hvIG5vZGVPdGhlckNvbmZpZ1xuICB1c2VWaXJ0dWFsaXphdGlvblRlbXBsYXRlPzogYm9vbGVhbjtcbiAgLyoqIFR14buzIGNo4buJbmggc3R5bGUgY2hvIGluZGljYXRvciAobsO6dCBcIitcIikgY+G7p2EgZHJvcCB6b25lICovXG4gIGRyb3Bab25lU3R5bGU/OiBJRHJvcFpvbmVJbmRpY2F0b3JTdHlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlhZ3JhbVN0b3JlRGF0YSB7XG4gIHBvc2l0aW9uTWF4TGVmdDogbnVtYmVyO1xuICBwb3NpdGlvbk1heFRvcDogbnVtYmVyO1xuICB3aWR0aEhlaWdodFN2Z0NhbnZhczogeyBoZWlnaHRTdmc6IG51bWJlcjsgd2lkdGhTdmc6IG51bWJlciB9O1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1zZXJ2aWNlcy1kaWFncmFtLWRyYXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvbGlicy11aS1zZXJ2aWNlcy1kaWFncmFtLWRyYXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,187 @@
1
+ import { canvasConfigReadonly } from '../diagram-draw.service';
2
+ import { checkMaxLeft, getDistanceFromBranchToFirstBlock, getHeightWaitConfig, MoLibDiagramCalculatorCoordinatesUtil } from './calculator-element.util';
3
+ export class MoLibDiagramCalculatorBranchUtil {
4
+ static drawStraightLine(left, lineFormElementToBranching, top, branch, maxHeightBranch, config) {
5
+ const startDraw = top + lineFormElementToBranching;
6
+ let Ly = startDraw;
7
+ Ly += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE; // chiều dài đến element đầu tiên
8
+ Ly += getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên
9
+ if (!branch.elements || !branch.elements.length) {
10
+ Ly += maxHeightBranch;
11
+ Ly += 20; // thêm đoạn nối từ điểm kết thúc nhánh đến hết
12
+ }
13
+ const coord1 = {
14
+ mx: left,
15
+ my: top,
16
+ ly: Ly,
17
+ lx: left,
18
+ };
19
+ branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;
20
+ if (branch.nodeOtherConfig) {
21
+ const endYToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + canvasConfigReadonly().DISTANCE_TO_WAIT;
22
+ branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.mx} ${endYToWait}`;
23
+ const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);
24
+ const topStartLine2 = endYToWait + waitHeight;
25
+ delete branch.nodeOtherConfig.attributeSvgD;
26
+ if (branch.elements && branch.elements.length) {
27
+ branch.nodeOtherConfig.attributeSvgD = `M ${coord1.mx} ${topStartLine2} L ${coord1.mx} ${coord1.ly}`;
28
+ }
29
+ branch.nodeOtherConfig.specific_y = endYToWait;
30
+ branch.nodeOtherConfig.specific_x = coord1.mx;
31
+ }
32
+ branch.specific_start_branch_y = top + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
33
+ branch.specific_start_branch_x = left;
34
+ if (!branch.elements || !branch.elements.length) {
35
+ return;
36
+ }
37
+ const heightToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên;
38
+ branch.elements.forEach((elementBranch) => {
39
+ elementBranch.specific_y = top + lineFormElementToBranching + heightToElement;
40
+ elementBranch.specific_x = left - (elementBranch.specific_width ?? 0) / 2;
41
+ });
42
+ MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);
43
+ }
44
+ static leftLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, element, config) {
45
+ const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'left', config);
46
+ branch.specific_start_branch_x = coordQL2.x;
47
+ branch.specific_start_branch_y = coordQL2.y;
48
+ if (!branch.elements || !branch.elements.length) {
49
+ return;
50
+ }
51
+ this.drawElementInBranchLine(branch, coordQL2, config);
52
+ if (isCheckAllElementConnectToExit) {
53
+ return;
54
+ }
55
+ }
56
+ static rightLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, element, config) {
57
+ const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'right', config);
58
+ branch.specific_start_branch_x = coordQL2.x;
59
+ branch.specific_start_branch_y = coordQL2.y;
60
+ const maxY = (coordQL1.y ?? 0) + 200;
61
+ const configSvg = config.widthHeightSvgCanvas;
62
+ configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;
63
+ if (!branch.elements || !branch.elements.length) {
64
+ return;
65
+ }
66
+ this.drawElementInBranchLine(branch, coordQL2, config);
67
+ if (isCheckAllElementConnectToExit) {
68
+ return;
69
+ }
70
+ }
71
+ static drawElementInBranchLine(branch, coordQL2, config) {
72
+ const topElementInBranch = coordQL2.ly; // bắt đầu của 1 emelent trong nhánh sẽ là điểm cuối cùng của nhánh trỏ tới
73
+ const elementFirst = branch.elements[0];
74
+ elementFirst.specific_y = topElementInBranch;
75
+ elementFirst.specific_x = (coordQL2.lx ?? 0) - (elementFirst.specific_width ?? 0) / 2;
76
+ MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);
77
+ }
78
+ static drawMissingLineFromLastElement(branch, coordQ3) {
79
+ const { mx, my } = coordQ3;
80
+ if (!my) {
81
+ return;
82
+ }
83
+ const lastElementInBranch = branch.elements[branch.elements.length - 1];
84
+ if (!lastElementInBranch.branches?.length) {
85
+ branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${lastElementInBranch.position_end ?? 0}`;
86
+ return;
87
+ }
88
+ const ly = (lastElementInBranch.position_end_branch ?? 0) - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
89
+ if (ly === my) {
90
+ return;
91
+ }
92
+ branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${ly}`;
93
+ }
94
+ static drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, direction, config) {
95
+ const M = `M ${left} ${top}`; // đặt bút vẽ từ điểm x, y
96
+ const Ly = top + lineFormElementToBranching - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
97
+ const L = `L ${left} ${Ly}`; // Kéo dài 1 đường thẳng tới X, Y,
98
+ const straightLineBetweenBranch = lineBetweenBranch - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE * 2;
99
+ const coordQL1 = {
100
+ // điểm cong số 1 của nhánh và đường thẳng kéo trên dưới
101
+ mx: left,
102
+ my: Ly,
103
+ x1: left,
104
+ y1: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,
105
+ x: this.mathOperatorsCalculation(direction, left, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),
106
+ y: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,
107
+ };
108
+ coordQL1.ly = coordQL1.y;
109
+ // đoạn thẳng kéo dài lineBetweenBranch phải trừ đi hai đầu cong
110
+ coordQL1.lx = this.mathOperatorsCalculation(direction, coordQL1.x, straightLineBetweenBranch, true);
111
+ const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;
112
+ const coordQL2 = {
113
+ // điểm cong số 2 của nhánh và đường thẳng đứng
114
+ y1: coordQL1.ly,
115
+ x1: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),
116
+ y: (coordQL1.ly ?? 0) + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,
117
+ x: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),
118
+ };
119
+ coordQL2.ly = (coordQL2.y ?? 0) + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig);
120
+ coordQL2.lx = coordQL2.x;
121
+ if (!branch.elements || !branch.elements.length) {
122
+ coordQL2.ly = maxHeightBranch + (coordQL2.ly ?? 0); // tổng chiều cao của nhánh + điểm xuất phát
123
+ }
124
+ let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;
125
+ if (branch.nodeOtherConfig) {
126
+ const endYToWait = (coordQL2.y ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT; // xử lý các line vào first element
127
+ const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);
128
+ const topStartLine2 = endYToWait + waitHeight;
129
+ delete branch.nodeOtherConfig.attributeSvgD;
130
+ QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${coordQL2.x},${endYToWait}`;
131
+ if (branch.elements && branch.elements.length) {
132
+ branch.nodeOtherConfig.attributeSvgD = `M ${coordQL2.x} ${topStartLine2} L ${coordQL2.x} ${coordQL2.ly}`;
133
+ }
134
+ branch.nodeOtherConfig.specific_y = endYToWait;
135
+ branch.nodeOtherConfig.specific_x = coordQL2.x;
136
+ }
137
+ branch.positionMaxLeft = coordQL2.lx;
138
+ branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;
139
+ const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);
140
+ checkMaxLeft(config, branch.nodeOtherConfig?.specific_x, branch.positionMaxLeft);
141
+ return { coordQL1, coordQL2, isCheckAllElementConnectToExit };
142
+ }
143
+ static checkChildrenConnectToExit(elements) {
144
+ let toExit = false;
145
+ if (elements.length && (elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
146
+ toExit = true;
147
+ return toExit;
148
+ }
149
+ elements.forEach((element) => {
150
+ if (!element.branches || !element.branches.length) {
151
+ return;
152
+ }
153
+ let branchConnectToExit = 0;
154
+ element.branches.forEach((branch) => {
155
+ if (this.checkChildrenConnectToExit(branch.elements)) {
156
+ branchConnectToExit++;
157
+ }
158
+ });
159
+ if (branchConnectToExit === element.branches.length) {
160
+ toExit = true;
161
+ }
162
+ });
163
+ return toExit;
164
+ }
165
+ /* above, left a + b; opposite = true a - b;
166
+ under, right a - b; opposite = true a + b
167
+ */
168
+ static mathOperatorsCalculation(direction, a, b, opposite) {
169
+ switch (direction) {
170
+ case 'left':
171
+ case 'above':
172
+ if (opposite) {
173
+ return (a ?? 0) - (b ?? 0);
174
+ }
175
+ return (a ?? 0) + (b ?? 0);
176
+ case 'right':
177
+ case 'under':
178
+ if (opposite) {
179
+ return (a ?? 0) + (b ?? 0);
180
+ }
181
+ return (a ?? 0) - (b ?? 0);
182
+ default:
183
+ return (a ?? 0) - (b ?? 0);
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1icmFuY2gudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZGlhZ3JhbS1kcmF3L3NyYy91dGlscy9jYWxjdWxhdG9yLWJyYW5jaC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUNBQWlDLEVBQUUsbUJBQW1CLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4SixNQUFNLE9BQU8sZ0NBQWdDO0lBQzNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsMEJBQWtDLEVBQUUsR0FBVyxFQUFFLE1BQTZCLEVBQUUsZUFBdUIsRUFBRSxNQUE2QjtRQUMxSyxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsMEJBQTBCLENBQUM7UUFDbkQsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBRW5CLEVBQUUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsaUNBQWlDO1FBQ3BGLEVBQUUsSUFBSSxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDbEcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELEVBQUUsSUFBSSxlQUFlLENBQUM7WUFDdEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUc7WUFDYixFQUFFLEVBQUUsSUFBSTtZQUNSLEVBQUUsRUFBRSxHQUFHO1lBQ1AsRUFBRSxFQUFFLEVBQUU7WUFDTixFQUFFLEVBQUUsSUFBSTtTQUNULENBQUM7UUFFRixNQUFNLENBQUMsYUFBYSxHQUFH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SSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3QjtnQkFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYW52YXNDb25maWdSZWFkb25seSB9IGZyb20gJy4uL2RpYWdyYW0tZHJhdy5zZXJ2aWNlJztcbmltcG9ydCB7IElDb29yZGluYXRlc0RpYWdyYW1TdmcsIElEYXRhRGlhZ3JhbUNvbmZpZ1N2ZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29vcmRpbmF0ZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IElEaWFncmFtRWxlbWVudCwgSURpYWdyYW1FbGVtZW50QnJhbmNoIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBjaGVja01heExlZnQsIGdldERpc3RhbmNlRnJvbUJyYW5jaFRvRmlyc3RCbG9jaywgZ2V0SGVpZ2h0V2FpdENvbmZpZywgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbCB9IGZyb20gJy4vY2FsY3VsYXRvci1lbGVtZW50LnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckJyYW5jaFV0aWwge1xuICBzdGF0aWMgZHJhd1N0cmFpZ2h0TGluZShsZWZ0OiBudW1iZXIsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nOiBudW1iZXIsIHRvcDogbnVtYmVyLCBicmFuY2g6IElEaWFncmFtRWxlbWVudEJyYW5jaCwgbWF4SGVpZ2h0QnJhbmNoOiBudW1iZXIsIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnKSB7XG4gICAgY29uc3Qgc3RhcnREcmF3ID0gdG9wICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmc7XG4gICAgbGV0IEx5ID0gc3RhcnREcmF3O1xuXG4gICAgTHkgKz0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX0hFSUdIVF9DVVJWRTsgLy8gY2hp4buBdSBkw6BpIMSR4bq/biBlbGVtZW50IMSR4bqndSB0acOqblxuICAgIEx5ICs9IGdldERpc3RhbmNlRnJvbUJyYW5jaFRvRmlyc3RCbG9jayhicmFuY2gubm9kZU90aGVyQ29uZmlnKTsgLy8gY2hp4buBdSBkw6BpIMSR4bq/biBlbGVtZW50IMSR4bqndSB0acOqblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBMeSArPSBtYXhIZWlnaHRCcmFuY2g7XG4gICAgICBMeSArPSAyMDsgLy8gdGjDqm0gxJFv4bqhbiBu4buRaSB04burIMSRaeG7g20ga+G6v3QgdGjDumMgbmjDoW5oIMSR4bq/biBo4bq/dFxuICAgIH1cblxuICAgIGNvbnN0IGNvb3JkMSA9IHtcbiAgICAgIG14OiBsZWZ0LFxuICAgICAgbXk6IHRvcCxcbiAgICAgIGx5OiBMeSxcbiAgICAgIGx4OiBsZWZ0LFxuICAgIH07XG5cbiAgICBicmFuY2guYXR0cmlidXRlU3ZnRCA9IGBNICR7Y29vcmQxLm14fSAke2Nvb3JkMS5teX0gTCAke2Nvb3JkMS5seH0gJHtjb29yZDEubHl9YDtcblxuICAgIGlmIChicmFuY2gubm9kZU90aGVyQ29uZmlnKSB7XG4gICAgICBjb25zdCBlbmRZVG9XYWl0ID0gc3RhcnREcmF3ICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX0hFSUdIVF9DVVJWRSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRElTVEFOQ0VfVE9fV0FJVDtcbiAgICAgIGJyYW5jaC5hdHRyaWJ1dGVTdmdEID0gYE0gJHtjb29yZDEubXh9ICR7Y29vcmQxLm15fSBMICR7Y29vcmQxLm14fSAke2VuZFlUb1dhaXR9YDtcblxuICAgICAgY29uc3Qgd2FpdEhlaWdodCA9IGdldEhlaWdodFdhaXRDb25maWcoYnJhbmNoLm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICBjb25zdCB0b3BTdGFydExpbmUyID0gZW5kWVRvV2FpdCArIHdhaXRIZWlnaHQ7XG5cbiAgICAgIGRlbGV0ZSBicmFuY2gubm9kZU90aGVyQ29uZmlnLmF0dHJpYnV0ZVN2Z0Q7XG4gICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtjb29yZDEubXh9ICR7dG9wU3RhcnRMaW5lMn0gTCAke2Nvb3JkMS5teH0gJHtjb29yZDEubHl9YDtcbiAgICAgIH1cbiAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeSA9IGVuZFlUb1dhaXQ7XG4gICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3ggPSBjb29yZDEubXg7XG4gICAgfVxuXG4gICAgYnJhbmNoLnNwZWNpZmljX3N0YXJ0X2JyYW5jaF95ID0gdG9wICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFO1xuICAgIGJyYW5jaC5zcGVjaWZpY19zdGFydF9icmFuY2hfeCA9IGxlZnQ7XG5cbiAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodFRvRWxlbWVudCA9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUgKyBnZXREaXN0YW5jZUZyb21CcmFuY2hUb0ZpcnN0QmxvY2soYnJhbmNoLm5vZGVPdGhlckNvbmZpZyk7IC8vIGNoaeG7gXUgZMOgaSDEkeG6v24gZWxlbWVudCDEkeG6p3UgdGnDqm47XG5cbiAgICBicmFuY2guZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudEJyYW5jaCkgPT4ge1xuICAgICAgZWxlbWVudEJyYW5jaC5zcGVjaWZpY195ID0gdG9wICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcgKyBoZWlnaHRUb0VsZW1lbnQ7XG4gICAgICBlbGVtZW50QnJhbmNoLnNwZWNpZmljX3ggPSBsZWZ0IC0gKGVsZW1lbnRCcmFuY2guc3BlY2lmaWNfd2lkdGggPz8gMCkgLyAyO1xuICAgIH0pO1xuICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JDb29yZGluYXRlc1V0aWwuc2V0WFlFbGVtZW50cyhicmFuY2guZWxlbWVudHMsIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgbGVmdExpbmUobGVmdDogbnVtYmVyLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZzogbnVtYmVyLCB0b3A6IG51bWJlciwgbGluZUJldHdlZW5CcmFuY2g6IG51bWJlciwgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIG1heEhlaWdodEJyYW5jaDogbnVtYmVyLCBlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnKSB7XG4gICAgY29uc3QgeyBjb29yZFFMMiwgaXNDaGVja0FsbEVsZW1lbnRDb25uZWN0VG9FeGl0IH0gPSB0aGlzLmRyYXdBYm92ZVVuZGVyTGluZShsZWZ0LCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgdG9wLCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhIZWlnaHRCcmFuY2gsICdsZWZ0JywgY29uZmlnKTtcbiAgICBicmFuY2guc3BlY2lmaWNfc3RhcnRfYnJhbmNoX3ggPSBjb29yZFFMMi54O1xuICAgIGJyYW5jaC5zcGVjaWZpY19zdGFydF9icmFuY2hfeSA9IGNvb3JkUUwyLnk7XG4gICAgaWYgKCFicmFuY2guZWxlbWVudHMgfHwgIWJyYW5jaC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYXdFbGVtZW50SW5CcmFuY2hMaW5lKGJyYW5jaCwgY29vcmRRTDIsIGNvbmZpZyk7XG4gICAgaWYgKGlzQ2hlY2tBbGxFbGVtZW50Q29ubmVjdFRvRXhpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByaWdodExpbmUobGVmdDogbnVtYmVyLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZzogbnVtYmVyLCB0b3A6IG51bWJlciwgbGluZUJldHdlZW5CcmFuY2g6IG51bWJlciwgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIG1heEhlaWdodEJyYW5jaDogbnVtYmVyLCBlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnKSB7XG4gICAgY29uc3QgeyBjb29yZFFMMSwgY29vcmRRTDIsIGlzQ2hlY2tBbGxFbGVtZW50Q29ubmVjdFRvRXhpdCB9ID0gdGhpcy5kcmF3QWJvdmVVbmRlckxpbmUobGVmdCwgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcsIHRvcCwgbGluZUJldHdlZW5CcmFuY2gsIGJyYW5jaCwgbWF4SGVpZ2h0QnJhbmNoLCAncmlnaHQnLCBjb25maWcpO1xuXG4gICAgYnJhbmNoLnNwZWNpZmljX3N0YXJ0X2JyYW5jaF94ID0gY29vcmRRTDIueDtcbiAgICBicmFuY2guc3BlY2lmaWNfc3RhcnRfYnJhbmNoX3kgPSBjb29yZFFMMi55O1xuICAgIGNvbnN0IG1heFkgPSAoY29vcmRRTDEueSA/PyAwKSArIDIwMDtcbiAgICBjb25zdCBjb25maWdTdmcgPSBjb25maWcud2lkdGhIZWlnaHRTdmdDYW52YXM7XG5cbiAgICBjb25maWdTdmcuaGVpZ2h0U3ZnID0gbWF4WSA+IGNvbmZpZ1N2Zy5oZWlnaHRTdmcgPyBtYXhZIDogY29uZmlnU3ZnLmhlaWdodFN2ZztcblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZHJhd0VsZW1lbnRJbkJyYW5jaExpbmUoYnJhbmNoLCBjb29yZFFMMiwgY29uZmlnKTtcbiAgICBpZiAoaXNDaGVja0FsbEVsZW1lbnRDb25uZWN0VG9FeGl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRyYXdFbGVtZW50SW5CcmFuY2hMaW5lKGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBjb29yZFFMMjogSUNvb3JkaW5hdGVzRGlhZ3JhbVN2ZywgY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmcpIHtcbiAgICBjb25zdCB0b3BFbGVtZW50SW5CcmFuY2ggPSBjb29yZFFMMi5seTsgLy8gYuG6r3QgxJHhuqd1IGPhu6dhIDEgZW1lbGVudCB0cm9uZyBuaMOhbmggc+G6vSBsw6AgxJFp4buDbSBjdeG7kWkgY8O5bmcgY+G7p2EgbmjDoW5oIHRy4buPIHThu5tpXG5cbiAgICBjb25zdCBlbGVtZW50Rmlyc3QgPSBicmFuY2guZWxlbWVudHNbMF07XG5cbiAgICBlbGVtZW50Rmlyc3Quc3BlY2lmaWNfeSA9IHRvcEVsZW1lbnRJbkJyYW5jaDtcbiAgICBlbGVtZW50Rmlyc3Quc3BlY2lmaWNfeCA9IChjb29yZFFMMi5seCA/PyAwKSAtIChlbGVtZW50Rmlyc3Quc3BlY2lmaWNfd2lkdGggPz8gMCkgLyAyO1xuICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JDb29yZGluYXRlc1V0aWwuc2V0WFlFbGVtZW50cyhicmFuY2guZWxlbWVudHMsIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgZHJhd01pc3NpbmdMaW5lRnJvbUxhc3RFbGVtZW50KGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBjb29yZFEzOiBJQ29vcmRpbmF0ZXNEaWFncmFtU3ZnKSB7XG4gICAgY29uc3QgeyBteCwgbXkgfSA9IGNvb3JkUTM7XG5cbiAgICBpZiAoIW15KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RFbGVtZW50SW5CcmFuY2ggPSBicmFuY2guZWxlbWVudHNbYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFsYXN0RWxlbWVudEluQnJhbmNoLmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICAgIGJyYW5jaC5hdHRyaWJ1dGVTdmdEID0gYCR7YnJhbmNoLmF0dHJpYnV0ZVN2Z0R9IE0gJHtteH0gJHtteX0gTCAke214fSAke2xhc3RFbGVtZW50SW5CcmFuY2gucG9zaXRpb25fZW5kID8/IDB9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbHkgPSAobGFzdEVsZW1lbnRJbkJyYW5jaC5wb3NpdGlvbl9lbmRfYnJhbmNoID8/IDApIC0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX0hFSUdIVF9DVVJWRTtcblxuICAgIGlmIChseSA9PT0gbXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYnJhbmNoLmF0dHJpYnV0ZVN2Z0QgPSBgJHticmFuY2guYXR0cmlidXRlU3ZnRH0gTSAke214fSAke215fSBMICR7bXh9ICR7bHl9YDtcbiAgfVxuXG4gIHN0YXRpYyBkcmF3QWJvdmVVbmRlckxpbmUobGVmdDogbnVtYmVyLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZzogbnVtYmVyLCB0b3A6IG51bWJlciwgbGluZUJldHdlZW5CcmFuY2g6IG51bWJlciwgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIG1heEhlaWdodEJyYW5jaDogbnVtYmVyLCBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcsIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnKSB7XG4gICAgY29uc3QgTSA9IGBNICR7bGVmdH0gJHt0b3B9YDsgLy8gxJHhurd0IGLDunQgduG6vSB04burIMSRaeG7g20geCwgeVxuICAgIGNvbnN0IEx5ID0gdG9wICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcgLSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFO1xuICAgIGNvbnN0IEwgPSBgTCAke2xlZnR9ICR7THl9YDsgLy8gS8OpbyBkw6BpIDEgxJHGsOG7nW5nIHRo4bqzbmcgdOG7m2kgWCwgWSxcbiAgICBjb25zdCBzdHJhaWdodExpbmVCZXR3ZWVuQnJhbmNoID0gbGluZUJldHdlZW5CcmFuY2ggLSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFICogMjtcblxuICAgIGNvbnN0IGNvb3JkUUwxOiBJQ29vcmRpbmF0ZXNEaWFncmFtU3ZnID0ge1xuICAgICAgLy8gxJFp4buDbSBjb25nIHPhu5EgMSBj4bunYSBuaMOhbmggdsOgIMSRxrDhu51uZyB0aOG6s25nIGvDqW8gdHLDqm4gZMaw4bubaVxuICAgICAgbXg6IGxlZnQsXG4gICAgICBteTogTHksXG4gICAgICB4MTogbGVmdCxcbiAgICAgIHkxOiBMeSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUsXG4gICAgICB4OiB0aGlzLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb24sIGxlZnQsIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUsIHRydWUpLFxuICAgICAgeTogTHkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFLFxuICAgIH07XG5cbiAgICBjb29yZFFMMS5seSA9IGNvb3JkUUwxLnk7XG4gICAgLy8gxJFv4bqhbiB0aOG6s25nIGvDqW8gZMOgaSBsaW5lQmV0d2VlbkJyYW5jaCBwaOG6o2kgdHLhu6sgxJFpIGhhaSDEkeG6p3UgY29uZ1xuICAgIGNvb3JkUUwxLmx4ID0gdGhpcy5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uLCBjb29yZFFMMS54LCBzdHJhaWdodExpbmVCZXR3ZWVuQnJhbmNoLCB0cnVlKTtcbiAgICBjb25zdCBRTDEgPSBgTSAke2Nvb3JkUUwxLm14fSwke2Nvb3JkUUwxLm15fSBRICR7Y29vcmRRTDEueDF9LCR7Y29vcmRRTDEueTF9ICR7Y29vcmRRTDEueH0sJHtjb29yZFFMMS55fSBMICR7Y29vcmRRTDEubHh9ICR7Y29vcmRRTDEubHl9YDtcblxuICAgIGNvbnN0IGNvb3JkUUwyOiBJQ29vcmRpbmF0ZXNEaWFncmFtU3ZnID0ge1xuICAgICAgLy8gxJFp4buDbSBjb25nIHPhu5EgMiBj4bunYSBuaMOhbmggdsOgIMSRxrDhu51uZyB0aOG6s25nIMSR4bupbmdcbiAgICAgIHkxOiBjb29yZFFMMS5seSxcbiAgICAgIHgxOiB0aGlzLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb24sIGNvb3JkUUwxLmx4LCBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFLCB0cnVlKSxcbiAgICAgIHk6IChjb29yZFFMMS5seSA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUsXG4gICAgICB4OiB0aGlzLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb24sIGNvb3JkUUwxLmx4LCBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFLCB0cnVlKSxcbiAgICB9O1xuXG4gICAgY29vcmRRTDIubHkgPSAoY29vcmRRTDIueSA/PyAwKSArIGdldERpc3RhbmNlRnJvbUJyYW5jaFRvRmlyc3RCbG9jayhicmFuY2gubm9kZU90aGVyQ29uZmlnKTtcbiAgICBjb29yZFFMMi5seCA9IGNvb3JkUUwyLng7XG5cbiAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgY29vcmRRTDIubHkgPSBtYXhIZWlnaHRCcmFuY2ggKyAoY29vcmRRTDIubHkgPz8gMCk7IC8vIHThu5VuZyBjaGnhu4F1IGNhbyBj4bunYSBuaMOhbmggKyDEkWnhu4NtIHh14bqldCBwaMOhdFxuICAgIH1cbiAgICBsZXQgUUwyID0gYFEgJHtjb29yZFFMMi54MX0sJHtjb29yZFFMMi55MX0gJHtjb29yZFFMMi54fSwke2Nvb3JkUUwyLnl9IEwgJHtjb29yZFFMMi5seH0gJHtjb29yZFFMMi5seX1gO1xuXG4gICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgIGNvbnN0IGVuZFlUb1dhaXQgPSAoY29vcmRRTDIueSA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRElTVEFOQ0VfVE9fV0FJVDsgLy8geOG7rSBsw70gY8OhYyBsaW5lIHbDoG8gZmlyc3QgZWxlbWVudFxuICAgICAgY29uc3Qgd2FpdEhlaWdodCA9IGdldEhlaWdodFdhaXRDb25maWcoYnJhbmNoLm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICBjb25zdCB0b3BTdGFydExpbmUyID0gZW5kWVRvV2FpdCArIHdhaXRIZWlnaHQ7XG5cbiAgICAgIGRlbGV0ZSBicmFuY2gubm9kZU90aGVyQ29uZmlnLmF0dHJpYnV0ZVN2Z0Q7XG4gICAgICBRTDIgPSBgUSAke2Nvb3JkUUwyLngxfSwke2Nvb3JkUUwyLnkxfSAke2Nvb3JkUUwyLnh9LCR7Y29vcmRRTDIueX0gTSAke2Nvb3JkUUwyLnh9LCR7Y29vcmRRTDIueX0gTCAke2Nvb3JkUUwyLnh9LCR7ZW5kWVRvV2FpdH1gO1xuICAgICAgaWYgKGJyYW5jaC5lbGVtZW50cyAmJiBicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuYXR0cmlidXRlU3ZnRCA9IGBNICR7Y29vcmRRTDIueH0gJHt0b3BTdGFydExpbmUyfSBMICR7Y29vcmRRTDIueH0gJHtjb29yZFFMMi5seX1gO1xuICAgICAgfVxuICAgICAgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID0gZW5kWVRvV2FpdDtcbiAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeCA9IGNvb3JkUUwyLng7XG4gICAgfVxuXG4gICAgYnJhbmNoLnBvc2l0aW9uTWF4TGVmdCA9IGNvb3JkUUwyLmx4O1xuICAgIGJyYW5jaC5hdHRyaWJ1dGVTdmdEID0gYCR7TX0gJHtMfSAke1FMMX0gJHtRTDJ9YDtcbiAgICBjb25zdCBpc0NoZWNrQWxsRWxlbWVudENvbm5lY3RUb0V4aXQgPSB0aGlzLmNoZWNrQ2hpbGRyZW5Db25uZWN0VG9FeGl0KGJyYW5jaC5lbGVtZW50cyk7XG4gICAgY2hlY2tNYXhMZWZ0KGNvbmZpZywgYnJhbmNoLm5vZGVPdGhlckNvbmZpZz8uc3BlY2lmaWNfeCwgYnJhbmNoLnBvc2l0aW9uTWF4TGVmdCk7XG5cbiAgICByZXR1cm4geyBjb29yZFFMMSwgY29vcmRRTDIsIGlzQ2hlY2tBbGxFbGVtZW50Q29ubmVjdFRvRXhpdCB9O1xuICB9XG5cbiAgc3RhdGljIGNoZWNrQ2hpbGRyZW5Db25uZWN0VG9FeGl0KGVsZW1lbnRzOiBJRGlhZ3JhbUVsZW1lbnRbXSkge1xuICAgIGxldCB0b0V4aXQgPSBmYWxzZTtcblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggJiYgKGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLnN1YkNvZGVPZkVsZW1lbnQgfHwgZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0uY29kZSkgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgIHRvRXhpdCA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0b0V4aXQ7XG4gICAgfVxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGJyYW5jaENvbm5lY3RUb0V4aXQgPSAwO1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja0NoaWxkcmVuQ29ubmVjdFRvRXhpdChicmFuY2guZWxlbWVudHMpKSB7XG4gICAgICAgICAgYnJhbmNoQ29ubmVjdFRvRXhpdCsrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChicmFuY2hDb25uZWN0VG9FeGl0ID09PSBlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICB0b0V4aXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvRXhpdDtcbiAgfVxuXG4gIC8qIGFib3ZlLCBsZWZ0IGEgKyBiOyBvcHBvc2l0ZSA9IHRydWUgYSAtIGI7IFxuICAgIHVuZGVyLCByaWdodCBhIC0gYjsgb3Bwb3NpdGUgPSB0cnVlIGEgKyBiXG4gICovXG4gIHN0YXRpYyBtYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ2Fib3ZlJyB8ICd1bmRlcicgfCBzdHJpbmcsIGE6IG51bWJlciB8IHVuZGVmaW5lZCwgYjogbnVtYmVyIHwgdW5kZWZpbmVkLCBvcHBvc2l0ZT86IGJvb2xlYW4pIHtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICBjYXNlICdhYm92ZSc6XG4gICAgICAgIGlmIChvcHBvc2l0ZSkge1xuICAgICAgICAgIHJldHVybiAoYSA/PyAwKSAtIChiID8/IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChhID8/IDApICsgKGIgPz8gMCk7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ3VuZGVyJzpcbiAgICAgICAgaWYgKG9wcG9zaXRlKSB7XG4gICAgICAgICAgcmV0dXJuIChhID8/IDApICsgKGIgPz8gMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGEgPz8gMCkgLSAoYiA/PyAwKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoYSA/PyAwKSAtIChiID8/IDApO1xuICAgIH1cbiAgfVxufVxuIl19