@schneideress/dashboardframework 0.0.68 → 0.0.69

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 (113) hide show
  1. package/README.md +24 -24
  2. package/bundles/schneideress-dashboardframework.umd.js +6932 -6931
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  4. package/bundles/schneideress-dashboardframework.umd.min.js +1 -1
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  6. package/esm2015/gridster/index.js +18 -18
  7. package/esm2015/gridster/lib/gridster.component.js +700 -700
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -84
  9. package/esm2015/gridster/lib/gridster.module.js +27 -27
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -223
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -179
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -219
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -161
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -510
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -317
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -213
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -46
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -48
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -66
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -467
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -358
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -277
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -552
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -195
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -134
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -137
  28. package/esm2015/lib/custom.notifier.options.js +46 -46
  29. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +494 -494
  30. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +401 -400
  31. package/esm2015/lib/ra.base.dashboard.filter.js +75 -75
  32. package/esm2015/lib/ra.base.dashboard.template.js +71 -71
  33. package/esm2015/lib/ra.dashbard.event.bus.js +85 -85
  34. package/esm2015/lib/ra.dashboard.module.js +49 -49
  35. package/esm2015/lib/ra.dashboard.service.js +144 -144
  36. package/esm2015/lib/ra.event.enum.js +51 -51
  37. package/esm2015/lib/ra.gridster.config.js +67 -67
  38. package/esm2015/public-api.js +16 -16
  39. package/esm2015/schneideress-dashboardframework.js +13 -13
  40. package/esm5/gridster/index.js +18 -18
  41. package/esm5/gridster/lib/gridster.component.js +803 -803
  42. package/esm5/gridster/lib/gridster.interface.js +94 -94
  43. package/esm5/gridster/lib/gridster.module.js +31 -31
  44. package/esm5/gridster/lib/gridsterCompact.service.js +253 -253
  45. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -179
  46. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -219
  47. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -161
  48. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -549
  49. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -358
  50. package/esm5/gridster/lib/gridsterItem.component.js +238 -238
  51. package/esm5/gridster/lib/gridsterItem.interface.js +46 -46
  52. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -58
  53. package/esm5/gridster/lib/gridsterPreview.component.js +70 -70
  54. package/esm5/gridster/lib/gridsterPush.service.js +547 -547
  55. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -423
  56. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -323
  57. package/esm5/gridster/lib/gridsterResizable.service.js +629 -629
  58. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  59. package/esm5/gridster/lib/gridsterScroll.service.js +195 -195
  60. package/esm5/gridster/lib/gridsterSwap.service.js +152 -152
  61. package/esm5/gridster/lib/gridsterUtils.service.js +177 -177
  62. package/esm5/lib/custom.notifier.options.js +46 -46
  63. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +586 -586
  64. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +507 -506
  65. package/esm5/lib/ra.base.dashboard.filter.js +81 -81
  66. package/esm5/lib/ra.base.dashboard.template.js +74 -74
  67. package/esm5/lib/ra.dashbard.event.bus.js +125 -125
  68. package/esm5/lib/ra.dashboard.module.js +53 -53
  69. package/esm5/lib/ra.dashboard.service.js +221 -221
  70. package/esm5/lib/ra.event.enum.js +51 -51
  71. package/esm5/lib/ra.gridster.config.js +67 -67
  72. package/esm5/public-api.js +16 -16
  73. package/esm5/schneideress-dashboardframework.js +13 -13
  74. package/fesm2015/schneideress-dashboardframework.js +6045 -6044
  75. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  76. package/fesm5/schneideress-dashboardframework.js +6935 -6934
  77. package/fesm5/schneideress-dashboardframework.js.map +1 -1
  78. package/gridster/index.d.ts +11 -11
  79. package/gridster/lib/gridster.component.d.ts +67 -67
  80. package/gridster/lib/gridster.interface.d.ts +46 -46
  81. package/gridster/lib/gridster.module.d.ts +2 -2
  82. package/gridster/lib/gridsterCompact.service.d.ts +15 -15
  83. package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
  84. package/gridster/lib/gridsterConfig.interface.d.ts +133 -133
  85. package/gridster/lib/gridsterConfigS.interface.d.ts +93 -93
  86. package/gridster/lib/gridsterDraggable.service.d.ts +59 -59
  87. package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -29
  88. package/gridster/lib/gridsterItem.component.d.ts +32 -32
  89. package/gridster/lib/gridsterItem.interface.d.ts +21 -21
  90. package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -25
  91. package/gridster/lib/gridsterPreview.component.d.ts +10 -10
  92. package/gridster/lib/gridsterPush.service.d.ts +33 -33
  93. package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
  94. package/gridster/lib/gridsterRenderer.service.d.ts +38 -38
  95. package/gridster/lib/gridsterResizable.service.d.ts +67 -67
  96. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
  97. package/gridster/lib/gridsterScroll.service.d.ts +4 -4
  98. package/gridster/lib/gridsterSwap.service.d.ts +13 -13
  99. package/gridster/lib/gridsterUtils.service.d.ts +16 -16
  100. package/lib/custom.notifier.options.d.ts +2 -2
  101. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +64 -64
  102. package/lib/ra-widget-container/ra.widget.container.component.d.ts +59 -59
  103. package/lib/ra.base.dashboard.filter.d.ts +10 -10
  104. package/lib/ra.base.dashboard.template.d.ts +15 -15
  105. package/lib/ra.dashbard.event.bus.d.ts +20 -20
  106. package/lib/ra.dashboard.module.d.ts +2 -2
  107. package/lib/ra.dashboard.service.d.ts +22 -22
  108. package/lib/ra.event.enum.d.ts +42 -42
  109. package/lib/ra.gridster.config.d.ts +2 -2
  110. package/package.json +1 -1
  111. package/public-api.d.ts +8 -8
  112. package/schneideress-dashboardframework.d.ts +9 -9
  113. package/schneideress-dashboardframework.metadata.json +1 -1
@@ -1,467 +1,467 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { GridsterItemComponentInterface } from './gridsterItemComponent.interface';
7
- export class GridsterPush {
8
- /**
9
- * @param {?} gridsterItem
10
- */
11
- constructor(gridsterItem) {
12
- this.pushedItems = [];
13
- this.pushedItemsTemp = [];
14
- this.pushedItemsTempPath = [];
15
- this.pushedItemsPath = [];
16
- this.gridsterItem = gridsterItem;
17
- this.gridster = gridsterItem.gridster;
18
- this.tryPattern = {
19
- fromEast: [this.tryWest, this.trySouth, this.tryNorth, this.tryEast],
20
- fromWest: [this.tryEast, this.trySouth, this.tryNorth, this.tryWest],
21
- fromNorth: [this.trySouth, this.tryEast, this.tryWest, this.tryNorth],
22
- fromSouth: [this.tryNorth, this.tryEast, this.tryWest, this.trySouth]
23
- };
24
- this.fromSouth = 'fromSouth';
25
- this.fromNorth = 'fromNorth';
26
- this.fromEast = 'fromEast';
27
- this.fromWest = 'fromWest';
28
- }
29
- /**
30
- * @return {?}
31
- */
32
- destroy() {
33
- delete this.gridster;
34
- delete this.gridsterItem;
35
- }
36
- /**
37
- * @param {?} direction
38
- * @param {?=} disable
39
- * @return {?}
40
- */
41
- pushItems(direction, disable) {
42
- if (this.gridster.$options.pushItems && !disable) {
43
- this.pushedItemsOrder = [];
44
- /** @type {?} */
45
- const pushed = this.push(this.gridsterItem, direction);
46
- if (!pushed) {
47
- this.restoreTempItems();
48
- }
49
- this.pushedItemsOrder = [];
50
- this.pushedItemsTemp = [];
51
- this.pushedItemsTempPath = [];
52
- return pushed;
53
- }
54
- else {
55
- return false;
56
- }
57
- }
58
- /**
59
- * @return {?}
60
- */
61
- restoreTempItems() {
62
- /** @type {?} */
63
- let i = this.pushedItemsTemp.length - 1;
64
- for (; i > -1; i--) {
65
- this.removeFromTempPushed(this.pushedItemsTemp[i]);
66
- }
67
- }
68
- /**
69
- * @return {?}
70
- */
71
- restoreItems() {
72
- /** @type {?} */
73
- let i = 0;
74
- /** @type {?} */
75
- const l = this.pushedItems.length;
76
- /** @type {?} */
77
- let pushedItem;
78
- for (; i < l; i++) {
79
- pushedItem = this.pushedItems[i];
80
- pushedItem.$item.x = pushedItem.item.x || 0;
81
- pushedItem.$item.y = pushedItem.item.y || 0;
82
- pushedItem.setSize();
83
- }
84
- this.pushedItems = [];
85
- this.pushedItemsPath = [];
86
- }
87
- /**
88
- * @return {?}
89
- */
90
- setPushedItems() {
91
- /** @type {?} */
92
- let i = 0;
93
- /** @type {?} */
94
- const l = this.pushedItems.length;
95
- /** @type {?} */
96
- let pushedItem;
97
- for (; i < l; i++) {
98
- pushedItem = this.pushedItems[i];
99
- pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);
100
- }
101
- this.pushedItems = [];
102
- this.pushedItemsPath = [];
103
- }
104
- /**
105
- * @return {?}
106
- */
107
- checkPushBack() {
108
- /** @type {?} */
109
- let i = this.pushedItems.length - 1;
110
- /** @type {?} */
111
- let change = false;
112
- for (; i > -1; i--) {
113
- if (this.checkPushedItem(this.pushedItems[i], i)) {
114
- change = true;
115
- }
116
- }
117
- if (change) {
118
- this.checkPushBack();
119
- }
120
- }
121
- /**
122
- * @private
123
- * @param {?} gridsterItem
124
- * @param {?} direction
125
- * @return {?}
126
- */
127
- push(gridsterItem, direction) {
128
- if (this.gridster.checkGridCollision(gridsterItem.$item)) {
129
- return false;
130
- }
131
- if (direction === '') {
132
- return false;
133
- }
134
- /** @type {?} */
135
- const a = this.gridster.findItemsWithItem(gridsterItem.$item);
136
- /** @type {?} */
137
- let i = a.length - 1;
138
- /** @type {?} */
139
- let itemCollision;
140
- /** @type {?} */
141
- let makePush = true;
142
- /** @type {?} */
143
- const b = [];
144
- for (; i > -1; i--) {
145
- itemCollision = a[i];
146
- if (itemCollision === this.gridsterItem) {
147
- makePush = false;
148
- break;
149
- }
150
- if (!itemCollision.canBeDragged()) {
151
- makePush = false;
152
- break;
153
- }
154
- /** @type {?} */
155
- const compare = this.pushedItemsTemp.find((/**
156
- * @param {?} el
157
- * @return {?}
158
- */
159
- (el) => {
160
- return el.$item.x === itemCollision.$item.x && el.$item.y === itemCollision.$item.y;
161
- }));
162
- if (compare) {
163
- makePush = false;
164
- break;
165
- }
166
- if (this.tryPattern[direction][0].call(this, itemCollision, gridsterItem)) {
167
- this.pushedItemsOrder.push(itemCollision);
168
- b.push(itemCollision);
169
- }
170
- else if (this.tryPattern[direction][1].call(this, itemCollision, gridsterItem)) {
171
- this.pushedItemsOrder.push(itemCollision);
172
- b.push(itemCollision);
173
- }
174
- else if (this.tryPattern[direction][2].call(this, itemCollision, gridsterItem)) {
175
- this.pushedItemsOrder.push(itemCollision);
176
- b.push(itemCollision);
177
- }
178
- else if (this.tryPattern[direction][3].call(this, itemCollision, gridsterItem)) {
179
- this.pushedItemsOrder.push(itemCollision);
180
- b.push(itemCollision);
181
- }
182
- else {
183
- makePush = false;
184
- break;
185
- }
186
- }
187
- if (!makePush) {
188
- i = this.pushedItemsOrder.lastIndexOf(b[0]);
189
- if (i > -1) {
190
- /** @type {?} */
191
- let j = this.pushedItemsOrder.length - 1;
192
- for (; j >= i; j--) {
193
- itemCollision = this.pushedItemsOrder[j];
194
- this.pushedItemsOrder.pop();
195
- this.removeFromTempPushed(itemCollision);
196
- this.removeFromPushedItem(itemCollision);
197
- }
198
- }
199
- }
200
- return makePush;
201
- }
202
- /**
203
- * @private
204
- * @param {?} gridsterItemCollide
205
- * @param {?} gridsterItem
206
- * @return {?}
207
- */
208
- trySouth(gridsterItemCollide, gridsterItem) {
209
- if (!this.gridster.$options.pushDirections.south) {
210
- return false;
211
- }
212
- this.addToTempPushed(gridsterItemCollide);
213
- gridsterItemCollide.$item.y = gridsterItem.$item.y + gridsterItem.$item.rows;
214
- if (this.push(gridsterItemCollide, this.fromNorth)) {
215
- gridsterItemCollide.setSize();
216
- this.addToPushed(gridsterItemCollide);
217
- return true;
218
- }
219
- else {
220
- this.removeFromTempPushed(gridsterItemCollide);
221
- }
222
- return false;
223
- }
224
- /**
225
- * @private
226
- * @param {?} gridsterItemCollide
227
- * @param {?} gridsterItem
228
- * @return {?}
229
- */
230
- tryNorth(gridsterItemCollide, gridsterItem) {
231
- if (!this.gridster.$options.pushDirections.north) {
232
- return false;
233
- }
234
- this.addToTempPushed(gridsterItemCollide);
235
- gridsterItemCollide.$item.y = gridsterItem.$item.y - gridsterItemCollide.$item.rows;
236
- if (this.push(gridsterItemCollide, this.fromSouth)) {
237
- gridsterItemCollide.setSize();
238
- this.addToPushed(gridsterItemCollide);
239
- return true;
240
- }
241
- else {
242
- this.removeFromTempPushed(gridsterItemCollide);
243
- }
244
- return false;
245
- }
246
- /**
247
- * @private
248
- * @param {?} gridsterItemCollide
249
- * @param {?} gridsterItem
250
- * @return {?}
251
- */
252
- tryEast(gridsterItemCollide, gridsterItem) {
253
- if (!this.gridster.$options.pushDirections.east) {
254
- return false;
255
- }
256
- this.addToTempPushed(gridsterItemCollide);
257
- gridsterItemCollide.$item.x = gridsterItem.$item.x + gridsterItem.$item.cols;
258
- if (this.push(gridsterItemCollide, this.fromWest)) {
259
- gridsterItemCollide.setSize();
260
- this.addToPushed(gridsterItemCollide);
261
- return true;
262
- }
263
- else {
264
- this.removeFromTempPushed(gridsterItemCollide);
265
- }
266
- return false;
267
- }
268
- /**
269
- * @private
270
- * @param {?} gridsterItemCollide
271
- * @param {?} gridsterItem
272
- * @return {?}
273
- */
274
- tryWest(gridsterItemCollide, gridsterItem) {
275
- if (!this.gridster.$options.pushDirections.west) {
276
- return false;
277
- }
278
- this.addToTempPushed(gridsterItemCollide);
279
- gridsterItemCollide.$item.x = gridsterItem.$item.x - gridsterItemCollide.$item.cols;
280
- if (this.push(gridsterItemCollide, this.fromEast)) {
281
- gridsterItemCollide.setSize();
282
- this.addToPushed(gridsterItemCollide);
283
- return true;
284
- }
285
- else {
286
- this.removeFromTempPushed(gridsterItemCollide);
287
- }
288
- return false;
289
- }
290
- /**
291
- * @private
292
- * @param {?} gridsterItem
293
- * @return {?}
294
- */
295
- addToTempPushed(gridsterItem) {
296
- /** @type {?} */
297
- let i = this.pushedItemsTemp.indexOf(gridsterItem);
298
- if (i === -1) {
299
- i = this.pushedItemsTemp.push(gridsterItem) - 1;
300
- this.pushedItemsTempPath[i] = [];
301
- }
302
- this.pushedItemsTempPath[i].push({ x: gridsterItem.$item.x, y: gridsterItem.$item.y });
303
- }
304
- /**
305
- * @private
306
- * @param {?} gridsterItem
307
- * @return {?}
308
- */
309
- removeFromTempPushed(gridsterItem) {
310
- /** @type {?} */
311
- const i = this.pushedItemsTemp.indexOf(gridsterItem);
312
- /** @type {?} */
313
- const tempPosition = this.pushedItemsTempPath[i].pop();
314
- if (!tempPosition) {
315
- return;
316
- }
317
- gridsterItem.$item.x = tempPosition.x;
318
- gridsterItem.$item.y = tempPosition.y;
319
- gridsterItem.setSize();
320
- if (!this.pushedItemsTempPath[i].length) {
321
- this.pushedItemsTemp.splice(i, 1);
322
- this.pushedItemsTempPath.splice(i, 1);
323
- }
324
- }
325
- /**
326
- * @private
327
- * @param {?} gridsterItem
328
- * @return {?}
329
- */
330
- addToPushed(gridsterItem) {
331
- if (this.pushedItems.indexOf(gridsterItem) < 0) {
332
- this.pushedItems.push(gridsterItem);
333
- this.pushedItemsPath.push([{ x: gridsterItem.item.x || 0, y: gridsterItem.item.y || 0 },
334
- { x: gridsterItem.$item.x, y: gridsterItem.$item.y }]);
335
- }
336
- else {
337
- /** @type {?} */
338
- const i = this.pushedItems.indexOf(gridsterItem);
339
- this.pushedItemsPath[i].push({ x: gridsterItem.$item.x, y: gridsterItem.$item.y });
340
- }
341
- }
342
- /**
343
- * @private
344
- * @param {?} i
345
- * @return {?}
346
- */
347
- removeFromPushed(i) {
348
- if (i > -1) {
349
- this.pushedItems.splice(i, 1);
350
- this.pushedItemsPath.splice(i, 1);
351
- }
352
- }
353
- /**
354
- * @private
355
- * @param {?} gridsterItem
356
- * @return {?}
357
- */
358
- removeFromPushedItem(gridsterItem) {
359
- /** @type {?} */
360
- const i = this.pushedItems.indexOf(gridsterItem);
361
- if (i > -1) {
362
- this.pushedItemsPath[i].pop();
363
- if (!this.pushedItemsPath.length) {
364
- this.pushedItems.splice(i, 1);
365
- this.pushedItemsPath.splice(i, 1);
366
- }
367
- }
368
- }
369
- /**
370
- * @private
371
- * @param {?} pushedItem
372
- * @param {?} i
373
- * @return {?}
374
- */
375
- checkPushedItem(pushedItem, i) {
376
- /** @type {?} */
377
- const path = this.pushedItemsPath[i];
378
- /** @type {?} */
379
- let j = path.length - 2;
380
- /** @type {?} */
381
- let lastPosition;
382
- /** @type {?} */
383
- let x;
384
- /** @type {?} */
385
- let y;
386
- /** @type {?} */
387
- let change = false;
388
- for (; j > -1; j--) {
389
- lastPosition = path[j];
390
- x = pushedItem.$item.x;
391
- y = pushedItem.$item.y;
392
- pushedItem.$item.x = lastPosition.x;
393
- pushedItem.$item.y = lastPosition.y;
394
- if (!this.gridster.findItemWithItem(pushedItem.$item)) {
395
- pushedItem.setSize();
396
- path.splice(j + 1, path.length - j - 1);
397
- change = true;
398
- }
399
- else {
400
- pushedItem.$item.x = x;
401
- pushedItem.$item.y = y;
402
- }
403
- }
404
- if (path.length < 2) {
405
- this.removeFromPushed(i);
406
- }
407
- return change;
408
- }
409
- }
410
- GridsterPush.decorators = [
411
- { type: Injectable }
412
- ];
413
- /** @nocollapse */
414
- GridsterPush.ctorParameters = () => [
415
- { type: GridsterItemComponentInterface }
416
- ];
417
- if (false) {
418
- /** @type {?} */
419
- GridsterPush.prototype.fromSouth;
420
- /** @type {?} */
421
- GridsterPush.prototype.fromNorth;
422
- /** @type {?} */
423
- GridsterPush.prototype.fromEast;
424
- /** @type {?} */
425
- GridsterPush.prototype.fromWest;
426
- /**
427
- * @type {?}
428
- * @private
429
- */
430
- GridsterPush.prototype.pushedItems;
431
- /**
432
- * @type {?}
433
- * @private
434
- */
435
- GridsterPush.prototype.pushedItemsTemp;
436
- /**
437
- * @type {?}
438
- * @private
439
- */
440
- GridsterPush.prototype.pushedItemsTempPath;
441
- /**
442
- * @type {?}
443
- * @private
444
- */
445
- GridsterPush.prototype.pushedItemsPath;
446
- /**
447
- * @type {?}
448
- * @private
449
- */
450
- GridsterPush.prototype.gridsterItem;
451
- /**
452
- * @type {?}
453
- * @private
454
- */
455
- GridsterPush.prototype.gridster;
456
- /**
457
- * @type {?}
458
- * @private
459
- */
460
- GridsterPush.prototype.pushedItemsOrder;
461
- /**
462
- * @type {?}
463
- * @private
464
- */
465
- GridsterPush.prototype.tryPattern;
466
- }
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJQdXNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImdyaWRzdGVyL2xpYi9ncmlkc3RlclB1c2guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUlqRixNQUFNLE9BQU8sWUFBWTs7OztJQW9CdkIsWUFBWSxZQUE0QztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNwRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVB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QUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JELFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7O1lBcFRGLFVBQVU7Ozs7WUFISCw4QkFBOEI7Ozs7SUFLcEMsaUNBQXlCOztJQUN6QixpQ0FBeUI7O0lBQ3pCLGdDQUF3Qjs7SUFDeEIsZ0NBQXdCOzs7OztJQUN4QixtQ0FBMkQ7Ozs7O0lBQzNELHVDQUErRDs7Ozs7SUFDL0QsMkNBQW9FOzs7OztJQUNwRSx1Q0FBZ0U7Ozs7O0lBQ2hFLG9DQUFxRDs7Ozs7SUFDckQsZ0NBQTZDOzs7OztJQUM3Qyx3Q0FBZ0U7Ozs7O0lBQ2hFLGtDQU1FIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2V9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtQ29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQge0dyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclB1c2gge1xuICBwdWJsaWMgZnJvbVNvdXRoOiBzdHJpbmc7XG4gIHB1YmxpYyBmcm9tTm9ydGg6IHN0cmluZztcbiAgcHVibGljIGZyb21FYXN0OiBzdHJpbmc7XG4gIHB1YmxpYyBmcm9tV2VzdDogc3RyaW5nO1xuICBwcml2YXRlIHB1c2hlZEl0ZW1zOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xuICBwcml2YXRlIHB1c2hlZEl0ZW1zVGVtcDogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPjtcbiAgcHJpdmF0ZSBwdXNoZWRJdGVtc1RlbXBQYXRoOiBBcnJheTxBcnJheTx7IHg6IG51bWJlciwgeTogbnVtYmVyIH0+PjtcbiAgcHJpdmF0ZSBwdXNoZWRJdGVtc1BhdGg6IEFycmF5PEFycmF5PHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfT4+O1xuICBwcml2YXRlIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICBwcml2YXRlIGdyaWRzdGVyOiBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZTtcbiAgcHJpdmF0ZSBwdXNoZWRJdGVtc09yZGVyOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xuICBwcml2YXRlIHRyeVBhdHRlcm46IHtcbiAgICBmcm9tRWFzdDogQXJyYXk8RnVuY3Rpb24+LFxuICAgIGZyb21XZXN0OiBBcnJheTxGdW5jdGlvbj4sXG4gICAgZnJvbU5vcnRoOiBBcnJheTxGdW5jdGlvbj4sXG4gICAgZnJvbVNvdXRoOiBBcnJheTxGdW5jdGlvbj4sXG4gICAgW2tleTogc3RyaW5nXTogQXJyYXk8RnVuY3Rpb24+XG4gIH07XG5cbiAgY29uc3RydWN0b3IoZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpIHtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zID0gW107XG4gICAgdGhpcy5wdXNoZWRJdGVtc1RlbXAgPSBbXTtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcFBhdGggPSBbXTtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtID0gZ3JpZHN0ZXJJdGVtO1xuICAgIHRoaXMuZ3JpZHN0ZXIgPSBncmlkc3Rlckl0ZW0uZ3JpZHN0ZXI7XG4gICAgdGhpcy50cnlQYXR0ZXJuID0ge1xuICAgICAgZnJvbUVhc3Q6IFt0aGlzLnRyeVdlc3QsIHRoaXMudHJ5U291dGgsIHRoaXMudHJ5Tm9ydGgsIHRoaXMudHJ5RWFzdF0sXG4gICAgICBmcm9tV2VzdDogW3RoaXMudHJ5RWFzdCwgdGhpcy50cnlTb3V0aCwgdGhpcy50cnlOb3J0aCwgdGhpcy50cnlXZXN0XSxcbiAgICAgIGZyb21Ob3J0aDogW3RoaXMudHJ5U291dGgsIHRoaXMudHJ5RWFzdCwgdGhpcy50cnlXZXN0LCB0aGlzLnRyeU5vcnRoXSxcbiAgICAgIGZyb21Tb3V0aDogW3RoaXMudHJ5Tm9ydGgsIHRoaXMudHJ5RWFzdCwgdGhpcy50cnlXZXN0LCB0aGlzLnRyeVNvdXRoXVxuICAgIH07XG4gICAgdGhpcy5mcm9tU291dGggPSAnZnJvbVNvdXRoJztcbiAgICB0aGlzLmZyb21Ob3J0aCA9ICdmcm9tTm9ydGgnO1xuICAgIHRoaXMuZnJvbUVhc3QgPSAnZnJvbUVhc3QnO1xuICAgIHRoaXMuZnJvbVdlc3QgPSAnZnJvbVdlc3QnO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5ncmlkc3RlcjtcbiAgICBkZWxldGUgdGhpcy5ncmlkc3Rlckl0ZW07XG4gIH1cblxuICBwdXNoSXRlbXMoZGlyZWN0aW9uOiBzdHJpbmcsIGRpc2FibGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaEl0ZW1zICYmICFkaXNhYmxlKSB7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zT3JkZXIgPSBbXTtcbiAgICAgIGNvbnN0IHB1c2hlZCA9IHRoaXMucHVzaCh0aGlzLmdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcbiAgICAgIGlmICghcHVzaGVkKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZVRlbXBJdGVtcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyID0gW107XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcCA9IFtdO1xuICAgICAgdGhpcy5wdXNoZWRJdGVtc1RlbXBQYXRoID0gW107XG4gICAgICByZXR1cm4gcHVzaGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZVRlbXBJdGVtcygpOiB2b2lkIHtcbiAgICBsZXQgaSA9IHRoaXMucHVzaGVkSXRlbXNUZW1wLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGkgPiAtMTsgaS0tKSB7XG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKHRoaXMucHVzaGVkSXRlbXNUZW1wW2ldKTtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlSXRlbXMoKTogdm9pZCB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGw6IG51bWJlciA9IHRoaXMucHVzaGVkSXRlbXMubGVuZ3RoO1xuICAgIGxldCBwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHB1c2hlZEl0ZW0gPSB0aGlzLnB1c2hlZEl0ZW1zW2ldO1xuICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0gcHVzaGVkSXRlbS5pdGVtLnggfHwgMDtcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueSA9IHB1c2hlZEl0ZW0uaXRlbS55IHx8IDA7XG4gICAgICBwdXNoZWRJdGVtLnNldFNpemUoKTtcbiAgICB9XG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoID0gW107XG4gIH1cblxuICBzZXRQdXNoZWRJdGVtcygpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbDogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGg7XG4gICAgbGV0IHB1c2hlZEl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgcHVzaGVkSXRlbSA9IHRoaXMucHVzaGVkSXRlbXNbaV07XG4gICAgICBwdXNoZWRJdGVtLmNoZWNrSXRlbUNoYW5nZXMocHVzaGVkSXRlbS4kaXRlbSwgcHVzaGVkSXRlbS5pdGVtKTtcbiAgICB9XG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoID0gW107XG4gIH1cblxuICBjaGVja1B1c2hCYWNrKCk6IHZvaWQge1xuICAgIGxldCBpOiBudW1iZXIgPSB0aGlzLnB1c2hlZEl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuICAgIGZvciAoOyBpID4gLTE7IGktLSkge1xuICAgICAgaWYgKHRoaXMuY2hlY2tQdXNoZWRJdGVtKHRoaXMucHVzaGVkSXRlbXNbaV0sIGkpKSB7XG4gICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgIHRoaXMuY2hlY2tQdXNoQmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHVzaChncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZGlyZWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtLiRpdGVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uID09PSAnJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+ID0gdGhpcy5ncmlkc3Rlci5maW5kSXRlbXNXaXRoSXRlbShncmlkc3Rlckl0ZW0uJGl0ZW0pO1xuICAgIGxldCBpID0gYS5sZW5ndGggLSAxLCBpdGVtQ29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgbGV0IG1ha2VQdXNoID0gdHJ1ZTtcbiAgICBjb25zdCBiOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+ID0gW107XG4gICAgZm9yICg7IGkgPiAtMTsgaS0tKSB7XG4gICAgICBpdGVtQ29sbGlzaW9uID0gYVtpXTtcbiAgICAgIGlmIChpdGVtQ29sbGlzaW9uID09PSB0aGlzLmdyaWRzdGVySXRlbSkge1xuICAgICAgICBtYWtlUHVzaCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNvbGxpc2lvbi5jYW5CZURyYWdnZWQoKSkge1xuICAgICAgICBtYWtlUHVzaCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBhcmUgPSB0aGlzLnB1c2hlZEl0ZW1zVGVtcC5maW5kKChlbDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSA9PiB7XG4gICAgICAgIHJldHVybiBlbC4kaXRlbS54ID09PSBpdGVtQ29sbGlzaW9uLiRpdGVtLnggJiYgZWwuJGl0ZW0ueSA9PT0gaXRlbUNvbGxpc2lvbi4kaXRlbS55O1xuICAgICAgfSk7XG4gICAgICBpZiAoY29tcGFyZSkge1xuICAgICAgICBtYWtlUHVzaCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRyeVBhdHRlcm5bZGlyZWN0aW9uXVswXS5jYWxsKHRoaXMsIGl0ZW1Db2xsaXNpb24sIGdyaWRzdGVySXRlbSkpIHtcbiAgICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyLnB1c2goaXRlbUNvbGxpc2lvbik7XG4gICAgICAgIGIucHVzaChpdGVtQ29sbGlzaW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cnlQYXR0ZXJuW2RpcmVjdGlvbl1bMV0uY2FsbCh0aGlzLCBpdGVtQ29sbGlzaW9uLCBncmlkc3Rlckl0ZW0pKSB7XG4gICAgICAgIHRoaXMucHVzaGVkSXRlbXNPcmRlci5wdXNoKGl0ZW1Db2xsaXNpb24pO1xuICAgICAgICBiLnB1c2goaXRlbUNvbGxpc2lvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJ5UGF0dGVybltkaXJlY3Rpb25dWzJdLmNhbGwodGhpcywgaXRlbUNvbGxpc2lvbiwgZ3JpZHN0ZXJJdGVtKSkge1xuICAgICAgICB0aGlzLnB1c2hlZEl0ZW1zT3JkZXIucHVzaChpdGVtQ29sbGlzaW9uKTtcbiAgICAgICAgYi5wdXNoKGl0ZW1Db2xsaXNpb24pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyeVBhdHRlcm5bZGlyZWN0aW9uXVszXS5jYWxsKHRoaXMsIGl0ZW1Db2xsaXNpb24sIGdyaWRzdGVySXRlbSkpIHtcbiAgICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyLnB1c2goaXRlbUNvbGxpc2lvbik7XG4gICAgICAgIGIucHVzaChpdGVtQ29sbGlzaW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ha2VQdXNoID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1ha2VQdXNoKSB7XG4gICAgICBpID0gdGhpcy5wdXNoZWRJdGVtc09yZGVyLmxhc3RJbmRleE9mKGJbMF0pO1xuICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICBsZXQgaiA9IHRoaXMucHVzaGVkSXRlbXNPcmRlci5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKDsgaiA+PSBpOyBqLS0pIHtcbiAgICAgICAgICBpdGVtQ29sbGlzaW9uID0gdGhpcy5wdXNoZWRJdGVtc09yZGVyW2pdO1xuICAgICAgICAgIHRoaXMucHVzaGVkSXRlbXNPcmRlci5wb3AoKTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKGl0ZW1Db2xsaXNpb24pO1xuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVB1c2hlZEl0ZW0oaXRlbUNvbGxpc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VQdXNoO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlTb3V0aChncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnB1c2hEaXJlY3Rpb25zLnNvdXRoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYWRkVG9UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueSA9IGdyaWRzdGVySXRlbS4kaXRlbS55ICsgZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3M7XG4gICAgaWYgKHRoaXMucHVzaChncmlkc3Rlckl0ZW1Db2xsaWRlLCB0aGlzLmZyb21Ob3J0aCkpIHtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRyeU5vcnRoKGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaERpcmVjdGlvbnMubm9ydGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hZGRUb1RlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID0gZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3M7XG4gICAgaWYgKHRoaXMucHVzaChncmlkc3Rlckl0ZW1Db2xsaWRlLCB0aGlzLmZyb21Tb3V0aCkpIHtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRyeUVhc3QoZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLCBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5wdXNoRGlyZWN0aW9ucy5lYXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYWRkVG9UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueCA9IGdyaWRzdGVySXRlbS4kaXRlbS54ICsgZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHM7XG4gICAgaWYgKHRoaXMucHVzaChncmlkc3Rlckl0ZW1Db2xsaWRlLCB0aGlzLmZyb21XZXN0KSkge1xuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XG4gICAgICB0aGlzLmFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVRlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5V2VzdChncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnB1c2hEaXJlY3Rpb25zLndlc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hZGRUb1RlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS54ID0gZ3JpZHN0ZXJJdGVtLiRpdGVtLnggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHM7XG4gICAgaWYgKHRoaXMucHVzaChncmlkc3Rlckl0ZW1Db2xsaWRlLCB0aGlzLmZyb21FYXN0KSkge1xuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XG4gICAgICB0aGlzLmFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVRlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9UZW1wUHVzaGVkKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgbGV0IGkgPSB0aGlzLnB1c2hlZEl0ZW1zVGVtcC5pbmRleE9mKGdyaWRzdGVySXRlbSk7XG4gICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICBpID0gdGhpcy5wdXNoZWRJdGVtc1RlbXAucHVzaChncmlkc3Rlckl0ZW0pIC0gMTtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNUZW1wUGF0aFtpXSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcFBhdGhbaV0ucHVzaCh7eDogZ3JpZHN0ZXJJdGVtLiRpdGVtLngsIHk6IGdyaWRzdGVySXRlbS4kaXRlbS55fSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUZyb21UZW1wUHVzaGVkKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXNUZW1wLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKTtcbiAgICBjb25zdCB0ZW1wUG9zaXRpb24gPSB0aGlzLnB1c2hlZEl0ZW1zVGVtcFBhdGhbaV0ucG9wKCk7XG4gICAgaWYgKCF0ZW1wUG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0ZW1wUG9zaXRpb24ueDtcbiAgICBncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRlbXBQb3NpdGlvbi55O1xuICAgIGdyaWRzdGVySXRlbS5zZXRTaXplKCk7XG4gICAgaWYgKCF0aGlzLnB1c2hlZEl0ZW1zVGVtcFBhdGhbaV0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcC5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcFBhdGguc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wdXNoZWRJdGVtcy5pbmRleE9mKGdyaWRzdGVySXRlbSkgPCAwKSB7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zLnB1c2goZ3JpZHN0ZXJJdGVtKTtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnB1c2goW3t4OiBncmlkc3Rlckl0ZW0uaXRlbS54IHx8IDAsIHk6IGdyaWRzdGVySXRlbS5pdGVtLnkgfHwgMH0sXG4gICAgICAgIHt4OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueCwgeTogZ3JpZHN0ZXJJdGVtLiRpdGVtLnl9XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLnB1c2hlZEl0ZW1zLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKTtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoW2ldLnB1c2goe3g6IGdyaWRzdGVySXRlbS4kaXRlbS54LCB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueX0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVB1c2hlZChpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUZyb21QdXNoZWRJdGVtKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXMuaW5kZXhPZihncmlkc3Rlckl0ZW0pO1xuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoW2ldLnBvcCgpO1xuICAgICAgaWYgKCF0aGlzLnB1c2hlZEl0ZW1zUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoZWRJdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUHVzaGVkSXRlbShwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsIGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXTtcbiAgICBsZXQgaiA9IHBhdGgubGVuZ3RoIC0gMjtcbiAgICBsZXQgbGFzdFBvc2l0aW9uLCB4LCB5O1xuICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICBmb3IgKDsgaiA+IC0xOyBqLS0pIHtcbiAgICAgIGxhc3RQb3NpdGlvbiA9IHBhdGhbal07XG4gICAgICB4ID0gcHVzaGVkSXRlbS4kaXRlbS54O1xuICAgICAgeSA9IHB1c2hlZEl0ZW0uJGl0ZW0ueTtcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueCA9IGxhc3RQb3NpdGlvbi54O1xuICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0gbGFzdFBvc2l0aW9uLnk7XG4gICAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuZmluZEl0ZW1XaXRoSXRlbShwdXNoZWRJdGVtLiRpdGVtKSkge1xuICAgICAgICBwdXNoZWRJdGVtLnNldFNpemUoKTtcbiAgICAgICAgcGF0aC5zcGxpY2UoaiArIDEsIHBhdGgubGVuZ3RoIC0gaiAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0geDtcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0geTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xuICAgICAgdGhpcy5yZW1vdmVGcm9tUHVzaGVkKGkpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlO1xuICB9XG59XG4iXX0=
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { GridsterItemComponentInterface } from './gridsterItemComponent.interface';
7
+ export class GridsterPush {
8
+ /**
9
+ * @param {?} gridsterItem
10
+ */
11
+ constructor(gridsterItem) {
12
+ this.pushedItems = [];
13
+ this.pushedItemsTemp = [];
14
+ this.pushedItemsTempPath = [];
15
+ this.pushedItemsPath = [];
16
+ this.gridsterItem = gridsterItem;
17
+ this.gridster = gridsterItem.gridster;
18
+ this.tryPattern = {
19
+ fromEast: [this.tryWest, this.trySouth, this.tryNorth, this.tryEast],
20
+ fromWest: [this.tryEast, this.trySouth, this.tryNorth, this.tryWest],
21
+ fromNorth: [this.trySouth, this.tryEast, this.tryWest, this.tryNorth],
22
+ fromSouth: [this.tryNorth, this.tryEast, this.tryWest, this.trySouth]
23
+ };
24
+ this.fromSouth = 'fromSouth';
25
+ this.fromNorth = 'fromNorth';
26
+ this.fromEast = 'fromEast';
27
+ this.fromWest = 'fromWest';
28
+ }
29
+ /**
30
+ * @return {?}
31
+ */
32
+ destroy() {
33
+ delete this.gridster;
34
+ delete this.gridsterItem;
35
+ }
36
+ /**
37
+ * @param {?} direction
38
+ * @param {?=} disable
39
+ * @return {?}
40
+ */
41
+ pushItems(direction, disable) {
42
+ if (this.gridster.$options.pushItems && !disable) {
43
+ this.pushedItemsOrder = [];
44
+ /** @type {?} */
45
+ const pushed = this.push(this.gridsterItem, direction);
46
+ if (!pushed) {
47
+ this.restoreTempItems();
48
+ }
49
+ this.pushedItemsOrder = [];
50
+ this.pushedItemsTemp = [];
51
+ this.pushedItemsTempPath = [];
52
+ return pushed;
53
+ }
54
+ else {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * @return {?}
60
+ */
61
+ restoreTempItems() {
62
+ /** @type {?} */
63
+ let i = this.pushedItemsTemp.length - 1;
64
+ for (; i > -1; i--) {
65
+ this.removeFromTempPushed(this.pushedItemsTemp[i]);
66
+ }
67
+ }
68
+ /**
69
+ * @return {?}
70
+ */
71
+ restoreItems() {
72
+ /** @type {?} */
73
+ let i = 0;
74
+ /** @type {?} */
75
+ const l = this.pushedItems.length;
76
+ /** @type {?} */
77
+ let pushedItem;
78
+ for (; i < l; i++) {
79
+ pushedItem = this.pushedItems[i];
80
+ pushedItem.$item.x = pushedItem.item.x || 0;
81
+ pushedItem.$item.y = pushedItem.item.y || 0;
82
+ pushedItem.setSize();
83
+ }
84
+ this.pushedItems = [];
85
+ this.pushedItemsPath = [];
86
+ }
87
+ /**
88
+ * @return {?}
89
+ */
90
+ setPushedItems() {
91
+ /** @type {?} */
92
+ let i = 0;
93
+ /** @type {?} */
94
+ const l = this.pushedItems.length;
95
+ /** @type {?} */
96
+ let pushedItem;
97
+ for (; i < l; i++) {
98
+ pushedItem = this.pushedItems[i];
99
+ pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);
100
+ }
101
+ this.pushedItems = [];
102
+ this.pushedItemsPath = [];
103
+ }
104
+ /**
105
+ * @return {?}
106
+ */
107
+ checkPushBack() {
108
+ /** @type {?} */
109
+ let i = this.pushedItems.length - 1;
110
+ /** @type {?} */
111
+ let change = false;
112
+ for (; i > -1; i--) {
113
+ if (this.checkPushedItem(this.pushedItems[i], i)) {
114
+ change = true;
115
+ }
116
+ }
117
+ if (change) {
118
+ this.checkPushBack();
119
+ }
120
+ }
121
+ /**
122
+ * @private
123
+ * @param {?} gridsterItem
124
+ * @param {?} direction
125
+ * @return {?}
126
+ */
127
+ push(gridsterItem, direction) {
128
+ if (this.gridster.checkGridCollision(gridsterItem.$item)) {
129
+ return false;
130
+ }
131
+ if (direction === '') {
132
+ return false;
133
+ }
134
+ /** @type {?} */
135
+ const a = this.gridster.findItemsWithItem(gridsterItem.$item);
136
+ /** @type {?} */
137
+ let i = a.length - 1;
138
+ /** @type {?} */
139
+ let itemCollision;
140
+ /** @type {?} */
141
+ let makePush = true;
142
+ /** @type {?} */
143
+ const b = [];
144
+ for (; i > -1; i--) {
145
+ itemCollision = a[i];
146
+ if (itemCollision === this.gridsterItem) {
147
+ makePush = false;
148
+ break;
149
+ }
150
+ if (!itemCollision.canBeDragged()) {
151
+ makePush = false;
152
+ break;
153
+ }
154
+ /** @type {?} */
155
+ const compare = this.pushedItemsTemp.find((/**
156
+ * @param {?} el
157
+ * @return {?}
158
+ */
159
+ (el) => {
160
+ return el.$item.x === itemCollision.$item.x && el.$item.y === itemCollision.$item.y;
161
+ }));
162
+ if (compare) {
163
+ makePush = false;
164
+ break;
165
+ }
166
+ if (this.tryPattern[direction][0].call(this, itemCollision, gridsterItem)) {
167
+ this.pushedItemsOrder.push(itemCollision);
168
+ b.push(itemCollision);
169
+ }
170
+ else if (this.tryPattern[direction][1].call(this, itemCollision, gridsterItem)) {
171
+ this.pushedItemsOrder.push(itemCollision);
172
+ b.push(itemCollision);
173
+ }
174
+ else if (this.tryPattern[direction][2].call(this, itemCollision, gridsterItem)) {
175
+ this.pushedItemsOrder.push(itemCollision);
176
+ b.push(itemCollision);
177
+ }
178
+ else if (this.tryPattern[direction][3].call(this, itemCollision, gridsterItem)) {
179
+ this.pushedItemsOrder.push(itemCollision);
180
+ b.push(itemCollision);
181
+ }
182
+ else {
183
+ makePush = false;
184
+ break;
185
+ }
186
+ }
187
+ if (!makePush) {
188
+ i = this.pushedItemsOrder.lastIndexOf(b[0]);
189
+ if (i > -1) {
190
+ /** @type {?} */
191
+ let j = this.pushedItemsOrder.length - 1;
192
+ for (; j >= i; j--) {
193
+ itemCollision = this.pushedItemsOrder[j];
194
+ this.pushedItemsOrder.pop();
195
+ this.removeFromTempPushed(itemCollision);
196
+ this.removeFromPushedItem(itemCollision);
197
+ }
198
+ }
199
+ }
200
+ return makePush;
201
+ }
202
+ /**
203
+ * @private
204
+ * @param {?} gridsterItemCollide
205
+ * @param {?} gridsterItem
206
+ * @return {?}
207
+ */
208
+ trySouth(gridsterItemCollide, gridsterItem) {
209
+ if (!this.gridster.$options.pushDirections.south) {
210
+ return false;
211
+ }
212
+ this.addToTempPushed(gridsterItemCollide);
213
+ gridsterItemCollide.$item.y = gridsterItem.$item.y + gridsterItem.$item.rows;
214
+ if (this.push(gridsterItemCollide, this.fromNorth)) {
215
+ gridsterItemCollide.setSize();
216
+ this.addToPushed(gridsterItemCollide);
217
+ return true;
218
+ }
219
+ else {
220
+ this.removeFromTempPushed(gridsterItemCollide);
221
+ }
222
+ return false;
223
+ }
224
+ /**
225
+ * @private
226
+ * @param {?} gridsterItemCollide
227
+ * @param {?} gridsterItem
228
+ * @return {?}
229
+ */
230
+ tryNorth(gridsterItemCollide, gridsterItem) {
231
+ if (!this.gridster.$options.pushDirections.north) {
232
+ return false;
233
+ }
234
+ this.addToTempPushed(gridsterItemCollide);
235
+ gridsterItemCollide.$item.y = gridsterItem.$item.y - gridsterItemCollide.$item.rows;
236
+ if (this.push(gridsterItemCollide, this.fromSouth)) {
237
+ gridsterItemCollide.setSize();
238
+ this.addToPushed(gridsterItemCollide);
239
+ return true;
240
+ }
241
+ else {
242
+ this.removeFromTempPushed(gridsterItemCollide);
243
+ }
244
+ return false;
245
+ }
246
+ /**
247
+ * @private
248
+ * @param {?} gridsterItemCollide
249
+ * @param {?} gridsterItem
250
+ * @return {?}
251
+ */
252
+ tryEast(gridsterItemCollide, gridsterItem) {
253
+ if (!this.gridster.$options.pushDirections.east) {
254
+ return false;
255
+ }
256
+ this.addToTempPushed(gridsterItemCollide);
257
+ gridsterItemCollide.$item.x = gridsterItem.$item.x + gridsterItem.$item.cols;
258
+ if (this.push(gridsterItemCollide, this.fromWest)) {
259
+ gridsterItemCollide.setSize();
260
+ this.addToPushed(gridsterItemCollide);
261
+ return true;
262
+ }
263
+ else {
264
+ this.removeFromTempPushed(gridsterItemCollide);
265
+ }
266
+ return false;
267
+ }
268
+ /**
269
+ * @private
270
+ * @param {?} gridsterItemCollide
271
+ * @param {?} gridsterItem
272
+ * @return {?}
273
+ */
274
+ tryWest(gridsterItemCollide, gridsterItem) {
275
+ if (!this.gridster.$options.pushDirections.west) {
276
+ return false;
277
+ }
278
+ this.addToTempPushed(gridsterItemCollide);
279
+ gridsterItemCollide.$item.x = gridsterItem.$item.x - gridsterItemCollide.$item.cols;
280
+ if (this.push(gridsterItemCollide, this.fromEast)) {
281
+ gridsterItemCollide.setSize();
282
+ this.addToPushed(gridsterItemCollide);
283
+ return true;
284
+ }
285
+ else {
286
+ this.removeFromTempPushed(gridsterItemCollide);
287
+ }
288
+ return false;
289
+ }
290
+ /**
291
+ * @private
292
+ * @param {?} gridsterItem
293
+ * @return {?}
294
+ */
295
+ addToTempPushed(gridsterItem) {
296
+ /** @type {?} */
297
+ let i = this.pushedItemsTemp.indexOf(gridsterItem);
298
+ if (i === -1) {
299
+ i = this.pushedItemsTemp.push(gridsterItem) - 1;
300
+ this.pushedItemsTempPath[i] = [];
301
+ }
302
+ this.pushedItemsTempPath[i].push({ x: gridsterItem.$item.x, y: gridsterItem.$item.y });
303
+ }
304
+ /**
305
+ * @private
306
+ * @param {?} gridsterItem
307
+ * @return {?}
308
+ */
309
+ removeFromTempPushed(gridsterItem) {
310
+ /** @type {?} */
311
+ const i = this.pushedItemsTemp.indexOf(gridsterItem);
312
+ /** @type {?} */
313
+ const tempPosition = this.pushedItemsTempPath[i].pop();
314
+ if (!tempPosition) {
315
+ return;
316
+ }
317
+ gridsterItem.$item.x = tempPosition.x;
318
+ gridsterItem.$item.y = tempPosition.y;
319
+ gridsterItem.setSize();
320
+ if (!this.pushedItemsTempPath[i].length) {
321
+ this.pushedItemsTemp.splice(i, 1);
322
+ this.pushedItemsTempPath.splice(i, 1);
323
+ }
324
+ }
325
+ /**
326
+ * @private
327
+ * @param {?} gridsterItem
328
+ * @return {?}
329
+ */
330
+ addToPushed(gridsterItem) {
331
+ if (this.pushedItems.indexOf(gridsterItem) < 0) {
332
+ this.pushedItems.push(gridsterItem);
333
+ this.pushedItemsPath.push([{ x: gridsterItem.item.x || 0, y: gridsterItem.item.y || 0 },
334
+ { x: gridsterItem.$item.x, y: gridsterItem.$item.y }]);
335
+ }
336
+ else {
337
+ /** @type {?} */
338
+ const i = this.pushedItems.indexOf(gridsterItem);
339
+ this.pushedItemsPath[i].push({ x: gridsterItem.$item.x, y: gridsterItem.$item.y });
340
+ }
341
+ }
342
+ /**
343
+ * @private
344
+ * @param {?} i
345
+ * @return {?}
346
+ */
347
+ removeFromPushed(i) {
348
+ if (i > -1) {
349
+ this.pushedItems.splice(i, 1);
350
+ this.pushedItemsPath.splice(i, 1);
351
+ }
352
+ }
353
+ /**
354
+ * @private
355
+ * @param {?} gridsterItem
356
+ * @return {?}
357
+ */
358
+ removeFromPushedItem(gridsterItem) {
359
+ /** @type {?} */
360
+ const i = this.pushedItems.indexOf(gridsterItem);
361
+ if (i > -1) {
362
+ this.pushedItemsPath[i].pop();
363
+ if (!this.pushedItemsPath.length) {
364
+ this.pushedItems.splice(i, 1);
365
+ this.pushedItemsPath.splice(i, 1);
366
+ }
367
+ }
368
+ }
369
+ /**
370
+ * @private
371
+ * @param {?} pushedItem
372
+ * @param {?} i
373
+ * @return {?}
374
+ */
375
+ checkPushedItem(pushedItem, i) {
376
+ /** @type {?} */
377
+ const path = this.pushedItemsPath[i];
378
+ /** @type {?} */
379
+ let j = path.length - 2;
380
+ /** @type {?} */
381
+ let lastPosition;
382
+ /** @type {?} */
383
+ let x;
384
+ /** @type {?} */
385
+ let y;
386
+ /** @type {?} */
387
+ let change = false;
388
+ for (; j > -1; j--) {
389
+ lastPosition = path[j];
390
+ x = pushedItem.$item.x;
391
+ y = pushedItem.$item.y;
392
+ pushedItem.$item.x = lastPosition.x;
393
+ pushedItem.$item.y = lastPosition.y;
394
+ if (!this.gridster.findItemWithItem(pushedItem.$item)) {
395
+ pushedItem.setSize();
396
+ path.splice(j + 1, path.length - j - 1);
397
+ change = true;
398
+ }
399
+ else {
400
+ pushedItem.$item.x = x;
401
+ pushedItem.$item.y = y;
402
+ }
403
+ }
404
+ if (path.length < 2) {
405
+ this.removeFromPushed(i);
406
+ }
407
+ return change;
408
+ }
409
+ }
410
+ GridsterPush.decorators = [
411
+ { type: Injectable }
412
+ ];
413
+ /** @nocollapse */
414
+ GridsterPush.ctorParameters = () => [
415
+ { type: GridsterItemComponentInterface }
416
+ ];
417
+ if (false) {
418
+ /** @type {?} */
419
+ GridsterPush.prototype.fromSouth;
420
+ /** @type {?} */
421
+ GridsterPush.prototype.fromNorth;
422
+ /** @type {?} */
423
+ GridsterPush.prototype.fromEast;
424
+ /** @type {?} */
425
+ GridsterPush.prototype.fromWest;
426
+ /**
427
+ * @type {?}
428
+ * @private
429
+ */
430
+ GridsterPush.prototype.pushedItems;
431
+ /**
432
+ * @type {?}
433
+ * @private
434
+ */
435
+ GridsterPush.prototype.pushedItemsTemp;
436
+ /**
437
+ * @type {?}
438
+ * @private
439
+ */
440
+ GridsterPush.prototype.pushedItemsTempPath;
441
+ /**
442
+ * @type {?}
443
+ * @private
444
+ */
445
+ GridsterPush.prototype.pushedItemsPath;
446
+ /**
447
+ * @type {?}
448
+ * @private
449
+ */
450
+ GridsterPush.prototype.gridsterItem;
451
+ /**
452
+ * @type {?}
453
+ * @private
454
+ */
455
+ GridsterPush.prototype.gridster;
456
+ /**
457
+ * @type {?}
458
+ * @private
459
+ */
460
+ GridsterPush.prototype.pushedItemsOrder;
461
+ /**
462
+ * @type {?}
463
+ * @private
464
+ */
465
+ GridsterPush.prototype.tryPattern;
466
+ }
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJQdXNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImdyaWRzdGVyL2xpYi9ncmlkc3RlclB1c2guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUlqRixNQUFNLE9BQU8sWUFBWTs7OztJQW9CdkIsWUFBWSxZQUE0QztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNwRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVB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QUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JELFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7O1lBcFRGLFVBQVU7Ozs7WUFISCw4QkFBOEI7Ozs7SUFLcEMsaUNBQXlCOztJQUN6QixpQ0FBeUI7O0lBQ3pCLGdDQUF3Qjs7SUFDeEIsZ0NBQXdCOzs7OztJQUN4QixtQ0FBMkQ7Ozs7O0lBQzNELHVDQUErRDs7Ozs7SUFDL0QsMkNBQW9FOzs7OztJQUNwRSx1Q0FBZ0U7Ozs7O0lBQ2hFLG9DQUFxRDs7Ozs7SUFDckQsZ0NBQTZDOzs7OztJQUM3Qyx3Q0FBZ0U7Ozs7O0lBQ2hFLGtDQU1FIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlfSBmcm9tICcuL2dyaWRzdGVySXRlbUNvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0dyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclB1c2gge1xyXG4gIHB1YmxpYyBmcm9tU291dGg6IHN0cmluZztcclxuICBwdWJsaWMgZnJvbU5vcnRoOiBzdHJpbmc7XHJcbiAgcHVibGljIGZyb21FYXN0OiBzdHJpbmc7XHJcbiAgcHVibGljIGZyb21XZXN0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBwdXNoZWRJdGVtczogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPjtcclxuICBwcml2YXRlIHB1c2hlZEl0ZW1zVGVtcDogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPjtcclxuICBwcml2YXRlIHB1c2hlZEl0ZW1zVGVtcFBhdGg6IEFycmF5PEFycmF5PHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfT4+O1xyXG4gIHByaXZhdGUgcHVzaGVkSXRlbXNQYXRoOiBBcnJheTxBcnJheTx7IHg6IG51bWJlciwgeTogbnVtYmVyIH0+PjtcclxuICBwcml2YXRlIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgcHVzaGVkSXRlbXNPcmRlcjogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPjtcclxuICBwcml2YXRlIHRyeVBhdHRlcm46IHtcclxuICAgIGZyb21FYXN0OiBBcnJheTxGdW5jdGlvbj4sXHJcbiAgICBmcm9tV2VzdDogQXJyYXk8RnVuY3Rpb24+LFxyXG4gICAgZnJvbU5vcnRoOiBBcnJheTxGdW5jdGlvbj4sXHJcbiAgICBmcm9tU291dGg6IEFycmF5PEZ1bmN0aW9uPixcclxuICAgIFtrZXk6IHN0cmluZ106IEFycmF5PEZ1bmN0aW9uPlxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSB7XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zID0gW107XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcCA9IFtdO1xyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1RlbXBQYXRoID0gW107XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0gPSBncmlkc3Rlckl0ZW07XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXJJdGVtLmdyaWRzdGVyO1xyXG4gICAgdGhpcy50cnlQYXR0ZXJuID0ge1xyXG4gICAgICBmcm9tRWFzdDogW3RoaXMudHJ5V2VzdCwgdGhpcy50cnlTb3V0aCwgdGhpcy50cnlOb3J0aCwgdGhpcy50cnlFYXN0XSxcclxuICAgICAgZnJvbVdlc3Q6IFt0aGlzLnRyeUVhc3QsIHRoaXMudHJ5U291dGgsIHRoaXMudHJ5Tm9ydGgsIHRoaXMudHJ5V2VzdF0sXHJcbiAgICAgIGZyb21Ob3J0aDogW3RoaXMudHJ5U291dGgsIHRoaXMudHJ5RWFzdCwgdGhpcy50cnlXZXN0LCB0aGlzLnRyeU5vcnRoXSxcclxuICAgICAgZnJvbVNvdXRoOiBbdGhpcy50cnlOb3J0aCwgdGhpcy50cnlFYXN0LCB0aGlzLnRyeVdlc3QsIHRoaXMudHJ5U291dGhdXHJcbiAgICB9O1xyXG4gICAgdGhpcy5mcm9tU291dGggPSAnZnJvbVNvdXRoJztcclxuICAgIHRoaXMuZnJvbU5vcnRoID0gJ2Zyb21Ob3J0aCc7XHJcbiAgICB0aGlzLmZyb21FYXN0ID0gJ2Zyb21FYXN0JztcclxuICAgIHRoaXMuZnJvbVdlc3QgPSAnZnJvbVdlc3QnO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGRlbGV0ZSB0aGlzLmdyaWRzdGVyO1xyXG4gICAgZGVsZXRlIHRoaXMuZ3JpZHN0ZXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHVzaEl0ZW1zKGRpcmVjdGlvbjogc3RyaW5nLCBkaXNhYmxlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaEl0ZW1zICYmICFkaXNhYmxlKSB7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNPcmRlciA9IFtdO1xyXG4gICAgICBjb25zdCBwdXNoZWQgPSB0aGlzLnB1c2godGhpcy5ncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICAgIGlmICghcHVzaGVkKSB7XHJcbiAgICAgICAgdGhpcy5yZXN0b3JlVGVtcEl0ZW1zKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyID0gW107XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNUZW1wID0gW107XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNUZW1wUGF0aCA9IFtdO1xyXG4gICAgICByZXR1cm4gcHVzaGVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzdG9yZVRlbXBJdGVtcygpOiB2b2lkIHtcclxuICAgIGxldCBpID0gdGhpcy5wdXNoZWRJdGVtc1RlbXAubGVuZ3RoIC0gMTtcclxuICAgIGZvciAoOyBpID4gLTE7IGktLSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKHRoaXMucHVzaGVkSXRlbXNUZW1wW2ldKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc3RvcmVJdGVtcygpOiB2b2lkIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGw6IG51bWJlciA9IHRoaXMucHVzaGVkSXRlbXMubGVuZ3RoO1xyXG4gICAgbGV0IHB1c2hlZEl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIHB1c2hlZEl0ZW0gPSB0aGlzLnB1c2hlZEl0ZW1zW2ldO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnggPSBwdXNoZWRJdGVtLml0ZW0ueCB8fCAwO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnkgPSBwdXNoZWRJdGVtLml0ZW0ueSB8fCAwO1xyXG4gICAgICBwdXNoZWRJdGVtLnNldFNpemUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucHVzaGVkSXRlbXMgPSBbXTtcclxuICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoID0gW107XHJcbiAgfVxyXG5cclxuICBzZXRQdXNoZWRJdGVtcygpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGw6IG51bWJlciA9IHRoaXMucHVzaGVkSXRlbXMubGVuZ3RoO1xyXG4gICAgbGV0IHB1c2hlZEl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIHB1c2hlZEl0ZW0gPSB0aGlzLnB1c2hlZEl0ZW1zW2ldO1xyXG4gICAgICBwdXNoZWRJdGVtLmNoZWNrSXRlbUNoYW5nZXMocHVzaGVkSXRlbS4kaXRlbSwgcHVzaGVkSXRlbS5pdGVtKTtcclxuICAgIH1cclxuICAgIHRoaXMucHVzaGVkSXRlbXMgPSBbXTtcclxuICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoID0gW107XHJcbiAgfVxyXG5cclxuICBjaGVja1B1c2hCYWNrKCk6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IHRoaXMucHVzaGVkSXRlbXMubGVuZ3RoIC0gMTtcclxuICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcclxuICAgIGZvciAoOyBpID4gLTE7IGktLSkge1xyXG4gICAgICBpZiAodGhpcy5jaGVja1B1c2hlZEl0ZW0odGhpcy5wdXNoZWRJdGVtc1tpXSwgaSkpIHtcclxuICAgICAgICBjaGFuZ2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tQdXNoQmFjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwdXNoKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLCBkaXJlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbS4kaXRlbSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IHRoaXMuZ3JpZHN0ZXIuZmluZEl0ZW1zV2l0aEl0ZW0oZ3JpZHN0ZXJJdGVtLiRpdGVtKTtcclxuICAgIGxldCBpID0gYS5sZW5ndGggLSAxLCBpdGVtQ29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBsZXQgbWFrZVB1c2ggPSB0cnVlO1xyXG4gICAgY29uc3QgYjogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IFtdO1xyXG4gICAgZm9yICg7IGkgPiAtMTsgaS0tKSB7XHJcbiAgICAgIGl0ZW1Db2xsaXNpb24gPSBhW2ldO1xyXG4gICAgICBpZiAoaXRlbUNvbGxpc2lvbiA9PT0gdGhpcy5ncmlkc3Rlckl0ZW0pIHtcclxuICAgICAgICBtYWtlUHVzaCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXRlbUNvbGxpc2lvbi5jYW5CZURyYWdnZWQoKSkge1xyXG4gICAgICAgIG1ha2VQdXNoID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29tcGFyZSA9IHRoaXMucHVzaGVkSXRlbXNUZW1wLmZpbmQoKGVsOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpID0+IHtcclxuICAgICAgICByZXR1cm4gZWwuJGl0ZW0ueCA9PT0gaXRlbUNvbGxpc2lvbi4kaXRlbS54ICYmIGVsLiRpdGVtLnkgPT09IGl0ZW1Db2xsaXNpb24uJGl0ZW0ueTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChjb21wYXJlKSB7XHJcbiAgICAgICAgbWFrZVB1c2ggPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy50cnlQYXR0ZXJuW2RpcmVjdGlvbl1bMF0uY2FsbCh0aGlzLCBpdGVtQ29sbGlzaW9uLCBncmlkc3Rlckl0ZW0pKSB7XHJcbiAgICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyLnB1c2goaXRlbUNvbGxpc2lvbik7XHJcbiAgICAgICAgYi5wdXNoKGl0ZW1Db2xsaXNpb24pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJ5UGF0dGVybltkaXJlY3Rpb25dWzFdLmNhbGwodGhpcywgaXRlbUNvbGxpc2lvbiwgZ3JpZHN0ZXJJdGVtKSkge1xyXG4gICAgICAgIHRoaXMucHVzaGVkSXRlbXNPcmRlci5wdXNoKGl0ZW1Db2xsaXNpb24pO1xyXG4gICAgICAgIGIucHVzaChpdGVtQ29sbGlzaW9uKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyeVBhdHRlcm5bZGlyZWN0aW9uXVsyXS5jYWxsKHRoaXMsIGl0ZW1Db2xsaXNpb24sIGdyaWRzdGVySXRlbSkpIHtcclxuICAgICAgICB0aGlzLnB1c2hlZEl0ZW1zT3JkZXIucHVzaChpdGVtQ29sbGlzaW9uKTtcclxuICAgICAgICBiLnB1c2goaXRlbUNvbGxpc2lvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cnlQYXR0ZXJuW2RpcmVjdGlvbl1bM10uY2FsbCh0aGlzLCBpdGVtQ29sbGlzaW9uLCBncmlkc3Rlckl0ZW0pKSB7XHJcbiAgICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyLnB1c2goaXRlbUNvbGxpc2lvbik7XHJcbiAgICAgICAgYi5wdXNoKGl0ZW1Db2xsaXNpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1ha2VQdXNoID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghbWFrZVB1c2gpIHtcclxuICAgICAgaSA9IHRoaXMucHVzaGVkSXRlbXNPcmRlci5sYXN0SW5kZXhPZihiWzBdKTtcclxuICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgIGxldCBqID0gdGhpcy5wdXNoZWRJdGVtc09yZGVyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgZm9yICg7IGogPj0gaTsgai0tKSB7XHJcbiAgICAgICAgICBpdGVtQ29sbGlzaW9uID0gdGhpcy5wdXNoZWRJdGVtc09yZGVyW2pdO1xyXG4gICAgICAgICAgdGhpcy5wdXNoZWRJdGVtc09yZGVyLnBvcCgpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tVGVtcFB1c2hlZChpdGVtQ29sbGlzaW9uKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVB1c2hlZEl0ZW0oaXRlbUNvbGxpc2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWFrZVB1c2g7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeVNvdXRoKGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5wdXNoRGlyZWN0aW9ucy5zb3V0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFkZFRvVGVtcFB1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueSA9IGdyaWRzdGVySXRlbS4kaXRlbS55ICsgZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3M7XHJcbiAgICBpZiAodGhpcy5wdXNoKGdyaWRzdGVySXRlbUNvbGxpZGUsIHRoaXMuZnJvbU5vcnRoKSkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlOb3J0aChncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaERpcmVjdGlvbnMubm9ydGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUb1RlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnkgPSBncmlkc3Rlckl0ZW0uJGl0ZW0ueSAtIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ucm93cztcclxuICAgIGlmICh0aGlzLnB1c2goZ3JpZHN0ZXJJdGVtQ29sbGlkZSwgdGhpcy5mcm9tU291dGgpKSB7XHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xyXG4gICAgICB0aGlzLmFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVRlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeUVhc3QoZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLCBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnB1c2hEaXJlY3Rpb25zLmVhc3QpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUb1RlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPSBncmlkc3Rlckl0ZW0uJGl0ZW0ueCArIGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgaWYgKHRoaXMucHVzaChncmlkc3Rlckl0ZW1Db2xsaWRlLCB0aGlzLmZyb21XZXN0KSkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlXZXN0KGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5wdXNoRGlyZWN0aW9ucy53ZXN0KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYWRkVG9UZW1wUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS54ID0gZ3JpZHN0ZXJJdGVtLiRpdGVtLnggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHM7XHJcbiAgICBpZiAodGhpcy5wdXNoKGdyaWRzdGVySXRlbUNvbGxpZGUsIHRoaXMuZnJvbUVhc3QpKSB7XHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xyXG4gICAgICB0aGlzLmFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVRlbXBQdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFRvVGVtcFB1c2hlZChncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgbGV0IGkgPSB0aGlzLnB1c2hlZEl0ZW1zVGVtcC5pbmRleE9mKGdyaWRzdGVySXRlbSk7XHJcbiAgICBpZiAoaSA9PT0gLTEpIHtcclxuICAgICAgaSA9IHRoaXMucHVzaGVkSXRlbXNUZW1wLnB1c2goZ3JpZHN0ZXJJdGVtKSAtIDE7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNUZW1wUGF0aFtpXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1RlbXBQYXRoW2ldLnB1c2goe3g6IGdyaWRzdGVySXRlbS4kaXRlbS54LCB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueX0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVGcm9tVGVtcFB1c2hlZChncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXNUZW1wLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKTtcclxuICAgIGNvbnN0IHRlbXBQb3NpdGlvbiA9IHRoaXMucHVzaGVkSXRlbXNUZW1wUGF0aFtpXS5wb3AoKTtcclxuICAgIGlmICghdGVtcFBvc2l0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGdyaWRzdGVySXRlbS4kaXRlbS54ID0gdGVtcFBvc2l0aW9uLng7XHJcbiAgICBncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRlbXBQb3NpdGlvbi55O1xyXG4gICAgZ3JpZHN0ZXJJdGVtLnNldFNpemUoKTtcclxuICAgIGlmICghdGhpcy5wdXNoZWRJdGVtc1RlbXBQYXRoW2ldLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zVGVtcC5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNUZW1wUGF0aC5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wdXNoZWRJdGVtcy5pbmRleE9mKGdyaWRzdGVySXRlbSkgPCAwKSB7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXMucHVzaChncmlkc3Rlckl0ZW0pO1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aC5wdXNoKFt7eDogZ3JpZHN0ZXJJdGVtLml0ZW0ueCB8fCAwLCB5OiBncmlkc3Rlckl0ZW0uaXRlbS55IHx8IDB9LFxyXG4gICAgICAgIHt4OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueCwgeTogZ3JpZHN0ZXJJdGVtLiRpdGVtLnl9XSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpID0gdGhpcy5wdXNoZWRJdGVtcy5pbmRleE9mKGdyaWRzdGVySXRlbSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoW2ldLnB1c2goe3g6IGdyaWRzdGVySXRlbS4kaXRlbS54LCB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVGcm9tUHVzaGVkKGk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zLnNwbGljZShpLCAxKTtcclxuICAgICAgdGhpcy5wdXNoZWRJdGVtc1BhdGguc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVGcm9tUHVzaGVkSXRlbShncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXMuaW5kZXhPZihncmlkc3Rlckl0ZW0pO1xyXG4gICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXS5wb3AoKTtcclxuICAgICAgaWYgKCF0aGlzLnB1c2hlZEl0ZW1zUGF0aC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnB1c2hlZEl0ZW1zLnNwbGljZShpLCAxKTtcclxuICAgICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aC5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tQdXNoZWRJdGVtKHB1c2hlZEl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wdXNoZWRJdGVtc1BhdGhbaV07XHJcbiAgICBsZXQgaiA9IHBhdGgubGVuZ3RoIC0gMjtcclxuICAgIGxldCBsYXN0UG9zaXRpb24sIHgsIHk7XHJcbiAgICBsZXQgY2hhbmdlID0gZmFsc2U7XHJcbiAgICBmb3IgKDsgaiA+IC0xOyBqLS0pIHtcclxuICAgICAgbGFzdFBvc2l0aW9uID0gcGF0aFtqXTtcclxuICAgICAgeCA9IHB1c2hlZEl0ZW0uJGl0ZW0ueDtcclxuICAgICAgeSA9IHB1c2hlZEl0ZW0uJGl0ZW0ueTtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0gbGFzdFBvc2l0aW9uLng7XHJcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueSA9IGxhc3RQb3NpdGlvbi55O1xyXG4gICAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuZmluZEl0ZW1XaXRoSXRlbShwdXNoZWRJdGVtLiRpdGVtKSkge1xyXG4gICAgICAgIHB1c2hlZEl0ZW0uc2V0U2l6ZSgpO1xyXG4gICAgICAgIHBhdGguc3BsaWNlKGogKyAxLCBwYXRoLmxlbmd0aCAtIGogLSAxKTtcclxuICAgICAgICBjaGFuZ2UgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueCA9IHg7XHJcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0geTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21QdXNoZWQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hhbmdlO1xyXG4gIH1cclxufVxyXG4iXX0=