@firestitch/list 12.12.1 → 12.12.3

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 (153) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +71 -71
  3. package/app/classes/data-controller.d.ts +90 -91
  4. package/app/classes/external-params-controller.d.ts +31 -31
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +174 -174
  7. package/app/classes/pagination-controller.d.ts +189 -189
  8. package/app/classes/persistance-controller.d.ts +10 -10
  9. package/app/classes/reorder-controller.d.ts +61 -66
  10. package/app/classes/selection-controller.d.ts +141 -146
  11. package/app/classes/sorting-controller.d.ts +64 -64
  12. package/app/components/body/body.component.d.ts +32 -32
  13. package/app/components/body/row/actions/actions.component.d.ts +35 -34
  14. package/app/components/body/row/cell/cell.component.d.ts +23 -23
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +16 -16
  16. package/app/components/body/row/menu-action/menu-action.component.d.ts +12 -14
  17. package/app/components/body/row/row.component.d.ts +72 -74
  18. package/app/components/customize-cols/customize-cols.component.d.ts +17 -17
  19. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -7
  20. package/app/components/footer/footer-row/footer-row.component.d.ts +11 -11
  21. package/app/components/footer/footer.component.d.ts +11 -11
  22. package/app/components/head/head-cell/head-cell.component.d.ts +14 -14
  23. package/app/components/head/head.component.d.ts +43 -43
  24. package/app/components/list/list.component.d.ts +113 -120
  25. package/app/components/loader/loader.component.d.ts +14 -14
  26. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +13 -13
  27. package/app/components/pagination/pagination.component.d.ts +14 -14
  28. package/app/components/saved-filters/saved-filters.component.d.ts +15 -15
  29. package/app/components/status/status.component.d.ts +21 -21
  30. package/app/directives/cell/cell.directive.d.ts +8 -8
  31. package/app/directives/column/column.directive.d.ts +33 -33
  32. package/app/directives/content/content.directive.d.ts +5 -5
  33. package/app/directives/content-init/content-init.directive.d.ts +9 -9
  34. package/app/directives/draggable-list/draggable-list.directive.d.ts +80 -89
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +21 -23
  36. package/app/directives/empty-state/empty-state.directive.d.ts +5 -5
  37. package/app/directives/footer/footer.directive.d.ts +8 -8
  38. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +10 -10
  39. package/app/directives/group-footer/group-footer.directive.d.ts +6 -6
  40. package/app/directives/group-header/group-header.directive.d.ts +6 -6
  41. package/app/directives/header/header.directive.d.ts +8 -8
  42. package/app/enums/button-type.enum.d.ts +7 -7
  43. package/app/enums/page-change-type.enum.d.ts +4 -4
  44. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  45. package/app/enums/row-type.enum.d.ts +6 -6
  46. package/app/enums/state.enum.d.ts +9 -9
  47. package/app/fs-list.module.d.ts +57 -59
  48. package/app/fs-list.providers.d.ts +3 -3
  49. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  50. package/app/interfaces/column-config.interface.d.ts +2 -2
  51. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  52. package/app/interfaces/external-params.interface.d.ts +13 -13
  53. package/app/interfaces/index.d.ts +3 -3
  54. package/app/interfaces/listconfig.interface.d.ts +250 -253
  55. package/app/interfaces/pagination.interface.d.ts +13 -13
  56. package/app/models/column-async-attribute.d.ts +5 -5
  57. package/app/models/column-attributes.d.ts +39 -39
  58. package/app/models/column.model.d.ts +59 -59
  59. package/app/models/row/base-row.d.ts +13 -13
  60. package/app/models/row/child-row.d.ts +12 -12
  61. package/app/models/row/group-footer-row.d.ts +10 -10
  62. package/app/models/row/group-row.d.ts +15 -16
  63. package/app/models/row/simple-row.d.ts +5 -5
  64. package/app/models/row-action.model.d.ts +31 -29
  65. package/app/models/row.d.ts +30 -30
  66. package/app/models/styleConfig.model.d.ts +31 -31
  67. package/app/services/group-expand-notifier.service.d.ts +11 -11
  68. package/bundles/firestitch-list.umd.js +6537 -6768
  69. package/bundles/firestitch-list.umd.js.map +1 -1
  70. package/esm2015/app/classes/actions-controller.js +55 -55
  71. package/esm2015/app/classes/columns-controller.js +205 -205
  72. package/esm2015/app/classes/data-controller.js +334 -352
  73. package/esm2015/app/classes/external-params-controller.js +153 -153
  74. package/esm2015/app/classes/index.js +3 -3
  75. package/esm2015/app/classes/list-controller.js +715 -714
  76. package/esm2015/app/classes/pagination-controller.js +460 -460
  77. package/esm2015/app/classes/persistance-controller.js +19 -19
  78. package/esm2015/app/classes/reorder-controller.js +170 -184
  79. package/esm2015/app/classes/selection-controller.js +445 -459
  80. package/esm2015/app/classes/sorting-controller.js +180 -180
  81. package/esm2015/app/components/body/body.component.js +76 -75
  82. package/esm2015/app/components/body/row/actions/actions.component.js +101 -96
  83. package/esm2015/app/components/body/row/cell/cell.component.js +92 -107
  84. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +41 -40
  85. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +32 -36
  86. package/esm2015/app/components/body/row/row.component.js +263 -264
  87. package/esm2015/app/components/customize-cols/customize-cols.component.js +72 -72
  88. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -20
  89. package/esm2015/app/components/footer/footer-row/footer-row.component.js +27 -26
  90. package/esm2015/app/components/footer/footer.component.js +26 -26
  91. package/esm2015/app/components/head/head-cell/head-cell.component.js +33 -33
  92. package/esm2015/app/components/head/head.component.js +91 -90
  93. package/esm2015/app/components/list/list.component.js +364 -386
  94. package/esm2015/app/components/loader/loader.component.js +47 -47
  95. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +79 -78
  96. package/esm2015/app/components/pagination/pagination.component.js +45 -44
  97. package/esm2015/app/components/saved-filters/saved-filters.component.js +33 -33
  98. package/esm2015/app/components/status/status.component.js +74 -74
  99. package/esm2015/app/directives/cell/cell.directive.js +18 -18
  100. package/esm2015/app/directives/column/column.directive.js +111 -111
  101. package/esm2015/app/directives/content/content.directive.js +12 -12
  102. package/esm2015/app/directives/content-init/content-init.directive.js +21 -21
  103. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +256 -321
  104. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +73 -81
  105. package/esm2015/app/directives/empty-state/empty-state.directive.js +13 -13
  106. package/esm2015/app/directives/footer/footer.directive.js +18 -18
  107. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +26 -26
  108. package/esm2015/app/directives/group-footer/group-footer.directive.js +13 -13
  109. package/esm2015/app/directives/group-header/group-header.directive.js +13 -13
  110. package/esm2015/app/directives/header/header.directive.js +18 -18
  111. package/esm2015/app/enums/button-type.enum.js +9 -9
  112. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  113. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  114. package/esm2015/app/enums/row-type.enum.js +7 -7
  115. package/esm2015/app/enums/state.enum.js +11 -11
  116. package/esm2015/app/fs-list.module.js +232 -241
  117. package/esm2015/app/fs-list.providers.js +4 -4
  118. package/esm2015/app/interfaces/cellconfig.interface.js +2 -2
  119. package/esm2015/app/interfaces/column-config.interface.js +1 -1
  120. package/esm2015/app/interfaces/draggable-list.interface.js +2 -2
  121. package/esm2015/app/interfaces/external-params.interface.js +2 -2
  122. package/esm2015/app/interfaces/index.js +4 -4
  123. package/esm2015/app/interfaces/listconfig.interface.js +2 -2
  124. package/esm2015/app/interfaces/pagination.interface.js +2 -2
  125. package/esm2015/app/models/column-async-attribute.js +13 -13
  126. package/esm2015/app/models/column-attributes.js +130 -130
  127. package/esm2015/app/models/column.model.js +166 -166
  128. package/esm2015/app/models/row/base-row.js +23 -23
  129. package/esm2015/app/models/row/child-row.js +28 -28
  130. package/esm2015/app/models/row/group-footer-row.js +21 -21
  131. package/esm2015/app/models/row/group-row.js +41 -45
  132. package/esm2015/app/models/row/simple-row.js +10 -10
  133. package/esm2015/app/models/row-action.model.js +109 -95
  134. package/esm2015/app/models/row.js +81 -81
  135. package/esm2015/app/models/styleConfig.model.js +75 -75
  136. package/esm2015/app/services/group-expand-notifier.service.js +26 -26
  137. package/esm2015/firestitch-list.js +4 -4
  138. package/esm2015/public_api.js +45 -46
  139. package/fesm2015/firestitch-list.js +5386 -5571
  140. package/fesm2015/firestitch-list.js.map +1 -1
  141. package/firestitch-list.d.ts +5 -5
  142. package/package.json +2 -2
  143. package/public_api.d.ts +38 -39
  144. package/app/directives/heading/heading.directive.d.ts +0 -5
  145. package/app/directives/index.d.ts +0 -2
  146. package/app/directives/subheading/subheading.directive.d.ts +0 -5
  147. package/app/pipes/action-label.d.ts +0 -8
  148. package/app/pipes/index.d.ts +0 -1
  149. package/esm2015/app/directives/heading/heading.directive.js +0 -13
  150. package/esm2015/app/directives/index.js +0 -3
  151. package/esm2015/app/directives/subheading/subheading.directive.js +0 -13
  152. package/esm2015/app/pipes/action-label.js +0 -17
  153. package/esm2015/app/pipes/index.js +0 -2
@@ -1,321 +1,256 @@
1
- import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone, Renderer2 } from '@angular/core';
2
- import { Observable, Subject } from 'rxjs';
3
- import { takeUntil } from 'rxjs/operators';
4
- import { ReorderController, ReorderStrategy } from '../../classes/reorder-controller';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../classes/reorder-controller";
7
- export class FsListDraggableListDirective {
8
- constructor(_cdRef, _zone, _containerElement, _reorderController, _renderer) {
9
- this._cdRef = _cdRef;
10
- this._zone = _zone;
11
- this._containerElement = _containerElement;
12
- this._reorderController = _reorderController;
13
- this._renderer = _renderer;
14
- // Handlers
15
- this._dragToHandler = this.dragTo.bind(this);
16
- this._dragEndHandler = this.dragEnd.bind(this);
17
- this._windowTouchMoveHandler = () => { };
18
- this._dragInProgress = false;
19
- this._dragStart$ = new Subject();
20
- this._dragEnd$ = new Subject();
21
- this._draggableChildrenDirectives = [];
22
- this._selectedRowsDirectives = [];
23
- this._destroy$ = new Subject();
24
- }
25
- get dragStart$() {
26
- return this._dragStart$.pipe(takeUntil(this._destroy$));
27
- }
28
- get dragEnd$() {
29
- return this._dragEnd$.pipe(takeUntil(this._destroy$));
30
- }
31
- get draggableItem() {
32
- return this._rows[this._draggableElementIndex];
33
- }
34
- get _isMultipleDrag() {
35
- return this._reorderController.multiple && this._selectedRowsDirectives.length > 1;
36
- }
37
- addDraggableDirective(dir) {
38
- this._draggableChildrenDirectives.push(dir);
39
- }
40
- removeDraggableDirective(dir) {
41
- const idx = this._draggableChildrenDirectives.indexOf(dir);
42
- if (idx !== -1) {
43
- this._draggableChildrenDirectives.splice(idx, 1);
44
- }
45
- }
46
- /**
47
- * Prepare draggable elements and add events
48
- * @param draggableElement
49
- */
50
- dragStart(draggableElement) {
51
- if (this._dragInProgress) {
52
- return;
53
- }
54
- if (this._reorderController.startCallback
55
- && this._reorderController.strategy === ReorderStrategy.Always) {
56
- this._reorderController.startCallback();
57
- }
58
- this._dragInProgress = true;
59
- window.document.body.classList.add('reorder-in-progress');
60
- this._draggableElement = draggableElement;
61
- this._detectSelectedRows();
62
- this.prepareElements();
63
- this.initDraggableElement();
64
- this._draggableElement.classList.add('draggable-elem');
65
- this._zone.runOutsideAngular(() => {
66
- window.addEventListener('touchmove', this._windowTouchMoveHandler, { passive: true });
67
- window.document.addEventListener('mousemove', this._dragToHandler, { passive: true });
68
- window.document.addEventListener('touchmove', this._dragToHandler, { passive: false });
69
- window.document.addEventListener('mouseup', this._dragEndHandler);
70
- window.document.addEventListener('touchend', this._dragEndHandler);
71
- window.document.addEventListener('touchcancel', this._dragEndHandler);
72
- });
73
- this._dragStart$.next();
74
- }
75
- /**
76
- * Move draggable elements and swap items
77
- * @param event
78
- */
79
- dragTo(event) {
80
- this.touchFix(event);
81
- const elemIndex = this.lookupElementUnder(event);
82
- const targetRow = this._rows[elemIndex];
83
- if (this._multipleDraggableElementPreview) {
84
- this._multipleDraggableElementPreview.style.left = event.clientX + 'px';
85
- this._multipleDraggableElementPreview.style.top = event.clientY + 'px';
86
- }
87
- // Can not drag before first group and after last group
88
- const swapWithBoundaryGroupElement = (elemIndex === 0 || elemIndex === this._rows.length - 1)
89
- && targetRow.isGroup
90
- && this.draggableItem.isChild;
91
- if (!swapWithBoundaryGroupElement) {
92
- if (elemIndex !== null) {
93
- if (targetRow.readyToSwap) {
94
- this.swapWithIndex(elemIndex);
95
- if (this._draggableElementPreview) {
96
- this._draggableElementPreview.classList.remove('fs-list-no-drop');
97
- }
98
- }
99
- else {
100
- if (this._draggableElementPreview) {
101
- this._draggableElementPreview.classList.add('fs-list-no-drop');
102
- }
103
- }
104
- }
105
- // FIXME
106
- if (this._draggableElementPreview) {
107
- const topOffset = (event.y || event.clientY) - (this._draggableElementHeight / 2);
108
- this._draggableElementPreview.style.top = topOffset + 'px';
109
- }
110
- }
111
- }
112
- /**
113
- * Remove events and classes after drag finish
114
- */
115
- dragEnd() {
116
- this._dragInProgress = false;
117
- this._reorderController.dataController.finishReorder();
118
- if (this._reorderController.movedCallback) {
119
- this._reorderController.movedCallback(this._reorderController.dataController.reorderData);
120
- }
121
- if (this._reorderController.strategy === ReorderStrategy.Always) {
122
- this._zone.run(() => {
123
- if (this._reorderController.doneCallback) {
124
- const result = this._reorderController.doneCallback(this._reorderController.dataController.reorderData);
125
- this._waitUntilIsNotDone(result);
126
- }
127
- });
128
- }
129
- // this._reorderController.dataController.updateOrderByRows(this._rows);
130
- ///
131
- this._containerElement.nativeElement.classList.remove('drag-hidden');
132
- this._draggableElement.classList.remove('draggable-elem');
133
- window.document.body.classList.remove('reorder-in-progress');
134
- this._draggableElement = null;
135
- if (this._draggableElementPreview) {
136
- this._draggableElementPreview.remove();
137
- this._draggableElementPreview = null;
138
- }
139
- else {
140
- this._renderer.removeChild(document.body, this._multipleDraggableElementPreview);
141
- this._multipleDraggableElementPreview = null;
142
- }
143
- this._draggableElementHeight = null;
144
- this._draggableElementIndex = null;
145
- this._selectedRowsDirectives = [];
146
- window.removeEventListener('touchmove', this._windowTouchMoveHandler);
147
- window.document.removeEventListener('mousemove', this._dragToHandler);
148
- window.document.removeEventListener('touchmove', this._dragToHandler);
149
- window.document.removeEventListener('mouseup', this._dragEndHandler);
150
- window.document.removeEventListener('touchend', this._dragEndHandler);
151
- window.document.removeEventListener('touchcancel', this._dragEndHandler);
152
- this._dragEnd$.next();
153
- }
154
- /**
155
- * looking row elements and save their dims
156
- */
157
- prepareElements() {
158
- this.lookupChildElements();
159
- this.calcElementsDimensions();
160
- }
161
- /**
162
- * Store child rows
163
- */
164
- lookupChildElements() {
165
- this._childRowElements = Array.from(this._containerElement.nativeElement.querySelectorAll('tr:not(.drag-hidden)'))
166
- .reduce((acc, rowElement, index) => {
167
- const element = { target: rowElement };
168
- if (rowElement === this._draggableElement) {
169
- this._draggableElementIndex = index;
170
- element.active = true;
171
- }
172
- acc.push(element);
173
- return acc;
174
- }, []);
175
- }
176
- /**
177
- * Calc child rows sizes/offsets
178
- */
179
- calcElementsDimensions() {
180
- this._childRowElements.forEach((el, index) => {
181
- const dims = el.target.getBoundingClientRect();
182
- el.top = dims.top;
183
- el.height = dims.height;
184
- el.center = dims.top + (dims.height / 2);
185
- el.index = index;
186
- });
187
- }
188
- /**
189
- * Init draggable element
190
- */
191
- initDraggableElement() {
192
- var _a;
193
- const el = this._draggableElement.cloneNode(true);
194
- const data = this._draggableElement.getBoundingClientRect();
195
- if (!(this._isMultipleDrag)) {
196
- el.style.width = data.width + 'px';
197
- el.style.left = data.left + 'px';
198
- el.style.top = data.top + 'px';
199
- el.classList.add('draggable');
200
- this._containerElement.nativeElement.insertAdjacentElement('afterbegin', el);
201
- this._draggableElementPreview = el;
202
- this._draggableElementHeight = data.height;
203
- this.updateDraggableDims();
204
- }
205
- else {
206
- // Create preview DIV
207
- this._containerElement.nativeElement.classList.add('drag-hidden');
208
- const selectedCount = (_a = this._selectedRowsDirectives) === null || _a === void 0 ? void 0 : _a.length;
209
- const previewBlock = this._renderer.createElement('div');
210
- previewBlock.style.left = data.left + 'px';
211
- previewBlock.style.top = data.top + 'px';
212
- const text = this._renderer.createText(`${selectedCount} selected items`);
213
- this._renderer.appendChild(previewBlock, text);
214
- this._renderer.addClass(previewBlock, 'preview-block');
215
- this._renderer.appendChild(document.body, previewBlock);
216
- this._multipleDraggableElementPreview = previewBlock;
217
- }
218
- }
219
- /**
220
- * Looking by stored row elements for overlapped row
221
- * @param event
222
- */
223
- lookupElementUnder(event) {
224
- const top = event.y || event.clientY;
225
- const bottom = event.y || event.clientY;
226
- let elemIndex = null;
227
- for (let i = 0; i < this._childRowElements.length; i++) {
228
- const el = this._childRowElements[i];
229
- if (!el.active) {
230
- if (top < el.center + (el.height / 2) && el.index < this._draggableElementIndex
231
- || bottom > el.center - (el.height / 2) && el.index > this._draggableElementIndex) {
232
- elemIndex = i;
233
- }
234
- }
235
- }
236
- return elemIndex;
237
- }
238
- /**
239
- * Swap rows
240
- * @param index
241
- */
242
- swapWithIndex(index) {
243
- const activeIndex = this._draggableElementIndex;
244
- const selectedRows = this._selectedRowsDirectives
245
- .map((d) => d.row)
246
- .filter((d) => d.readyToSwap);
247
- // Swap rows in global rows stack
248
- this._reorderController
249
- .dataController
250
- .swapRows(this._rows[activeIndex], this._rows[index], selectedRows, this._isMultipleDrag);
251
- // Swap visible rows
252
- if (!this._isMultipleDrag) {
253
- const activeRow = this._rows[activeIndex];
254
- this._rows[activeIndex] = this._rows[index];
255
- this._rows[index] = activeRow;
256
- const activeElement = this._childRowElements[activeIndex].target;
257
- this._childRowElements[activeIndex].active = false;
258
- this._childRowElements[activeIndex].target = this._childRowElements[index].target;
259
- this._childRowElements[index].target = activeElement;
260
- this._childRowElements[index].active = true;
261
- }
262
- this._draggableElementIndex = index;
263
- this._cdRef.detectChanges();
264
- }
265
- /**
266
- * Update cell width for draggable elem
267
- */
268
- updateDraggableDims() {
269
- const draggableCells = Array.from(this._draggableElementPreview.querySelectorAll('td'));
270
- Array.from(this._draggableElementPreview.querySelectorAll('td')).forEach((elem, index) => {
271
- const dims = elem.getBoundingClientRect();
272
- draggableCells[index].style.width = dims.width + 'px';
273
- });
274
- }
275
- _waitUntilIsNotDone(doneResult) {
276
- if (doneResult instanceof Observable) {
277
- this._reorderController.disableReorderAction();
278
- doneResult
279
- .pipe(takeUntil(this._destroy$))
280
- .subscribe(() => {
281
- this._reorderController.enableReorderAction();
282
- });
283
- }
284
- }
285
- _detectSelectedRows() {
286
- this._draggableChildrenDirectives
287
- .forEach((dir) => {
288
- var _a;
289
- const isRowSelected = (_a = this._reorderController.selectionController) === null || _a === void 0 ? void 0 : _a.isRowSelected(dir.row.data);
290
- if (isRowSelected && !dir.row.isGroup) {
291
- this._selectedRowsDirectives.push(dir);
292
- }
293
- });
294
- }
295
- /**
296
- * Fix background when mobile
297
- * @param e
298
- */
299
- touchFix(e) {
300
- if (!('clientX' in e) && !('clientY' in e)) {
301
- const touches = e.touches || e.originalEvent.touches;
302
- if (touches && touches.length) {
303
- e.clientX = touches[0].clientX;
304
- e.clientY = touches[0].clientY;
305
- }
306
- e.preventDefault();
307
- }
308
- }
309
- }
310
- FsListDraggableListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsListDraggableListDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.ReorderController }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
311
- FsListDraggableListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsListDraggableListDirective, selector: "[fsListDraggableList]", inputs: { _rows: ["rows", "_rows"] }, ngImport: i0 });
312
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsListDraggableListDirective, decorators: [{
313
- type: Directive,
314
- args: [{
315
- selector: '[fsListDraggableList]',
316
- }]
317
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.ReorderController }, { type: i0.Renderer2 }]; }, propDecorators: { _rows: [{
318
- type: Input,
319
- args: ['rows']
320
- }] } });
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUFXdEYsTUFBTSxPQUFPLDRCQUE0QjtJQXlCdkMsWUFDVSxNQUF5QixFQUN6QixLQUFhLEVBQ2IsaUJBQTZCLEVBQzdCLGtCQUFxQyxFQUNyQyxTQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN6QixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFZO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDckMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXRCOUIsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBSWhDLGlDQUE0QixHQUFrQyxFQUFFLENBQUM7UUFDakUsNEJBQXVCLEdBQWtDLEVBQUUsQ0FBQztRQUM1RCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQVEvQixDQUFDO0lBRUosSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQVksZUFBZTtRQUN6QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLHFCQUFxQixDQUFDLEdBQWdDO1FBQzNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLHdCQUF3QixDQUFDLEdBQWdDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsZ0JBQTZCO1FBQzVDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixPQUFPO1NBQ1I7UUFFRCxJQUNFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhO2VBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFDOUQ7WUFDQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUU1QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO1FBRTFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7WUFDekMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDeEUsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDeEU7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSw0QkFBNEIsR0FDaEMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7ZUFDckQsU0FBUyxDQUFDLE9BQU87ZUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFHaEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ2pDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtnQkFDdEIsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFO29CQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM5QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTt3QkFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDbkU7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7d0JBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7cUJBQ2hFO2lCQUNGO2FBQ0Y7WUFFRCxRQUFRO1lBQ1IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDN0Q7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXZELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRTtZQUV6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FDbkQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNsQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUU7b0JBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUNuRCxDQUFDO29CQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsd0VBQXdFO1FBQ3hFLEdBQUc7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFdkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztTQUN0QzthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFFbEMsTUFBTSxDQUFDLG1CQUFtQixDQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2FBQy9HLE1BQU0sQ0FBQyxDQUFDLEdBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFFNUMsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN6QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2dCQUNwQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzthQUN2QjtZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbEIsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0I7O1FBQzFCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFnQixDQUFDO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMzQixFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUMvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU3RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBRTNDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO2FBQU07WUFDTCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRWxFLE1BQU0sYUFBYSxHQUFHLE1BQUEsSUFBSSxDQUFDLHVCQUF1QiwwQ0FBRSxNQUFNLENBQUM7WUFDM0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDM0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFFekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxhQUFhLGlCQUFpQixDQUFDLENBQUM7WUFFMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxZQUFZLENBQUM7U0FDdEQ7SUFFSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQUMsS0FBSztRQUM5QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCO3VCQUMxRSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQ3BGLFNBQVMsR0FBRyxDQUFDLENBQUM7aUJBQ2Y7YUFDRjtTQUNGO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWEsQ0FBQyxLQUFLO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsdUJBQXVCO2FBQzlDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVoQyxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGtCQUFrQjthQUNwQixjQUFjO2FBQ2QsUUFBUSxDQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ2pCLFlBQVksRUFDWixJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO1FBRUosb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO1lBRTlCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDakUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFbkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2xGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQ3JELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQjtRQUN6QixNQUFNLGNBQWMsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTdGLEtBQUssQ0FBQyxJQUFJLENBQ1IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUNyRCxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMxQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxVQUFtQjtRQUM3QyxJQUFJLFVBQVUsWUFBWSxVQUFVLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFL0MsVUFBVTtpQkFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDL0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsNEJBQTRCO2FBQzlCLE9BQU8sQ0FBQyxDQUFDLEdBQWdDLEVBQUUsRUFBRTs7WUFDNUMsTUFBTSxhQUFhLEdBQUcsTUFBQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLDBDQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRS9GLElBQUksYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUMxQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ3JELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ2hDO1lBRUQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7MEhBeFlVLDRCQUE0Qjs4R0FBNUIsNEJBQTRCOzRGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtpQkFDbEM7OE1BcUJTLEtBQUs7c0JBRFosS0FBSzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVvcmRlckNvbnRyb2xsZXIsIFJlb3JkZXJTdHJhdGVneSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvcmVvcmRlci1jb250cm9sbGVyJztcbmltcG9ydCB7IFNlbGVjdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3NlbGVjdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFJvdyB9IGZyb20gJy4uLy4uL21vZGVscy9yb3cnO1xuaW1wb3J0IHsgRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZHJhZ2dhYmxlLWxpc3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzTGlzdFJlb3JkZXJEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmUgfSBmcm9tICcuLi9kcmFnZ2FibGUtcm93L2RyYWdnYWJsZS1yb3cuZGlyZWN0aXZlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZnNMaXN0RHJhZ2dhYmxlTGlzdF0nLFxufSlcbmV4cG9ydCBjbGFzcyBGc0xpc3REcmFnZ2FibGVMaXN0RGlyZWN0aXZlIHtcbiAgLy8gRHJhZ2dhYmxlIEVsZW1lbnRcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcHJpdmF0ZSBfZHJhZ1RvSGFuZGxlciA9IHRoaXMuZHJhZ1RvLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX2RyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIF9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NoaWxkUm93RWxlbWVudHM6IEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RyYWdFbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoJ3Jvd3MnKVxuICBwcml2YXRlIF9yb3dzOiBSb3dbXTtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmVbXSA9IFtdO1xuICBwcml2YXRlIF9zZWxlY3RlZFJvd3NEaXJlY3RpdmVzOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmVbXSA9IFtdO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX3Jlb3JkZXJDb250cm9sbGVyOiBSZW9yZGVyQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkcmFnU3RhcnQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnU3RhcnQkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyYWdFbmQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnRW5kJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcmFnZ2FibGVJdGVtKCk6IFJvdyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NbdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9pc011bHRpcGxlRHJhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIubXVsdGlwbGUgJiYgdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcy5sZW5ndGggPiAxO1xuICB9XG5cbiAgcHVibGljIGFkZERyYWdnYWJsZURpcmVjdGl2ZShkaXI6IEZzTGlzdERyYWdnYWJsZVJvd0RpcmVjdGl2ZSk6IHZvaWQge1xuICAgIHRoaXMuX2RyYWdnYWJsZUNoaWxkcmVuRGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRHJhZ2dhYmxlRGlyZWN0aXZlKGRpcjogRnNMaXN0RHJhZ2dhYmxlUm93RGlyZWN0aXZlKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzLmluZGV4T2YoZGlyKTtcblxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kcmFnZ2FibGVDaGlsZHJlbkRpcmVjdGl2ZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBhZGQgZXZlbnRzXG4gICAqIEBwYXJhbSBkcmFnZ2FibGVFbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZHJhZ1N0YXJ0KGRyYWdnYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2RyYWdJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RhcnRDYWxsYmFja1xuICAgICAgJiYgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RyYXRlZ3kgPT09IFJlb3JkZXJTdHJhdGVneS5BbHdheXNcbiAgICApIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0YXJ0Q2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdyZW9yZGVyLWluLXByb2dyZXNzJyk7XG5cbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50ID0gZHJhZ2dhYmxlRWxlbWVudDtcblxuICAgIHRoaXMuX2RldGVjdFNlbGVjdGVkUm93cygpO1xuICAgIHRoaXMucHJlcGFyZUVsZW1lbnRzKCk7XG5cbiAgICB0aGlzLmluaXREcmFnZ2FibGVFbGVtZW50KCk7XG5cbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnYWJsZS1lbGVtJyk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgdGhpcy5fd2luZG93VG91Y2hNb3ZlSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcmFnU3RhcnQkLm5leHQoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE1vdmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBzd2FwIGl0ZW1zXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHVibGljIGRyYWdUbyhldmVudCkge1xuICAgIHRoaXMudG91Y2hGaXgoZXZlbnQpO1xuICAgIGNvbnN0IGVsZW1JbmRleCA9IHRoaXMubG9va3VwRWxlbWVudFVuZGVyKGV2ZW50KTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSB0aGlzLl9yb3dzW2VsZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldykge1xuICAgICAgdGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldy5zdHlsZS5sZWZ0ID0gZXZlbnQuY2xpZW50WCArICdweCc7XG4gICAgICB0aGlzLl9tdWx0aXBsZURyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnN0eWxlLnRvcCA9IGV2ZW50LmNsaWVudFkgKyAncHgnO1xuICAgIH1cblxuICAgIC8vIENhbiBub3QgZHJhZyBiZWZvcmUgZmlyc3QgZ3JvdXAgYW5kIGFmdGVyIGxhc3QgZ3JvdXBcbiAgICBjb25zdCBzd2FwV2l0aEJvdW5kYXJ5R3JvdXBFbGVtZW50ID1cbiAgICAgIChlbGVtSW5kZXggPT09IDAgfHwgZWxlbUluZGV4ID09PSB0aGlzLl9yb3dzLmxlbmd0aCAtIDEpXG4gICAgICAmJiB0YXJnZXRSb3cuaXNHcm91cFxuICAgICAgJiYgdGhpcy5kcmFnZ2FibGVJdGVtLmlzQ2hpbGQ7XG5cblxuICAgIGlmICghc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCkge1xuICAgICAgaWYgKGVsZW1JbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGFyZ2V0Um93LnJlYWR5VG9Td2FwKSB7XG4gICAgICAgICAgdGhpcy5zd2FwV2l0aEluZGV4KGVsZW1JbmRleCk7XG4gICAgICAgICAgaWYgKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QucmVtb3ZlKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QuYWRkKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYTUVcbiAgICAgIGlmICh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldykge1xuICAgICAgICBjb25zdCB0b3BPZmZzZXQgPSAoZXZlbnQueSB8fCBldmVudC5jbGllbnRZKSAtICh0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0IC8gMik7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnN0eWxlLnRvcCA9ICB0b3BPZmZzZXQgKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnRzIGFuZCBjbGFzc2VzIGFmdGVyIGRyYWcgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgZHJhZ0VuZCgpIHtcbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLmZpbmlzaFJlb3JkZXIoKTtcblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5tb3ZlZENhbGxiYWNrKSB7XG5cbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5cykge1xuICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKFxuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIucmVvcmRlckRhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdFVudGlsSXNOb3REb25lKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnVwZGF0ZU9yZGVyQnlSb3dzKHRoaXMuX3Jvd3MpO1xuICAgIC8vL1xuICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLWhpZGRlbicpO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dhYmxlLWVsZW0nKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW9yZGVyLWluLXByb2dyZXNzJyk7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5fZHJhZ2dhYmxlRWxlbWVudFByZXZpZXcpIHtcbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnJlbW92ZSgpO1xuXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMuX211bHRpcGxlRHJhZ2dhYmxlRWxlbWVudFByZXZpZXcpO1xuICAgICAgdGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEhlaWdodCA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3NEaXJlY3RpdmVzID0gW107XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIHRoaXMuX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcblxuICAgIHRoaXMuX2RyYWdFbmQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsb29raW5nIHJvdyBlbGVtZW50cyBhbmQgc2F2ZSB0aGVpciBkaW1zXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVFbGVtZW50cygpIHtcbiAgICB0aGlzLmxvb2t1cENoaWxkRWxlbWVudHMoKTtcbiAgICB0aGlzLmNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBjaGlsZCByb3dzXG4gICAqL1xuICBwcml2YXRlIGxvb2t1cENoaWxkRWxlbWVudHMoKSB7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5fY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyOm5vdCguZHJhZy1oaWRkZW4pJykpXG4gICAgICAucmVkdWNlKChhY2M6IGFueVtdLCByb3dFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSB7IHRhcmdldDogcm93RWxlbWVudCB9O1xuXG4gICAgICAgIGlmIChyb3dFbGVtZW50ID09PSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgZWxlbWVudC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKSBhcyBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50W107XG4gIH1cblxuICAvKipcbiAgICogQ2FsYyBjaGlsZCByb3dzIHNpemVzL29mZnNldHNcbiAgICovXG4gIHByaXZhdGUgY2FsY0VsZW1lbnRzRGltZW5zaW9ucygpIHtcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmZvckVhY2goKGVsOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWwudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZWwudG9wID0gZGltcy50b3A7XG4gICAgICBlbC5oZWlnaHQgPSBkaW1zLmhlaWdodDtcbiAgICAgIGVsLmNlbnRlciA9IGRpbXMudG9wICsgKGRpbXMuaGVpZ2h0IC8gMik7XG4gICAgICBlbC5pbmRleCA9IGluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgaW5pdERyYWdnYWJsZUVsZW1lbnQoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghKHRoaXMuX2lzTXVsdGlwbGVEcmFnKSkge1xuICAgICAgZWwuc3R5bGUud2lkdGggPSBkYXRhLndpZHRoICsgJ3B4JztcbiAgICAgIGVsLnN0eWxlLmxlZnQgPSBkYXRhLmxlZnQgKyAncHgnO1xuICAgICAgZWwuc3R5bGUudG9wID0gZGF0YS50b3AgKyAncHgnO1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlJyk7XG5cbiAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBlbCk7XG5cbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gZWw7XG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gZGF0YS5oZWlnaHQ7XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ2dhYmxlRGltcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgcHJldmlldyBESVZcbiAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnLWhpZGRlbicpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcz8ubGVuZ3RoO1xuICAgICAgY29uc3QgcHJldmlld0Jsb2NrID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwcmV2aWV3QmxvY2suc3R5bGUubGVmdCA9IGRhdGEubGVmdCArICdweCc7XG4gICAgICBwcmV2aWV3QmxvY2suc3R5bGUudG9wID0gZGF0YS50b3AgKyAncHgnO1xuXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlVGV4dChgJHtzZWxlY3RlZENvdW50fSBzZWxlY3RlZCBpdGVtc2ApO1xuXG4gICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChwcmV2aWV3QmxvY2ssIHRleHQpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3MocHJldmlld0Jsb2NrLCAncHJldmlldy1ibG9jaycpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgcHJldmlld0Jsb2NrKTtcbiAgICAgIHRoaXMuX211bHRpcGxlRHJhZ2dhYmxlRWxlbWVudFByZXZpZXcgPSBwcmV2aWV3QmxvY2s7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogTG9va2luZyBieSBzdG9yZWQgcm93IGVsZW1lbnRzIGZvciBvdmVybGFwcGVkIHJvd1xuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHByaXZhdGUgbG9va3VwRWxlbWVudFVuZGVyKGV2ZW50KSB7XG4gICAgY29uc3QgdG9wID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IGJvdHRvbSA9IGV2ZW50LnkgfHwgZXZlbnQuY2xpZW50WTtcbiAgICBsZXQgZWxlbUluZGV4ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2hpbGRSb3dFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2ldO1xuXG4gICAgICBpZiAoIWVsLmFjdGl2ZSkge1xuICAgICAgICBpZiAodG9wIDwgZWwuY2VudGVyICsgKGVsLmhlaWdodCAvIDIpICYmIGVsLmluZGV4IDwgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4XG4gICAgICAgICAgfHwgYm90dG9tID4gZWwuY2VudGVyIC0gKGVsLmhlaWdodCAvIDIpICAmJiBlbC5pbmRleCA+IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCkge1xuICAgICAgICAgIGVsZW1JbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbUluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgcm93c1xuICAgKiBAcGFyYW0gaW5kZXhcbiAgICovXG4gIHByaXZhdGUgc3dhcFdpdGhJbmRleChpbmRleCkge1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4O1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX3NlbGVjdGVkUm93c0RpcmVjdGl2ZXNcbiAgICAgIC5tYXAoKGQpID0+IGQucm93KVxuICAgICAgLmZpbHRlcigoZCkgPT4gZC5yZWFkeVRvU3dhcCk7XG5cbiAgICAvLyBTd2FwIHJvd3MgaW4gZ2xvYmFsIHJvd3Mgc3RhY2tcbiAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlclxuICAgICAgLmRhdGFDb250cm9sbGVyXG4gICAgICAuc3dhcFJvd3MoXG4gICAgICAgIHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdLFxuICAgICAgICB0aGlzLl9yb3dzW2luZGV4XSxcbiAgICAgICAgc2VsZWN0ZWRSb3dzLFxuICAgICAgICB0aGlzLl9pc011bHRpcGxlRHJhZyxcbiAgICAgICk7XG5cbiAgICAvLyBTd2FwIHZpc2libGUgcm93c1xuICAgIGlmICghdGhpcy5faXNNdWx0aXBsZURyYWcpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdO1xuICAgICAgdGhpcy5fcm93c1thY3RpdmVJbmRleF0gPSB0aGlzLl9yb3dzW2luZGV4XTtcbiAgICAgIHRoaXMuX3Jvd3NbaW5kZXhdID0gYWN0aXZlUm93O1xuXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0O1xuICAgICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0uYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbYWN0aXZlSW5kZXhdLnRhcmdldCA9IHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldDtcbiAgICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2VsbCB3aWR0aCBmb3IgZHJhZ2dhYmxlIGVsZW1cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dhYmxlRGltcygpIHtcbiAgICBjb25zdCBkcmFnZ2FibGVDZWxsczogYW55ID0gQXJyYXkuZnJvbSh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpKTtcblxuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpXG4gICAgKS5mb3JFYWNoKChlbGVtOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGRyYWdnYWJsZUNlbGxzW2luZGV4XS5zdHlsZS53aWR0aCA9IGRpbXMud2lkdGggKyAncHgnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsSXNOb3REb25lKGRvbmVSZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoZG9uZVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRpc2FibGVSZW9yZGVyQWN0aW9uKCk7XG5cbiAgICAgIGRvbmVSZXN1bHRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZW5hYmxlUmVvcmRlckFjdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXRlY3RTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzXG4gICAgICAuZm9yRWFjaCgoZGlyOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgY29uc3QgaXNSb3dTZWxlY3RlZCA9IHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnNlbGVjdGlvbkNvbnRyb2xsZXI/LmlzUm93U2VsZWN0ZWQoZGlyLnJvdy5kYXRhKTtcblxuICAgICAgICBpZiAoaXNSb3dTZWxlY3RlZCAmJiAhZGlyLnJvdy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeCBiYWNrZ3JvdW5kIHdoZW4gbW9iaWxlXG4gICAqIEBwYXJhbSBlXG4gICAqL1xuICBwcml2YXRlIHRvdWNoRml4KGUpIHtcbiAgICBpZiAoISgnY2xpZW50WCcgaW4gZSkgJiYgISgnY2xpZW50WScgaW4gZSkpIHtcbiAgICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBlLmNsaWVudFggPSB0b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgIGUuY2xpZW50WSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuIl19
1
+ import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone } from '@angular/core';
2
+ import { Observable, Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { ReorderController, ReorderStrategy } from '../../classes/reorder-controller';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../classes/reorder-controller";
7
+ export class FsListDraggableListDirective {
8
+ constructor(_cdRef, _zone, _containerElement, _reorderController) {
9
+ this._cdRef = _cdRef;
10
+ this._zone = _zone;
11
+ this._containerElement = _containerElement;
12
+ this._reorderController = _reorderController;
13
+ // Handlers
14
+ this._dragToHandler = this.dragTo.bind(this);
15
+ this._dragEndHandler = this.dragEnd.bind(this);
16
+ this._windowTouchMoveHandler = () => { };
17
+ this._dragInProgress = false;
18
+ this._dragStart$ = new Subject();
19
+ this._dragEnd$ = new Subject();
20
+ this._destroy$ = new Subject();
21
+ }
22
+ get dragStart$() {
23
+ return this._dragStart$.pipe(takeUntil(this._destroy$));
24
+ }
25
+ get dragEnd$() {
26
+ return this._dragEnd$.pipe(takeUntil(this._destroy$));
27
+ }
28
+ get draggableItem() {
29
+ return this._rows[this._draggableElementIndex];
30
+ }
31
+ /**
32
+ * Prepare draggable elements and add events
33
+ * @param draggableElement
34
+ */
35
+ dragStart(draggableElement) {
36
+ if (this._dragInProgress) {
37
+ return;
38
+ }
39
+ if (this._reorderController.startCallback
40
+ && this._reorderController.strategy === ReorderStrategy.Always) {
41
+ this._reorderController.startCallback();
42
+ }
43
+ this._dragInProgress = true;
44
+ window.document.body.classList.add('reorder-in-progress');
45
+ this._draggableElement = draggableElement;
46
+ this.prepareElements();
47
+ this.initDraggableElement();
48
+ this._draggableElement.classList.add('draggable-elem');
49
+ this._zone.runOutsideAngular(() => {
50
+ window.addEventListener('touchmove', this._windowTouchMoveHandler, { passive: true });
51
+ window.document.addEventListener('mousemove', this._dragToHandler, { passive: true });
52
+ window.document.addEventListener('touchmove', this._dragToHandler, { passive: false });
53
+ window.document.addEventListener('mouseup', this._dragEndHandler);
54
+ window.document.addEventListener('touchend', this._dragEndHandler);
55
+ window.document.addEventListener('touchcancel', this._dragEndHandler);
56
+ });
57
+ this._dragStart$.next();
58
+ }
59
+ /**
60
+ * Move draggable elements and swap items
61
+ * @param event
62
+ */
63
+ dragTo(event) {
64
+ this.touchFix(event);
65
+ const elemIndex = this.lookupElementUnder(event);
66
+ const targetRow = this._rows[elemIndex];
67
+ // Can not drag before first group and after last group
68
+ const swapWithBoundaryGroupElement = (elemIndex === 0 || elemIndex === this._rows.length - 1)
69
+ && targetRow.isGroup
70
+ && this.draggableItem.isChild;
71
+ if (!swapWithBoundaryGroupElement) {
72
+ if (elemIndex !== null) {
73
+ if (targetRow.readyToSwap) {
74
+ this.swapWithIndex(elemIndex);
75
+ this._draggableElementPreview.classList.remove('fs-list-no-drop');
76
+ }
77
+ else {
78
+ this._draggableElementPreview.classList.add('fs-list-no-drop');
79
+ }
80
+ }
81
+ }
82
+ const topOffset = (event.y || event.clientY) - (this._draggableElementHeight / 2);
83
+ this._draggableElementPreview.style.top = topOffset + 'px';
84
+ }
85
+ /**
86
+ * Remove events and classes after drag finish
87
+ */
88
+ dragEnd() {
89
+ this._dragInProgress = false;
90
+ ///
91
+ if (this._reorderController.movedCallback) {
92
+ this._reorderController.movedCallback(this._reorderController.dataController.reorderData);
93
+ }
94
+ if (this._reorderController.strategy === ReorderStrategy.Always) {
95
+ this._zone.run(() => {
96
+ if (this._reorderController.doneCallback) {
97
+ const result = this._reorderController.doneCallback(this._reorderController.dataController.reorderData);
98
+ this._waitUntilIsNotDone(result);
99
+ }
100
+ });
101
+ }
102
+ // this._reorderController.dataController.updateOrderByRows(this._rows);
103
+ ///
104
+ this._draggableElement.classList.remove('draggable-elem');
105
+ window.document.body.classList.remove('reorder-in-progress');
106
+ this._draggableElementPreview.remove();
107
+ this._draggableElement = null;
108
+ this._draggableElementPreview = null;
109
+ this._draggableElementHeight = null;
110
+ this._draggableElementIndex = null;
111
+ window.removeEventListener('touchmove', this._windowTouchMoveHandler);
112
+ window.document.removeEventListener('mousemove', this._dragToHandler);
113
+ window.document.removeEventListener('touchmove', this._dragToHandler);
114
+ window.document.removeEventListener('mouseup', this._dragEndHandler);
115
+ window.document.removeEventListener('touchend', this._dragEndHandler);
116
+ window.document.removeEventListener('touchcancel', this._dragEndHandler);
117
+ this._dragEnd$.next();
118
+ }
119
+ /**
120
+ * looking row elements and save their dims
121
+ */
122
+ prepareElements() {
123
+ this.lookupChildElements();
124
+ this.calcElementsDimensions();
125
+ }
126
+ /**
127
+ * Store child rows
128
+ */
129
+ lookupChildElements() {
130
+ this._childRowElements = Array.from(this._containerElement.nativeElement.querySelectorAll('tr'))
131
+ .reduce((acc, rowElement, index) => {
132
+ const element = { target: rowElement };
133
+ if (rowElement === this._draggableElement) {
134
+ this._draggableElementIndex = index;
135
+ element.active = true;
136
+ }
137
+ acc.push(element);
138
+ return acc;
139
+ }, []);
140
+ }
141
+ /**
142
+ * Calc child rows sizes/offsets
143
+ */
144
+ calcElementsDimensions() {
145
+ this._childRowElements.forEach((el, index) => {
146
+ const dims = el.target.getBoundingClientRect();
147
+ el.top = dims.top;
148
+ el.height = dims.height;
149
+ el.center = dims.top + (dims.height / 2);
150
+ el.index = index;
151
+ });
152
+ }
153
+ /**
154
+ * Init draggable element
155
+ */
156
+ initDraggableElement() {
157
+ const el = this._draggableElement.cloneNode(true);
158
+ const data = this._draggableElement.getBoundingClientRect();
159
+ el.style.width = data.width + 'px';
160
+ el.style.left = data.left + 'px';
161
+ el.style.top = data.top + 'px';
162
+ el.classList.add('draggable');
163
+ this._containerElement.nativeElement.insertAdjacentElement('afterbegin', el);
164
+ this._draggableElementPreview = el;
165
+ this._draggableElementHeight = data.height;
166
+ this.updateDraggableDims();
167
+ }
168
+ /**
169
+ * Looking by stored row elemens for overlapped row
170
+ * @param event
171
+ */
172
+ lookupElementUnder(event) {
173
+ const top = event.y || event.clientY;
174
+ const bottom = event.y || event.clientY;
175
+ let elemIndex = null;
176
+ for (let i = 0; i < this._childRowElements.length; i++) {
177
+ const el = this._childRowElements[i];
178
+ if (!el.active) {
179
+ if (top < el.center + (el.height / 2) && el.index < this._draggableElementIndex
180
+ || bottom > el.center - (el.height / 2) && el.index > this._draggableElementIndex) {
181
+ elemIndex = i;
182
+ }
183
+ }
184
+ }
185
+ return elemIndex;
186
+ }
187
+ /**
188
+ * Swap rows
189
+ * @param index
190
+ */
191
+ swapWithIndex(index) {
192
+ const activeIndex = this._draggableElementIndex;
193
+ // Swap rows in global rows stack
194
+ this._reorderController
195
+ .dataController
196
+ .swapRows(this._rows[activeIndex], this._rows[index]);
197
+ // Swap visible rows
198
+ const activeRow = this._rows[activeIndex];
199
+ this._rows[activeIndex] = this._rows[index];
200
+ this._rows[index] = activeRow;
201
+ const activeElement = this._childRowElements[activeIndex].target;
202
+ this._childRowElements[activeIndex].active = false;
203
+ this._childRowElements[activeIndex].target = this._childRowElements[index].target;
204
+ this._childRowElements[index].target = activeElement;
205
+ this._childRowElements[index].active = true;
206
+ this._draggableElementIndex = index;
207
+ this._cdRef.detectChanges();
208
+ }
209
+ /**
210
+ * Update cell width for draggable elem
211
+ */
212
+ updateDraggableDims() {
213
+ const draggableCells = Array.from(this._draggableElementPreview.querySelectorAll('td'));
214
+ Array.from(this._draggableElementPreview.querySelectorAll('td')).forEach((elem, index) => {
215
+ const dims = elem.getBoundingClientRect();
216
+ draggableCells[index].style.width = dims.width + 'px';
217
+ });
218
+ }
219
+ _waitUntilIsNotDone(doneResult) {
220
+ if (doneResult instanceof Observable) {
221
+ this._reorderController.disableReorderAction();
222
+ doneResult
223
+ .pipe(takeUntil(this._destroy$))
224
+ .subscribe(() => {
225
+ console.log('enable');
226
+ this._reorderController.enableReorderAction();
227
+ });
228
+ }
229
+ }
230
+ /**
231
+ * Fix background when mobile
232
+ * @param e
233
+ */
234
+ touchFix(e) {
235
+ if (!('clientX' in e) && !('clientY' in e)) {
236
+ const touches = e.touches || e.originalEvent.touches;
237
+ if (touches && touches.length) {
238
+ e.clientX = touches[0].clientX;
239
+ e.clientY = touches[0].clientY;
240
+ }
241
+ e.preventDefault();
242
+ }
243
+ }
244
+ }
245
+ FsListDraggableListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsListDraggableListDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.ReorderController }], target: i0.ɵɵFactoryTarget.Directive });
246
+ FsListDraggableListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsListDraggableListDirective, selector: "[fsListDraggableList]", inputs: { _rows: ["rows", "_rows"] }, ngImport: i0 });
247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsListDraggableListDirective, decorators: [{
248
+ type: Directive,
249
+ args: [{
250
+ selector: '[fsListDraggableList]',
251
+ }]
252
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.ReorderController }]; }, propDecorators: { _rows: [{
253
+ type: Input,
254
+ args: ['rows']
255
+ }] } });
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQVF0RixNQUFNLE9BQU8sNEJBQTRCO0lBd0J2QyxZQUNVLE1BQXlCLEVBQ3pCLEtBQWEsRUFDYixpQkFBNkIsRUFDN0Isa0JBQXFDO1FBSHJDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQXBCL0MsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS2hDLGNBQVMsR0FBRyxJ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QW1CO1FBQzdDLElBQUksVUFBVSxZQUFZLFVBQVUsRUFBRTtZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUUvQyxVQUFVO2lCQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMvQixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNyRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUM3QixDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUNoQztZQUVELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7OzBIQTNUVSw0QkFBNEI7OEdBQTVCLDRCQUE0Qjs0RkFBNUIsNEJBQTRCO2tCQUh4QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7aUJBQ2xDO3NMQXFCUyxLQUFLO3NCQURaLEtBQUs7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZW9yZGVyQ29udHJvbGxlciwgUmVvcmRlclN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9yZW9yZGVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Jvdyc7XG5pbXBvcnQgeyBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kcmFnZ2FibGUtbGlzdC5pbnRlcmZhY2UnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0xpc3REcmFnZ2FibGVMaXN0XScsXG59KVxuZXhwb3J0IGNsYXNzIEZzTGlzdERyYWdnYWJsZUxpc3REaXJlY3RpdmUge1xuXG4gIC8vIERyYWdnYWJsZSBFbGVtZW50XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9kcmFnZ2FibGVFbGVtZW50UHJldmlldzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcHJpdmF0ZSBfZHJhZ1RvSGFuZGxlciA9IHRoaXMuZHJhZ1RvLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX2RyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIF9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NoaWxkUm93RWxlbWVudHM6IEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RyYWdFbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoJ3Jvd3MnKVxuICBwcml2YXRlIF9yb3dzOiBSb3dbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX3Jlb3JkZXJDb250cm9sbGVyOiBSZW9yZGVyQ29udHJvbGxlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZHJhZ1N0YXJ0JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0JC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcmFnRW5kJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJhZ0VuZCQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHJhZ2dhYmxlSXRlbSgpOiBSb3cge1xuICAgIHJldHVybiB0aGlzLl9yb3dzW3RoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBkcmFnZ2FibGUgZWxlbWVudHMgYW5kIGFkZCBldmVudHNcbiAgICogQHBhcmFtIGRyYWdnYWJsZUVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBkcmFnU3RhcnQoZHJhZ2dhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fZHJhZ0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdGFydENhbGxiYWNrXG4gICAgICAmJiB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5c1xuICAgICkge1xuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RhcnRDYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYWdJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Jlb3JkZXItaW4tcHJvZ3Jlc3MnKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQgPSBkcmFnZ2FibGVFbGVtZW50O1xuXG4gICAgdGhpcy5wcmVwYXJlRWxlbWVudHMoKTtcblxuICAgIHRoaXMuaW5pdERyYWdnYWJsZUVsZW1lbnQoKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlLWVsZW0nKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCB0aGlzLl93aW5kb3dUb3VjaE1vdmVIYW5kbGVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2RyYWdTdGFydCQubmV4dCgpO1xuXG4gIH1cblxuXG4gIC8qKlxuICAgKiBNb3ZlIGRyYWdnYWJsZSBlbGVtZW50cyBhbmQgc3dhcCBpdGVtc1xuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyBkcmFnVG8oZXZlbnQpIHtcbiAgICB0aGlzLnRvdWNoRml4KGV2ZW50KTtcbiAgICBjb25zdCBlbGVtSW5kZXggPSB0aGlzLmxvb2t1cEVsZW1lbnRVbmRlcihldmVudCk7XG4gICAgY29uc3QgdGFyZ2V0Um93ID0gdGhpcy5fcm93c1tlbGVtSW5kZXhdO1xuXG4gICAgLy8gQ2FuIG5vdCBkcmFnIGJlZm9yZSBmaXJzdCBncm91cCBhbmQgYWZ0ZXIgbGFzdCBncm91cFxuICAgIGNvbnN0IHN3YXBXaXRoQm91bmRhcnlHcm91cEVsZW1lbnQgPVxuICAgICAgKGVsZW1JbmRleCA9PT0gMCB8fCBlbGVtSW5kZXggPT09IHRoaXMuX3Jvd3MubGVuZ3RoIC0gMSlcbiAgICAgICYmIHRhcmdldFJvdy5pc0dyb3VwXG4gICAgICAmJiB0aGlzLmRyYWdnYWJsZUl0ZW0uaXNDaGlsZDtcblxuICAgIGlmICghc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCkge1xuICAgICAgaWYgKGVsZW1JbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGFyZ2V0Um93LnJlYWR5VG9Td2FwKSB7XG4gICAgICAgICAgdGhpcy5zd2FwV2l0aEluZGV4KGVsZW1JbmRleClcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QucmVtb3ZlKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QuYWRkKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvcE9mZnNldCA9IChldmVudC55IHx8IGV2ZW50LmNsaWVudFkpIC0gKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQgLyAyKTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5zdHlsZS50b3AgPSAgdG9wT2Zmc2V0ICsgJ3B4JztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnRzIGFuZCBjbGFzc2VzIGFmdGVyIGRyYWcgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgZHJhZ0VuZCgpIHtcbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8vXG4gICAgaWYgKHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5cykge1xuICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKFxuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIucmVvcmRlckRhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdFVudGlsSXNOb3REb25lKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnVwZGF0ZU9yZGVyQnlSb3dzKHRoaXMuX3Jvd3MpO1xuICAgIC8vL1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2FibGUtZWxlbScpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Jlb3JkZXItaW4tcHJvZ3Jlc3MnKTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5yZW1vdmUoKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gbnVsbDtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXggPSBudWxsO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCB0aGlzLl93aW5kb3dUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG5cbiAgICB0aGlzLl9kcmFnRW5kJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogbG9va2luZyByb3cgZWxlbWVudHMgYW5kIHNhdmUgdGhlaXIgZGltc1xuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRWxlbWVudHMoKSB7XG4gICAgdGhpcy5sb29rdXBDaGlsZEVsZW1lbnRzKCk7XG4gICAgdGhpcy5jYWxjRWxlbWVudHNEaW1lbnNpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgY2hpbGQgcm93c1xuICAgKi9cbiAgcHJpdmF0ZSBsb29rdXBDaGlsZEVsZW1lbnRzKCkge1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0cicpKVxuICAgICAgLnJlZHVjZSgoYWNjOiBhbnlbXSwgcm93RWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0geyB0YXJnZXQ6IHJvd0VsZW1lbnQgfTtcblxuICAgICAgICBpZiAocm93RWxlbWVudCA9PT0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGVsZW1lbnQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjYy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSkgYXMgRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGMgY2hpbGQgcm93cyBzaXplcy9vZmZzZXRzXG4gICAqL1xuICBwcml2YXRlIGNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKSB7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cy5mb3JFYWNoKChlbDogYW55LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZGltcyA9IGVsLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGVsLnRvcCA9IGRpbXMudG9wO1xuICAgICAgZWwuaGVpZ2h0ID0gZGltcy5oZWlnaHQ7XG4gICAgICBlbC5jZW50ZXIgPSBkaW1zLnRvcCArIChkaW1zLmhlaWdodCAvIDIpO1xuICAgICAgZWwuaW5kZXggPSBpbmRleDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IGRyYWdnYWJsZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGluaXREcmFnZ2FibGVFbGVtZW50KCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBlbC5zdHlsZS53aWR0aCA9IGRhdGEud2lkdGggKyAncHgnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSBkYXRhLmxlZnQgKyAncHgnO1xuICAgIGVsLnN0eWxlLnRvcCA9IGRhdGEudG9wICsgJ3B4JztcblxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2RyYWdnYWJsZScpO1xuXG4gICAgdGhpcy5fY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIGVsKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gZWw7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEhlaWdodCA9IGRhdGEuaGVpZ2h0O1xuXG4gICAgdGhpcy51cGRhdGVEcmFnZ2FibGVEaW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9va2luZyBieSBzdG9yZWQgcm93IGVsZW1lbnMgZm9yIG92ZXJsYXBwZWQgcm93XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBsb29rdXBFbGVtZW50VW5kZXIoZXZlbnQpIHtcbiAgICBjb25zdCB0b3AgPSBldmVudC55IHx8IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgYm90dG9tID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xuICAgIGxldCBlbGVtSW5kZXggPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaV07XG5cbiAgICAgIGlmICghZWwuYWN0aXZlKSB7XG4gICAgICAgIGlmICh0b3AgPCBlbC5jZW50ZXIgKyAoZWwuaGVpZ2h0IC8gMikgJiYgZWwuaW5kZXggPCB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXhcbiAgICAgICAgICB8fCBib3R0b20gPiBlbC5jZW50ZXIgLSAoZWwuaGVpZ2h0IC8gMikgICYmIGVsLmluZGV4ID4gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4KSB7XG4gICAgICAgICAgZWxlbUluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCByb3dzXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBzd2FwV2l0aEluZGV4KGluZGV4KSB7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXg7XG5cbiAgICAvLyBTd2FwIHJvd3MgaW4gZ2xvYmFsIHJvd3Mgc3RhY2tcbiAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlclxuICAgICAgLmRhdGFDb250cm9sbGVyXG4gICAgICAuc3dhcFJvd3ModGhpcy5fcm93c1thY3RpdmVJbmRleF0gLCB0aGlzLl9yb3dzW2luZGV4XSk7XG5cbiAgICAvLyBTd2FwIHZpc2libGUgcm93c1xuICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdO1xuICAgIHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdID0gdGhpcy5fcm93c1tpbmRleF07XG4gICAgdGhpcy5fcm93c1tpbmRleF0gPSBhY3RpdmVSb3c7XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0O1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbYWN0aXZlSW5kZXhdLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0udGFyZ2V0O1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0uYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXggPSBpbmRleDtcblxuICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2VsbCB3aWR0aCBmb3IgZHJhZ2dhYmxlIGVsZW1cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dhYmxlRGltcygpIHtcbiAgICBjb25zdCBkcmFnZ2FibGVDZWxsczogYW55ID0gQXJyYXkuZnJvbSh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpKTtcblxuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpXG4gICAgKS5mb3JFYWNoKChlbGVtOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGRyYWdnYWJsZUNlbGxzW2luZGV4XS5zdHlsZS53aWR0aCA9IGRpbXMud2lkdGggKyAncHgnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsSXNOb3REb25lKGRvbmVSZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoZG9uZVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRpc2FibGVSZW9yZGVyQWN0aW9uKCk7XG5cbiAgICAgIGRvbmVSZXN1bHRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2VuYWJsZScpO1xuICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmVuYWJsZVJlb3JkZXJBY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpeCBiYWNrZ3JvdW5kIHdoZW4gbW9iaWxlXG4gICAqIEBwYXJhbSBlXG4gICAqL1xuICBwcml2YXRlIHRvdWNoRml4KGUpIHtcbiAgICBpZiAoISgnY2xpZW50WCcgaW4gZSkgJiYgISgnY2xpZW50WScgaW4gZSkpIHtcbiAgICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBlLmNsaWVudFggPSB0b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgIGUuY2xpZW50WSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuIl19