@schneideress/dashboardframework 17.0.47 → 20.0.0

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