@schneideress/dashboardframework 13.0.0 → 17.0.2

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 (94) hide show
  1. package/README.md +7 -7
  2. package/esm2022/gridster/index.mjs +12 -0
  3. package/esm2022/gridster/lib/gridster.component.mjs +627 -0
  4. package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
  5. package/esm2022/gridster/lib/gridster.module.mjs +17 -0
  6. package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
  7. package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
  8. package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
  9. package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
  10. package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
  11. package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
  12. package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
  13. package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
  14. package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
  15. package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
  16. package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
  17. package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
  18. package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
  19. package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
  20. package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
  21. package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
  22. package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
  23. package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
  24. package/esm2022/lib/custom.notifier.options.mjs +41 -0
  25. package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
  26. package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
  27. package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
  28. package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
  29. package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
  30. package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
  31. package/esm2022/lib/ra.dashboard.module.mjs +55 -0
  32. package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
  33. package/esm2022/lib/ra.dashboard.service.mjs +77 -0
  34. package/esm2022/lib/ra.event.enum.mjs +60 -0
  35. package/esm2022/lib/ra.gridster.config.mjs +56 -0
  36. package/esm2022/public-api.mjs +13 -0
  37. package/esm2022/schneideress-dashboardframework.mjs +5 -0
  38. package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
  39. package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
  40. package/gridster/index.d.ts +9 -0
  41. package/gridster/lib/gridster.component.d.ts +79 -0
  42. package/gridster/lib/gridster.interface.d.ts +49 -0
  43. package/gridster/lib/gridster.module.d.ts +8 -0
  44. package/gridster/lib/gridsterCompact.service.d.ts +11 -0
  45. package/gridster/lib/gridsterConfig.constant.d.ts +2 -0
  46. package/gridster/lib/gridsterConfig.interface.d.ts +155 -0
  47. package/gridster/lib/gridsterConfigS.interface.d.ts +107 -0
  48. package/gridster/lib/gridsterDraggable.service.d.ts +68 -0
  49. package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -0
  50. package/gridster/lib/gridsterItem.component.d.ts +61 -0
  51. package/gridster/lib/gridsterItem.interface.d.ts +67 -0
  52. package/gridster/lib/gridsterPreview.component.d.ts +17 -0
  53. package/gridster/lib/gridsterPush.service.d.ts +34 -0
  54. package/gridster/lib/gridsterPushResize.service.d.ts +26 -0
  55. package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
  56. package/gridster/lib/gridsterRenderer.service.d.ts +37 -0
  57. package/gridster/lib/gridsterResizable.service.d.ts +86 -0
  58. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -0
  59. package/gridster/lib/gridsterScroll.service.d.ts +7 -0
  60. package/gridster/lib/gridsterSwap.service.d.ts +13 -0
  61. package/gridster/lib/gridsterUtils.service.d.ts +16 -0
  62. package/{schneideress-dashboardframework.d.ts → index.d.ts} +5 -5
  63. package/lib/custom.notifier.options.d.ts +2 -2
  64. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -88
  65. package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -20
  66. package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -142
  67. package/lib/ra.base.dashboard.filter.d.ts +17 -17
  68. package/lib/ra.base.dashboard.template.d.ts +18 -18
  69. package/lib/ra.dashbard.event.bus.d.ts +23 -23
  70. package/lib/ra.dashboard.module.d.ts +16 -17
  71. package/lib/ra.dashboard.responsive.service.d.ts +24 -24
  72. package/lib/ra.dashboard.service.d.ts +25 -25
  73. package/lib/ra.event.enum.d.ts +57 -57
  74. package/lib/ra.gridster.config.d.ts +2 -2
  75. package/package.json +11 -17
  76. package/public-api.d.ts +9 -9
  77. package/esm2020/lib/custom.notifier.options.mjs +0 -41
  78. package/esm2020/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -445
  79. package/esm2020/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
  80. package/esm2020/lib/ra-widget-container/ra.widget.container.component.mjs +0 -767
  81. package/esm2020/lib/ra.base.dashboard.filter.mjs +0 -44
  82. package/esm2020/lib/ra.base.dashboard.template.mjs +0 -36
  83. package/esm2020/lib/ra.dashbard.event.bus.mjs +0 -46
  84. package/esm2020/lib/ra.dashboard.module.mjs +0 -64
  85. package/esm2020/lib/ra.dashboard.responsive.service.mjs +0 -136
  86. package/esm2020/lib/ra.dashboard.service.mjs +0 -77
  87. package/esm2020/lib/ra.event.enum.mjs +0 -60
  88. package/esm2020/lib/ra.gridster.config.mjs +0 -56
  89. package/esm2020/public-api.mjs +0 -15
  90. package/esm2020/schneideress-dashboardframework.mjs +0 -5
  91. package/fesm2015/schneideress-dashboardframework.mjs +0 -1800
  92. package/fesm2015/schneideress-dashboardframework.mjs.map +0 -1
  93. package/fesm2020/schneideress-dashboardframework.mjs +0 -1790
  94. package/fesm2020/schneideress-dashboardframework.mjs.map +0 -1
@@ -0,0 +1,405 @@
1
+ import { DirTypes } from './gridsterConfig.interface';
2
+ import { GridsterPush } from './gridsterPush.service';
3
+ import { cancelScroll, scroll } from './gridsterScroll.service';
4
+ import { GridsterSwap } from './gridsterSwap.service';
5
+ import { GridsterUtils } from './gridsterUtils.service';
6
+ const GRIDSTER_ITEM_RESIZABLE_HANDLER_CLASS = 'gridster-item-resizable-handler';
7
+ var Direction;
8
+ (function (Direction) {
9
+ Direction["UP"] = "UP";
10
+ Direction["DOWN"] = "DOWN";
11
+ Direction["LEFT"] = "LEFT";
12
+ Direction["RIGHT"] = "RIGHT";
13
+ })(Direction || (Direction = {}));
14
+ export class GridsterDraggable {
15
+ constructor(gridsterItem, gridster, zone) {
16
+ this.zone = zone;
17
+ this.collision = false;
18
+ this.dragMove = (e) => {
19
+ e.stopPropagation();
20
+ e.preventDefault();
21
+ GridsterUtils.checkTouchEvent(e);
22
+ // get the directions of the mouse event
23
+ let directions = this.getDirections(e);
24
+ if (this.gridster.options.enableBoundaryControl) {
25
+ // prevent moving up at the top of gridster
26
+ if (directions.includes(Direction.UP) &&
27
+ this.gridsterItem.el.getBoundingClientRect().top <
28
+ this.gridster.el.getBoundingClientRect().top +
29
+ (this.outerMarginTop ?? this.margin)) {
30
+ directions = directions.filter(direction => direction != Direction.UP);
31
+ e = new MouseEvent(e.type, {
32
+ clientX: e.clientX,
33
+ clientY: this.lastMouse.clientY
34
+ });
35
+ }
36
+ // prevent moving left at the leftmost column of gridster
37
+ if (directions.includes(Direction.LEFT) &&
38
+ this.gridsterItem.el.getBoundingClientRect().left <
39
+ this.gridster.el.getBoundingClientRect().left +
40
+ (this.outerMarginLeft ?? this.margin)) {
41
+ directions = directions.filter(direction => direction != Direction.LEFT);
42
+ e = new MouseEvent(e.type, {
43
+ clientX: this.lastMouse.clientX,
44
+ clientY: e.clientY
45
+ });
46
+ }
47
+ // prevent moving right at the rightmost column of gridster
48
+ if (directions.includes(Direction.RIGHT) &&
49
+ this.gridsterItem.el.getBoundingClientRect().right >
50
+ this.gridster.el.getBoundingClientRect().right -
51
+ (this.outerMarginRight ?? this.margin)) {
52
+ directions = directions.filter(direction => direction != Direction.RIGHT);
53
+ e = new MouseEvent(e.type, {
54
+ clientX: this.lastMouse.clientX,
55
+ clientY: e.clientY
56
+ });
57
+ }
58
+ // prevent moving down at the bottom of gridster
59
+ if (directions.includes(Direction.DOWN) &&
60
+ this.gridsterItem.el.getBoundingClientRect().bottom >
61
+ this.gridster.el.getBoundingClientRect().bottom -
62
+ (this.outerMarginBottom ?? this.margin)) {
63
+ directions = directions.filter(direction => direction != Direction.DOWN);
64
+ e = new MouseEvent(e.type, {
65
+ clientX: e.clientX,
66
+ clientY: this.lastMouse.clientY
67
+ });
68
+ }
69
+ }
70
+ // do not change item location when there is no direction to go
71
+ if (directions.length) {
72
+ this.offsetLeft =
73
+ this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
74
+ this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
75
+ scroll(this.gridster, this.left, this.top, this.width, this.height, e, this.lastMouse, this.calculateItemPositionFromMousePosition);
76
+ this.calculateItemPositionFromMousePosition(e);
77
+ }
78
+ };
79
+ this.calculateItemPositionFromMousePosition = (e) => {
80
+ if (this.gridster.options.scale) {
81
+ this.calculateItemPositionWithScale(e, this.gridster.options.scale);
82
+ }
83
+ else {
84
+ this.calculateItemPositionWithoutScale(e);
85
+ }
86
+ this.calculateItemPosition();
87
+ this.lastMouse.clientX = e.clientX;
88
+ this.lastMouse.clientY = e.clientY;
89
+ this.zone.run(() => {
90
+ this.gridster.updateGrid();
91
+ });
92
+ };
93
+ this.dragStop = (e) => {
94
+ e.stopPropagation();
95
+ e.preventDefault();
96
+ cancelScroll();
97
+ this.cancelOnBlur();
98
+ this.mousemove();
99
+ this.mouseup();
100
+ this.mouseleave();
101
+ this.touchmove();
102
+ this.touchend();
103
+ this.touchcancel();
104
+ this.gridsterItem.renderer.removeClass(this.gridsterItem.el, 'gridster-item-moving');
105
+ this.gridster.dragInProgress = false;
106
+ this.gridster.updateGrid();
107
+ this.path = [];
108
+ if (this.gridster.options.draggable &&
109
+ this.gridster.options.draggable.stop) {
110
+ Promise.resolve(this.gridster.options.draggable.stop(this.gridsterItem.item, this.gridsterItem, e)).then(this.makeDrag, this.cancelDrag);
111
+ }
112
+ else {
113
+ this.makeDrag();
114
+ }
115
+ setTimeout(() => {
116
+ if (this.gridster) {
117
+ this.gridster.movingItem = null;
118
+ this.gridster.previewStyle(true);
119
+ }
120
+ });
121
+ };
122
+ this.cancelDrag = () => {
123
+ this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;
124
+ this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;
125
+ this.gridsterItem.setSize();
126
+ if (this.push) {
127
+ this.push.restoreItems();
128
+ }
129
+ if (this.swap) {
130
+ this.swap.restoreSwapItem();
131
+ }
132
+ if (this.push) {
133
+ this.push.destroy();
134
+ this.push = null;
135
+ }
136
+ if (this.swap) {
137
+ this.swap.destroy();
138
+ this.swap = null;
139
+ }
140
+ };
141
+ this.makeDrag = () => {
142
+ if (this.gridster.$options.draggable.dropOverItems &&
143
+ this.gridster.options.draggable &&
144
+ this.gridster.options.draggable.dropOverItemsCallback &&
145
+ this.collision &&
146
+ this.collision !== true &&
147
+ this.collision.$item) {
148
+ this.gridster.options.draggable.dropOverItemsCallback(this.gridsterItem.item, this.collision.item, this.gridster);
149
+ }
150
+ this.collision = false;
151
+ this.gridsterItem.setSize();
152
+ this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);
153
+ if (this.push) {
154
+ this.push.setPushedItems();
155
+ }
156
+ if (this.swap) {
157
+ this.swap.setSwapItem();
158
+ }
159
+ if (this.push) {
160
+ this.push.destroy();
161
+ this.push = null;
162
+ }
163
+ if (this.swap) {
164
+ this.swap.destroy();
165
+ this.swap = null;
166
+ }
167
+ };
168
+ this.dragStartDelay = (e) => {
169
+ const target = e.target;
170
+ if (target.classList.contains(GRIDSTER_ITEM_RESIZABLE_HANDLER_CLASS)) {
171
+ return;
172
+ }
173
+ if (GridsterUtils.checkContentClassForEvent(this.gridster, e)) {
174
+ return;
175
+ }
176
+ GridsterUtils.checkTouchEvent(e);
177
+ if (!this.gridster.$options.draggable.delayStart) {
178
+ this.dragStart(e);
179
+ return;
180
+ }
181
+ const timeout = setTimeout(() => {
182
+ this.dragStart(e);
183
+ cancelDrag();
184
+ }, this.gridster.$options.draggable.delayStart);
185
+ const cancelMouse = this.gridsterItem.renderer.listen('document', 'mouseup', cancelDrag);
186
+ const cancelMouseLeave = this.gridsterItem.renderer.listen('document', 'mouseleave', cancelDrag);
187
+ const cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', cancelDrag);
188
+ const cancelTouchMove = this.gridsterItem.renderer.listen('document', 'touchmove', cancelMove);
189
+ const cancelTouchEnd = this.gridsterItem.renderer.listen('document', 'touchend', cancelDrag);
190
+ const cancelTouchCancel = this.gridsterItem.renderer.listen('document', 'touchcancel', cancelDrag);
191
+ function cancelMove(eventMove) {
192
+ GridsterUtils.checkTouchEvent(eventMove);
193
+ if (Math.abs(eventMove.clientX - e.clientX) > 9 ||
194
+ Math.abs(eventMove.clientY - e.clientY) > 9) {
195
+ cancelDrag();
196
+ }
197
+ }
198
+ function cancelDrag() {
199
+ clearTimeout(timeout);
200
+ cancelOnBlur();
201
+ cancelMouse();
202
+ cancelMouseLeave();
203
+ cancelTouchMove();
204
+ cancelTouchEnd();
205
+ cancelTouchCancel();
206
+ }
207
+ };
208
+ this.gridsterItem = gridsterItem;
209
+ this.gridster = gridster;
210
+ this.lastMouse = {
211
+ clientX: 0,
212
+ clientY: 0
213
+ };
214
+ this.path = [];
215
+ }
216
+ destroy() {
217
+ if (this.gridster.previewStyle) {
218
+ this.gridster.previewStyle(true);
219
+ }
220
+ this.gridsterItem = this.gridster = this.collision = null;
221
+ if (this.mousedown) {
222
+ this.mousedown();
223
+ this.touchstart();
224
+ }
225
+ }
226
+ dragStart(e) {
227
+ if (e.which && e.which !== 1) {
228
+ return;
229
+ }
230
+ if (this.gridster.options.draggable &&
231
+ this.gridster.options.draggable.start) {
232
+ this.gridster.options.draggable.start(this.gridsterItem.item, this.gridsterItem, e);
233
+ }
234
+ e.stopPropagation();
235
+ e.preventDefault();
236
+ this.zone.runOutsideAngular(() => {
237
+ this.mousemove = this.gridsterItem.renderer.listen('document', 'mousemove', this.dragMove);
238
+ this.touchmove = this.gridster.renderer.listen(this.gridster.el, 'touchmove', this.dragMove);
239
+ });
240
+ this.mouseup = this.gridsterItem.renderer.listen('document', 'mouseup', this.dragStop);
241
+ this.mouseleave = this.gridsterItem.renderer.listen('document', 'mouseleave', this.dragStop);
242
+ this.cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', this.dragStop);
243
+ this.touchend = this.gridsterItem.renderer.listen('document', 'touchend', this.dragStop);
244
+ this.touchcancel = this.gridsterItem.renderer.listen('document', 'touchcancel', this.dragStop);
245
+ this.gridsterItem.renderer.addClass(this.gridsterItem.el, 'gridster-item-moving');
246
+ this.margin = this.gridster.$options.margin;
247
+ this.outerMarginTop = this.gridster.$options.outerMarginTop;
248
+ this.outerMarginRight = this.gridster.$options.outerMarginRight;
249
+ this.outerMarginBottom = this.gridster.$options.outerMarginBottom;
250
+ this.outerMarginLeft = this.gridster.$options.outerMarginLeft;
251
+ this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
252
+ this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
253
+ this.left = this.gridsterItem.left - this.margin;
254
+ this.top = this.gridsterItem.top - this.margin;
255
+ this.originalClientX = e.clientX;
256
+ this.originalClientY = e.clientY;
257
+ this.width = this.gridsterItem.width;
258
+ this.height = this.gridsterItem.height;
259
+ if (this.gridster.$options.dirType === DirTypes.RTL) {
260
+ this.diffLeft =
261
+ e.clientX - this.gridster.el.scrollWidth + this.gridsterItem.left;
262
+ }
263
+ else {
264
+ this.diffLeft = e.clientX + this.offsetLeft - this.margin - this.left;
265
+ }
266
+ this.diffTop = e.clientY + this.offsetTop - this.margin - this.top;
267
+ this.gridster.movingItem = this.gridsterItem.$item;
268
+ this.gridster.previewStyle(true);
269
+ this.push = new GridsterPush(this.gridsterItem);
270
+ this.swap = new GridsterSwap(this.gridsterItem);
271
+ this.gridster.dragInProgress = true;
272
+ this.gridster.updateGrid();
273
+ this.path.push({
274
+ x: this.gridsterItem.item.x || 0,
275
+ y: this.gridsterItem.item.y || 0
276
+ });
277
+ }
278
+ calculateItemPositionWithScale(e, scale) {
279
+ if (this.gridster.$options.dirType === DirTypes.RTL) {
280
+ this.left =
281
+ this.gridster.el.scrollWidth -
282
+ this.originalClientX +
283
+ (e.clientX - this.originalClientX) / scale +
284
+ this.diffLeft;
285
+ }
286
+ else {
287
+ this.left =
288
+ this.originalClientX +
289
+ (e.clientX - this.originalClientX) / scale +
290
+ this.offsetLeft -
291
+ this.diffLeft;
292
+ }
293
+ this.top =
294
+ this.originalClientY +
295
+ (e.clientY - this.originalClientY) / scale +
296
+ this.offsetTop -
297
+ this.diffTop;
298
+ }
299
+ calculateItemPositionWithoutScale(e) {
300
+ if (this.gridster.$options.dirType === DirTypes.RTL) {
301
+ this.left = this.gridster.el.scrollWidth - e.clientX + this.diffLeft;
302
+ }
303
+ else {
304
+ this.left = e.clientX + this.offsetLeft - this.diffLeft;
305
+ }
306
+ this.top = e.clientY + this.offsetTop - this.diffTop;
307
+ }
308
+ calculateItemPosition() {
309
+ this.gridster.movingItem = this.gridsterItem.$item;
310
+ this.positionX = this.gridster.pixelsToPositionX(this.left, Math.round);
311
+ this.positionY = this.gridster.pixelsToPositionY(this.top, Math.round);
312
+ this.positionXBackup = this.gridsterItem.$item.x;
313
+ this.positionYBackup = this.gridsterItem.$item.y;
314
+ this.gridsterItem.$item.x = this.positionX;
315
+ if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
316
+ this.gridsterItem.$item.x = this.positionXBackup;
317
+ }
318
+ this.gridsterItem.$item.y = this.positionY;
319
+ if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
320
+ this.gridsterItem.$item.y = this.positionYBackup;
321
+ }
322
+ this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, this.left, this.top);
323
+ if (this.positionXBackup !== this.gridsterItem.$item.x ||
324
+ this.positionYBackup !== this.gridsterItem.$item.y) {
325
+ const lastPosition = this.path[this.path.length - 1];
326
+ let direction = '';
327
+ if (lastPosition.x < this.gridsterItem.$item.x) {
328
+ direction = this.push.fromWest;
329
+ }
330
+ else if (lastPosition.x > this.gridsterItem.$item.x) {
331
+ direction = this.push.fromEast;
332
+ }
333
+ else if (lastPosition.y < this.gridsterItem.$item.y) {
334
+ direction = this.push.fromNorth;
335
+ }
336
+ else if (lastPosition.y > this.gridsterItem.$item.y) {
337
+ direction = this.push.fromSouth;
338
+ }
339
+ this.push.pushItems(direction, this.gridster.$options.disablePushOnDrag);
340
+ this.swap.swapItems();
341
+ this.collision = this.gridster.checkCollision(this.gridsterItem.$item);
342
+ if (this.collision) {
343
+ this.gridsterItem.$item.x = this.positionXBackup;
344
+ this.gridsterItem.$item.y = this.positionYBackup;
345
+ if (this.gridster.$options.draggable.dropOverItems &&
346
+ this.collision !== true &&
347
+ this.collision.$item) {
348
+ this.gridster.movingItem = null;
349
+ }
350
+ }
351
+ else {
352
+ this.path.push({
353
+ x: this.gridsterItem.$item.x,
354
+ y: this.gridsterItem.$item.y
355
+ });
356
+ }
357
+ this.push.checkPushBack();
358
+ }
359
+ else {
360
+ // reset the collision when you drag and drop on an adjacent cell that is not empty
361
+ // and go back to the cell you were in from the beginning,
362
+ // this is to prevent `dropOverItemsCallback'
363
+ this.collision = false;
364
+ }
365
+ this.gridster.previewStyle(true);
366
+ }
367
+ toggle() {
368
+ const enableDrag = this.gridsterItem.canBeDragged();
369
+ if (!this.enabled && enableDrag) {
370
+ this.enabled = !this.enabled;
371
+ this.mousedown = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'mousedown', this.dragStartDelay);
372
+ this.touchstart = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'touchstart', this.dragStartDelay);
373
+ }
374
+ else if (this.enabled && !enableDrag) {
375
+ this.enabled = !this.enabled;
376
+ this.mousedown();
377
+ this.touchstart();
378
+ }
379
+ }
380
+ /**
381
+ * Returns the list of directions for given mouse event
382
+ * @param e Mouse event
383
+ * */
384
+ getDirections(e) {
385
+ const directions = [];
386
+ if (this.lastMouse.clientX === 0 && this.lastMouse.clientY === 0) {
387
+ this.lastMouse.clientY = e.clientY;
388
+ this.lastMouse.clientX = e.clientX;
389
+ }
390
+ if (this.lastMouse.clientY > e.clientY) {
391
+ directions.push(Direction.UP);
392
+ }
393
+ if (this.lastMouse.clientY < e.clientY) {
394
+ directions.push(Direction.DOWN);
395
+ }
396
+ if (this.lastMouse.clientX < e.clientX) {
397
+ directions.push(Direction.RIGHT);
398
+ }
399
+ if (this.lastMouse.clientX > e.clientX) {
400
+ directions.push(Direction.LEFT);
401
+ }
402
+ return directions;
403
+ }
404
+ }
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJEcmFnZ2FibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhLWRhc2hib2FyZC1mcmFtZXdvcmsvc3JjL2dyaWRzdGVyL2xpYi9ncmlkc3RlckRyYWdnYWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXhELE1BQU0scUNBQXFDLEdBQUcsaUNBQWlDLENBQUM7QUFFaEYsSUFBSyxTQUtKO0FBTEQsV0FBSyxTQUFTO0lBQ1osc0JBQVMsQ0FBQTtJQUNULDBCQUFhLENBQUE7SUFDYiwwQkFBYSxDQUFBO0lBQ2IsNEJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTEksU0FBUyxLQUFULFNBQVMsUUFLYjtBQUVELE1BQU0sT0FBTyxpQkFBaUI7SUF5QzVCLFlBQ0UsWUFBNEMsRUFDNUMsUUFBb0MsRUFDNUIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFMdEIsY0FBUyxHQUE2QyxLQUFLLENBQUM7UUF1SDVELGFBQVEsR0FBRyxDQUFDLENBQWEsRUFBUSxFQUFFO1lBQ2pDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqQyx3Q0FBd0M7WUFDeEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFD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U0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IERpclR5cGVzIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclB1c2ggfSBmcm9tICcuL2dyaWRzdGVyUHVzaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgY2FuY2VsU2Nyb2xsLCBzY3JvbGwgfSBmcm9tICcuL2dyaWRzdGVyU2Nyb2xsLnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJTd2FwIH0gZnJvbSAnLi9ncmlkc3RlclN3YXAuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyVXRpbHMgfSBmcm9tICcuL2dyaWRzdGVyVXRpbHMuc2VydmljZSc7XHJcblxyXG5jb25zdCBHUklEU1RFUl9JVEVNX1JFU0laQUJMRV9IQU5ETEVSX0NMQVNTID0gJ2dyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXInO1xyXG5cclxuZW51bSBEaXJlY3Rpb24ge1xyXG4gIFVQID0gJ1VQJyxcclxuICBET1dOID0gJ0RPV04nLFxyXG4gIExFRlQgPSAnTEVGVCcsXHJcbiAgUklHSFQgPSAnUklHSFQnXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckRyYWdnYWJsZSB7XHJcbiAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIGxhc3RNb3VzZToge1xyXG4gICAgY2xpZW50WDogbnVtYmVyO1xyXG4gICAgY2xpZW50WTogbnVtYmVyO1xyXG4gIH07XHJcbiAgb2Zmc2V0TGVmdCE6IG51bWJlcjtcclxuICBvZmZzZXRUb3AhOiBudW1iZXI7XHJcbiAgbWFyZ2luITogbnVtYmVyO1xyXG4gIG91dGVyTWFyZ2luVG9wITogbnVtYmVyIHwgbnVsbDtcclxuICBvdXRlck1hcmdpblJpZ2h0ITogbnVtYmVyIHwgbnVsbDtcclxuICBvdXRlck1hcmdpbkJvdHRvbSE6IG51bWJlciB8IG51bGw7XHJcbiAgb3V0ZXJNYXJnaW5MZWZ0ITogbnVtYmVyIHwgbnVsbDtcclxuICBkaWZmVG9wITogbnVtYmVyO1xyXG4gIGRpZmZMZWZ0ITogbnVtYmVyO1xyXG4gIG9yaWdpbmFsQ2xpZW50WCE6IG51bWJlcjtcclxuICBvcmlnaW5hbENsaWVudFkhOiBudW1iZXI7XHJcbiAgdG9wITogbnVtYmVyO1xyXG4gIGxlZnQhOiBudW1iZXI7XHJcbiAgaGVpZ2h0ITogbnVtYmVyO1xyXG4gIHdpZHRoITogbnVtYmVyO1xyXG4gIHBvc2l0aW9uWCE6IG51bWJlcjtcclxuICBwb3NpdGlvblkhOiBudW1iZXI7XHJcbiAgcG9zaXRpb25YQmFja3VwITogbnVtYmVyO1xyXG4gIHBvc2l0aW9uWUJhY2t1cCE6IG51bWJlcjtcclxuICBlbmFibGVkITogYm9vbGVhbjtcclxuICBtb3VzZW1vdmUhOiAoKSA9PiB2b2lkO1xyXG4gIG1vdXNldXAhOiAoKSA9PiB2b2lkO1xyXG4gIG1vdXNlbGVhdmUhOiAoKSA9PiB2b2lkO1xyXG4gIGNhbmNlbE9uQmx1ciE6ICgpID0+IHZvaWQ7XHJcbiAgdG91Y2htb3ZlITogKCkgPT4gdm9pZDtcclxuICB0b3VjaGVuZCE6ICgpID0+IHZvaWQ7XHJcbiAgdG91Y2hjYW5jZWwhOiAoKSA9PiB2b2lkO1xyXG4gIG1vdXNlZG93biE6ICgpID0+IHZvaWQ7XHJcbiAgdG91Y2hzdGFydCE6ICgpID0+IHZvaWQ7XHJcbiAgcHVzaCE6IEdyaWRzdGVyUHVzaDtcclxuICBzd2FwITogR3JpZHN0ZXJTd2FwO1xyXG4gIHBhdGg6IEFycmF5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT47XHJcbiAgY29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBncmlkc3RlcjogR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxyXG4gICkge1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0gPSBncmlkc3Rlckl0ZW07XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXI7XHJcbiAgICB0aGlzLmxhc3RNb3VzZSA9IHtcclxuICAgICAgY2xpZW50WDogMCxcclxuICAgICAgY2xpZW50WTogMFxyXG4gICAgfTtcclxuICAgIHRoaXMucGF0aCA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtID0gdGhpcy5ncmlkc3RlciA9IHRoaXMuY29sbGlzaW9uID0gbnVsbCE7XHJcbiAgICBpZiAodGhpcy5tb3VzZWRvd24pIHtcclxuICAgICAgdGhpcy5tb3VzZWRvd24oKTtcclxuICAgICAgdGhpcy50b3VjaHN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcmFnU3RhcnQoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGUud2hpY2ggJiYgZS53aGljaCAhPT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlICYmXHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuc3RhcnRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLnN0YXJ0KFxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0sXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0sXHJcbiAgICAgICAgZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5tb3VzZW1vdmUgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICAgJ2RvY3VtZW50JyxcclxuICAgICAgICAnbW91c2Vtb3ZlJyxcclxuICAgICAgICB0aGlzLmRyYWdNb3ZlXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMudG91Y2htb3ZlID0gdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5lbCxcclxuICAgICAgICAndG91Y2htb3ZlJyxcclxuICAgICAgICB0aGlzLmRyYWdNb3ZlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW91c2V1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgJ2RvY3VtZW50JyxcclxuICAgICAgJ21vdXNldXAnLFxyXG4gICAgICB0aGlzLmRyYWdTdG9wXHJcbiAgICApO1xyXG4gICAgdGhpcy5tb3VzZWxlYXZlID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKFxyXG4gICAgICAnZG9jdW1lbnQnLFxyXG4gICAgICAnbW91c2VsZWF2ZScsXHJcbiAgICAgIHRoaXMuZHJhZ1N0b3BcclxuICAgICk7XHJcbiAgICB0aGlzLmNhbmNlbE9uQmx1ciA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgJ3dpbmRvdycsXHJcbiAgICAgICdibHVyJyxcclxuICAgICAgdGhpcy5kcmFnU3RvcFxyXG4gICAgKTtcclxuICAgIHRoaXMudG91Y2hlbmQgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICdkb2N1bWVudCcsXHJcbiAgICAgICd0b3VjaGVuZCcsXHJcbiAgICAgIHRoaXMuZHJhZ1N0b3BcclxuICAgICk7XHJcbiAgICB0aGlzLnRvdWNoY2FuY2VsID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKFxyXG4gICAgICAnZG9jdW1lbnQnLFxyXG4gICAgICAndG91Y2hjYW5jZWwnLFxyXG4gICAgICB0aGlzLmRyYWdTdG9wXHJcbiAgICApO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIuYWRkQ2xhc3MoXHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLFxyXG4gICAgICAnZ3JpZHN0ZXItaXRlbS1tb3ZpbmcnXHJcbiAgICApO1xyXG4gICAgdGhpcy5tYXJnaW4gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgIHRoaXMub3V0ZXJNYXJnaW5Ub3AgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wO1xyXG4gICAgdGhpcy5vdXRlck1hcmdpblJpZ2h0ID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0O1xyXG4gICAgdGhpcy5vdXRlck1hcmdpbkJvdHRvbSA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b207XHJcbiAgICB0aGlzLm91dGVyTWFyZ2luTGVmdCA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0O1xyXG4gICAgdGhpcy5vZmZzZXRMZWZ0ID0gdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxMZWZ0IC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRMZWZ0O1xyXG4gICAgdGhpcy5vZmZzZXRUb3AgPSB0aGlzLmdyaWRzdGVyLmVsLnNjcm9sbFRvcCAtIHRoaXMuZ3JpZHN0ZXIuZWwub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5ncmlkc3Rlckl0ZW0ubGVmdCAtIHRoaXMubWFyZ2luO1xyXG4gICAgdGhpcy50b3AgPSB0aGlzLmdyaWRzdGVySXRlbS50b3AgLSB0aGlzLm1hcmdpbjtcclxuICAgIHRoaXMub3JpZ2luYWxDbGllbnRYID0gZS5jbGllbnRYO1xyXG4gICAgdGhpcy5vcmlnaW5hbENsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICB0aGlzLndpZHRoID0gdGhpcy5ncmlkc3Rlckl0ZW0ud2lkdGg7XHJcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLmhlaWdodDtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRpclR5cGUgPT09IERpclR5cGVzLlJUTCkge1xyXG4gICAgICB0aGlzLmRpZmZMZWZ0ID1cclxuICAgICAgICBlLmNsaWVudFggLSB0aGlzLmdyaWRzdGVyLmVsLnNjcm9sbFdpZHRoICsgdGhpcy5ncmlkc3Rlckl0ZW0ubGVmdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlmZkxlZnQgPSBlLmNsaWVudFggKyB0aGlzLm9mZnNldExlZnQgLSB0aGlzLm1hcmdpbiAtIHRoaXMubGVmdDtcclxuICAgIH1cclxuICAgIHRoaXMuZGlmZlRvcCA9IGUuY2xpZW50WSArIHRoaXMub2Zmc2V0VG9wIC0gdGhpcy5tYXJnaW4gLSB0aGlzLnRvcDtcclxuICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUodHJ1ZSk7XHJcbiAgICB0aGlzLnB1c2ggPSBuZXcgR3JpZHN0ZXJQdXNoKHRoaXMuZ3JpZHN0ZXJJdGVtKTtcclxuICAgIHRoaXMuc3dhcCA9IG5ldyBHcmlkc3RlclN3YXAodGhpcy5ncmlkc3Rlckl0ZW0pO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5kcmFnSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRzdGVyLnVwZGF0ZUdyaWQoKTtcclxuICAgIHRoaXMucGF0aC5wdXNoKHtcclxuICAgICAgeDogdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbS54IHx8IDAsXHJcbiAgICAgIHk6IHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0ueSB8fCAwXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyYWdNb3ZlID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBHcmlkc3RlclV0aWxzLmNoZWNrVG91Y2hFdmVudChlKTtcclxuXHJcbiAgICAvLyBnZXQgdGhlIGRpcmVjdGlvbnMgb2YgdGhlIG1vdXNlIGV2ZW50XHJcbiAgICBsZXQgZGlyZWN0aW9ucyA9IHRoaXMuZ2V0RGlyZWN0aW9ucyhlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5vcHRpb25zLmVuYWJsZUJvdW5kYXJ5Q29udHJvbCkge1xyXG4gICAgICAvLyBwcmV2ZW50IG1vdmluZyB1cCBhdCB0aGUgdG9wIG9mIGdyaWRzdGVyXHJcbiAgICAgIGlmIChcclxuICAgICAgICBkaXJlY3Rpb25zLmluY2x1ZGVzKERpcmVjdGlvbi5VUCkgJiZcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPFxyXG4gICAgICAgICAgdGhpcy5ncmlkc3Rlci5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgK1xyXG4gICAgICAgICAgICAodGhpcy5vdXRlck1hcmdpblRvcCA/PyB0aGlzLm1hcmdpbilcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGlyZWN0aW9ucyA9IGRpcmVjdGlvbnMuZmlsdGVyKGRpcmVjdGlvbiA9PiBkaXJlY3Rpb24gIT0gRGlyZWN0aW9uLlVQKTtcclxuICAgICAgICBlID0gbmV3IE1vdXNlRXZlbnQoZS50eXBlLCB7XHJcbiAgICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXHJcbiAgICAgICAgICBjbGllbnRZOiB0aGlzLmxhc3RNb3VzZS5jbGllbnRZXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcHJldmVudCBtb3ZpbmcgbGVmdCBhdCB0aGUgbGVmdG1vc3QgY29sdW1uIG9mIGdyaWRzdGVyXHJcbiAgICAgIGlmIChcclxuICAgICAgICBkaXJlY3Rpb25zLmluY2x1ZGVzKERpcmVjdGlvbi5MRUZUKSAmJlxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPFxyXG4gICAgICAgICAgdGhpcy5ncmlkc3Rlci5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICtcclxuICAgICAgICAgICAgKHRoaXMub3V0ZXJNYXJnaW5MZWZ0ID8/IHRoaXMubWFyZ2luKVxyXG4gICAgICApIHtcclxuICAgICAgICBkaXJlY3Rpb25zID0gZGlyZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgICBkaXJlY3Rpb24gPT4gZGlyZWN0aW9uICE9IERpcmVjdGlvbi5MRUZUXHJcbiAgICAgICAgKTtcclxuICAgICAgICBlID0gbmV3IE1vdXNlRXZlbnQoZS50eXBlLCB7XHJcbiAgICAgICAgICBjbGllbnRYOiB0aGlzLmxhc3RNb3VzZS5jbGllbnRYLFxyXG4gICAgICAgICAgY2xpZW50WTogZS5jbGllbnRZXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcHJldmVudCBtb3ZpbmcgcmlnaHQgYXQgdGhlIHJpZ2h0bW9zdCBjb2x1bW4gb2YgZ3JpZHN0ZXJcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGRpcmVjdGlvbnMuaW5jbHVkZXMoRGlyZWN0aW9uLlJJR0hUKSAmJlxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID5cclxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgLVxyXG4gICAgICAgICAgICAodGhpcy5vdXRlck1hcmdpblJpZ2h0ID8/IHRoaXMubWFyZ2luKVxyXG4gICAgICApIHtcclxuICAgICAgICBkaXJlY3Rpb25zID0gZGlyZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgICBkaXJlY3Rpb24gPT4gZGlyZWN0aW9uICE9IERpcmVjdGlvbi5SSUdIVFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZSA9IG5ldyBNb3VzZUV2ZW50KGUudHlwZSwge1xyXG4gICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0TW91c2UuY2xpZW50WCxcclxuICAgICAgICAgIGNsaWVudFk6IGUuY2xpZW50WVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHByZXZlbnQgbW92aW5nIGRvd24gYXQgdGhlIGJvdHRvbSBvZiBncmlkc3RlclxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZGlyZWN0aW9ucy5pbmNsdWRlcyhEaXJlY3Rpb24uRE9XTikgJiZcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPlxyXG4gICAgICAgICAgdGhpcy5ncmlkc3Rlci5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBcclxuICAgICAgICAgICAgKHRoaXMub3V0ZXJNYXJnaW5Cb3R0b20gPz8gdGhpcy5tYXJnaW4pXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRpcmVjdGlvbnMgPSBkaXJlY3Rpb25zLmZpbHRlcihcclxuICAgICAgICAgIGRpcmVjdGlvbiA9PiBkaXJlY3Rpb24gIT0gRGlyZWN0aW9uLkRPV05cclxuICAgICAgICApO1xyXG4gICAgICAgIGUgPSBuZXcgTW91c2VFdmVudChlLnR5cGUsIHtcclxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcclxuICAgICAgICAgIGNsaWVudFk6IHRoaXMubGFzdE1vdXNlLmNsaWVudFlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvIG5vdCBjaGFuZ2UgaXRlbSBsb2NhdGlvbiB3aGVuIHRoZXJlIGlzIG5vIGRpcmVjdGlvbiB0byBnb1xyXG4gICAgaWYgKGRpcmVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2Zmc2V0TGVmdCA9XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxMZWZ0IC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRMZWZ0O1xyXG4gICAgICB0aGlzLm9mZnNldFRvcCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsVG9wIC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRUb3A7XHJcbiAgICAgIHNjcm9sbChcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLFxyXG4gICAgICAgIHRoaXMubGVmdCxcclxuICAgICAgICB0aGlzLnRvcCxcclxuICAgICAgICB0aGlzLndpZHRoLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0LFxyXG4gICAgICAgIGUsXHJcbiAgICAgICAgdGhpcy5sYXN0TW91c2UsXHJcbiAgICAgICAgPGFueT50aGlzLmNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbkZyb21Nb3VzZVBvc2l0aW9uXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbkZyb21Nb3VzZVBvc2l0aW9uKGUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbkZyb21Nb3VzZVBvc2l0aW9uID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuc2NhbGUpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtUG9zaXRpb25XaXRoU2NhbGUoZSwgdGhpcy5ncmlkc3Rlci5vcHRpb25zLnNjYWxlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbVBvc2l0aW9uV2l0aG91dFNjYWxlKGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxhdGVJdGVtUG9zaXRpb24oKTtcclxuICAgIHRoaXMubGFzdE1vdXNlLmNsaWVudFggPSBlLmNsaWVudFg7XHJcbiAgICB0aGlzLmxhc3RNb3VzZS5jbGllbnRZID0gZS5jbGllbnRZO1xyXG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIudXBkYXRlR3JpZCgpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgY2FsY3VsYXRlSXRlbVBvc2l0aW9uV2l0aFNjYWxlKGU6IE1vdXNlRXZlbnQsIHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRpclR5cGUgPT09IERpclR5cGVzLlJUTCkge1xyXG4gICAgICB0aGlzLmxlZnQgPVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsV2lkdGggLVxyXG4gICAgICAgIHRoaXMub3JpZ2luYWxDbGllbnRYICtcclxuICAgICAgICAoZS5jbGllbnRYIC0gdGhpcy5vcmlnaW5hbENsaWVudFgpIC8gc2NhbGUgK1xyXG4gICAgICAgIHRoaXMuZGlmZkxlZnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxlZnQgPVxyXG4gICAgICAgIHRoaXMub3JpZ2luYWxDbGllbnRYICtcclxuICAgICAgICAoZS5jbGllbnRYIC0gdGhpcy5vcmlnaW5hbENsaWVudFgpIC8gc2NhbGUgK1xyXG4gICAgICAgIHRoaXMub2Zmc2V0TGVmdCAtXHJcbiAgICAgICAgdGhpcy5kaWZmTGVmdDtcclxuICAgIH1cclxuICAgIHRoaXMudG9wID1cclxuICAgICAgdGhpcy5vcmlnaW5hbENsaWVudFkgK1xyXG4gICAgICAoZS5jbGllbnRZIC0gdGhpcy5vcmlnaW5hbENsaWVudFkpIC8gc2NhbGUgK1xyXG4gICAgICB0aGlzLm9mZnNldFRvcCAtXHJcbiAgICAgIHRoaXMuZGlmZlRvcDtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbldpdGhvdXRTY2FsZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kaXJUeXBlID09PSBEaXJUeXBlcy5SVEwpIHtcclxuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxXaWR0aCAtIGUuY2xpZW50WCArIHRoaXMuZGlmZkxlZnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxlZnQgPSBlLmNsaWVudFggKyB0aGlzLm9mZnNldExlZnQgLSB0aGlzLmRpZmZMZWZ0O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9wID0gZS5jbGllbnRZICsgdGhpcy5vZmZzZXRUb3AgLSB0aGlzLmRpZmZUb3A7XHJcbiAgfVxyXG5cclxuICBkcmFnU3RvcCA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIGNhbmNlbFNjcm9sbCgpO1xyXG4gICAgdGhpcy5jYW5jZWxPbkJsdXIoKTtcclxuICAgIHRoaXMubW91c2Vtb3ZlKCk7XHJcbiAgICB0aGlzLm1vdXNldXAoKTtcclxuICAgIHRoaXMubW91c2VsZWF2ZSgpO1xyXG4gICAgdGhpcy50b3VjaG1vdmUoKTtcclxuICAgIHRoaXMudG91Y2hlbmQoKTtcclxuICAgIHRoaXMudG91Y2hjYW5jZWwoKTtcclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxyXG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS5lbCxcclxuICAgICAgJ2dyaWRzdGVyLWl0ZW0tbW92aW5nJ1xyXG4gICAgKTtcclxuICAgIHRoaXMuZ3JpZHN0ZXIuZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIHRoaXMuZ3JpZHN0ZXIudXBkYXRlR3JpZCgpO1xyXG4gICAgdGhpcy5wYXRoID0gW107XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUgJiZcclxuICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZS5zdG9wXHJcbiAgICApIHtcclxuICAgICAgUHJvbWlzZS5yZXNvbHZlKFxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuc3RvcChcclxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0sXHJcbiAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbSxcclxuICAgICAgICAgIGVcclxuICAgICAgICApXHJcbiAgICAgICkudGhlbih0aGlzLm1ha2VEcmFnLCB0aGlzLmNhbmNlbERyYWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYWtlRHJhZygpO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gbnVsbDtcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgY2FuY2VsRHJhZyA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLnggfHwgMDtcclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLnkgfHwgMDtcclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLnNldFNpemUoKTtcclxuICAgIGlmICh0aGlzLnB1c2gpIHtcclxuICAgICAgdGhpcy5wdXNoLnJlc3RvcmVJdGVtcygpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc3dhcCkge1xyXG4gICAgICB0aGlzLnN3YXAucmVzdG9yZVN3YXBJdGVtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wdXNoKSB7XHJcbiAgICAgIHRoaXMucHVzaC5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucHVzaCA9IG51bGwhO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc3dhcCkge1xyXG4gICAgICB0aGlzLnN3YXAuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnN3YXAgPSBudWxsITtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBtYWtlRHJhZyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kcmFnZ2FibGUuZHJvcE92ZXJJdGVtcyAmJlxyXG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlICYmXHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuZHJvcE92ZXJJdGVtc0NhbGxiYWNrICYmXHJcbiAgICAgIHRoaXMuY29sbGlzaW9uICYmXHJcbiAgICAgIHRoaXMuY29sbGlzaW9uICE9PSB0cnVlICYmXHJcbiAgICAgIHRoaXMuY29sbGlzaW9uLiRpdGVtXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZS5kcm9wT3Zlckl0ZW1zQ2FsbGJhY2soXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbSxcclxuICAgICAgICB0aGlzLmNvbGxpc2lvbi5pdGVtLFxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuY29sbGlzaW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5zZXRTaXplKCk7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5jaGVja0l0ZW1DaGFuZ2VzKFxyXG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSxcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbVxyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLnB1c2gpIHtcclxuICAgICAgdGhpcy5wdXNoLnNldFB1c2hlZEl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zd2FwKSB7XHJcbiAgICAgIHRoaXMuc3dhcC5zZXRTd2FwSXRlbSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHVzaCkge1xyXG4gICAgICB0aGlzLnB1c2guZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnB1c2ggPSBudWxsITtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN3YXApIHtcclxuICAgICAgdGhpcy5zd2FwLmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5zd2FwID0gbnVsbCE7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY2FsY3VsYXRlSXRlbVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW07XHJcbiAgICB0aGlzLnBvc2l0aW9uWCA9IHRoaXMuZ3JpZHN0ZXIucGl4ZWxzVG9Qb3NpdGlvblgodGhpcy5sZWZ0LCBNYXRoLnJvdW5kKTtcclxuICAgIHRoaXMucG9zaXRpb25ZID0gdGhpcy5ncmlkc3Rlci5waXhlbHNUb1Bvc2l0aW9uWSh0aGlzLnRvcCwgTWF0aC5yb3VuZCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uWEJhY2t1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLng7XHJcbiAgICB0aGlzLnBvc2l0aW9uWUJhY2t1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnk7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54ID0gdGhpcy5wb3NpdGlvblg7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLnBvc2l0aW9uWEJhY2t1cDtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLnBvc2l0aW9uWTtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLmNoZWNrR3JpZENvbGxpc2lvbih0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSkpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMucG9zaXRpb25ZQmFja3VwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkc3Rlci5ncmlkUmVuZGVyZXIuc2V0Q2VsbFBvc2l0aW9uKFxyXG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlcixcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uZWwsXHJcbiAgICAgIHRoaXMubGVmdCxcclxuICAgICAgdGhpcy50b3BcclxuICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnBvc2l0aW9uWEJhY2t1cCAhPT0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCB8fFxyXG4gICAgICB0aGlzLnBvc2l0aW9uWUJhY2t1cCAhPT0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XHJcbiAgICAgIGxldCBkaXJlY3Rpb24gPSAnJztcclxuICAgICAgaWYgKGxhc3RQb3NpdGlvbi54IDwgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCkge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tV2VzdDtcclxuICAgICAgfSBlbHNlIGlmIChsYXN0UG9zaXRpb24ueCA+IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLngpIHtcclxuICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLnB1c2guZnJvbUVhc3Q7XHJcbiAgICAgIH0gZWxzZSBpZiAobGFzdFBvc2l0aW9uLnkgPCB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55KSB7XHJcbiAgICAgICAgZGlyZWN0aW9uID0gdGhpcy5wdXNoLmZyb21Ob3J0aDtcclxuICAgICAgfSBlbHNlIGlmIChsYXN0UG9zaXRpb24ueSA+IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkpIHtcclxuICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLnB1c2guZnJvbVNvdXRoO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucHVzaC5wdXNoSXRlbXMoZGlyZWN0aW9uLCB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRpc2FibGVQdXNoT25EcmFnKTtcclxuICAgICAgdGhpcy5zd2FwLnN3YXBJdGVtcygpO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbiA9IHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pO1xyXG4gICAgICBpZiAodGhpcy5jb2xsaXNpb24pIHtcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54ID0gdGhpcy5wb3NpdGlvblhCYWNrdXA7XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMucG9zaXRpb25ZQmFja3VwO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXMgJiZcclxuICAgICAgICAgIHRoaXMuY29sbGlzaW9uICE9PSB0cnVlICYmXHJcbiAgICAgICAgICB0aGlzLmNvbGxpc2lvbi4kaXRlbVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYXRoLnB1c2goe1xyXG4gICAgICAgICAgeDogdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCxcclxuICAgICAgICAgIHk6IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnB1c2guY2hlY2tQdXNoQmFjaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmVzZXQgdGhlIGNvbGxpc2lvbiB3aGVuIHlvdSBkcmFnIGFuZCBkcm9wIG9uIGFuIGFkamFjZW50IGNlbGwgdGhhdCBpcyBub3QgZW1wdHlcclxuICAgICAgLy8gYW5kIGdvIGJhY2sgdG8gdGhlIGNlbGwgeW91IHdlcmUgaW4gZnJvbSB0aGUgYmVnaW5uaW5nLFxyXG4gICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgYGRyb3BPdmVySXRlbXNDYWxsYmFjaydcclxuICAgICAgdGhpcy5jb2xsaXNpb24gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZHN0ZXIucHJldmlld1N0eWxlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZW5hYmxlRHJhZyA9IHRoaXMuZ3JpZHN0ZXJJdGVtLmNhbkJlRHJhZ2dlZCgpO1xyXG4gICAgaWYgKCF0aGlzLmVuYWJsZWQgJiYgZW5hYmxlRHJhZykge1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkO1xyXG4gICAgICB0aGlzLm1vdXNlZG93biA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS5lbCxcclxuICAgICAgICAnbW91c2Vkb3duJyxcclxuICAgICAgICB0aGlzLmRyYWdTdGFydERlbGF5XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMudG91Y2hzdGFydCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS5lbCxcclxuICAgICAgICAndG91Y2hzdGFydCcsXHJcbiAgICAgICAgdGhpcy5kcmFnU3RhcnREZWxheVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZWQgJiYgIWVuYWJsZURyYWcpIHtcclxuICAgICAgdGhpcy5lbmFibGVkID0gIXRoaXMuZW5hYmxlZDtcclxuICAgICAgdGhpcy5tb3VzZWRvd24oKTtcclxuICAgICAgdGhpcy50b3VjaHN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcmFnU3RhcnREZWxheSA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKEdSSURTVEVSX0lURU1fUkVTSVpBQkxFX0hBTkRMRVJfQ0xBU1MpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChHcmlkc3RlclV0aWxzLmNoZWNrQ29udGVudENsYXNzRm9yRXZlbnQodGhpcy5ncmlkc3RlciwgZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgR3JpZHN0ZXJVdGlscy5jaGVja1RvdWNoRXZlbnQoZSk7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRlbGF5U3RhcnQpIHtcclxuICAgICAgdGhpcy5kcmFnU3RhcnQoZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kcmFnU3RhcnQoZSk7XHJcbiAgICAgIGNhbmNlbERyYWcoKTtcclxuICAgIH0sIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRlbGF5U3RhcnQpO1xyXG4gICAgY29uc3QgY2FuY2VsTW91c2UgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICdkb2N1bWVudCcsXHJcbiAgICAgICdtb3VzZXVwJyxcclxuICAgICAgY2FuY2VsRHJhZ1xyXG4gICAgKTtcclxuICAgIGNvbnN0IGNhbmNlbE1vdXNlTGVhdmUgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICdkb2N1bWVudCcsXHJcbiAgICAgICdtb3VzZWxlYXZlJyxcclxuICAgICAgY2FuY2VsRHJhZ1xyXG4gICAgKTtcclxuICAgIGNvbnN0IGNhbmNlbE9uQmx1ciA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgJ3dpbmRvdycsXHJcbiAgICAgICdibHVyJyxcclxuICAgICAgY2FuY2VsRHJhZ1xyXG4gICAgKTtcclxuICAgIGNvbnN0IGNhbmNlbFRvdWNoTW92ZSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgJ2RvY3VtZW50JyxcclxuICAgICAgJ3RvdWNobW92ZScsXHJcbiAgICAgIGNhbmNlbE1vdmVcclxuICAgICk7XHJcbiAgICBjb25zdCBjYW5jZWxUb3VjaEVuZCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgJ2RvY3VtZW50JyxcclxuICAgICAgJ3RvdWNoZW5kJyxcclxuICAgICAgY2FuY2VsRHJhZ1xyXG4gICAgKTtcclxuICAgIGNvbnN0IGNhbmNlbFRvdWNoQ2FuY2VsID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKFxyXG4gICAgICAnZG9jdW1lbnQnLFxyXG4gICAgICAndG91Y2hjYW5jZWwnLFxyXG4gICAgICBjYW5jZWxEcmFnXHJcbiAgICApO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNhbmNlbE1vdmUoZXZlbnRNb3ZlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tUb3VjaEV2ZW50KGV2ZW50TW92ZSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBNYXRoLmFicyhldmVudE1vdmUuY2xpZW50WCAtIGUuY2xpZW50WCkgPiA5IHx8XHJcbiAgICAgICAgTWF0aC5hYnMoZXZlbnRNb3ZlLmNsaWVudFkgLSBlLmNsaWVudFkpID4gOVxyXG4gICAgICApIHtcclxuICAgICAgICBjYW5jZWxEcmFnKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjYW5jZWxEcmFnKCk6IHZvaWQge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgIGNhbmNlbE9uQmx1cigpO1xyXG4gICAgICBjYW5jZWxNb3VzZSgpO1xyXG4gICAgICBjYW5jZWxNb3VzZUxlYXZlKCk7XHJcbiAgICAgIGNhbmNlbFRvdWNoTW92ZSgpO1xyXG4gICAgICBjYW5jZWxUb3VjaEVuZCgpO1xyXG4gICAgICBjYW5jZWxUb3VjaENhbmNlbCgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0aW9ucyBmb3IgZ2l2ZW4gbW91c2UgZXZlbnRcclxuICAgKiBAcGFyYW0gZSBNb3VzZSBldmVudFxyXG4gICAqICovXHJcbiAgcHJpdmF0ZSBnZXREaXJlY3Rpb25zKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IGRpcmVjdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5sYXN0TW91c2UuY2xpZW50WCA9PT0gMCAmJiB0aGlzLmxhc3RNb3VzZS5jbGllbnRZID09PSAwKSB7XHJcbiAgICAgIHRoaXMubGFzdE1vdXNlLmNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgIHRoaXMubGFzdE1vdXNlLmNsaWVudFggPSBlLmNsaWVudFg7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sYXN0TW91c2UuY2xpZW50WSA+IGUuY2xpZW50WSkge1xyXG4gICAgICBkaXJlY3Rpb25zLnB1c2goRGlyZWN0aW9uLlVQKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhc3RNb3VzZS5jbGllbnRZIDwgZS5jbGllbnRZKSB7XHJcbiAgICAgIGRpcmVjdGlvbnMucHVzaChEaXJlY3Rpb24uRE9XTik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sYXN0TW91c2UuY2xpZW50WCA8IGUuY2xpZW50WCkge1xyXG4gICAgICBkaXJlY3Rpb25zLnB1c2goRGlyZWN0aW9uLlJJR0hUKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhc3RNb3VzZS5jbGllbnRYID4gZS5jbGllbnRYKSB7XHJcbiAgICAgIGRpcmVjdGlvbnMucHVzaChEaXJlY3Rpb24uTEVGVCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlyZWN0aW9ucztcclxuICB9XHJcbn1cclxuIl19