@schneideress/dashboardframework 0.0.76 → 0.0.78

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 +7013 -7030
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  4. package/bundles/schneideress-dashboardframework.umd.min.js +2 -2
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  6. package/esm2015/gridster/index.js +18 -19
  7. package/esm2015/gridster/lib/gridster.component.js +700 -701
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -85
  9. package/esm2015/gridster/lib/gridster.module.js +27 -28
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -224
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -180
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -220
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -162
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -511
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -318
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -214
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -47
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -49
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -67
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -468
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -359
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -278
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -553
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -20
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -196
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -135
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -138
  28. package/esm2015/lib/custom.notifier.options.js +46 -47
  29. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +496 -497
  30. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +471 -462
  31. package/esm2015/lib/ra.base.dashboard.filter.js +75 -76
  32. package/esm2015/lib/ra.base.dashboard.template.js +71 -72
  33. package/esm2015/lib/ra.dashbard.event.bus.js +85 -86
  34. package/esm2015/lib/ra.dashboard.module.js +51 -50
  35. package/esm2015/lib/ra.dashboard.service.js +144 -145
  36. package/esm2015/lib/ra.event.enum.js +51 -52
  37. package/esm2015/lib/ra.gridster.config.js +67 -68
  38. package/esm2015/public-api.js +16 -17
  39. package/esm2015/schneideress-dashboardframework.js +14 -15
  40. package/esm5/gridster/index.js +18 -19
  41. package/esm5/gridster/lib/gridster.component.js +803 -804
  42. package/esm5/gridster/lib/gridster.interface.js +94 -95
  43. package/esm5/gridster/lib/gridster.module.js +31 -32
  44. package/esm5/gridster/lib/gridsterCompact.service.js +253 -254
  45. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -180
  46. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -220
  47. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -162
  48. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -550
  49. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -359
  50. package/esm5/gridster/lib/gridsterItem.component.js +238 -239
  51. package/esm5/gridster/lib/gridsterItem.interface.js +46 -47
  52. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -59
  53. package/esm5/gridster/lib/gridsterPreview.component.js +70 -71
  54. package/esm5/gridster/lib/gridsterPush.service.js +547 -548
  55. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -424
  56. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -324
  57. package/esm5/gridster/lib/gridsterResizable.service.js +629 -630
  58. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -20
  59. package/esm5/gridster/lib/gridsterScroll.service.js +195 -196
  60. package/esm5/gridster/lib/gridsterSwap.service.js +152 -153
  61. package/esm5/gridster/lib/gridsterUtils.service.js +177 -178
  62. package/esm5/lib/custom.notifier.options.js +46 -47
  63. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +588 -589
  64. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +584 -575
  65. package/esm5/lib/ra.base.dashboard.filter.js +81 -82
  66. package/esm5/lib/ra.base.dashboard.template.js +74 -75
  67. package/esm5/lib/ra.dashbard.event.bus.js +125 -126
  68. package/esm5/lib/ra.dashboard.module.js +55 -54
  69. package/esm5/lib/ra.dashboard.service.js +221 -222
  70. package/esm5/lib/ra.event.enum.js +51 -52
  71. package/esm5/lib/ra.gridster.config.js +67 -68
  72. package/esm5/public-api.js +16 -17
  73. package/esm5/schneideress-dashboardframework.js +14 -15
  74. package/fesm2015/schneideress-dashboardframework.js +6118 -6136
  75. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  76. package/fesm5/schneideress-dashboardframework.js +7015 -7033
  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 +64 -63
  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,804 +1,803 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: gridster/lib/gridster.component.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
7
- import { GridsterConfigService } from './gridsterConfig.constant';
8
- import { GridsterUtils } from './gridsterUtils.service';
9
- import { GridsterEmptyCell } from './gridsterEmptyCell.service';
10
- import { GridsterCompact } from './gridsterCompact.service';
11
- import { GridsterRenderer } from './gridsterRenderer.service';
12
- var GridsterComponent = /** @class */ (function () {
13
- function GridsterComponent(el, renderer, cdRef, zone) {
14
- this.renderer = renderer;
15
- this.cdRef = cdRef;
16
- this.zone = zone;
17
- this.gridColumns = [];
18
- this.gridRows = [];
19
- this.el = el.nativeElement;
20
- this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
21
- this.calculateLayoutDebounce = GridsterUtils.debounce(this.calculateLayout.bind(this), 0);
22
- this.mobile = false;
23
- this.curWidth = 0;
24
- this.curHeight = 0;
25
- this.grid = [];
26
- this.curColWidth = 0;
27
- this.curRowHeight = 0;
28
- this.dragInProgress = false;
29
- this.emptyCell = new GridsterEmptyCell(this);
30
- this.compact = new GridsterCompact(this);
31
- this.gridRenderer = new GridsterRenderer(this);
32
- }
33
- /**
34
- * @param {?} item
35
- * @param {?} item2
36
- * @return {?}
37
- */
38
- GridsterComponent.checkCollisionTwoItems = /**
39
- * @param {?} item
40
- * @param {?} item2
41
- * @return {?}
42
- */
43
- function (item, item2) {
44
- return item.x < item2.x + item2.cols
45
- && item.x + item.cols > item2.x
46
- && item.y < item2.y + item2.rows
47
- && item.y + item.rows > item2.y;
48
- };
49
- /**
50
- * @return {?}
51
- */
52
- GridsterComponent.prototype.ngOnInit = /**
53
- * @return {?}
54
- */
55
- function () {
56
- if (this.options.initCallback) {
57
- this.options.initCallback(this);
58
- }
59
- };
60
- /**
61
- * @param {?} changes
62
- * @return {?}
63
- */
64
- GridsterComponent.prototype.ngOnChanges = /**
65
- * @param {?} changes
66
- * @return {?}
67
- */
68
- function (changes) {
69
- if (changes.options) {
70
- this.setOptions();
71
- this.options.api = {
72
- optionsChanged: this.optionsChanged.bind(this),
73
- resize: this.onResize.bind(this),
74
- getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
75
- getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
76
- getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
77
- getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
78
- };
79
- this.columns = this.$options.minCols;
80
- this.rows = this.$options.minRows;
81
- this.setGridSize();
82
- this.calculateLayout();
83
- }
84
- };
85
- /**
86
- * @return {?}
87
- */
88
- GridsterComponent.prototype.getCurrentRowHeight = /**
89
- * @return {?}
90
- */
91
- function () {
92
- return this.curRowHeight;
93
- };
94
- /**
95
- * @return {?}
96
- */
97
- GridsterComponent.prototype.resize = /**
98
- * @return {?}
99
- */
100
- function () {
101
- /** @type {?} */
102
- var height;
103
- /** @type {?} */
104
- var width;
105
- if (this.$options.gridType === 'fit' && !this.mobile) {
106
- width = this.el.offsetWidth;
107
- height = this.el.offsetHeight;
108
- }
109
- else {
110
- width = this.el.clientWidth;
111
- height = this.el.clientHeight;
112
- }
113
- if ((width !== this.curWidth || height !== this.curHeight) && this.checkIfToResize()) {
114
- this.onResize();
115
- }
116
- };
117
- /**
118
- * @return {?}
119
- */
120
- GridsterComponent.prototype.setOptions = /**
121
- * @return {?}
122
- */
123
- function () {
124
- this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
125
- if (!this.$options.disableWindowResize && !this.windowResize) {
126
- this.windowResize = this.renderer.listen('window', 'resize', this.onResize.bind(this));
127
- }
128
- else if (this.$options.disableWindowResize && this.windowResize) {
129
- this.windowResize();
130
- this.windowResize = null;
131
- }
132
- this.emptyCell.updateOptions();
133
- };
134
- /**
135
- * @return {?}
136
- */
137
- GridsterComponent.prototype.optionsChanged = /**
138
- * @return {?}
139
- */
140
- function () {
141
- this.setOptions();
142
- /** @type {?} */
143
- var widgetsIndex = this.grid.length - 1;
144
- /** @type {?} */
145
- var widget;
146
- for (; widgetsIndex >= 0; widgetsIndex--) {
147
- widget = this.grid[widgetsIndex];
148
- widget.updateOptions();
149
- }
150
- this.calculateLayout();
151
- };
152
- /**
153
- * @return {?}
154
- */
155
- GridsterComponent.prototype.ngOnDestroy = /**
156
- * @return {?}
157
- */
158
- function () {
159
- if (this.windowResize) {
160
- this.windowResize();
161
- }
162
- if (this.options.destroyCallback) {
163
- this.options.destroyCallback(this);
164
- }
165
- //if (this.options.api) {
166
- /* this.options.api getting undefined for new dashboard load- temp fix
167
- * on new dashboard area load, old dashboard area gets destroyed, but that leads to
168
- * ondestroy of current this.options.api instance - needs to investigate further
169
- */
170
- if (false) {
171
- this.options.api.resize = undefined;
172
- this.options.api.optionsChanged = undefined;
173
- this.options.api.getNextPossiblePosition = undefined;
174
- this.options.api = undefined;
175
- }
176
- this.emptyCell.destroy();
177
- delete this.emptyCell;
178
- this.compact.destroy();
179
- delete this.compact;
180
- };
181
- /**
182
- * @return {?}
183
- */
184
- GridsterComponent.prototype.onResize = /**
185
- * @return {?}
186
- */
187
- function () {
188
- this.setGridSize();
189
- this.calculateLayout();
190
- };
191
- /**
192
- * @return {?}
193
- */
194
- GridsterComponent.prototype.checkIfToResize = /**
195
- * @return {?}
196
- */
197
- function () {
198
- /** @type {?} */
199
- var clientWidth = this.el.clientWidth;
200
- /** @type {?} */
201
- var offsetWidth = this.el.offsetWidth;
202
- /** @type {?} */
203
- var scrollWidth = this.el.scrollWidth;
204
- /** @type {?} */
205
- var clientHeight = this.el.clientHeight;
206
- /** @type {?} */
207
- var offsetHeight = this.el.offsetHeight;
208
- /** @type {?} */
209
- var scrollHeight = this.el.scrollHeight;
210
- /** @type {?} */
211
- var verticalScrollPresent = clientWidth < offsetWidth && scrollHeight > offsetHeight
212
- && scrollHeight - offsetHeight < offsetWidth - clientWidth;
213
- /** @type {?} */
214
- var horizontalScrollPresent = clientHeight < offsetHeight
215
- && scrollWidth > offsetWidth && scrollWidth - offsetWidth < offsetHeight - clientHeight;
216
- if (verticalScrollPresent) {
217
- return false;
218
- }
219
- return !horizontalScrollPresent;
220
- };
221
- /**
222
- * @return {?}
223
- */
224
- GridsterComponent.prototype.setGridSize = /**
225
- * @return {?}
226
- */
227
- function () {
228
- /** @type {?} */
229
- var el = this.el;
230
- /** @type {?} */
231
- var width = el.clientWidth;
232
- /** @type {?} */
233
- var height = el.clientHeight;
234
- if (this.$options.setGridSize || this.$options.gridType === 'fit' && !this.mobile) {
235
- width = el.offsetWidth;
236
- height = el.offsetHeight;
237
- }
238
- else {
239
- width = el.clientWidth;
240
- height = el.clientHeight;
241
- }
242
- this.curWidth = width;
243
- this.curHeight = height;
244
- };
245
- /**
246
- * @return {?}
247
- */
248
- GridsterComponent.prototype.setGridDimensions = /**
249
- * @return {?}
250
- */
251
- function () {
252
- this.setGridSize();
253
- if (!this.mobile && this.$options.mobileBreakpoint > this.curWidth) {
254
- this.mobile = !this.mobile;
255
- this.renderer.addClass(this.el, 'mobile');
256
- }
257
- else if (this.mobile && this.$options.mobileBreakpoint < this.curWidth) {
258
- this.mobile = !this.mobile;
259
- this.renderer.removeClass(this.el, 'mobile');
260
- }
261
- /** @type {?} */
262
- var rows = this.$options.minRows;
263
- /** @type {?} */
264
- var columns = this.$options.minCols;
265
- /** @type {?} */
266
- var widgetsIndex = this.grid.length - 1;
267
- /** @type {?} */
268
- var widget;
269
- for (; widgetsIndex >= 0; widgetsIndex--) {
270
- widget = this.grid[widgetsIndex];
271
- if (!widget.notPlaced) {
272
- rows = Math.max(rows, widget.$item.y + widget.$item.rows);
273
- columns = Math.max(columns, widget.$item.x + widget.$item.cols);
274
- }
275
- }
276
- if (this.columns !== columns || this.rows !== rows) {
277
- this.columns = columns;
278
- this.rows = rows;
279
- if (this.options.gridSizeChangedCallback) {
280
- this.options.gridSizeChangedCallback(this);
281
- }
282
- }
283
- };
284
- /**
285
- * @return {?}
286
- */
287
- GridsterComponent.prototype.calculateLayout = /**
288
- * @return {?}
289
- */
290
- function () {
291
- if (this.compact) {
292
- this.compact.checkCompact();
293
- }
294
- this.setGridDimensions();
295
- if (this.$options.outerMargin) {
296
- /** @type {?} */
297
- var marginWidth = -this.$options.margin;
298
- if (this.$options.outerMarginLeft !== null) {
299
- marginWidth += this.$options.outerMarginLeft;
300
- this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
301
- }
302
- else {
303
- marginWidth += this.$options.margin;
304
- this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
305
- }
306
- if (this.$options.outerMarginRight !== null) {
307
- marginWidth += this.$options.outerMarginRight;
308
- this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
309
- }
310
- else {
311
- marginWidth += this.$options.margin;
312
- this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
313
- }
314
- this.curColWidth = (this.curWidth - marginWidth) / this.columns;
315
- /** @type {?} */
316
- var marginHeight = -this.$options.margin;
317
- if (this.$options.outerMarginTop !== null) {
318
- marginHeight += this.$options.outerMarginTop;
319
- this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
320
- }
321
- else {
322
- marginHeight += this.$options.margin;
323
- this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
324
- }
325
- if (this.$options.outerMarginBottom !== null) {
326
- marginHeight += this.$options.outerMarginBottom;
327
- this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
328
- }
329
- else {
330
- marginHeight += this.$options.margin;
331
- this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
332
- }
333
- this.curRowHeight = (this.curHeight - marginHeight) / this.rows;
334
- }
335
- else {
336
- this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
337
- this.curRowHeight = (this.curHeight + this.$options.margin) / this.rows;
338
- this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
339
- this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
340
- this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
341
- this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
342
- }
343
- this.gridRenderer.updateGridster();
344
- this.updateGrid();
345
- if (this.$options.setGridSize) {
346
- this.renderer.setStyle(this.el, 'width', (this.columns * this.curColWidth + this.$options.margin) + 'px');
347
- this.renderer.setStyle(this.el, 'height', (this.rows * this.curRowHeight + this.$options.margin) + 'px');
348
- }
349
- else {
350
- this.renderer.setStyle(this.el, 'width', '');
351
- this.renderer.setStyle(this.el, 'height', '');
352
- }
353
- /** @type {?} */
354
- var widgetsIndex = this.grid.length - 1;
355
- /** @type {?} */
356
- var widget;
357
- for (; widgetsIndex >= 0; widgetsIndex--) {
358
- widget = this.grid[widgetsIndex];
359
- widget.setSize();
360
- widget.drag.toggle();
361
- widget.resize.toggle();
362
- }
363
- setTimeout(this.resize.bind(this), 100);
364
- };
365
- /**
366
- * @return {?}
367
- */
368
- GridsterComponent.prototype.updateGrid = /**
369
- * @return {?}
370
- */
371
- function () {
372
- if (this.$options.displayGrid === 'always' && !this.mobile) {
373
- this.renderer.addClass(this.el, 'display-grid');
374
- }
375
- else if (this.$options.displayGrid === 'onDrag&Resize' && this.dragInProgress) {
376
- this.renderer.addClass(this.el, 'display-grid');
377
- }
378
- else if (this.$options.displayGrid === 'none' || !this.dragInProgress || this.mobile) {
379
- this.renderer.removeClass(this.el, 'display-grid');
380
- }
381
- this.setGridDimensions();
382
- this.gridColumns.length = Math.max(this.columns, Math.floor(this.curWidth / this.curColWidth)) || 0;
383
- this.gridRows.length = Math.max(this.rows, Math.floor(this.curHeight / this.curRowHeight)) || 0;
384
- this.cdRef.markForCheck();
385
- };
386
- /**
387
- * @param {?} itemComponent
388
- * @return {?}
389
- */
390
- GridsterComponent.prototype.addItem = /**
391
- * @param {?} itemComponent
392
- * @return {?}
393
- */
394
- function (itemComponent) {
395
- if (itemComponent.$item.cols === undefined) {
396
- itemComponent.$item.cols = this.$options.defaultItemCols;
397
- itemComponent.item.cols = itemComponent.$item.cols;
398
- itemComponent.itemChanged();
399
- }
400
- if (itemComponent.$item.rows === undefined) {
401
- itemComponent.$item.rows = this.$options.defaultItemRows;
402
- itemComponent.item.rows = itemComponent.$item.rows;
403
- itemComponent.itemChanged();
404
- }
405
- if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
406
- this.autoPositionItem(itemComponent);
407
- }
408
- else if (this.checkCollision(itemComponent.$item)) {
409
- if (!this.$options.disableWarnings) {
410
- itemComponent.notPlaced = true;
411
- console.warn('Can\'t be placed in the bounds of the dashboard, trying to auto position!/n' +
412
- JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
413
- }
414
- if (!this.$options.disableAutoPositionOnConflict) {
415
- this.autoPositionItem(itemComponent);
416
- }
417
- else {
418
- itemComponent.notPlaced = true;
419
- }
420
- }
421
- this.grid.push(itemComponent);
422
- this.calculateLayoutDebounce();
423
- };
424
- /**
425
- * @param {?} itemComponent
426
- * @return {?}
427
- */
428
- GridsterComponent.prototype.removeItem = /**
429
- * @param {?} itemComponent
430
- * @return {?}
431
- */
432
- function (itemComponent) {
433
- this.grid.splice(this.grid.indexOf(itemComponent), 1);
434
- this.calculateLayoutDebounce();
435
- if (this.options.itemRemovedCallback) {
436
- this.options.itemRemovedCallback(itemComponent.item, itemComponent);
437
- }
438
- };
439
- /**
440
- * @param {?} item
441
- * @return {?}
442
- */
443
- GridsterComponent.prototype.checkCollision = /**
444
- * @param {?} item
445
- * @return {?}
446
- */
447
- function (item) {
448
- /** @type {?} */
449
- var collision = false;
450
- if (this.options.itemValidateCallback) {
451
- collision = !this.options.itemValidateCallback(item);
452
- }
453
- if (!collision && this.checkGridCollision(item)) {
454
- collision = true;
455
- }
456
- if (!collision) {
457
- /** @type {?} */
458
- var c = this.findItemWithItem(item);
459
- if (c) {
460
- collision = c;
461
- }
462
- }
463
- return collision;
464
- };
465
- /**
466
- * @param {?} item
467
- * @return {?}
468
- */
469
- GridsterComponent.prototype.checkGridCollision = /**
470
- * @param {?} item
471
- * @return {?}
472
- */
473
- function (item) {
474
- /** @type {?} */
475
- var noNegativePosition = item.y > -1 && item.x > -1;
476
- /** @type {?} */
477
- var maxGridCols = item.cols + item.x <= this.$options.maxCols;
478
- /** @type {?} */
479
- var maxGridRows = item.rows + item.y <= this.$options.maxRows;
480
- /** @type {?} */
481
- var maxItemCols = item.maxItemCols === undefined ? this.$options.maxItemCols : item.maxItemCols;
482
- /** @type {?} */
483
- var minItemCols = item.minItemCols === undefined ? this.$options.minItemCols : item.minItemCols;
484
- /** @type {?} */
485
- var maxItemRows = item.maxItemRows === undefined ? this.$options.maxItemRows : item.maxItemRows;
486
- /** @type {?} */
487
- var minItemRows = item.minItemRows === undefined ? this.$options.minItemRows : item.minItemRows;
488
- /** @type {?} */
489
- var inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
490
- /** @type {?} */
491
- var inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
492
- /** @type {?} */
493
- var minAreaLimit = item.minItemArea === undefined ? this.$options.minItemArea : item.minItemArea;
494
- /** @type {?} */
495
- var maxAreaLimit = item.maxItemArea === undefined ? this.$options.maxItemArea : item.maxItemArea;
496
- /** @type {?} */
497
- var area = item.cols * item.rows;
498
- /** @type {?} */
499
- var inMinArea = minAreaLimit <= area;
500
- /** @type {?} */
501
- var inMaxArea = maxAreaLimit >= area;
502
- return !(noNegativePosition && maxGridCols && maxGridRows && inColsLimits && inRowsLimits && inMinArea && inMaxArea);
503
- };
504
- /**
505
- * @param {?} item
506
- * @return {?}
507
- */
508
- GridsterComponent.prototype.findItemWithItem = /**
509
- * @param {?} item
510
- * @return {?}
511
- */
512
- function (item) {
513
- /** @type {?} */
514
- var widgetsIndex = this.grid.length - 1;
515
- /** @type {?} */
516
- var widget;
517
- for (; widgetsIndex > -1; widgetsIndex--) {
518
- widget = this.grid[widgetsIndex];
519
- if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
520
- return widget;
521
- }
522
- }
523
- return false;
524
- };
525
- /**
526
- * @param {?} item
527
- * @return {?}
528
- */
529
- GridsterComponent.prototype.findItemsWithItem = /**
530
- * @param {?} item
531
- * @return {?}
532
- */
533
- function (item) {
534
- /** @type {?} */
535
- var a = [];
536
- /** @type {?} */
537
- var widgetsIndex = this.grid.length - 1;
538
- /** @type {?} */
539
- var widget;
540
- for (; widgetsIndex > -1; widgetsIndex--) {
541
- widget = this.grid[widgetsIndex];
542
- if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
543
- a.push(widget);
544
- }
545
- }
546
- return a;
547
- };
548
- /**
549
- * @param {?} itemComponent
550
- * @return {?}
551
- */
552
- GridsterComponent.prototype.autoPositionItem = /**
553
- * @param {?} itemComponent
554
- * @return {?}
555
- */
556
- function (itemComponent) {
557
- if (this.getNextPossiblePosition(itemComponent.$item)) {
558
- itemComponent.notPlaced = false;
559
- itemComponent.item.x = itemComponent.$item.x;
560
- itemComponent.item.y = itemComponent.$item.y;
561
- itemComponent.itemChanged();
562
- }
563
- else {
564
- itemComponent.notPlaced = true;
565
- if (!this.$options.disableWarnings) {
566
- console.warn('Can\'t be placed in the bounds of the dashboard!/n' +
567
- JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
568
- }
569
- }
570
- };
571
- /**
572
- * @param {?} newItem
573
- * @param {?=} startingFrom
574
- * @return {?}
575
- */
576
- GridsterComponent.prototype.getNextPossiblePosition = /**
577
- * @param {?} newItem
578
- * @param {?=} startingFrom
579
- * @return {?}
580
- */
581
- function (newItem, startingFrom) {
582
- if (startingFrom === void 0) { startingFrom = {}; }
583
- if (newItem.cols === -1) {
584
- newItem.cols = this.$options.defaultItemCols;
585
- }
586
- if (newItem.rows === -1) {
587
- newItem.rows = this.$options.defaultItemRows;
588
- }
589
- this.setGridDimensions();
590
- /** @type {?} */
591
- var rowsIndex = startingFrom.y || 0;
592
- /** @type {?} */
593
- var colsIndex;
594
- for (; rowsIndex < this.rows; rowsIndex++) {
595
- newItem.y = rowsIndex;
596
- colsIndex = startingFrom.x || 0;
597
- for (; colsIndex < this.columns; colsIndex++) {
598
- newItem.x = colsIndex;
599
- if (!this.checkCollision(newItem)) {
600
- return true;
601
- }
602
- }
603
- }
604
- /** @type {?} */
605
- var canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
606
- /** @type {?} */
607
- var canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
608
- /** @type {?} */
609
- var addToRows = this.rows <= this.columns && canAddToRows;
610
- if (!addToRows && canAddToColumns) {
611
- newItem.x = this.columns;
612
- newItem.y = 0;
613
- return true;
614
- }
615
- else if (canAddToRows) {
616
- newItem.y = this.rows;
617
- newItem.x = 0;
618
- return true;
619
- }
620
- return false;
621
- };
622
- /**
623
- * @param {?} item
624
- * @return {?}
625
- */
626
- GridsterComponent.prototype.getFirstPossiblePosition = /**
627
- * @param {?} item
628
- * @return {?}
629
- */
630
- function (item) {
631
- /** @type {?} */
632
- var tmpItem = Object.assign({}, item);
633
- this.getNextPossiblePosition(tmpItem);
634
- return tmpItem;
635
- };
636
- /**
637
- * @param {?} item
638
- * @return {?}
639
- */
640
- GridsterComponent.prototype.getLastPossiblePosition = /**
641
- * @param {?} item
642
- * @return {?}
643
- */
644
- function (item) {
645
- /** @type {?} */
646
- var farthestItem = { y: 0, x: 0 };
647
- farthestItem = this.grid.reduce((/**
648
- * @param {?} prev
649
- * @param {?} curr
650
- * @return {?}
651
- */
652
- function (prev, curr) {
653
- /** @type {?} */
654
- var currCoords = { y: curr.$item.y + curr.$item.rows - 1, x: curr.$item.x + curr.$item.cols - 1 };
655
- if (GridsterUtils.compareItems(prev, currCoords) === 1) {
656
- return currCoords;
657
- }
658
- else {
659
- return prev;
660
- }
661
- }), farthestItem);
662
- /** @type {?} */
663
- var tmpItem = Object.assign({}, item);
664
- this.getNextPossiblePosition(tmpItem, farthestItem);
665
- return tmpItem;
666
- };
667
- /**
668
- * @param {?} x
669
- * @param {?} roundingMethod
670
- * @param {?=} noLimit
671
- * @return {?}
672
- */
673
- GridsterComponent.prototype.pixelsToPositionX = /**
674
- * @param {?} x
675
- * @param {?} roundingMethod
676
- * @param {?=} noLimit
677
- * @return {?}
678
- */
679
- function (x, roundingMethod, noLimit) {
680
- /** @type {?} */
681
- var position = roundingMethod(x / this.curColWidth);
682
- if (noLimit) {
683
- return position;
684
- }
685
- else {
686
- return Math.max(position, 0);
687
- }
688
- };
689
- /**
690
- * @param {?} y
691
- * @param {?} roundingMethod
692
- * @param {?=} noLimit
693
- * @return {?}
694
- */
695
- GridsterComponent.prototype.pixelsToPositionY = /**
696
- * @param {?} y
697
- * @param {?} roundingMethod
698
- * @param {?=} noLimit
699
- * @return {?}
700
- */
701
- function (y, roundingMethod, noLimit) {
702
- /** @type {?} */
703
- var position = roundingMethod(y / this.curRowHeight);
704
- if (noLimit) {
705
- return position;
706
- }
707
- else {
708
- return Math.max(position, 0);
709
- }
710
- };
711
- /**
712
- * @param {?} x
713
- * @return {?}
714
- */
715
- GridsterComponent.prototype.positionXToPixels = /**
716
- * @param {?} x
717
- * @return {?}
718
- */
719
- function (x) {
720
- return x * this.curColWidth;
721
- };
722
- /**
723
- * @param {?} y
724
- * @return {?}
725
- */
726
- GridsterComponent.prototype.positionYToPixels = /**
727
- * @param {?} y
728
- * @return {?}
729
- */
730
- function (y) {
731
- return y * this.curRowHeight;
732
- };
733
- GridsterComponent.decorators = [
734
- { type: Component, args: [{
735
- selector: 'gridster',
736
- template: "<div class=\"gridster-column\" *ngFor=\"let column of gridColumns; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"></div>\r\n<div class=\"gridster-row\" *ngFor=\"let row of gridRows; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"></div>\r\n<ng-content></ng-content>\r\n<gridster-preview class=\"gridster-preview\"></gridster-preview>\r\n",
737
- encapsulation: ViewEncapsulation.None,
738
- styles: ["gridster{clear:both;position:relative;box-sizing:border-box;background:#fff;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;overflow:auto}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;-webkit-transition:.3s;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid #ccc;border-right:1px solid #ccc}gridster .gridster-row{border-top:1px solid #ccc;border-bottom:1px solid #ccc}"]
739
- }] }
740
- ];
741
- /** @nocollapse */
742
- GridsterComponent.ctorParameters = function () { return [
743
- { type: ElementRef },
744
- { type: Renderer2 },
745
- { type: ChangeDetectorRef },
746
- { type: NgZone }
747
- ]; };
748
- GridsterComponent.propDecorators = {
749
- options: [{ type: Input }]
750
- };
751
- return GridsterComponent;
752
- }());
753
- export { GridsterComponent };
754
- if (false) {
755
- /** @type {?} */
756
- GridsterComponent.prototype.options;
757
- /** @type {?} */
758
- GridsterComponent.prototype.calculateLayoutDebounce;
759
- /** @type {?} */
760
- GridsterComponent.prototype.movingItem;
761
- /** @type {?} */
762
- GridsterComponent.prototype.previewStyle;
763
- /** @type {?} */
764
- GridsterComponent.prototype.el;
765
- /** @type {?} */
766
- GridsterComponent.prototype.$options;
767
- /** @type {?} */
768
- GridsterComponent.prototype.mobile;
769
- /** @type {?} */
770
- GridsterComponent.prototype.curWidth;
771
- /** @type {?} */
772
- GridsterComponent.prototype.curHeight;
773
- /** @type {?} */
774
- GridsterComponent.prototype.grid;
775
- /** @type {?} */
776
- GridsterComponent.prototype.columns;
777
- /** @type {?} */
778
- GridsterComponent.prototype.rows;
779
- /** @type {?} */
780
- GridsterComponent.prototype.curColWidth;
781
- /** @type {?} */
782
- GridsterComponent.prototype.curRowHeight;
783
- /** @type {?} */
784
- GridsterComponent.prototype.gridColumns;
785
- /** @type {?} */
786
- GridsterComponent.prototype.gridRows;
787
- /** @type {?} */
788
- GridsterComponent.prototype.windowResize;
789
- /** @type {?} */
790
- GridsterComponent.prototype.dragInProgress;
791
- /** @type {?} */
792
- GridsterComponent.prototype.emptyCell;
793
- /** @type {?} */
794
- GridsterComponent.prototype.compact;
795
- /** @type {?} */
796
- GridsterComponent.prototype.gridRenderer;
797
- /** @type {?} */
798
- GridsterComponent.prototype.renderer;
799
- /** @type {?} */
800
- GridsterComponent.prototype.cdRef;
801
- /** @type {?} */
802
- GridsterComponent.prototype.zone;
803
- }
804
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBSU4sU0FBUyxFQUVULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSTVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzlEO0lBNkJFLDJCQUFZLEVBQWMsRUFBUyxRQUFtQixFQUFTLEtBQXdCLEVBQVMsSUFBWTtRQUF6RSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBUjVHLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFRWixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElB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QUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVzs7WUFDM0YsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVc7O1lBQzNGLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXOztZQUMzRixXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVzs7WUFDM0YsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVzs7WUFDbkUsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVzs7WUFDbkUsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVc7O1lBQzVGLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXOztZQUM1RixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTs7WUFDNUIsU0FBUyxHQUFHLFlBQVksSUFBSSxJQUFJOztZQUNoQyxTQUFTLEdBQUcsWUFBWSxJQUFJLElBQUk7UUFDdEMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLElBQUksV0FBVyxJQUFJLFdBQVcsSUFB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QWM7O0lBQ2QseUNBQWtDOztJQUNsQywyQ0FBd0I7O0lBQ3hCLHNDQUE2Qjs7SUFDN0Isb0NBQXlCOztJQUN6Qix5Q0FBK0I7O0lBRUgscUNBQTBCOztJQUFFLGtDQUErQjs7SUFBRSxpQ0FBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE5nWm9uZSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5jb25zdGFudCc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclV0aWxzIH0gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlckVtcHR5Q2VsbCB9IGZyb20gJy4vZ3JpZHN0ZXJFbXB0eUNlbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29tcGFjdCB9IGZyb20gJy4vZ3JpZHN0ZXJDb21wYWN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZ1MgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnUy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gJy4vZ3JpZHN0ZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW1Db21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJSZW5kZXJlciB9IGZyb20gJy4vZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW0uaW50ZXJmYWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3JpZHN0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkc3Rlci5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkc3Rlci5jc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIHtcclxuICBASW5wdXQoKSBvcHRpb25zOiBHcmlkc3RlckNvbmZpZztcclxuICBjYWxjdWxhdGVMYXlvdXREZWJvdW5jZTogKCkgPT4gdm9pZDtcclxuICBtb3ZpbmdJdGVtOiBHcmlkc3Rlckl0ZW0gfCBudWxsO1xyXG4gIHByZXZpZXdTdHlsZTogKCkgPT4gdm9pZDtcclxuICBlbDogYW55O1xyXG4gICRvcHRpb25zOiBHcmlkc3RlckNvbmZpZ1M7XHJcbiAgbW9iaWxlOiBib29sZWFuO1xyXG4gIGN1cldpZHRoOiBudW1iZXI7XHJcbiAgY3VySGVpZ2h0OiBudW1iZXI7XHJcbiAgZ3JpZDogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPjtcclxuICBjb2x1bW5zOiBudW1iZXI7XHJcbiAgcm93czogbnVtYmVyO1xyXG4gIGN1ckNvbFdpZHRoOiBudW1iZXI7XHJcbiAgY3VyUm93SGVpZ2h0OiBudW1iZXI7XHJcbiAgZ3JpZENvbHVtbnMgPSBbXTtcclxuICBncmlkUm93cyA9IFtdO1xyXG4gIHdpbmRvd1Jlc2l6ZTogKCgpID0+IHZvaWQpIHwgbnVsbDtcclxuICBkcmFnSW5Qcm9ncmVzczogYm9vbGVhbjtcclxuICBlbXB0eUNlbGw6IEdyaWRzdGVyRW1wdHlDZWxsO1xyXG4gIGNvbXBhY3Q6IEdyaWRzdGVyQ29tcGFjdDtcclxuICBncmlkUmVuZGVyZXI6IEdyaWRzdGVyUmVuZGVyZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHVibGljIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgdGhpcy5lbCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLiRvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShHcmlkc3RlckNvbmZpZ1NlcnZpY2UpKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0RGVib3VuY2UgPSBHcmlkc3RlclV0aWxzLmRlYm91bmNlKHRoaXMuY2FsY3VsYXRlTGF5b3V0LmJpbmQodGhpcyksIDApO1xyXG4gICAgdGhpcy5tb2JpbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuY3VyV2lkdGggPSAwO1xyXG4gICAgdGhpcy5jdXJIZWlnaHQgPSAwO1xyXG4gICAgdGhpcy5ncmlkID0gW107XHJcbiAgICB0aGlzLmN1ckNvbFdpZHRoID0gMDtcclxuICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gMDtcclxuICAgIHRoaXMuZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIHRoaXMuZW1wdHlDZWxsID0gbmV3IEdyaWRzdGVyRW1wdHlDZWxsKHRoaXMpO1xyXG4gICAgdGhpcy5jb21wYWN0ID0gbmV3IEdyaWRzdGVyQ29tcGFjdCh0aGlzKTtcclxuICAgIHRoaXMuZ3JpZFJlbmRlcmVyID0gbmV3IEdyaWRzdGVyUmVuZGVyZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhpdGVtOiBHcmlkc3Rlckl0ZW0sIGl0ZW0yOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpdGVtLnggPCBpdGVtMi54ICsgaXRlbTIuY29sc1xyXG4gICAgICAmJiBpdGVtLnggKyBpdGVtLmNvbHMgPiBpdGVtMi54XHJcbiAgICAgICYmIGl0ZW0ueSA8IGl0ZW0yLnkgKyBpdGVtMi5yb3dzXHJcbiAgICAgICYmIGl0ZW0ueSArIGl0ZW0ucm93cyA+IGl0ZW0yLnk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5pbml0Q2FsbGJhY2sodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuc2V0T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpID0ge1xyXG4gICAgICAgIG9wdGlvbnNDaGFuZ2VkOiB0aGlzLm9wdGlvbnNDaGFuZ2VkLmJpbmQodGhpcyksXHJcbiAgICAgICAgcmVzaXplOiB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgICBnZXRDdXJyZW50Um93SGVpZ2h0OiB0aGlzLmdldEN1cnJlbnRSb3dIZWlnaHQuYmluZCh0aGlzKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xyXG4gICAgICB0aGlzLnJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3M7XHJcbiAgICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRSb3dIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmN1clJvd0hlaWdodDtcclxuICB9XHJcblxyXG4gIHJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIGxldCBoZWlnaHQ7XHJcbiAgICBsZXQgd2lkdGg7XHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gJ2ZpdCcgJiYgIXRoaXMubW9iaWxlKSB7XHJcbiAgICAgIHdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aWR0aCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgaWYgKCh3aWR0aCAhPT0gdGhpcy5jdXJXaWR0aCB8fCBoZWlnaHQgIT09IHRoaXMuY3VySGVpZ2h0KSAmJiB0aGlzLmNoZWNrSWZUb1Jlc2l6ZSgpKSB7XHJcbiAgICAgIHRoaXMub25SZXNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLiRvcHRpb25zID0gR3JpZHN0ZXJVdGlscy5tZXJnZSh0aGlzLiRvcHRpb25zLCB0aGlzLm9wdGlvbnMsIHRoaXMuJG9wdGlvbnMpO1xyXG4gICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXaW5kb3dSZXNpemUgJiYgIXRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcykpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc2FibGVXaW5kb3dSZXNpemUgJiYgdGhpcy53aW5kb3dSZXNpemUpIHtcclxuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcclxuICAgICAgdGhpcy53aW5kb3dSZXNpemUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbXB0eUNlbGwudXBkYXRlT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgb3B0aW9uc0NoYW5nZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldE9wdGlvbnMoKTtcclxuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPj0gMDsgd2lkZ2V0c0luZGV4LS0pIHtcclxuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XHJcbiAgICAgIHdpZGdldC51cGRhdGVPcHRpb25zKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemUpIHtcclxuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVzdHJveUNhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0cm95Q2FsbGJhY2sodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvL2lmICh0aGlzLm9wdGlvbnMuYXBpKSB7XHJcbiAgICAvKiB0aGlzLm9wdGlvbnMuYXBpIGdldHRpbmcgdW5kZWZpbmVkIGZvciBuZXcgZGFzaGJvYXJkIGxvYWQtIHRlbXAgZml4XHJcbiAgICAqICBvbiBuZXcgZGFzaGJvYXJkIGFyZWEgbG9hZCwgb2xkIGRhc2hib2FyZCBhcmVhIGdldHMgZGVzdHJveWVkLCBidXQgdGhhdCBsZWFkcyB0byBcclxuICAgICogIG9uZGVzdHJveSBvZiBjdXJyZW50IHRoaXMub3B0aW9ucy5hcGkgaW5zdGFuY2UgLSBuZWVkcyB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyXHJcbiAgICAqL1xyXG4gICAgaWYgKGZhbHNlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkucmVzaXplID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLm9wdGlvbnNDaGFuZ2VkID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbXB0eUNlbGwuZGVzdHJveSgpO1xyXG4gICAgZGVsZXRlIHRoaXMuZW1wdHlDZWxsO1xyXG4gICAgdGhpcy5jb21wYWN0LmRlc3Ryb3koKTtcclxuICAgIGRlbGV0ZSB0aGlzLmNvbXBhY3Q7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmVG9SZXNpemUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjbGllbnRXaWR0aCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XHJcbiAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XHJcbiAgICBjb25zdCBzY3JvbGxXaWR0aCA9IHRoaXMuZWwuc2Nyb2xsV2lkdGg7XHJcbiAgICBjb25zdCBjbGllbnRIZWlnaHQgPSB0aGlzLmVsLmNsaWVudEhlaWdodDtcclxuICAgIGNvbnN0IG9mZnNldEhlaWdodCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5lbC5zY3JvbGxIZWlnaHQ7XHJcbiAgICBjb25zdCB2ZXJ0aWNhbFNjcm9sbFByZXNlbnQgPSBjbGllbnRXaWR0aCA8IG9mZnNldFdpZHRoICYmIHNjcm9sbEhlaWdodCA+IG9mZnNldEhlaWdodFxyXG4gICAgICAmJiBzY3JvbGxIZWlnaHQgLSBvZmZzZXRIZWlnaHQgPCBvZmZzZXRXaWR0aCAtIGNsaWVudFdpZHRoO1xyXG4gICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQgPSBjbGllbnRIZWlnaHQgPCBvZmZzZXRIZWlnaHRcclxuICAgICAgJiYgc2Nyb2xsV2lkdGggPiBvZmZzZXRXaWR0aCAmJiBzY3JvbGxXaWR0aCAtIG9mZnNldFdpZHRoIDwgb2Zmc2V0SGVpZ2h0IC0gY2xpZW50SGVpZ2h0O1xyXG4gICAgaWYgKHZlcnRpY2FsU2Nyb2xsUHJlc2VudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWhvcml6b250YWxTY3JvbGxQcmVzZW50O1xyXG4gIH1cclxuXHJcbiAgc2V0R3JpZFNpemUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuZWw7XHJcbiAgICBsZXQgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcclxuICAgIGxldCBoZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7XHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSB8fCB0aGlzLiRvcHRpb25zLmdyaWRUeXBlID09PSAnZml0JyAmJiAhdGhpcy5tb2JpbGUpIHtcclxuICAgICAgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJXaWR0aCA9IHdpZHRoO1xyXG4gICAgdGhpcy5jdXJIZWlnaHQgPSBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBzZXRHcmlkRGltZW5zaW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcclxuICAgIGlmICghdGhpcy5tb2JpbGUgJiYgdGhpcy4kb3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ID4gdGhpcy5jdXJXaWR0aCkge1xyXG4gICAgICB0aGlzLm1vYmlsZSA9ICF0aGlzLm1vYmlsZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9iaWxlICYmIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA8IHRoaXMuY3VyV2lkdGgpIHtcclxuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ21vYmlsZScpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3MsIGNvbHVtbnMgPSB0aGlzLiRvcHRpb25zLm1pbkNvbHM7XHJcblxyXG4gICAgbGV0IHdpZGdldHNJbmRleCA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAoIXdpZGdldC5ub3RQbGFjZWQpIHtcclxuICAgICAgICByb3dzID0gTWF0aC5tYXgocm93cywgd2lkZ2V0LiRpdGVtLnkgKyB3aWRnZXQuJGl0ZW0ucm93cyk7XHJcbiAgICAgICAgY29sdW1ucyA9IE1hdGgubWF4KGNvbHVtbnMsIHdpZGdldC4kaXRlbS54ICsgd2lkZ2V0LiRpdGVtLmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPT0gY29sdW1ucyB8fCB0aGlzLnJvd3MgIT09IHJvd3MpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcclxuICAgICAgdGhpcy5yb3dzID0gcm93cztcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkU2l6ZUNoYW5nZWRDYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5ncmlkU2l6ZUNoYW5nZWRDYWxsYmFjayh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlTGF5b3V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29tcGFjdCkge1xyXG4gICAgICB0aGlzLmNvbXBhY3QuY2hlY2tDb21wYWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgbGV0IG1hcmdpbldpZHRoID0gLXRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdCArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0ICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jdXJDb2xXaWR0aCA9ICh0aGlzLmN1cldpZHRoIC0gbWFyZ2luV2lkdGgpIC8gdGhpcy5jb2x1bW5zO1xyXG4gICAgICBsZXQgbWFyZ2luSGVpZ2h0ID0gLXRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctdG9wJywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gKyAncHgnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gKHRoaXMuY3VySGVpZ2h0IC0gbWFyZ2luSGVpZ2h0KSAvIHRoaXMucm93cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VyQ29sV2lkdGggPSAodGhpcy5jdXJXaWR0aCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSAvIHRoaXMuY29sdW1ucztcclxuICAgICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAodGhpcy5jdXJIZWlnaHQgKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLnJvd3M7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIDAgKyAncHgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIDAgKyAncHgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCAwICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctYm90dG9tJywgMCArICdweCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkUmVuZGVyZXIudXBkYXRlR3JpZHN0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICh0aGlzLmNvbHVtbnMgKiB0aGlzLmN1ckNvbFdpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICh0aGlzLnJvd3MgKiB0aGlzLmN1clJvd0hlaWdodCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSArICdweCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnd2lkdGgnLCAnJyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICB3aWRnZXQuc2V0U2l6ZSgpO1xyXG4gICAgICB3aWRnZXQuZHJhZy50b2dnbGUoKTtcclxuICAgICAgd2lkZ2V0LnJlc2l6ZS50b2dnbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KHRoaXMucmVzaXplLmJpbmQodGhpcyksIDEwMCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHcmlkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdhbHdheXMnICYmICF0aGlzLm1vYmlsZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ29uRHJhZyZSZXNpemUnICYmIHRoaXMuZHJhZ0luUHJvZ3Jlc3MpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdub25lJyB8fCAhdGhpcy5kcmFnSW5Qcm9ncmVzcyB8fCB0aGlzLm1vYmlsZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcclxuICAgIHRoaXMuZ3JpZENvbHVtbnMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5jb2x1bW5zLCBNYXRoLmZsb29yKHRoaXMuY3VyV2lkdGggLyB0aGlzLmN1ckNvbFdpZHRoKSkgfHwgMDtcclxuICAgIHRoaXMuZ3JpZFJvd3MubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5yb3dzLCBNYXRoLmZsb29yKHRoaXMuY3VySGVpZ2h0IC8gdGhpcy5jdXJSb3dIZWlnaHQpKSB8fCAwO1xyXG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGFkZEl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbUNvbHM7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS5jb2xzID0gaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbVJvd3M7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS5yb3dzID0gaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS54ID09PSAtMSB8fCBpdGVtQ29tcG9uZW50LiRpdGVtLnkgPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja0NvbGxpc2lvbihpdGVtQ29tcG9uZW50LiRpdGVtKSkge1xyXG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzKSB7XHJcbiAgICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQ2FuXFwndCBiZSBwbGFjZWQgaW4gdGhlIGJvdW5kcyBvZiB0aGUgZGFzaGJvYXJkLCB0cnlpbmcgdG8gYXV0byBwb3NpdGlvbiEvbicgK1xyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbXBvbmVudC5pdGVtLCBbJ2NvbHMnLCAncm93cycsICd4JywgJ3knXSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlQXV0b1Bvc2l0aW9uT25Db25mbGljdCkge1xyXG4gICAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5wdXNoKGl0ZW1Db21wb25lbnQpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXREZWJvdW5jZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlSXRlbShpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5zcGxpY2UodGhpcy5ncmlkLmluZGV4T2YoaXRlbUNvbXBvbmVudCksIDEpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXREZWJvdW5jZSgpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pdGVtUmVtb3ZlZENhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5pdGVtUmVtb3ZlZENhbGxiYWNrKGl0ZW1Db21wb25lbnQuaXRlbSwgaXRlbUNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0NvbGxpc2lvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuIHtcclxuICAgIGxldCBjb2xsaXNpb246IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2spIHtcclxuICAgICAgY29sbGlzaW9uID0gIXRoaXMub3B0aW9ucy5pdGVtVmFsaWRhdGVDYWxsYmFjayhpdGVtKTtcclxuICAgIH1cclxuICAgIGlmICghY29sbGlzaW9uICYmIHRoaXMuY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW0pKSB7XHJcbiAgICAgIGNvbGxpc2lvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbGxpc2lvbikge1xyXG4gICAgICBjb25zdCBjID0gdGhpcy5maW5kSXRlbVdpdGhJdGVtKGl0ZW0pO1xyXG4gICAgICBpZiAoYykge1xyXG4gICAgICAgIGNvbGxpc2lvbiA9IGM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb2xsaXNpb247XHJcbiAgfVxyXG5cclxuICBjaGVja0dyaWRDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBub05lZ2F0aXZlUG9zaXRpb24gPSBpdGVtLnkgPiAtMSAmJiBpdGVtLnggPiAtMTtcclxuICAgIGNvbnN0IG1heEdyaWRDb2xzID0gaXRlbS5jb2xzICsgaXRlbS54IDw9IHRoaXMuJG9wdGlvbnMubWF4Q29scztcclxuICAgIGNvbnN0IG1heEdyaWRSb3dzID0gaXRlbS5yb3dzICsgaXRlbS55IDw9IHRoaXMuJG9wdGlvbnMubWF4Um93cztcclxuICAgIGNvbnN0IG1heEl0ZW1Db2xzID0gaXRlbS5tYXhJdGVtQ29scyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtQ29scyA6IGl0ZW0ubWF4SXRlbUNvbHM7XHJcbiAgICBjb25zdCBtaW5JdGVtQ29scyA9IGl0ZW0ubWluSXRlbUNvbHMgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWluSXRlbUNvbHMgOiBpdGVtLm1pbkl0ZW1Db2xzO1xyXG4gICAgY29uc3QgbWF4SXRlbVJvd3MgPSBpdGVtLm1heEl0ZW1Sb3dzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Sb3dzIDogaXRlbS5tYXhJdGVtUm93cztcclxuICAgIGNvbnN0IG1pbkl0ZW1Sb3dzID0gaXRlbS5taW5JdGVtUm93cyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtUm93cyA6IGl0ZW0ubWluSXRlbVJvd3M7XHJcbiAgICBjb25zdCBpbkNvbHNMaW1pdHMgPSBpdGVtLmNvbHMgPD0gbWF4SXRlbUNvbHMgJiYgaXRlbS5jb2xzID49IG1pbkl0ZW1Db2xzO1xyXG4gICAgY29uc3QgaW5Sb3dzTGltaXRzID0gaXRlbS5yb3dzIDw9IG1heEl0ZW1Sb3dzICYmIGl0ZW0ucm93cyA+PSBtaW5JdGVtUm93cztcclxuICAgIGNvbnN0IG1pbkFyZWFMaW1pdCA9IGl0ZW0ubWluSXRlbUFyZWEgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWluSXRlbUFyZWEgOiBpdGVtLm1pbkl0ZW1BcmVhO1xyXG4gICAgY29uc3QgbWF4QXJlYUxpbWl0ID0gaXRlbS5tYXhJdGVtQXJlYSA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtQXJlYSA6IGl0ZW0ubWF4SXRlbUFyZWE7XHJcbiAgICBjb25zdCBhcmVhID0gaXRlbS5jb2xzICogaXRlbS5yb3dzO1xyXG4gICAgY29uc3QgaW5NaW5BcmVhID0gbWluQXJlYUxpbWl0IDw9IGFyZWE7XHJcbiAgICBjb25zdCBpbk1heEFyZWEgPSBtYXhBcmVhTGltaXQgPj0gYXJlYTtcclxuICAgIHJldHVybiAhKG5vTmVnYXRpdmVQb3NpdGlvbiAmJiBtYXhHcmlkQ29scyAmJiBtYXhHcmlkUm93cyAmJiBpbkNvbHNMaW1pdHMgJiYgaW5Sb3dzTGltaXRzICYmIGluTWluQXJlYSAmJiBpbk1heEFyZWEpO1xyXG4gIH1cclxuXHJcbiAgZmluZEl0ZW1XaXRoSXRlbShpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuIHtcclxuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPiAtMTsgd2lkZ2V0c0luZGV4LS0pIHtcclxuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XHJcbiAgICAgIGlmICh3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiYgR3JpZHN0ZXJDb21wb25lbnQuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyh3aWRnZXQuJGl0ZW0sIGl0ZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpZGdldDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZmluZEl0ZW1zV2l0aEl0ZW0oaXRlbTogR3JpZHN0ZXJJdGVtKTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiB7XHJcbiAgICBjb25zdCBhOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+ID0gW107XHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID4gLTE7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAod2lkZ2V0LiRpdGVtICE9PSBpdGVtICYmIEdyaWRzdGVyQ29tcG9uZW50LmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMod2lkZ2V0LiRpdGVtLCBpdGVtKSkge1xyXG4gICAgICAgIGEucHVzaCh3aWRnZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYTtcclxuICB9XHJcblxyXG4gIGF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbihpdGVtQ29tcG9uZW50LiRpdGVtKSkge1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IGZhbHNlO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ueCA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ueDtcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnkgPSBpdGVtQ29tcG9uZW50LiRpdGVtLnk7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbUNoYW5nZWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXYXJuaW5ncykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQ2FuXFwndCBiZSBwbGFjZWQgaW4gdGhlIGJvdW5kcyBvZiB0aGUgZGFzaGJvYXJkIS9uJyArXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5leHRQb3NzaWJsZVBvc2l0aW9uKG5ld0l0ZW06IEdyaWRzdGVySXRlbSwgc3RhcnRpbmdGcm9tOiB7IHk/OiBudW1iZXIsIHg/OiBudW1iZXIgfSA9IHt9KTogYm9vbGVhbiB7XHJcbiAgICBpZiAobmV3SXRlbS5jb2xzID09PSAtMSkge1xyXG4gICAgICBuZXdJdGVtLmNvbHMgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scztcclxuICAgIH1cclxuICAgIGlmIChuZXdJdGVtLnJvd3MgPT09IC0xKSB7XHJcbiAgICAgIG5ld0l0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xyXG4gICAgbGV0IHJvd3NJbmRleCA9IHN0YXJ0aW5nRnJvbS55IHx8IDAsIGNvbHNJbmRleDtcclxuICAgIGZvciAoOyByb3dzSW5kZXggPCB0aGlzLnJvd3M7IHJvd3NJbmRleCsrKSB7XHJcbiAgICAgIG5ld0l0ZW0ueSA9IHJvd3NJbmRleDtcclxuICAgICAgY29sc0luZGV4ID0gc3RhcnRpbmdGcm9tLnggfHwgMDtcclxuICAgICAgZm9yICg7IGNvbHNJbmRleCA8IHRoaXMuY29sdW1uczsgY29sc0luZGV4KyspIHtcclxuICAgICAgICBuZXdJdGVtLnggPSBjb2xzSW5kZXg7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQ29sbGlzaW9uKG5ld0l0ZW0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNhbkFkZFRvUm93cyA9IHRoaXMuJG9wdGlvbnMubWF4Um93cyA+PSB0aGlzLnJvd3MgKyBuZXdJdGVtLnJvd3M7XHJcbiAgICBjb25zdCBjYW5BZGRUb0NvbHVtbnMgPSB0aGlzLiRvcHRpb25zLm1heENvbHMgPj0gdGhpcy5jb2x1bW5zICsgbmV3SXRlbS5jb2xzO1xyXG4gICAgY29uc3QgYWRkVG9Sb3dzID0gdGhpcy5yb3dzIDw9IHRoaXMuY29sdW1ucyAmJiBjYW5BZGRUb1Jvd3M7XHJcbiAgICBpZiAoIWFkZFRvUm93cyAmJiBjYW5BZGRUb0NvbHVtbnMpIHtcclxuICAgICAgbmV3SXRlbS54ID0gdGhpcy5jb2x1bW5zO1xyXG4gICAgICBuZXdJdGVtLnkgPSAwO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoY2FuQWRkVG9Sb3dzKSB7XHJcbiAgICAgIG5ld0l0ZW0ueSA9IHRoaXMucm93cztcclxuICAgICAgbmV3SXRlbS54ID0gMDtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtIHtcclxuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcclxuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSk7XHJcbiAgICByZXR1cm4gdG1wSXRlbTtcclxuICB9XHJcblxyXG4gIGdldExhc3RQb3NzaWJsZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbSB7XHJcbiAgICBsZXQgZmFydGhlc3RJdGVtOiB7IHk6IG51bWJlciwgeDogbnVtYmVyIH0gPSB7IHk6IDAsIHg6IDAgfTtcclxuICAgIGZhcnRoZXN0SXRlbSA9IHRoaXMuZ3JpZC5yZWR1Y2UoKHByZXY6IGFueSwgY3VycjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJDb29yZHMgPSB7IHk6IGN1cnIuJGl0ZW0ueSArIGN1cnIuJGl0ZW0ucm93cyAtIDEsIHg6IGN1cnIuJGl0ZW0ueCArIGN1cnIuJGl0ZW0uY29scyAtIDEgfTtcclxuICAgICAgaWYgKEdyaWRzdGVyVXRpbHMuY29tcGFyZUl0ZW1zKHByZXYsIGN1cnJDb29yZHMpID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJDb29yZHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHByZXY7XHJcbiAgICAgIH1cclxuICAgIH0sIGZhcnRoZXN0SXRlbSk7XHJcblxyXG4gICAgY29uc3QgdG1wSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbih0bXBJdGVtLCBmYXJ0aGVzdEl0ZW0pO1xyXG4gICAgcmV0dXJuIHRtcEl0ZW07XHJcbiAgfVxyXG5cclxuICBwaXhlbHNUb1Bvc2l0aW9uWCh4OiBudW1iZXIsIHJvdW5kaW5nTWV0aG9kOiBGdW5jdGlvbiwgbm9MaW1pdD86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSByb3VuZGluZ01ldGhvZCh4IC8gdGhpcy5jdXJDb2xXaWR0aCk7XHJcbiAgICBpZiAobm9MaW1pdCkge1xyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGl4ZWxzVG9Qb3NpdGlvblkoeTogbnVtYmVyLCByb3VuZGluZ01ldGhvZDogRnVuY3Rpb24sIG5vTGltaXQ/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeSAvIHRoaXMuY3VyUm93SGVpZ2h0KTtcclxuICAgIGlmIChub0xpbWl0KSB7XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBNYXRoLm1heChwb3NpdGlvbiwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwb3NpdGlvblhUb1BpeGVscyh4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHggKiB0aGlzLmN1ckNvbFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgcG9zaXRpb25ZVG9QaXhlbHMoeTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB5ICogdGhpcy5jdXJSb3dIZWlnaHQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
6
+ import { GridsterConfigService } from './gridsterConfig.constant';
7
+ import { GridsterUtils } from './gridsterUtils.service';
8
+ import { GridsterEmptyCell } from './gridsterEmptyCell.service';
9
+ import { GridsterCompact } from './gridsterCompact.service';
10
+ import { GridsterRenderer } from './gridsterRenderer.service';
11
+ var GridsterComponent = /** @class */ (function () {
12
+ function GridsterComponent(el, renderer, cdRef, zone) {
13
+ this.renderer = renderer;
14
+ this.cdRef = cdRef;
15
+ this.zone = zone;
16
+ this.gridColumns = [];
17
+ this.gridRows = [];
18
+ this.el = el.nativeElement;
19
+ this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
20
+ this.calculateLayoutDebounce = GridsterUtils.debounce(this.calculateLayout.bind(this), 0);
21
+ this.mobile = false;
22
+ this.curWidth = 0;
23
+ this.curHeight = 0;
24
+ this.grid = [];
25
+ this.curColWidth = 0;
26
+ this.curRowHeight = 0;
27
+ this.dragInProgress = false;
28
+ this.emptyCell = new GridsterEmptyCell(this);
29
+ this.compact = new GridsterCompact(this);
30
+ this.gridRenderer = new GridsterRenderer(this);
31
+ }
32
+ /**
33
+ * @param {?} item
34
+ * @param {?} item2
35
+ * @return {?}
36
+ */
37
+ GridsterComponent.checkCollisionTwoItems = /**
38
+ * @param {?} item
39
+ * @param {?} item2
40
+ * @return {?}
41
+ */
42
+ function (item, item2) {
43
+ return item.x < item2.x + item2.cols
44
+ && item.x + item.cols > item2.x
45
+ && item.y < item2.y + item2.rows
46
+ && item.y + item.rows > item2.y;
47
+ };
48
+ /**
49
+ * @return {?}
50
+ */
51
+ GridsterComponent.prototype.ngOnInit = /**
52
+ * @return {?}
53
+ */
54
+ function () {
55
+ if (this.options.initCallback) {
56
+ this.options.initCallback(this);
57
+ }
58
+ };
59
+ /**
60
+ * @param {?} changes
61
+ * @return {?}
62
+ */
63
+ GridsterComponent.prototype.ngOnChanges = /**
64
+ * @param {?} changes
65
+ * @return {?}
66
+ */
67
+ function (changes) {
68
+ if (changes.options) {
69
+ this.setOptions();
70
+ this.options.api = {
71
+ optionsChanged: this.optionsChanged.bind(this),
72
+ resize: this.onResize.bind(this),
73
+ getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
74
+ getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
75
+ getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
76
+ getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
77
+ };
78
+ this.columns = this.$options.minCols;
79
+ this.rows = this.$options.minRows;
80
+ this.setGridSize();
81
+ this.calculateLayout();
82
+ }
83
+ };
84
+ /**
85
+ * @return {?}
86
+ */
87
+ GridsterComponent.prototype.getCurrentRowHeight = /**
88
+ * @return {?}
89
+ */
90
+ function () {
91
+ return this.curRowHeight;
92
+ };
93
+ /**
94
+ * @return {?}
95
+ */
96
+ GridsterComponent.prototype.resize = /**
97
+ * @return {?}
98
+ */
99
+ function () {
100
+ /** @type {?} */
101
+ var height;
102
+ /** @type {?} */
103
+ var width;
104
+ if (this.$options.gridType === 'fit' && !this.mobile) {
105
+ width = this.el.offsetWidth;
106
+ height = this.el.offsetHeight;
107
+ }
108
+ else {
109
+ width = this.el.clientWidth;
110
+ height = this.el.clientHeight;
111
+ }
112
+ if ((width !== this.curWidth || height !== this.curHeight) && this.checkIfToResize()) {
113
+ this.onResize();
114
+ }
115
+ };
116
+ /**
117
+ * @return {?}
118
+ */
119
+ GridsterComponent.prototype.setOptions = /**
120
+ * @return {?}
121
+ */
122
+ function () {
123
+ this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
124
+ if (!this.$options.disableWindowResize && !this.windowResize) {
125
+ this.windowResize = this.renderer.listen('window', 'resize', this.onResize.bind(this));
126
+ }
127
+ else if (this.$options.disableWindowResize && this.windowResize) {
128
+ this.windowResize();
129
+ this.windowResize = null;
130
+ }
131
+ this.emptyCell.updateOptions();
132
+ };
133
+ /**
134
+ * @return {?}
135
+ */
136
+ GridsterComponent.prototype.optionsChanged = /**
137
+ * @return {?}
138
+ */
139
+ function () {
140
+ this.setOptions();
141
+ /** @type {?} */
142
+ var widgetsIndex = this.grid.length - 1;
143
+ /** @type {?} */
144
+ var widget;
145
+ for (; widgetsIndex >= 0; widgetsIndex--) {
146
+ widget = this.grid[widgetsIndex];
147
+ widget.updateOptions();
148
+ }
149
+ this.calculateLayout();
150
+ };
151
+ /**
152
+ * @return {?}
153
+ */
154
+ GridsterComponent.prototype.ngOnDestroy = /**
155
+ * @return {?}
156
+ */
157
+ function () {
158
+ if (this.windowResize) {
159
+ this.windowResize();
160
+ }
161
+ if (this.options.destroyCallback) {
162
+ this.options.destroyCallback(this);
163
+ }
164
+ //if (this.options.api) {
165
+ /* this.options.api getting undefined for new dashboard load- temp fix
166
+ * on new dashboard area load, old dashboard area gets destroyed, but that leads to
167
+ * ondestroy of current this.options.api instance - needs to investigate further
168
+ */
169
+ if (false) {
170
+ this.options.api.resize = undefined;
171
+ this.options.api.optionsChanged = undefined;
172
+ this.options.api.getNextPossiblePosition = undefined;
173
+ this.options.api = undefined;
174
+ }
175
+ this.emptyCell.destroy();
176
+ delete this.emptyCell;
177
+ this.compact.destroy();
178
+ delete this.compact;
179
+ };
180
+ /**
181
+ * @return {?}
182
+ */
183
+ GridsterComponent.prototype.onResize = /**
184
+ * @return {?}
185
+ */
186
+ function () {
187
+ this.setGridSize();
188
+ this.calculateLayout();
189
+ };
190
+ /**
191
+ * @return {?}
192
+ */
193
+ GridsterComponent.prototype.checkIfToResize = /**
194
+ * @return {?}
195
+ */
196
+ function () {
197
+ /** @type {?} */
198
+ var clientWidth = this.el.clientWidth;
199
+ /** @type {?} */
200
+ var offsetWidth = this.el.offsetWidth;
201
+ /** @type {?} */
202
+ var scrollWidth = this.el.scrollWidth;
203
+ /** @type {?} */
204
+ var clientHeight = this.el.clientHeight;
205
+ /** @type {?} */
206
+ var offsetHeight = this.el.offsetHeight;
207
+ /** @type {?} */
208
+ var scrollHeight = this.el.scrollHeight;
209
+ /** @type {?} */
210
+ var verticalScrollPresent = clientWidth < offsetWidth && scrollHeight > offsetHeight
211
+ && scrollHeight - offsetHeight < offsetWidth - clientWidth;
212
+ /** @type {?} */
213
+ var horizontalScrollPresent = clientHeight < offsetHeight
214
+ && scrollWidth > offsetWidth && scrollWidth - offsetWidth < offsetHeight - clientHeight;
215
+ if (verticalScrollPresent) {
216
+ return false;
217
+ }
218
+ return !horizontalScrollPresent;
219
+ };
220
+ /**
221
+ * @return {?}
222
+ */
223
+ GridsterComponent.prototype.setGridSize = /**
224
+ * @return {?}
225
+ */
226
+ function () {
227
+ /** @type {?} */
228
+ var el = this.el;
229
+ /** @type {?} */
230
+ var width = el.clientWidth;
231
+ /** @type {?} */
232
+ var height = el.clientHeight;
233
+ if (this.$options.setGridSize || this.$options.gridType === 'fit' && !this.mobile) {
234
+ width = el.offsetWidth;
235
+ height = el.offsetHeight;
236
+ }
237
+ else {
238
+ width = el.clientWidth;
239
+ height = el.clientHeight;
240
+ }
241
+ this.curWidth = width;
242
+ this.curHeight = height;
243
+ };
244
+ /**
245
+ * @return {?}
246
+ */
247
+ GridsterComponent.prototype.setGridDimensions = /**
248
+ * @return {?}
249
+ */
250
+ function () {
251
+ this.setGridSize();
252
+ if (!this.mobile && this.$options.mobileBreakpoint > this.curWidth) {
253
+ this.mobile = !this.mobile;
254
+ this.renderer.addClass(this.el, 'mobile');
255
+ }
256
+ else if (this.mobile && this.$options.mobileBreakpoint < this.curWidth) {
257
+ this.mobile = !this.mobile;
258
+ this.renderer.removeClass(this.el, 'mobile');
259
+ }
260
+ /** @type {?} */
261
+ var rows = this.$options.minRows;
262
+ /** @type {?} */
263
+ var columns = this.$options.minCols;
264
+ /** @type {?} */
265
+ var widgetsIndex = this.grid.length - 1;
266
+ /** @type {?} */
267
+ var widget;
268
+ for (; widgetsIndex >= 0; widgetsIndex--) {
269
+ widget = this.grid[widgetsIndex];
270
+ if (!widget.notPlaced) {
271
+ rows = Math.max(rows, widget.$item.y + widget.$item.rows);
272
+ columns = Math.max(columns, widget.$item.x + widget.$item.cols);
273
+ }
274
+ }
275
+ if (this.columns !== columns || this.rows !== rows) {
276
+ this.columns = columns;
277
+ this.rows = rows;
278
+ if (this.options.gridSizeChangedCallback) {
279
+ this.options.gridSizeChangedCallback(this);
280
+ }
281
+ }
282
+ };
283
+ /**
284
+ * @return {?}
285
+ */
286
+ GridsterComponent.prototype.calculateLayout = /**
287
+ * @return {?}
288
+ */
289
+ function () {
290
+ if (this.compact) {
291
+ this.compact.checkCompact();
292
+ }
293
+ this.setGridDimensions();
294
+ if (this.$options.outerMargin) {
295
+ /** @type {?} */
296
+ var marginWidth = -this.$options.margin;
297
+ if (this.$options.outerMarginLeft !== null) {
298
+ marginWidth += this.$options.outerMarginLeft;
299
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
300
+ }
301
+ else {
302
+ marginWidth += this.$options.margin;
303
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
304
+ }
305
+ if (this.$options.outerMarginRight !== null) {
306
+ marginWidth += this.$options.outerMarginRight;
307
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
308
+ }
309
+ else {
310
+ marginWidth += this.$options.margin;
311
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
312
+ }
313
+ this.curColWidth = (this.curWidth - marginWidth) / this.columns;
314
+ /** @type {?} */
315
+ var marginHeight = -this.$options.margin;
316
+ if (this.$options.outerMarginTop !== null) {
317
+ marginHeight += this.$options.outerMarginTop;
318
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
319
+ }
320
+ else {
321
+ marginHeight += this.$options.margin;
322
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
323
+ }
324
+ if (this.$options.outerMarginBottom !== null) {
325
+ marginHeight += this.$options.outerMarginBottom;
326
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
327
+ }
328
+ else {
329
+ marginHeight += this.$options.margin;
330
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
331
+ }
332
+ this.curRowHeight = (this.curHeight - marginHeight) / this.rows;
333
+ }
334
+ else {
335
+ this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
336
+ this.curRowHeight = (this.curHeight + this.$options.margin) / this.rows;
337
+ this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
338
+ this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
339
+ this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
340
+ this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
341
+ }
342
+ this.gridRenderer.updateGridster();
343
+ this.updateGrid();
344
+ if (this.$options.setGridSize) {
345
+ this.renderer.setStyle(this.el, 'width', (this.columns * this.curColWidth + this.$options.margin) + 'px');
346
+ this.renderer.setStyle(this.el, 'height', (this.rows * this.curRowHeight + this.$options.margin) + 'px');
347
+ }
348
+ else {
349
+ this.renderer.setStyle(this.el, 'width', '');
350
+ this.renderer.setStyle(this.el, 'height', '');
351
+ }
352
+ /** @type {?} */
353
+ var widgetsIndex = this.grid.length - 1;
354
+ /** @type {?} */
355
+ var widget;
356
+ for (; widgetsIndex >= 0; widgetsIndex--) {
357
+ widget = this.grid[widgetsIndex];
358
+ widget.setSize();
359
+ widget.drag.toggle();
360
+ widget.resize.toggle();
361
+ }
362
+ setTimeout(this.resize.bind(this), 100);
363
+ };
364
+ /**
365
+ * @return {?}
366
+ */
367
+ GridsterComponent.prototype.updateGrid = /**
368
+ * @return {?}
369
+ */
370
+ function () {
371
+ if (this.$options.displayGrid === 'always' && !this.mobile) {
372
+ this.renderer.addClass(this.el, 'display-grid');
373
+ }
374
+ else if (this.$options.displayGrid === 'onDrag&Resize' && this.dragInProgress) {
375
+ this.renderer.addClass(this.el, 'display-grid');
376
+ }
377
+ else if (this.$options.displayGrid === 'none' || !this.dragInProgress || this.mobile) {
378
+ this.renderer.removeClass(this.el, 'display-grid');
379
+ }
380
+ this.setGridDimensions();
381
+ this.gridColumns.length = Math.max(this.columns, Math.floor(this.curWidth / this.curColWidth)) || 0;
382
+ this.gridRows.length = Math.max(this.rows, Math.floor(this.curHeight / this.curRowHeight)) || 0;
383
+ this.cdRef.markForCheck();
384
+ };
385
+ /**
386
+ * @param {?} itemComponent
387
+ * @return {?}
388
+ */
389
+ GridsterComponent.prototype.addItem = /**
390
+ * @param {?} itemComponent
391
+ * @return {?}
392
+ */
393
+ function (itemComponent) {
394
+ if (itemComponent.$item.cols === undefined) {
395
+ itemComponent.$item.cols = this.$options.defaultItemCols;
396
+ itemComponent.item.cols = itemComponent.$item.cols;
397
+ itemComponent.itemChanged();
398
+ }
399
+ if (itemComponent.$item.rows === undefined) {
400
+ itemComponent.$item.rows = this.$options.defaultItemRows;
401
+ itemComponent.item.rows = itemComponent.$item.rows;
402
+ itemComponent.itemChanged();
403
+ }
404
+ if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
405
+ this.autoPositionItem(itemComponent);
406
+ }
407
+ else if (this.checkCollision(itemComponent.$item)) {
408
+ if (!this.$options.disableWarnings) {
409
+ itemComponent.notPlaced = true;
410
+ console.warn('Can\'t be placed in the bounds of the dashboard, trying to auto position!/n' +
411
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
412
+ }
413
+ if (!this.$options.disableAutoPositionOnConflict) {
414
+ this.autoPositionItem(itemComponent);
415
+ }
416
+ else {
417
+ itemComponent.notPlaced = true;
418
+ }
419
+ }
420
+ this.grid.push(itemComponent);
421
+ this.calculateLayoutDebounce();
422
+ };
423
+ /**
424
+ * @param {?} itemComponent
425
+ * @return {?}
426
+ */
427
+ GridsterComponent.prototype.removeItem = /**
428
+ * @param {?} itemComponent
429
+ * @return {?}
430
+ */
431
+ function (itemComponent) {
432
+ this.grid.splice(this.grid.indexOf(itemComponent), 1);
433
+ this.calculateLayoutDebounce();
434
+ if (this.options.itemRemovedCallback) {
435
+ this.options.itemRemovedCallback(itemComponent.item, itemComponent);
436
+ }
437
+ };
438
+ /**
439
+ * @param {?} item
440
+ * @return {?}
441
+ */
442
+ GridsterComponent.prototype.checkCollision = /**
443
+ * @param {?} item
444
+ * @return {?}
445
+ */
446
+ function (item) {
447
+ /** @type {?} */
448
+ var collision = false;
449
+ if (this.options.itemValidateCallback) {
450
+ collision = !this.options.itemValidateCallback(item);
451
+ }
452
+ if (!collision && this.checkGridCollision(item)) {
453
+ collision = true;
454
+ }
455
+ if (!collision) {
456
+ /** @type {?} */
457
+ var c = this.findItemWithItem(item);
458
+ if (c) {
459
+ collision = c;
460
+ }
461
+ }
462
+ return collision;
463
+ };
464
+ /**
465
+ * @param {?} item
466
+ * @return {?}
467
+ */
468
+ GridsterComponent.prototype.checkGridCollision = /**
469
+ * @param {?} item
470
+ * @return {?}
471
+ */
472
+ function (item) {
473
+ /** @type {?} */
474
+ var noNegativePosition = item.y > -1 && item.x > -1;
475
+ /** @type {?} */
476
+ var maxGridCols = item.cols + item.x <= this.$options.maxCols;
477
+ /** @type {?} */
478
+ var maxGridRows = item.rows + item.y <= this.$options.maxRows;
479
+ /** @type {?} */
480
+ var maxItemCols = item.maxItemCols === undefined ? this.$options.maxItemCols : item.maxItemCols;
481
+ /** @type {?} */
482
+ var minItemCols = item.minItemCols === undefined ? this.$options.minItemCols : item.minItemCols;
483
+ /** @type {?} */
484
+ var maxItemRows = item.maxItemRows === undefined ? this.$options.maxItemRows : item.maxItemRows;
485
+ /** @type {?} */
486
+ var minItemRows = item.minItemRows === undefined ? this.$options.minItemRows : item.minItemRows;
487
+ /** @type {?} */
488
+ var inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
489
+ /** @type {?} */
490
+ var inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
491
+ /** @type {?} */
492
+ var minAreaLimit = item.minItemArea === undefined ? this.$options.minItemArea : item.minItemArea;
493
+ /** @type {?} */
494
+ var maxAreaLimit = item.maxItemArea === undefined ? this.$options.maxItemArea : item.maxItemArea;
495
+ /** @type {?} */
496
+ var area = item.cols * item.rows;
497
+ /** @type {?} */
498
+ var inMinArea = minAreaLimit <= area;
499
+ /** @type {?} */
500
+ var inMaxArea = maxAreaLimit >= area;
501
+ return !(noNegativePosition && maxGridCols && maxGridRows && inColsLimits && inRowsLimits && inMinArea && inMaxArea);
502
+ };
503
+ /**
504
+ * @param {?} item
505
+ * @return {?}
506
+ */
507
+ GridsterComponent.prototype.findItemWithItem = /**
508
+ * @param {?} item
509
+ * @return {?}
510
+ */
511
+ function (item) {
512
+ /** @type {?} */
513
+ var widgetsIndex = this.grid.length - 1;
514
+ /** @type {?} */
515
+ var widget;
516
+ for (; widgetsIndex > -1; widgetsIndex--) {
517
+ widget = this.grid[widgetsIndex];
518
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
519
+ return widget;
520
+ }
521
+ }
522
+ return false;
523
+ };
524
+ /**
525
+ * @param {?} item
526
+ * @return {?}
527
+ */
528
+ GridsterComponent.prototype.findItemsWithItem = /**
529
+ * @param {?} item
530
+ * @return {?}
531
+ */
532
+ function (item) {
533
+ /** @type {?} */
534
+ var a = [];
535
+ /** @type {?} */
536
+ var widgetsIndex = this.grid.length - 1;
537
+ /** @type {?} */
538
+ var widget;
539
+ for (; widgetsIndex > -1; widgetsIndex--) {
540
+ widget = this.grid[widgetsIndex];
541
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
542
+ a.push(widget);
543
+ }
544
+ }
545
+ return a;
546
+ };
547
+ /**
548
+ * @param {?} itemComponent
549
+ * @return {?}
550
+ */
551
+ GridsterComponent.prototype.autoPositionItem = /**
552
+ * @param {?} itemComponent
553
+ * @return {?}
554
+ */
555
+ function (itemComponent) {
556
+ if (this.getNextPossiblePosition(itemComponent.$item)) {
557
+ itemComponent.notPlaced = false;
558
+ itemComponent.item.x = itemComponent.$item.x;
559
+ itemComponent.item.y = itemComponent.$item.y;
560
+ itemComponent.itemChanged();
561
+ }
562
+ else {
563
+ itemComponent.notPlaced = true;
564
+ if (!this.$options.disableWarnings) {
565
+ console.warn('Can\'t be placed in the bounds of the dashboard!/n' +
566
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
567
+ }
568
+ }
569
+ };
570
+ /**
571
+ * @param {?} newItem
572
+ * @param {?=} startingFrom
573
+ * @return {?}
574
+ */
575
+ GridsterComponent.prototype.getNextPossiblePosition = /**
576
+ * @param {?} newItem
577
+ * @param {?=} startingFrom
578
+ * @return {?}
579
+ */
580
+ function (newItem, startingFrom) {
581
+ if (startingFrom === void 0) { startingFrom = {}; }
582
+ if (newItem.cols === -1) {
583
+ newItem.cols = this.$options.defaultItemCols;
584
+ }
585
+ if (newItem.rows === -1) {
586
+ newItem.rows = this.$options.defaultItemRows;
587
+ }
588
+ this.setGridDimensions();
589
+ /** @type {?} */
590
+ var rowsIndex = startingFrom.y || 0;
591
+ /** @type {?} */
592
+ var colsIndex;
593
+ for (; rowsIndex < this.rows; rowsIndex++) {
594
+ newItem.y = rowsIndex;
595
+ colsIndex = startingFrom.x || 0;
596
+ for (; colsIndex < this.columns; colsIndex++) {
597
+ newItem.x = colsIndex;
598
+ if (!this.checkCollision(newItem)) {
599
+ return true;
600
+ }
601
+ }
602
+ }
603
+ /** @type {?} */
604
+ var canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
605
+ /** @type {?} */
606
+ var canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
607
+ /** @type {?} */
608
+ var addToRows = this.rows <= this.columns && canAddToRows;
609
+ if (!addToRows && canAddToColumns) {
610
+ newItem.x = this.columns;
611
+ newItem.y = 0;
612
+ return true;
613
+ }
614
+ else if (canAddToRows) {
615
+ newItem.y = this.rows;
616
+ newItem.x = 0;
617
+ return true;
618
+ }
619
+ return false;
620
+ };
621
+ /**
622
+ * @param {?} item
623
+ * @return {?}
624
+ */
625
+ GridsterComponent.prototype.getFirstPossiblePosition = /**
626
+ * @param {?} item
627
+ * @return {?}
628
+ */
629
+ function (item) {
630
+ /** @type {?} */
631
+ var tmpItem = Object.assign({}, item);
632
+ this.getNextPossiblePosition(tmpItem);
633
+ return tmpItem;
634
+ };
635
+ /**
636
+ * @param {?} item
637
+ * @return {?}
638
+ */
639
+ GridsterComponent.prototype.getLastPossiblePosition = /**
640
+ * @param {?} item
641
+ * @return {?}
642
+ */
643
+ function (item) {
644
+ /** @type {?} */
645
+ var farthestItem = { y: 0, x: 0 };
646
+ farthestItem = this.grid.reduce((/**
647
+ * @param {?} prev
648
+ * @param {?} curr
649
+ * @return {?}
650
+ */
651
+ function (prev, curr) {
652
+ /** @type {?} */
653
+ var currCoords = { y: curr.$item.y + curr.$item.rows - 1, x: curr.$item.x + curr.$item.cols - 1 };
654
+ if (GridsterUtils.compareItems(prev, currCoords) === 1) {
655
+ return currCoords;
656
+ }
657
+ else {
658
+ return prev;
659
+ }
660
+ }), farthestItem);
661
+ /** @type {?} */
662
+ var tmpItem = Object.assign({}, item);
663
+ this.getNextPossiblePosition(tmpItem, farthestItem);
664
+ return tmpItem;
665
+ };
666
+ /**
667
+ * @param {?} x
668
+ * @param {?} roundingMethod
669
+ * @param {?=} noLimit
670
+ * @return {?}
671
+ */
672
+ GridsterComponent.prototype.pixelsToPositionX = /**
673
+ * @param {?} x
674
+ * @param {?} roundingMethod
675
+ * @param {?=} noLimit
676
+ * @return {?}
677
+ */
678
+ function (x, roundingMethod, noLimit) {
679
+ /** @type {?} */
680
+ var position = roundingMethod(x / this.curColWidth);
681
+ if (noLimit) {
682
+ return position;
683
+ }
684
+ else {
685
+ return Math.max(position, 0);
686
+ }
687
+ };
688
+ /**
689
+ * @param {?} y
690
+ * @param {?} roundingMethod
691
+ * @param {?=} noLimit
692
+ * @return {?}
693
+ */
694
+ GridsterComponent.prototype.pixelsToPositionY = /**
695
+ * @param {?} y
696
+ * @param {?} roundingMethod
697
+ * @param {?=} noLimit
698
+ * @return {?}
699
+ */
700
+ function (y, roundingMethod, noLimit) {
701
+ /** @type {?} */
702
+ var position = roundingMethod(y / this.curRowHeight);
703
+ if (noLimit) {
704
+ return position;
705
+ }
706
+ else {
707
+ return Math.max(position, 0);
708
+ }
709
+ };
710
+ /**
711
+ * @param {?} x
712
+ * @return {?}
713
+ */
714
+ GridsterComponent.prototype.positionXToPixels = /**
715
+ * @param {?} x
716
+ * @return {?}
717
+ */
718
+ function (x) {
719
+ return x * this.curColWidth;
720
+ };
721
+ /**
722
+ * @param {?} y
723
+ * @return {?}
724
+ */
725
+ GridsterComponent.prototype.positionYToPixels = /**
726
+ * @param {?} y
727
+ * @return {?}
728
+ */
729
+ function (y) {
730
+ return y * this.curRowHeight;
731
+ };
732
+ GridsterComponent.decorators = [
733
+ { type: Component, args: [{
734
+ selector: 'gridster',
735
+ template: "<div class=\"gridster-column\" *ngFor=\"let column of gridColumns; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"></div>\n<div class=\"gridster-row\" *ngFor=\"let row of gridRows; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"></div>\n<ng-content></ng-content>\n<gridster-preview class=\"gridster-preview\"></gridster-preview>\n",
736
+ encapsulation: ViewEncapsulation.None,
737
+ styles: ["gridster{clear:both;position:relative;box-sizing:border-box;background:#fff;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;overflow:auto}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column}gridster.mobile gridster-item{position:relative;width:100%!important;min-height:300px!important}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;-webkit-transition:.3s;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid #ccc;border-right:1px solid #ccc}gridster .gridster-row{border-top:1px solid #ccc;border-bottom:1px solid #ccc}"]
738
+ }] }
739
+ ];
740
+ /** @nocollapse */
741
+ GridsterComponent.ctorParameters = function () { return [
742
+ { type: ElementRef },
743
+ { type: Renderer2 },
744
+ { type: ChangeDetectorRef },
745
+ { type: NgZone }
746
+ ]; };
747
+ GridsterComponent.propDecorators = {
748
+ options: [{ type: Input }]
749
+ };
750
+ return GridsterComponent;
751
+ }());
752
+ export { GridsterComponent };
753
+ if (false) {
754
+ /** @type {?} */
755
+ GridsterComponent.prototype.options;
756
+ /** @type {?} */
757
+ GridsterComponent.prototype.calculateLayoutDebounce;
758
+ /** @type {?} */
759
+ GridsterComponent.prototype.movingItem;
760
+ /** @type {?} */
761
+ GridsterComponent.prototype.previewStyle;
762
+ /** @type {?} */
763
+ GridsterComponent.prototype.el;
764
+ /** @type {?} */
765
+ GridsterComponent.prototype.$options;
766
+ /** @type {?} */
767
+ GridsterComponent.prototype.mobile;
768
+ /** @type {?} */
769
+ GridsterComponent.prototype.curWidth;
770
+ /** @type {?} */
771
+ GridsterComponent.prototype.curHeight;
772
+ /** @type {?} */
773
+ GridsterComponent.prototype.grid;
774
+ /** @type {?} */
775
+ GridsterComponent.prototype.columns;
776
+ /** @type {?} */
777
+ GridsterComponent.prototype.rows;
778
+ /** @type {?} */
779
+ GridsterComponent.prototype.curColWidth;
780
+ /** @type {?} */
781
+ GridsterComponent.prototype.curRowHeight;
782
+ /** @type {?} */
783
+ GridsterComponent.prototype.gridColumns;
784
+ /** @type {?} */
785
+ GridsterComponent.prototype.gridRows;
786
+ /** @type {?} */
787
+ GridsterComponent.prototype.windowResize;
788
+ /** @type {?} */
789
+ GridsterComponent.prototype.dragInProgress;
790
+ /** @type {?} */
791
+ GridsterComponent.prototype.emptyCell;
792
+ /** @type {?} */
793
+ GridsterComponent.prototype.compact;
794
+ /** @type {?} */
795
+ GridsterComponent.prototype.gridRenderer;
796
+ /** @type {?} */
797
+ GridsterComponent.prototype.renderer;
798
+ /** @type {?} */
799
+ GridsterComponent.prototype.cdRef;
800
+ /** @type {?} */
801
+ GridsterComponent.prototype.zone;
802
+ }
803
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFJTixTQUFTLEVBRVQsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHOUQ7SUE2QkUsMkJBQVksRUFBYyxFQUFTLFFBQW1CLEVBQVMsS0FBd0IsRUFBUyxJQUFZO1FBQXpFLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7UUFSNUcsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQVFaLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFB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Yzs7SUFDZCx5Q0FBa0M7O0lBQ2xDLDJDQUF3Qjs7SUFDeEIsc0NBQTZCOztJQUM3QixvQ0FBeUI7O0lBQ3pCLHlDQUErQjs7SUFFSCxxQ0FBMEI7O0lBQUUsa0NBQStCOztJQUFFLGlDQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuY29uc3RhbnQnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWcgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3RlclV0aWxzIH0gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJFbXB0eUNlbGwgfSBmcm9tICcuL2dyaWRzdGVyRW1wdHlDZWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wYWN0IH0gZnJvbSAnLi9ncmlkc3RlckNvbXBhY3Quc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZ1MgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnUy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVySXRlbUNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJSZW5kZXJlciB9IGZyb20gJy4vZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRzdGVySXRlbSB9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dyaWRzdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWRzdGVyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncmlkc3Rlci5jc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIHtcbiAgQElucHV0KCkgb3B0aW9uczogR3JpZHN0ZXJDb25maWc7XG4gIGNhbGN1bGF0ZUxheW91dERlYm91bmNlOiAoKSA9PiB2b2lkO1xuICBtb3ZpbmdJdGVtOiBHcmlkc3Rlckl0ZW0gfCBudWxsO1xuICBwcmV2aWV3U3R5bGU6ICgpID0+IHZvaWQ7XG4gIGVsOiBhbnk7XG4gICRvcHRpb25zOiBHcmlkc3RlckNvbmZpZ1M7XG4gIG1vYmlsZTogYm9vbGVhbjtcbiAgY3VyV2lkdGg6IG51bWJlcjtcbiAgY3VySGVpZ2h0OiBudW1iZXI7XG4gIGdyaWQ6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT47XG4gIGNvbHVtbnM6IG51bWJlcjtcbiAgcm93czogbnVtYmVyO1xuICBjdXJDb2xXaWR0aDogbnVtYmVyO1xuICBjdXJSb3dIZWlnaHQ6IG51bWJlcjtcbiAgZ3JpZENvbHVtbnMgPSBbXTtcbiAgZ3JpZFJvd3MgPSBbXTtcbiAgd2luZG93UmVzaXplOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICBkcmFnSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgZW1wdHlDZWxsOiBHcmlkc3RlckVtcHR5Q2VsbDtcbiAgY29tcGFjdDogR3JpZHN0ZXJDb21wYWN0O1xuICBncmlkUmVuZGVyZXI6IEdyaWRzdGVyUmVuZGVyZXI7XG5cbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYsIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLCBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwdWJsaWMgem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5lbCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy4kb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoR3JpZHN0ZXJDb25maWdTZXJ2aWNlKSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXREZWJvdW5jZSA9IEdyaWRzdGVyVXRpbHMuZGVib3VuY2UodGhpcy5jYWxjdWxhdGVMYXlvdXQuYmluZCh0aGlzKSwgMCk7XG4gICAgdGhpcy5tb2JpbGUgPSBmYWxzZTtcbiAgICB0aGlzLmN1cldpZHRoID0gMDtcbiAgICB0aGlzLmN1ckhlaWdodCA9IDA7XG4gICAgdGhpcy5ncmlkID0gW107XG4gICAgdGhpcy5jdXJDb2xXaWR0aCA9IDA7XG4gICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAwO1xuICAgIHRoaXMuZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmVtcHR5Q2VsbCA9IG5ldyBHcmlkc3RlckVtcHR5Q2VsbCh0aGlzKTtcbiAgICB0aGlzLmNvbXBhY3QgPSBuZXcgR3JpZHN0ZXJDb21wYWN0KHRoaXMpO1xuICAgIHRoaXMuZ3JpZFJlbmRlcmVyID0gbmV3IEdyaWRzdGVyUmVuZGVyZXIodGhpcyk7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhpdGVtOiBHcmlkc3Rlckl0ZW0sIGl0ZW0yOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS54IDwgaXRlbTIueCArIGl0ZW0yLmNvbHNcbiAgICAgICYmIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnhcbiAgICAgICYmIGl0ZW0ueSA8IGl0ZW0yLnkgKyBpdGVtMi5yb3dzXG4gICAgICAmJiBpdGVtLnkgKyBpdGVtLnJvd3MgPiBpdGVtMi55O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbml0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pbml0Q2FsbGJhY2sodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9ucygpO1xuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHtcbiAgICAgICAgb3B0aW9uc0NoYW5nZWQ6IHRoaXMub3B0aW9uc0NoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgcmVzaXplOiB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyksXG4gICAgICAgIGdldE5leHRQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIGdldEZpcnN0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXRGaXJzdFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgZ2V0Q3VycmVudFJvd0hlaWdodDogdGhpcy5nZXRDdXJyZW50Um93SGVpZ2h0LmJpbmQodGhpcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuJG9wdGlvbnMubWluQ29scztcbiAgICAgIHRoaXMucm93cyA9IHRoaXMuJG9wdGlvbnMubWluUm93cztcbiAgICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1clJvd0hlaWdodDtcbiAgfVxuXG4gIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICBsZXQgaGVpZ2h0O1xuICAgIGxldCB3aWR0aDtcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gJ2ZpdCcgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICB3aWR0aCA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmVsLm9mZnNldEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggPSB0aGlzLmVsLmNsaWVudFdpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICgod2lkdGggIT09IHRoaXMuY3VyV2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmN1ckhlaWdodCkgJiYgdGhpcy5jaGVja0lmVG9SZXNpemUoKSkge1xuICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldE9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy4kb3B0aW9ucyA9IEdyaWRzdGVyVXRpbHMubWVyZ2UodGhpcy4kb3B0aW9ucywgdGhpcy5vcHRpb25zLCB0aGlzLiRvcHRpb25zKTtcbiAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdpbmRvd1Jlc2l6ZSAmJiAhdGhpcy53aW5kb3dSZXNpemUpIHtcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kb3B0aW9ucy5kaXNhYmxlV2luZG93UmVzaXplICYmIHRoaXMud2luZG93UmVzaXplKSB7XG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZSgpO1xuICAgICAgdGhpcy53aW5kb3dSZXNpemUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmVtcHR5Q2VsbC51cGRhdGVPcHRpb25zKCk7XG4gIH1cblxuICBvcHRpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE9wdGlvbnMoKTtcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XG4gICAgICB3aWRnZXQudXBkYXRlT3B0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2luZG93UmVzaXplKSB7XG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjaykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjayh0aGlzKTtcbiAgICB9XG4gICAgLy9pZiAodGhpcy5vcHRpb25zLmFwaSkge1xuICAgIC8qIHRoaXMub3B0aW9ucy5hcGkgZ2V0dGluZyB1bmRlZmluZWQgZm9yIG5ldyBkYXNoYm9hcmQgbG9hZC0gdGVtcCBmaXhcbiAgICAqICBvbiBuZXcgZGFzaGJvYXJkIGFyZWEgbG9hZCwgb2xkIGRhc2hib2FyZCBhcmVhIGdldHMgZGVzdHJveWVkLCBidXQgdGhhdCBsZWFkcyB0byBcbiAgICAqICBvbmRlc3Ryb3kgb2YgY3VycmVudCB0aGlzLm9wdGlvbnMuYXBpIGluc3RhbmNlIC0gbmVlZHMgdG8gaW52ZXN0aWdhdGUgZnVydGhlclxuICAgICovXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLnJlc2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkub3B0aW9uc0NoYW5nZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5lbXB0eUNlbGwuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmVtcHR5Q2VsbDtcbiAgICB0aGlzLmNvbXBhY3QuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmNvbXBhY3Q7XG4gIH1cblxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEdyaWRTaXplKCk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcbiAgfVxuXG4gIGNoZWNrSWZUb1Jlc2l6ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjbGllbnRXaWR0aCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0V2lkdGggPSB0aGlzLmVsLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gdGhpcy5lbC5zY3JvbGxXaWR0aDtcbiAgICBjb25zdCBjbGllbnRIZWlnaHQgPSB0aGlzLmVsLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB0aGlzLmVsLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodDtcbiAgICBjb25zdCB2ZXJ0aWNhbFNjcm9sbFByZXNlbnQgPSBjbGllbnRXaWR0aCA8IG9mZnNldFdpZHRoICYmIHNjcm9sbEhlaWdodCA+IG9mZnNldEhlaWdodFxuICAgICAgJiYgc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0SGVpZ2h0IDwgb2Zmc2V0V2lkdGggLSBjbGllbnRXaWR0aDtcbiAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsUHJlc2VudCA9IGNsaWVudEhlaWdodCA8IG9mZnNldEhlaWdodFxuICAgICAgJiYgc2Nyb2xsV2lkdGggPiBvZmZzZXRXaWR0aCAmJiBzY3JvbGxXaWR0aCAtIG9mZnNldFdpZHRoIDwgb2Zmc2V0SGVpZ2h0IC0gY2xpZW50SGVpZ2h0O1xuICAgIGlmICh2ZXJ0aWNhbFNjcm9sbFByZXNlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFob3Jpem9udGFsU2Nyb2xsUHJlc2VudDtcbiAgfVxuXG4gIHNldEdyaWRTaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5lbDtcbiAgICBsZXQgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcbiAgICBsZXQgaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0O1xuICAgIGlmICh0aGlzLiRvcHRpb25zLnNldEdyaWRTaXplIHx8IHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09ICdmaXQnICYmICF0aGlzLm1vYmlsZSkge1xuICAgICAgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICAgIGhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcbiAgICAgIGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5jdXJXaWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuY3VySGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgc2V0R3JpZERpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xuICAgIGlmICghdGhpcy5tb2JpbGUgJiYgdGhpcy4kb3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ID4gdGhpcy5jdXJXaWR0aCkge1xuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdtb2JpbGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9iaWxlICYmIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA8IHRoaXMuY3VyV2lkdGgpIHtcbiAgICAgIHRoaXMubW9iaWxlID0gIXRoaXMubW9iaWxlO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XG4gICAgfVxuICAgIGxldCByb3dzID0gdGhpcy4kb3B0aW9ucy5taW5Sb3dzLCBjb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xuXG4gICAgbGV0IHdpZGdldHNJbmRleCA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ7XG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XG4gICAgICBpZiAoIXdpZGdldC5ub3RQbGFjZWQpIHtcbiAgICAgICAgcm93cyA9IE1hdGgubWF4KHJvd3MsIHdpZGdldC4kaXRlbS55ICsgd2lkZ2V0LiRpdGVtLnJvd3MpO1xuICAgICAgICBjb2x1bW5zID0gTWF0aC5tYXgoY29sdW1ucywgd2lkZ2V0LiRpdGVtLnggKyB3aWRnZXQuJGl0ZW0uY29scyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPT0gY29sdW1ucyB8fCB0aGlzLnJvd3MgIT09IHJvd3MpIHtcbiAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgICB0aGlzLnJvd3MgPSByb3dzO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkU2l6ZUNoYW5nZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ3JpZFNpemVDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlTGF5b3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBhY3QpIHtcbiAgICAgIHRoaXMuY29tcGFjdC5jaGVja0NvbXBhY3QoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcbiAgICAgIGxldCBtYXJnaW5XaWR0aCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdCAhPT0gbnVsbCkge1xuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1sZWZ0JywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgKyAncHgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCAhPT0gbnVsbCkge1xuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctcmlnaHQnLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgKyAncHgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VyQ29sV2lkdGggPSAodGhpcy5jdXJXaWR0aCAtIG1hcmdpbldpZHRoKSAvIHRoaXMuY29sdW1ucztcbiAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAtdGhpcy4kb3B0aW9ucy5tYXJnaW47XG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCAhPT0gbnVsbCkge1xuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICsgJ3B4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctdG9wJywgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gKyAncHgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAodGhpcy5jdXJIZWlnaHQgLSBtYXJnaW5IZWlnaHQpIC8gdGhpcy5yb3dzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1ckNvbFdpZHRoID0gKHRoaXMuY3VyV2lkdGggKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLmNvbHVtbnM7XG4gICAgICB0aGlzLmN1clJvd0hlaWdodCA9ICh0aGlzLmN1ckhlaWdodCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSAvIHRoaXMucm93cztcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIDAgKyAncHgnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctcmlnaHQnLCAwICsgJ3B4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIDAgKyAncHgnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctYm90dG9tJywgMCArICdweCcpO1xuICAgIH1cbiAgICB0aGlzLmdyaWRSZW5kZXJlci51cGRhdGVHcmlkc3RlcigpO1xuXG4gICAgdGhpcy51cGRhdGVHcmlkKCk7XG5cbiAgICBpZiAodGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnd2lkdGgnLCAodGhpcy5jb2x1bW5zICogdGhpcy5jdXJDb2xXaWR0aCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSArICdweCcpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnaGVpZ2h0JywgKHRoaXMucm93cyAqIHRoaXMuY3VyUm93SGVpZ2h0ICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pICsgJ3B4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3dpZHRoJywgJycpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnaGVpZ2h0JywgJycpO1xuICAgIH1cblxuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcbiAgICAgIHdpZGdldC5zZXRTaXplKCk7XG4gICAgICB3aWRnZXQuZHJhZy50b2dnbGUoKTtcbiAgICAgIHdpZGdldC5yZXNpemUudG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpLCAxMDApO1xuICB9XG5cbiAgdXBkYXRlR3JpZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ2Fsd2F5cycgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdvbkRyYWcmUmVzaXplJyAmJiB0aGlzLmRyYWdJblByb2dyZXNzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdub25lJyB8fCAhdGhpcy5kcmFnSW5Qcm9ncmVzcyB8fCB0aGlzLm1vYmlsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmdyaWRDb2x1bW5zLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMuY29sdW1ucywgTWF0aC5mbG9vcih0aGlzLmN1cldpZHRoIC8gdGhpcy5jdXJDb2xXaWR0aCkpIHx8IDA7XG4gICAgdGhpcy5ncmlkUm93cy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLnJvd3MsIE1hdGguZmxvb3IodGhpcy5jdXJIZWlnaHQgLyB0aGlzLmN1clJvd0hlaWdodCkpIHx8IDA7XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZEl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHMgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scztcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS5jb2xzID0gaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnJvd3MgPSBpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3M7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLnggPT09IC0xIHx8IGl0ZW1Db21wb25lbnQuJGl0ZW0ueSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcbiAgICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NhblxcJ3QgYmUgcGxhY2VkIGluIHRoZSBib3VuZHMgb2YgdGhlIGRhc2hib2FyZCwgdHJ5aW5nIHRvIGF1dG8gcG9zaXRpb24hL24nICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZUF1dG9Qb3NpdGlvbk9uQ29uZmxpY3QpIHtcbiAgICAgICAgdGhpcy5hdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdyaWQucHVzaChpdGVtQ29tcG9uZW50KTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dERlYm91bmNlKCk7XG4gIH1cblxuICByZW1vdmVJdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZC5zcGxpY2UodGhpcy5ncmlkLmluZGV4T2YoaXRlbUNvbXBvbmVudCksIDEpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0RGVib3VuY2UoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pdGVtUmVtb3ZlZENhbGxiYWNrKGl0ZW1Db21wb25lbnQuaXRlbSwgaXRlbUNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XG4gICAgbGV0IGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2spIHtcbiAgICAgIGNvbGxpc2lvbiA9ICF0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2soaXRlbSk7XG4gICAgfVxuICAgIGlmICghY29sbGlzaW9uICYmIHRoaXMuY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW0pKSB7XG4gICAgICBjb2xsaXNpb24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbGxpc2lvbikge1xuICAgICAgY29uc3QgYyA9IHRoaXMuZmluZEl0ZW1XaXRoSXRlbShpdGVtKTtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIGNvbGxpc2lvbiA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2xsaXNpb247XG4gIH1cblxuICBjaGVja0dyaWRDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9OZWdhdGl2ZVBvc2l0aW9uID0gaXRlbS55ID4gLTEgJiYgaXRlbS54ID4gLTE7XG4gICAgY29uc3QgbWF4R3JpZENvbHMgPSBpdGVtLmNvbHMgKyBpdGVtLnggPD0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzO1xuICAgIGNvbnN0IG1heEdyaWRSb3dzID0gaXRlbS5yb3dzICsgaXRlbS55IDw9IHRoaXMuJG9wdGlvbnMubWF4Um93cztcbiAgICBjb25zdCBtYXhJdGVtQ29scyA9IGl0ZW0ubWF4SXRlbUNvbHMgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWF4SXRlbUNvbHMgOiBpdGVtLm1heEl0ZW1Db2xzO1xuICAgIGNvbnN0IG1pbkl0ZW1Db2xzID0gaXRlbS5taW5JdGVtQ29scyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQ29scyA6IGl0ZW0ubWluSXRlbUNvbHM7XG4gICAgY29uc3QgbWF4SXRlbVJvd3MgPSBpdGVtLm1heEl0ZW1Sb3dzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Sb3dzIDogaXRlbS5tYXhJdGVtUm93cztcbiAgICBjb25zdCBtaW5JdGVtUm93cyA9IGl0ZW0ubWluSXRlbVJvd3MgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWluSXRlbVJvd3MgOiBpdGVtLm1pbkl0ZW1Sb3dzO1xuICAgIGNvbnN0IGluQ29sc0xpbWl0cyA9IGl0ZW0uY29scyA8PSBtYXhJdGVtQ29scyAmJiBpdGVtLmNvbHMgPj0gbWluSXRlbUNvbHM7XG4gICAgY29uc3QgaW5Sb3dzTGltaXRzID0gaXRlbS5yb3dzIDw9IG1heEl0ZW1Sb3dzICYmIGl0ZW0ucm93cyA+PSBtaW5JdGVtUm93cztcbiAgICBjb25zdCBtaW5BcmVhTGltaXQgPSBpdGVtLm1pbkl0ZW1BcmVhID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1BcmVhIDogaXRlbS5taW5JdGVtQXJlYTtcbiAgICBjb25zdCBtYXhBcmVhTGltaXQgPSBpdGVtLm1heEl0ZW1BcmVhID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1BcmVhIDogaXRlbS5tYXhJdGVtQXJlYTtcbiAgICBjb25zdCBhcmVhID0gaXRlbS5jb2xzICogaXRlbS5yb3dzO1xuICAgIGNvbnN0IGluTWluQXJlYSA9IG1pbkFyZWFMaW1pdCA8PSBhcmVhO1xuICAgIGNvbnN0IGluTWF4QXJlYSA9IG1heEFyZWFMaW1pdCA+PSBhcmVhO1xuICAgIHJldHVybiAhKG5vTmVnYXRpdmVQb3NpdGlvbiAmJiBtYXhHcmlkQ29scyAmJiBtYXhHcmlkUm93cyAmJiBpbkNvbHNMaW1pdHMgJiYgaW5Sb3dzTGltaXRzICYmIGluTWluQXJlYSAmJiBpbk1heEFyZWEpO1xuICB9XG5cbiAgZmluZEl0ZW1XaXRoSXRlbShpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuIHtcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+IC0xOyB3aWRnZXRzSW5kZXgtLSkge1xuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XG4gICAgICBpZiAod2lkZ2V0LiRpdGVtICE9PSBpdGVtICYmIEdyaWRzdGVyQ29tcG9uZW50LmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMod2lkZ2V0LiRpdGVtLCBpdGVtKSkge1xuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmaW5kSXRlbXNXaXRoSXRlbShpdGVtOiBHcmlkc3Rlckl0ZW0pOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+IHtcbiAgICBjb25zdCBhOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+ID0gW107XG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPiAtMTsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgaWYgKHdpZGdldC4kaXRlbSAhPT0gaXRlbSAmJiBHcmlkc3RlckNvbXBvbmVudC5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKHdpZGdldC4kaXRlbSwgaXRlbSkpIHtcbiAgICAgICAgYS5wdXNoKHdpZGdldCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbihpdGVtQ29tcG9uZW50LiRpdGVtKSkge1xuICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSBmYWxzZTtcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS54ID0gaXRlbUNvbXBvbmVudC4kaXRlbS54O1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnkgPSBpdGVtQ29tcG9uZW50LiRpdGVtLnk7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5cXCd0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQhL24nICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24obmV3SXRlbTogR3JpZHN0ZXJJdGVtLCBzdGFydGluZ0Zyb206IHsgeT86IG51bWJlciwgeD86IG51bWJlciB9ID0ge30pOiBib29sZWFuIHtcbiAgICBpZiAobmV3SXRlbS5jb2xzID09PSAtMSkge1xuICAgICAgbmV3SXRlbS5jb2xzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbUNvbHM7XG4gICAgfVxuICAgIGlmIChuZXdJdGVtLnJvd3MgPT09IC0xKSB7XG4gICAgICBuZXdJdGVtLnJvd3MgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtUm93cztcbiAgICB9XG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xuICAgIGxldCByb3dzSW5kZXggPSBzdGFydGluZ0Zyb20ueSB8fCAwLCBjb2xzSW5kZXg7XG4gICAgZm9yICg7IHJvd3NJbmRleCA8IHRoaXMucm93czsgcm93c0luZGV4KyspIHtcbiAgICAgIG5ld0l0ZW0ueSA9IHJvd3NJbmRleDtcbiAgICAgIGNvbHNJbmRleCA9IHN0YXJ0aW5nRnJvbS54IHx8IDA7XG4gICAgICBmb3IgKDsgY29sc0luZGV4IDwgdGhpcy5jb2x1bW5zOyBjb2xzSW5kZXgrKykge1xuICAgICAgICBuZXdJdGVtLnggPSBjb2xzSW5kZXg7XG4gICAgICAgIGlmICghdGhpcy5jaGVja0NvbGxpc2lvbihuZXdJdGVtKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNhbkFkZFRvUm93cyA9IHRoaXMuJG9wdGlvbnMubWF4Um93cyA+PSB0aGlzLnJvd3MgKyBuZXdJdGVtLnJvd3M7XG4gICAgY29uc3QgY2FuQWRkVG9Db2x1bW5zID0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzID49IHRoaXMuY29sdW1ucyArIG5ld0l0ZW0uY29scztcbiAgICBjb25zdCBhZGRUb1Jvd3MgPSB0aGlzLnJvd3MgPD0gdGhpcy5jb2x1bW5zICYmIGNhbkFkZFRvUm93cztcbiAgICBpZiAoIWFkZFRvUm93cyAmJiBjYW5BZGRUb0NvbHVtbnMpIHtcbiAgICAgIG5ld0l0ZW0ueCA9IHRoaXMuY29sdW1ucztcbiAgICAgIG5ld0l0ZW0ueSA9IDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNhbkFkZFRvUm93cykge1xuICAgICAgbmV3SXRlbS55ID0gdGhpcy5yb3dzO1xuICAgICAgbmV3SXRlbS54ID0gMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtIHtcbiAgICBjb25zdCB0bXBJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbih0bXBJdGVtKTtcbiAgICByZXR1cm4gdG1wSXRlbTtcbiAgfVxuXG4gIGdldExhc3RQb3NzaWJsZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbSB7XG4gICAgbGV0IGZhcnRoZXN0SXRlbTogeyB5OiBudW1iZXIsIHg6IG51bWJlciB9ID0geyB5OiAwLCB4OiAwIH07XG4gICAgZmFydGhlc3RJdGVtID0gdGhpcy5ncmlkLnJlZHVjZSgocHJldjogYW55LCBjdXJyOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJDb29yZHMgPSB7IHk6IGN1cnIuJGl0ZW0ueSArIGN1cnIuJGl0ZW0ucm93cyAtIDEsIHg6IGN1cnIuJGl0ZW0ueCArIGN1cnIuJGl0ZW0uY29scyAtIDEgfTtcbiAgICAgIGlmIChHcmlkc3RlclV0aWxzLmNvbXBhcmVJdGVtcyhwcmV2LCBjdXJyQ29vcmRzKSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY3VyckNvb3JkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuICAgIH0sIGZhcnRoZXN0SXRlbSk7XG5cbiAgICBjb25zdCB0bXBJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbih0bXBJdGVtLCBmYXJ0aGVzdEl0ZW0pO1xuICAgIHJldHVybiB0bXBJdGVtO1xuICB9XG5cbiAgcGl4ZWxzVG9Qb3NpdGlvblgoeDogbnVtYmVyLCByb3VuZGluZ01ldGhvZDogRnVuY3Rpb24sIG5vTGltaXQ/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHJvdW5kaW5nTWV0aG9kKHggLyB0aGlzLmN1ckNvbFdpZHRoKTtcbiAgICBpZiAobm9MaW1pdCkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xuICAgIH1cbiAgfVxuXG4gIHBpeGVsc1RvUG9zaXRpb25ZKHk6IG51bWJlciwgcm91bmRpbmdNZXRob2Q6IEZ1bmN0aW9uLCBub0xpbWl0PzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgY29uc3QgcG9zaXRpb24gPSByb3VuZGluZ01ldGhvZCh5IC8gdGhpcy5jdXJSb3dIZWlnaHQpO1xuICAgIGlmIChub0xpbWl0KSB7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChwb3NpdGlvbiwgMCk7XG4gICAgfVxuICB9XG5cbiAgcG9zaXRpb25YVG9QaXhlbHMoeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4geCAqIHRoaXMuY3VyQ29sV2lkdGg7XG4gIH1cblxuICBwb3NpdGlvbllUb1BpeGVscyh5OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB5ICogdGhpcy5jdXJSb3dIZWlnaHQ7XG4gIH1cbn1cbiJdfQ==