@plait/core 0.77.3 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/fesm2022/plait-core.mjs.map +1 -1
  2. package/package.json +1 -3
  3. package/esm2022/constants/cursor.mjs +0 -13
  4. package/esm2022/constants/index.mjs +0 -20
  5. package/esm2022/constants/keycodes.mjs +0 -127
  6. package/esm2022/constants/selection.mjs +0 -6
  7. package/esm2022/constants/zoom.mjs +0 -4
  8. package/esm2022/context.mjs +0 -23
  9. package/esm2022/core/element/context-change.mjs +0 -13
  10. package/esm2022/core/element/context.mjs +0 -2
  11. package/esm2022/core/element/element-flavour.mjs +0 -140
  12. package/esm2022/core/element/element-ref.mjs +0 -2
  13. package/esm2022/core/list-render.mjs +0 -217
  14. package/esm2022/differs/default_iterable_differ.mjs +0 -614
  15. package/esm2022/differs/iterable_differs.mjs +0 -9
  16. package/esm2022/interfaces/board.mjs +0 -108
  17. package/esm2022/interfaces/custom-types.mjs +0 -5
  18. package/esm2022/interfaces/direction.mjs +0 -8
  19. package/esm2022/interfaces/element.mjs +0 -43
  20. package/esm2022/interfaces/group.mjs +0 -6
  21. package/esm2022/interfaces/history.mjs +0 -5
  22. package/esm2022/interfaces/index.mjs +0 -19
  23. package/esm2022/interfaces/node.mjs +0 -57
  24. package/esm2022/interfaces/operation.mjs +0 -96
  25. package/esm2022/interfaces/path-ref.mjs +0 -15
  26. package/esm2022/interfaces/path.mjs +0 -183
  27. package/esm2022/interfaces/plugin.mjs +0 -6
  28. package/esm2022/interfaces/point.mjs +0 -27
  29. package/esm2022/interfaces/pointer.mjs +0 -6
  30. package/esm2022/interfaces/rectangle-client.mjs +0 -171
  31. package/esm2022/interfaces/selection.mjs +0 -13
  32. package/esm2022/interfaces/svg-arc-command.mjs +0 -2
  33. package/esm2022/interfaces/theme.mjs +0 -49
  34. package/esm2022/interfaces/viewport.mjs +0 -7
  35. package/esm2022/plait-core.mjs +0 -5
  36. package/esm2022/plugins/create-board.mjs +0 -122
  37. package/esm2022/plugins/index.mjs +0 -11
  38. package/esm2022/plugins/with-board.mjs +0 -20
  39. package/esm2022/plugins/with-hand.mjs +0 -113
  40. package/esm2022/plugins/with-history.mjs +0 -91
  41. package/esm2022/plugins/with-hotkey.mjs +0 -96
  42. package/esm2022/plugins/with-i18n.mjs +0 -13
  43. package/esm2022/plugins/with-moving.mjs +0 -282
  44. package/esm2022/plugins/with-options.mjs +0 -13
  45. package/esm2022/plugins/with-related-fragment.mjs +0 -23
  46. package/esm2022/plugins/with-selection.mjs +0 -230
  47. package/esm2022/public-api.mjs +0 -16
  48. package/esm2022/testing/core/create-board.mjs +0 -15
  49. package/esm2022/testing/core/fake-weak-map.mjs +0 -18
  50. package/esm2022/testing/core/index.mjs +0 -3
  51. package/esm2022/testing/fake-events/event-objects.mjs +0 -131
  52. package/esm2022/testing/fake-events/index.mjs +0 -2
  53. package/esm2022/testing/index.mjs +0 -3
  54. package/esm2022/testing/test-element.mjs +0 -9
  55. package/esm2022/transforms/board.mjs +0 -137
  56. package/esm2022/transforms/element.mjs +0 -22
  57. package/esm2022/transforms/general.mjs +0 -146
  58. package/esm2022/transforms/group.mjs +0 -64
  59. package/esm2022/transforms/index.mjs +0 -17
  60. package/esm2022/transforms/node.mjs +0 -37
  61. package/esm2022/transforms/selection.mjs +0 -26
  62. package/esm2022/transforms/theme.mjs +0 -8
  63. package/esm2022/transforms/viewport.mjs +0 -8
  64. package/esm2022/transforms/z-index.mjs +0 -20
  65. package/esm2022/utils/angle.mjs +0 -164
  66. package/esm2022/utils/board.mjs +0 -18
  67. package/esm2022/utils/clipboard/clipboard.mjs +0 -40
  68. package/esm2022/utils/clipboard/common.mjs +0 -82
  69. package/esm2022/utils/clipboard/data-transfer.mjs +0 -33
  70. package/esm2022/utils/clipboard/index.mjs +0 -3
  71. package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -71
  72. package/esm2022/utils/clipboard/types.mjs +0 -13
  73. package/esm2022/utils/common.mjs +0 -79
  74. package/esm2022/utils/debug.mjs +0 -91
  75. package/esm2022/utils/dnd.mjs +0 -8
  76. package/esm2022/utils/dom/common.mjs +0 -75
  77. package/esm2022/utils/dom/environment.mjs +0 -2
  78. package/esm2022/utils/dom/foreign.mjs +0 -26
  79. package/esm2022/utils/dom/index.mjs +0 -4
  80. package/esm2022/utils/drawing/arrow.mjs +0 -23
  81. package/esm2022/utils/drawing/circle.mjs +0 -4
  82. package/esm2022/utils/drawing/line.mjs +0 -47
  83. package/esm2022/utils/drawing/rectangle.mjs +0 -36
  84. package/esm2022/utils/element.mjs +0 -90
  85. package/esm2022/utils/environment.mjs +0 -14
  86. package/esm2022/utils/fragment.mjs +0 -27
  87. package/esm2022/utils/group.mjs +0 -239
  88. package/esm2022/utils/helper.mjs +0 -68
  89. package/esm2022/utils/history.mjs +0 -96
  90. package/esm2022/utils/hotkeys.mjs +0 -109
  91. package/esm2022/utils/id-creator.mjs +0 -11
  92. package/esm2022/utils/index.mjs +0 -35
  93. package/esm2022/utils/iterable.mjs +0 -32
  94. package/esm2022/utils/math.mjs +0 -480
  95. package/esm2022/utils/mobile.mjs +0 -6
  96. package/esm2022/utils/moving-element.mjs +0 -17
  97. package/esm2022/utils/pointer.mjs +0 -13
  98. package/esm2022/utils/position.mjs +0 -9
  99. package/esm2022/utils/selected-element.mjs +0 -145
  100. package/esm2022/utils/selection.mjs +0 -151
  101. package/esm2022/utils/snap/snap-moving.mjs +0 -199
  102. package/esm2022/utils/snap/snap.mjs +0 -211
  103. package/esm2022/utils/to-image.mjs +0 -204
  104. package/esm2022/utils/to-point.mjs +0 -74
  105. package/esm2022/utils/tree.mjs +0 -22
  106. package/esm2022/utils/viewport.mjs +0 -227
  107. package/esm2022/utils/weak-maps.mjs +0 -27
  108. package/esm2022/utils/z-index.mjs +0 -166
@@ -1,217 +0,0 @@
1
- import { PlaitBoard, PlaitElement, PlaitNode } from '../interfaces';
2
- import { NODE_TO_INDEX, NODE_TO_PARENT } from '../utils/weak-maps';
3
- import { isSelectedElement, replaceSelectedElement } from '../utils/selected-element';
4
- import { DefaultIterableDiffer } from '../differs/default_iterable_differ';
5
- import { isDebug } from '../utils/debug';
6
- export class ListRender {
7
- constructor(board) {
8
- this.board = board;
9
- this.children = [];
10
- this.instances = [];
11
- this.contexts = [];
12
- this.differ = null;
13
- this.initialized = false;
14
- }
15
- initialize(children, childrenContext) {
16
- this.initialized = true;
17
- this.children = children;
18
- children.forEach((descendant, index) => {
19
- NODE_TO_INDEX.set(descendant, index);
20
- NODE_TO_PARENT.set(descendant, childrenContext.parent);
21
- const context = getContext(this.board, descendant, index, childrenContext.parent);
22
- const componentType = getComponentType(this.board, context);
23
- const instance = createPluginComponent(this.board, componentType, context, childrenContext);
24
- this.instances.push(instance);
25
- this.contexts.push(context);
26
- });
27
- this.differ = new DefaultIterableDiffer(trackBy);
28
- this.differ.diff(children);
29
- }
30
- update(children, childrenContext) {
31
- if (!this.initialized) {
32
- this.initialize(children, childrenContext);
33
- return;
34
- }
35
- if (!this.differ) {
36
- throw new Error('Exception: Can not find differ ');
37
- }
38
- const { board, parent } = childrenContext;
39
- const diffResult = this.differ.diff(children);
40
- if (diffResult) {
41
- const newContexts = [];
42
- const newInstances = [];
43
- // for moving scene: the current index for first element before moving
44
- let currentIndexForFirstElement = null;
45
- diffResult.forEachItem((record) => {
46
- NODE_TO_INDEX.set(record.item, record.currentIndex);
47
- NODE_TO_PARENT.set(record.item, childrenContext.parent);
48
- const previousContext = record.previousIndex === null ? undefined : this.contexts[record.previousIndex];
49
- const context = getContext(board, record.item, record.currentIndex, parent, previousContext);
50
- if (record.previousIndex === null) {
51
- const componentType = getComponentType(board, context);
52
- const componentRef = createPluginComponent(board, componentType, context, childrenContext);
53
- newContexts.push(context);
54
- newInstances.push(componentRef);
55
- }
56
- else {
57
- const instance = this.instances[record.previousIndex];
58
- instance.context = context;
59
- newInstances.push(instance);
60
- newContexts.push(context);
61
- }
62
- // item might has been changed, so need to compare the id
63
- if (record.item === this.children[0] || record.item.id === this.children[0]?.id) {
64
- currentIndexForFirstElement = record.currentIndex;
65
- }
66
- });
67
- diffResult.forEachOperation(record => {
68
- // removed
69
- if (record.currentIndex === null) {
70
- const componentRef = this.instances[record.previousIndex];
71
- componentRef?.destroy();
72
- }
73
- // moved
74
- if (record.previousIndex !== null && record.currentIndex !== null) {
75
- mountOnItemMove(record.item, record.currentIndex, childrenContext, currentIndexForFirstElement);
76
- }
77
- });
78
- this.instances = newInstances;
79
- this.contexts = newContexts;
80
- this.children = children;
81
- }
82
- else {
83
- const newContexts = [];
84
- this.children.forEach((element, index) => {
85
- NODE_TO_INDEX.set(element, index);
86
- NODE_TO_PARENT.set(element, childrenContext.parent);
87
- const previousContext = this.contexts[index];
88
- const previousInstance = this.instances[index];
89
- const context = getContext(board, element, index, parent, previousContext);
90
- previousInstance.context = context;
91
- newContexts.push(context);
92
- });
93
- this.contexts = newContexts;
94
- }
95
- }
96
- destroy() {
97
- this.children.forEach((element, index) => {
98
- if (this.instances[index]) {
99
- this.instances[index].destroy();
100
- }
101
- });
102
- this.instances = [];
103
- this.children = [];
104
- this.contexts = [];
105
- this.initialized = false;
106
- this.differ = null;
107
- }
108
- }
109
- const trackBy = (index, element) => {
110
- return element.id;
111
- };
112
- const createPluginComponent = (board, componentType, context, childrenContext) => {
113
- const instance = new componentType();
114
- instance.context = context;
115
- board.normalizeElement(context);
116
- try {
117
- instance.initialize();
118
- }
119
- catch (error) {
120
- if (isDebug()) {
121
- console.error('list-render-initialize', error, 'context', context);
122
- }
123
- }
124
- const g = instance.getContainerG();
125
- mountElementG(context.index, g, childrenContext);
126
- instance.initializeListRender();
127
- return instance;
128
- };
129
- const getComponentType = (board, context) => {
130
- const result = board.drawElement(context);
131
- return result;
132
- };
133
- const getContext = (board, element, index, parent, previousContext) => {
134
- let isSelected = isSelectedElement(board, element);
135
- const previousElement = previousContext && previousContext.element;
136
- if (previousElement && previousElement !== element && isSelectedElement(board, previousElement)) {
137
- isSelected = true;
138
- replaceSelectedElement(board, previousElement, element);
139
- }
140
- const context = {
141
- element: element,
142
- parent: parent,
143
- board: board,
144
- selected: isSelected,
145
- index,
146
- hasThemeChanged: !!board.operations?.find(op => op.type === 'set_theme')
147
- };
148
- return context;
149
- };
150
- // the g depth of root element:[1]-[2]-[3]-[4]
151
- // the g depth of root element and children element(the [2] element has children):
152
- // [1]-
153
- // [2]([2-1-1][2-1-2][2-1][2-2][2-3-1][2-3-2][2-3][2])-
154
- // [3]-
155
- // [4]
156
- export const mountElementG = (index, g, childrenContext,
157
- // for moving scene: the current index for first element before moving
158
- currentIndexForFirstElement = null) => {
159
- const { parent, parentG } = childrenContext;
160
- if (PlaitBoard.isBoard(parent)) {
161
- if (index > 0) {
162
- const previousElement = parent.children[index - 1];
163
- const previousContainerG = PlaitElement.getContainerG(previousElement, { suppressThrow: false });
164
- previousContainerG.insertAdjacentElement('afterend', g);
165
- }
166
- else {
167
- if (currentIndexForFirstElement !== null) {
168
- const firstElement = parent.children[currentIndexForFirstElement];
169
- const firstContainerG = firstElement && PlaitElement.getContainerG(firstElement, { suppressThrow: true });
170
- if (firstElement && firstContainerG) {
171
- parentG.insertBefore(g, firstContainerG);
172
- }
173
- else {
174
- throw new Error('fail to mount container on moving');
175
- }
176
- }
177
- else {
178
- parentG.append(g);
179
- }
180
- }
181
- }
182
- else {
183
- if (index > 0) {
184
- const previousElement = parent.children[index - 1];
185
- const previousElementG = PlaitElement.getElementG(previousElement);
186
- previousElementG.insertAdjacentElement('afterend', g);
187
- }
188
- else {
189
- if (currentIndexForFirstElement) {
190
- const nextElement = parent.children[currentIndexForFirstElement];
191
- const nextPath = nextElement && PlaitBoard.findPath(childrenContext.board, nextElement);
192
- const first = nextPath && PlaitNode.first(childrenContext.board, nextPath);
193
- const firstContainerG = first && PlaitElement.getContainerG(first, { suppressThrow: false });
194
- if (firstContainerG) {
195
- parentG.insertBefore(g, firstContainerG);
196
- }
197
- else {
198
- throw new Error('fail to mount container on moving');
199
- }
200
- }
201
- else {
202
- let parentElementG = PlaitElement.getElementG(parent);
203
- parentG.insertBefore(g, parentElementG);
204
- }
205
- }
206
- }
207
- };
208
- const mountOnItemMove = (element, index, childrenContext, currentIndexForFirstElement) => {
209
- const containerG = PlaitElement.getContainerG(element, { suppressThrow: false });
210
- mountElementG(index, containerG, childrenContext, currentIndexForFirstElement);
211
- if (element.children && !PlaitElement.isRootElement(element) && childrenContext.board.isExpanded(element)) {
212
- element.children.forEach((child, index) => {
213
- mountOnItemMove(child, index, { ...childrenContext, parent: element }, null);
214
- });
215
- }
216
- };
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9jb3JlL2xpc3QtcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxVQUFVLEVBRVYsWUFBWSxFQUNaLFNBQVMsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLE9BQU8sVUFBVTtJQU9uQixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBTjdCLGFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBcUIsRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBZ0MsRUFBRSxDQUFDO1FBQzNDLFdBQU0sR0FBd0MsSUFBSSxDQUFDO1FBQ3BELGdCQUFXLEdBQUcsS0FBSyxDQUFDO0lBRWEsQ0FBQztJQUVsQyxVQUFVLENBQUMsUUFBd0IsRUFBRSxlQUFxQztRQUM3RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLE9BQU8sR0FB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YSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDL0UsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQW5jZXN0b3IsXG4gICAgQ29tcG9uZW50VHlwZSxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0Q2hpbGRyZW5Db250ZXh0LFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdE5vZGUsXG4gICAgUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE5PREVfVE9fSU5ERVgsIE5PREVfVE9fUEFSRU5UIH0gZnJvbSAnLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7IGlzU2VsZWN0ZWRFbGVtZW50LCByZXBsYWNlU2VsZWN0ZWRFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0ZWQtZWxlbWVudCc7XG5pbXBvcnQgeyBFbGVtZW50Rmxhdm91ciB9IGZyb20gJy4vZWxlbWVudC9lbGVtZW50LWZsYXZvdXInO1xuaW1wb3J0IHsgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIH0gZnJvbSAnLi4vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlcic7XG5pbXBvcnQgeyBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXIgfSBmcm9tICcuLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuaW1wb3J0IHsgaXNEZWJ1ZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnJztcblxuZXhwb3J0IGNsYXNzIExpc3RSZW5kZXIge1xuICAgIHByaXZhdGUgY2hpbGRyZW46IFBsYWl0RWxlbWVudFtdID0gW107XG4gICAgcHJpdmF0ZSBpbnN0YW5jZXM6IEVsZW1lbnRGbGF2b3VyW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8UGxhaXRFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRCb2FyZCkge31cblxuICAgIHB1YmxpYyBpbml0aWFsaXplKGNoaWxkcmVuOiBQbGFpdEVsZW1lbnRbXSwgY2hpbGRyZW5Db250ZXh0OiBQbGFpdENoaWxkcmVuQ29udGV4dCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChkZXNjZW5kYW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgTk9ERV9UT19JTkRFWC5zZXQoZGVzY2VuZGFudCwgaW5kZXgpO1xuICAgICAgICAgICAgTk9ERV9UT19QQVJFTlQuc2V0KGRlc2NlbmRhbnQsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcy5ib2FyZCwgZGVzY2VuZGFudCwgaW5kZXgsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGdldENvbXBvbmVudFR5cGUodGhpcy5ib2FyZCwgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZVBsdWdpbkNvbXBvbmVudCh0aGlzLmJvYXJkLCBjb21wb25lbnRUeXBlLCBjb250ZXh0LCBjaGlsZHJlbkNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpZmZlciA9IG5ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXI8UGxhaXRFbGVtZW50Pih0cmFja0J5KTtcbiAgICAgICAgdGhpcy5kaWZmZXIuZGlmZihjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShjaGlsZHJlbjogUGxhaXRFbGVtZW50W10sIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemUoY2hpbGRyZW4sIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRpZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb246IENhbiBub3QgZmluZCBkaWZmZXIgJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBib2FyZCwgcGFyZW50IH0gPSBjaGlsZHJlbkNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGRpZmZSZXN1bHQgPSB0aGlzLmRpZmZlci5kaWZmKGNoaWxkcmVuKTtcbiAgICAgICAgaWYgKGRpZmZSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlczogRWxlbWVudEZsYXZvdXJbXSA9IFtdO1xuICAgICAgICAgICAgLy8gZm9yIG1vdmluZyBzY2VuZTogdGhlIGN1cnJlbnQgaW5kZXggZm9yIGZpcnN0IGVsZW1lbnQgYmVmb3JlIG1vdmluZ1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPFBsYWl0RWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX0lOREVYLnNldChyZWNvcmQuaXRlbSwgcmVjb3JkLmN1cnJlbnRJbmRleCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIE5PREVfVE9fUEFSRU5ULnNldChyZWNvcmQuaXRlbSwgY2hpbGRyZW5Db250ZXh0LnBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZXh0ID0gcmVjb3JkLnByZXZpb3VzSW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRleHRzW3JlY29yZC5wcmV2aW91c0luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dChib2FyZCwgcmVjb3JkLml0ZW0sIHJlY29yZC5jdXJyZW50SW5kZXggYXMgbnVtYmVyLCBwYXJlbnQsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBnZXRDb21wb25lbnRUeXBlKGJvYXJkLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gY3JlYXRlUGx1Z2luQ29tcG9uZW50KGJvYXJkLCBjb21wb25lbnRUeXBlLCBjb250ZXh0LCBjaGlsZHJlbkNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdJbnN0YW5jZXMucHVzaChjb21wb25lbnRSZWYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXNbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgbmV3SW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpdGVtIG1pZ2h0IGhhcyBiZWVuIGNoYW5nZWQsIHNvIG5lZWQgdG8gY29tcGFyZSB0aGUgaWRcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLml0ZW0gPT09IHRoaXMuY2hpbGRyZW5bMF0gfHwgcmVjb3JkLml0ZW0uaWQgPT09IHRoaXMuY2hpbGRyZW5bMF0/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudCA9IHJlY29yZC5jdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hPcGVyYXRpb24ocmVjb3JkID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbnN0YW5jZXNbcmVjb3JkLnByZXZpb3VzSW5kZXggYXMgbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ICE9PSBudWxsICYmIHJlY29yZC5jdXJyZW50SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbW91bnRPbkl0ZW1Nb3ZlKHJlY29yZC5pdGVtLCByZWNvcmQuY3VycmVudEluZGV4LCBjaGlsZHJlbkNvbnRleHQsIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlcyA9IG5ld0luc3RhbmNlcztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXdDb250ZXh0cztcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX0lOREVYLnNldChlbGVtZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgTk9ERV9UT19QQVJFTlQuc2V0KGVsZW1lbnQsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29udGV4dCA9IHRoaXMuY29udGV4dHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoYm9hcmQsIGVsZW1lbnQsIGluZGV4LCBwYXJlbnQsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNJbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRzID0gbmV3Q29udGV4dHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50OiBQbGFpdEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1tpbmRleF0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRzID0gW107XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWZmZXIgPSBudWxsO1xuICAgIH1cbn1cblxuY29uc3QgdHJhY2tCeSA9IChpbmRleDogbnVtYmVyLCBlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZWxlbWVudC5pZDtcbn07XG5cbmNvbnN0IGNyZWF0ZVBsdWdpbkNvbXBvbmVudCA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlPEVsZW1lbnRGbGF2b3VyPixcbiAgICBjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0LFxuICAgIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHRcbikgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbXBvbmVudFR5cGUoKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICBib2FyZC5ub3JtYWxpemVFbGVtZW50KGNvbnRleHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNEZWJ1ZygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdsaXN0LXJlbmRlci1pbml0aWFsaXplJywgZXJyb3IsICdjb250ZXh0JywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZyA9IGluc3RhbmNlLmdldENvbnRhaW5lckcoKTtcbiAgICBtb3VudEVsZW1lbnRHKGNvbnRleHQuaW5kZXgsIGcsIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgaW5zdGFuY2UuaW5pdGlhbGl6ZUxpc3RSZW5kZXIoKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59O1xuXG5jb25zdCBnZXRDb21wb25lbnRUeXBlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYm9hcmQuZHJhd0VsZW1lbnQoY29udGV4dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGdldENvbnRleHQgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRFbGVtZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50OiBBbmNlc3RvcixcbiAgICBwcmV2aW91c0NvbnRleHQ/OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0XG4pOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0ID0+IHtcbiAgICBsZXQgaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWRFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBwcmV2aW91c0NvbnRleHQgJiYgcHJldmlvdXNDb250ZXh0LmVsZW1lbnQ7XG4gICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQgIT09IGVsZW1lbnQgJiYgaXNTZWxlY3RlZEVsZW1lbnQoYm9hcmQsIHByZXZpb3VzRWxlbWVudCkpIHtcbiAgICAgICAgaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJlcGxhY2VTZWxlY3RlZEVsZW1lbnQoYm9hcmQsIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQ6IFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBib2FyZDogYm9hcmQsXG4gICAgICAgIHNlbGVjdGVkOiBpc1NlbGVjdGVkLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgaGFzVGhlbWVDaGFuZ2VkOiAhIWJvYXJkLm9wZXJhdGlvbnM/LmZpbmQob3AgPT4gb3AudHlwZSA9PT0gJ3NldF90aGVtZScpXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbn07XG5cbi8vIHRoZSBnIGRlcHRoIG9mIHJvb3QgZWxlbWVudO+8mlsxXS1bMl0tWzNdLVs0XVxuLy8gdGhlIGcgZGVwdGggb2Ygcm9vdCBlbGVtZW50IGFuZCBjaGlsZHJlbiBlbGVtZW5077yIdGhlIFsyXSBlbGVtZW50IGhhcyBjaGlsZHJlbu+8ie+8mlxuLy8gWzFdLVxuLy8gWzJdKFsyLTEtMV1bMi0xLTJdWzItMV1bMi0yXVsyLTMtMV1bMi0zLTJdWzItM11bMl0pLVxuLy8gWzNdLVxuLy8gWzRdXG5leHBvcnQgY29uc3QgbW91bnRFbGVtZW50RyA9IChcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGc6IFNWR0dFbGVtZW50LFxuICAgIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHQsXG4gICAgLy8gZm9yIG1vdmluZyBzY2VuZTogdGhlIGN1cnJlbnQgaW5kZXggZm9yIGZpcnN0IGVsZW1lbnQgYmVmb3JlIG1vdmluZ1xuICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbikgPT4ge1xuICAgIGNvbnN0IHsgcGFyZW50LCBwYXJlbnRHIH0gPSBjaGlsZHJlbkNvbnRleHQ7XG4gICAgaWYgKFBsYWl0Qm9hcmQuaXNCb2FyZChwYXJlbnQpKSB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IHBhcmVudC5jaGlsZHJlbltpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDb250YWluZXJHID0gUGxhaXRFbGVtZW50LmdldENvbnRhaW5lckcocHJldmlvdXNFbGVtZW50LCB7IHN1cHByZXNzVGhyb3c6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcHJldmlvdXNDb250YWluZXJHLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBwYXJlbnQuY2hpbGRyZW5bY3VycmVudEluZGV4Rm9yRmlyc3RFbGVtZW50XTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENvbnRhaW5lckcgPSBmaXJzdEVsZW1lbnQgJiYgUGxhaXRFbGVtZW50LmdldENvbnRhaW5lckcoZmlyc3RFbGVtZW50LCB7IHN1cHByZXNzVGhyb3c6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0RWxlbWVudCAmJiBmaXJzdENvbnRhaW5lckcpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Ry5pbnNlcnRCZWZvcmUoZywgZmlyc3RDb250YWluZXJHKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWwgdG8gbW91bnQgY29udGFpbmVyIG9uIG1vdmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Ry5hcHBlbmQoZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSAocGFyZW50LmNoaWxkcmVuIGFzIFBsYWl0RWxlbWVudFtdKVtpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50RyA9IFBsYWl0RWxlbWVudC5nZXRFbGVtZW50RyhwcmV2aW91c0VsZW1lbnQpO1xuICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50Ry5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4Rm9yRmlyc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSAocGFyZW50LmNoaWxkcmVuIGFzIFBsYWl0RWxlbWVudFtdKVtjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gbmV4dEVsZW1lbnQgJiYgUGxhaXRCb2FyZC5maW5kUGF0aChjaGlsZHJlbkNvbnRleHQuYm9hcmQsIG5leHRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdCA9IG5leHRQYXRoICYmIFBsYWl0Tm9kZS5maXJzdChjaGlsZHJlbkNvbnRleHQuYm9hcmQsIG5leHRQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENvbnRhaW5lckcgPSBmaXJzdCAmJiBQbGFpdEVsZW1lbnQuZ2V0Q29udGFpbmVyRyhmaXJzdCwgeyBzdXBwcmVzc1Rocm93OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250YWluZXJHKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEcuaW5zZXJ0QmVmb3JlKGcsIGZpcnN0Q29udGFpbmVyRyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsIHRvIG1vdW50IGNvbnRhaW5lciBvbiBtb3ZpbmcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRFbGVtZW50RyA9IFBsYWl0RWxlbWVudC5nZXRFbGVtZW50RyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIHBhcmVudEcuaW5zZXJ0QmVmb3JlKGcsIHBhcmVudEVsZW1lbnRHKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmNvbnN0IG1vdW50T25JdGVtTW92ZSA9IChcbiAgICBlbGVtZW50OiBQbGFpdEVsZW1lbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjaGlsZHJlbkNvbnRleHQ6IFBsYWl0Q2hpbGRyZW5Db250ZXh0LFxuICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbFxuKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyRyA9IFBsYWl0RWxlbWVudC5nZXRDb250YWluZXJHKGVsZW1lbnQsIHsgc3VwcHJlc3NUaHJvdzogZmFsc2UgfSk7XG4gICAgbW91bnRFbGVtZW50RyhpbmRleCwgY29udGFpbmVyRywgY2hpbGRyZW5Db250ZXh0LCBjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnQpO1xuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmICFQbGFpdEVsZW1lbnQuaXNSb290RWxlbWVudChlbGVtZW50KSAmJiBjaGlsZHJlbkNvbnRleHQuYm9hcmQuaXNFeHBhbmRlZChlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbW91bnRPbkl0ZW1Nb3ZlKGNoaWxkLCBpbmRleCwgeyAuLi5jaGlsZHJlbkNvbnRleHQsIHBhcmVudDogZWxlbWVudCB9LCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ==