@firestitch/list 12.9.0 → 12.11.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 (147) 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 +91 -90
  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 +66 -62
  10. package/app/classes/selection-controller.d.ts +146 -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 +34 -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 +14 -14
  17. package/app/components/body/row/row.component.d.ts +74 -72
  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 +118 -118
  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 +89 -80
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +23 -21
  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 -57
  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 +252 -251
  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 +16 -16
  63. package/app/models/row/simple-row.d.ts +5 -5
  64. package/app/models/row-action.model.d.ts +29 -29
  65. package/app/models/row.d.ts +30 -30
  66. package/app/models/styleConfig.model.d.ts +31 -31
  67. package/app/pipes/action-label.d.ts +8 -8
  68. package/app/pipes/index.d.ts +1 -1
  69. package/app/services/group-expand-notifier.service.d.ts +11 -11
  70. package/bundles/firestitch-list.umd.js +6712 -6580
  71. package/bundles/firestitch-list.umd.js.map +1 -1
  72. package/esm2015/app/classes/actions-controller.js +55 -55
  73. package/esm2015/app/classes/columns-controller.js +205 -205
  74. package/esm2015/app/classes/data-controller.js +352 -331
  75. package/esm2015/app/classes/external-params-controller.js +153 -153
  76. package/esm2015/app/classes/index.js +3 -3
  77. package/esm2015/app/classes/list-controller.js +714 -714
  78. package/esm2015/app/classes/pagination-controller.js +460 -460
  79. package/esm2015/app/classes/persistance-controller.js +19 -19
  80. package/esm2015/app/classes/reorder-controller.js +183 -178
  81. package/esm2015/app/classes/selection-controller.js +458 -458
  82. package/esm2015/app/classes/sorting-controller.js +180 -180
  83. package/esm2015/app/components/body/body.component.js +75 -75
  84. package/esm2015/app/components/body/row/actions/actions.component.js +95 -95
  85. package/esm2015/app/components/body/row/cell/cell.component.js +107 -107
  86. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +39 -39
  87. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +35 -35
  88. package/esm2015/app/components/body/row/row.component.js +264 -254
  89. package/esm2015/app/components/customize-cols/customize-cols.component.js +72 -72
  90. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -20
  91. package/esm2015/app/components/footer/footer-row/footer-row.component.js +26 -26
  92. package/esm2015/app/components/footer/footer.component.js +26 -26
  93. package/esm2015/app/components/head/head-cell/head-cell.component.js +33 -33
  94. package/esm2015/app/components/head/head.component.js +90 -90
  95. package/esm2015/app/components/list/list.component.js +382 -382
  96. package/esm2015/app/components/loader/loader.component.js +47 -47
  97. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +78 -78
  98. package/esm2015/app/components/pagination/pagination.component.js +44 -44
  99. package/esm2015/app/components/saved-filters/saved-filters.component.js +33 -33
  100. package/esm2015/app/components/status/status.component.js +74 -74
  101. package/esm2015/app/directives/cell/cell.directive.js +18 -18
  102. package/esm2015/app/directives/column/column.directive.js +111 -111
  103. package/esm2015/app/directives/content/content.directive.js +12 -12
  104. package/esm2015/app/directives/content-init/content-init.directive.js +21 -21
  105. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +321 -255
  106. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +81 -73
  107. package/esm2015/app/directives/empty-state/empty-state.directive.js +13 -13
  108. package/esm2015/app/directives/footer/footer.directive.js +18 -18
  109. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +26 -26
  110. package/esm2015/app/directives/group-footer/group-footer.directive.js +13 -13
  111. package/esm2015/app/directives/group-header/group-header.directive.js +13 -13
  112. package/esm2015/app/directives/header/header.directive.js +18 -18
  113. package/esm2015/app/enums/button-type.enum.js +9 -9
  114. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  115. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  116. package/esm2015/app/enums/row-type.enum.js +7 -7
  117. package/esm2015/app/enums/state.enum.js +11 -11
  118. package/esm2015/app/fs-list.module.js +231 -231
  119. package/esm2015/app/fs-list.providers.js +4 -4
  120. package/esm2015/app/interfaces/cellconfig.interface.js +2 -2
  121. package/esm2015/app/interfaces/column-config.interface.js +1 -1
  122. package/esm2015/app/interfaces/draggable-list.interface.js +2 -2
  123. package/esm2015/app/interfaces/external-params.interface.js +2 -2
  124. package/esm2015/app/interfaces/index.js +4 -4
  125. package/esm2015/app/interfaces/listconfig.interface.js +2 -2
  126. package/esm2015/app/interfaces/pagination.interface.js +2 -2
  127. package/esm2015/app/models/column-async-attribute.js +13 -13
  128. package/esm2015/app/models/column-attributes.js +130 -130
  129. package/esm2015/app/models/column.model.js +166 -166
  130. package/esm2015/app/models/row/base-row.js +23 -23
  131. package/esm2015/app/models/row/child-row.js +28 -28
  132. package/esm2015/app/models/row/group-footer-row.js +20 -20
  133. package/esm2015/app/models/row/group-row.js +44 -44
  134. package/esm2015/app/models/row/simple-row.js +10 -10
  135. package/esm2015/app/models/row-action.model.js +94 -94
  136. package/esm2015/app/models/row.js +80 -80
  137. package/esm2015/app/models/styleConfig.model.js +75 -75
  138. package/esm2015/app/pipes/action-label.js +16 -16
  139. package/esm2015/app/pipes/index.js +1 -1
  140. package/esm2015/app/services/group-expand-notifier.service.js +26 -26
  141. package/esm2015/firestitch-list.js +4 -4
  142. package/esm2015/public_api.js +44 -44
  143. package/fesm2015/firestitch-list.js +5522 -5412
  144. package/fesm2015/firestitch-list.js.map +1 -1
  145. package/firestitch-list.d.ts +5 -5
  146. package/package.json +1 -1
  147. package/public_api.d.ts +38 -38
@@ -1,255 +1,321 @@
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
- this._reorderController.enableReorderAction();
226
- });
227
- }
228
- }
229
- /**
230
- * Fix background when mobile
231
- * @param e
232
- */
233
- touchFix(e) {
234
- if (!('clientX' in e) && !('clientY' in e)) {
235
- const touches = e.touches || e.originalEvent.touches;
236
- if (touches && touches.length) {
237
- e.clientX = touches[0].clientX;
238
- e.clientY = touches[0].clientY;
239
- }
240
- e.preventDefault();
241
- }
242
- }
243
- }
244
- 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 });
245
- FsListDraggableListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsListDraggableListDirective, selector: "[fsListDraggableList]", inputs: { _rows: ["rows", "_rows"] }, ngImport: i0 });
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsListDraggableListDirective, decorators: [{
247
- type: Directive,
248
- args: [{
249
- selector: '[fsListDraggableList]',
250
- }]
251
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.ReorderController }]; }, propDecorators: { _rows: [{
252
- type: Input,
253
- args: ['rows']
254
- }] } });
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQVF0RixNQUFNLE9BQU8sNEJBQTRCO0lBd0J2QyxZQUNVLE1BQXlCLEVBQ3pCLEtBQWEsRUFDYixpQkFBNkIsRUFDN0Isa0JBQXFDO1FBSHJDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQXBCL0MsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS2hDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBTy9CLENBQUM7SUFFSixJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUFDLGdCQUE2QjtRQUM1QyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBRUQsSUFDRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYTtlQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQzlEO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUUxQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNoQyxNQUFNLENBQUMsZ0JBQWdCLENBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN0RixNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNuRSxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRTFCLENBQUM7SUFHRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhDLHVEQUF1RDtRQUN2RCxNQUFNLDRCQUE0QixHQUNoQyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztlQUNyRCxTQUFTLENBQUMsT0FBTztlQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUVoQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7WUFDakMsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO2dCQUN0QixJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7b0JBQzdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQ25FO3FCQUFNO29CQUNMLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQ2hFO2FBQ0Y7U0FDRjtRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUksU0FBUyxHQUFHLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFFN0IsR0FBRztRQUNILElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRTtZQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FDbkQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNsQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUU7b0JBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUNuRCxDQUFDO29CQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsd0VBQXdFO1FBQ3hFLEdBQUc7UUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUVuQyxNQUFNLENBQUMsbUJBQW1CLENBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdGLE1BQU0sQ0FBQyxDQUFDLEdBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFFNUMsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN6QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2dCQUNwQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzthQUN2QjtZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbEIsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0I7UUFDMUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWdCLENBQUM7UUFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFNUQsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbkMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFFL0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUzQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQUMsS0FBSztRQUM5QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCO3VCQUMxRSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQ3BGLFNBQVMsR0FBRyxDQUFDLENBQUM7aUJBQ2Y7YUFDRjtTQUNGO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWEsQ0FBQyxLQUFLO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUVoRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGtCQUFrQjthQUNwQixjQUFjO2FBQ2QsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpELG9CQUFvQjtRQUNwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUU5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRW5ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM1QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBRXBDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLE1BQU0sY0FBYyxHQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFN0YsS0FBSyxDQUFDLElBQUksQ0FDUixJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQ3JELENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFVBQW1CO1FBQzdDLElBQUksVUFBVSxZQUFZLFVBQVUsRUFBRTtZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUUvQyxVQUFVO2lCQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMvQixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNyRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUM3QixDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUNoQztZQUVELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7OzBIQTFUVSw0QkFBNEI7OEdBQTVCLDRCQUE0Qjs0RkFBNUIsNEJBQTRCO2tCQUh4QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7aUJBQ2xDO3NMQXFCUyxLQUFLO3NCQURaLEtBQUs7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZW9yZGVyQ29udHJvbGxlciwgUmVvcmRlclN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9yZW9yZGVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Jvdyc7XG5pbXBvcnQgeyBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kcmFnZ2FibGUtbGlzdC5pbnRlcmZhY2UnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0xpc3REcmFnZ2FibGVMaXN0XScsXG59KVxuZXhwb3J0IGNsYXNzIEZzTGlzdERyYWdnYWJsZUxpc3REaXJlY3RpdmUge1xuXG4gIC8vIERyYWdnYWJsZSBFbGVtZW50XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9kcmFnZ2FibGVFbGVtZW50UHJldmlldzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcHJpdmF0ZSBfZHJhZ1RvSGFuZGxlciA9IHRoaXMuZHJhZ1RvLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX2RyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIF9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NoaWxkUm93RWxlbWVudHM6IEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RyYWdFbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoJ3Jvd3MnKVxuICBwcml2YXRlIF9yb3dzOiBSb3dbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX3Jlb3JkZXJDb250cm9sbGVyOiBSZW9yZGVyQ29udHJvbGxlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZHJhZ1N0YXJ0JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0JC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcmFnRW5kJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJhZ0VuZCQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHJhZ2dhYmxlSXRlbSgpOiBSb3cge1xuICAgIHJldHVybiB0aGlzLl9yb3dzW3RoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBkcmFnZ2FibGUgZWxlbWVudHMgYW5kIGFkZCBldmVudHNcbiAgICogQHBhcmFtIGRyYWdnYWJsZUVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBkcmFnU3RhcnQoZHJhZ2dhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fZHJhZ0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdGFydENhbGxiYWNrXG4gICAgICAmJiB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5c1xuICAgICkge1xuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RhcnRDYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYWdJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Jlb3JkZXItaW4tcHJvZ3Jlc3MnKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQgPSBkcmFnZ2FibGVFbGVtZW50O1xuXG4gICAgdGhpcy5wcmVwYXJlRWxlbWVudHMoKTtcblxuICAgIHRoaXMuaW5pdERyYWdnYWJsZUVsZW1lbnQoKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlLWVsZW0nKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCB0aGlzLl93aW5kb3dUb3VjaE1vdmVIYW5kbGVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2RyYWdTdGFydCQubmV4dCgpO1xuXG4gIH1cblxuXG4gIC8qKlxuICAgKiBNb3ZlIGRyYWdnYWJsZSBlbGVtZW50cyBhbmQgc3dhcCBpdGVtc1xuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyBkcmFnVG8oZXZlbnQpIHtcbiAgICB0aGlzLnRvdWNoRml4KGV2ZW50KTtcbiAgICBjb25zdCBlbGVtSW5kZXggPSB0aGlzLmxvb2t1cEVsZW1lbnRVbmRlcihldmVudCk7XG4gICAgY29uc3QgdGFyZ2V0Um93ID0gdGhpcy5fcm93c1tlbGVtSW5kZXhdO1xuXG4gICAgLy8gQ2FuIG5vdCBkcmFnIGJlZm9yZSBmaXJzdCBncm91cCBhbmQgYWZ0ZXIgbGFzdCBncm91cFxuICAgIGNvbnN0IHN3YXBXaXRoQm91bmRhcnlHcm91cEVsZW1lbnQgPVxuICAgICAgKGVsZW1JbmRleCA9PT0gMCB8fCBlbGVtSW5kZXggPT09IHRoaXMuX3Jvd3MubGVuZ3RoIC0gMSlcbiAgICAgICYmIHRhcmdldFJvdy5pc0dyb3VwXG4gICAgICAmJiB0aGlzLmRyYWdnYWJsZUl0ZW0uaXNDaGlsZDtcblxuICAgIGlmICghc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCkge1xuICAgICAgaWYgKGVsZW1JbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGFyZ2V0Um93LnJlYWR5VG9Td2FwKSB7XG4gICAgICAgICAgdGhpcy5zd2FwV2l0aEluZGV4KGVsZW1JbmRleClcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QucmVtb3ZlKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QuYWRkKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvcE9mZnNldCA9IChldmVudC55IHx8IGV2ZW50LmNsaWVudFkpIC0gKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQgLyAyKTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5zdHlsZS50b3AgPSAgdG9wT2Zmc2V0ICsgJ3B4JztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnRzIGFuZCBjbGFzc2VzIGFmdGVyIGRyYWcgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgZHJhZ0VuZCgpIHtcbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8vXG4gICAgaWYgKHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5cykge1xuICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKFxuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIucmVvcmRlckRhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdFVudGlsSXNOb3REb25lKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnVwZGF0ZU9yZGVyQnlSb3dzKHRoaXMuX3Jvd3MpO1xuICAgIC8vL1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2FibGUtZWxlbScpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Jlb3JkZXItaW4tcHJvZ3Jlc3MnKTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5yZW1vdmUoKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gbnVsbDtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXggPSBudWxsO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCB0aGlzLl93aW5kb3dUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG5cbiAgICB0aGlzLl9kcmFnRW5kJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogbG9va2luZyByb3cgZWxlbWVudHMgYW5kIHNhdmUgdGhlaXIgZGltc1xuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRWxlbWVudHMoKSB7XG4gICAgdGhpcy5sb29rdXBDaGlsZEVsZW1lbnRzKCk7XG4gICAgdGhpcy5jYWxjRWxlbWVudHNEaW1lbnNpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgY2hpbGQgcm93c1xuICAgKi9cbiAgcHJpdmF0ZSBsb29rdXBDaGlsZEVsZW1lbnRzKCkge1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0cicpKVxuICAgICAgLnJlZHVjZSgoYWNjOiBhbnlbXSwgcm93RWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0geyB0YXJnZXQ6IHJvd0VsZW1lbnQgfTtcblxuICAgICAgICBpZiAocm93RWxlbWVudCA9PT0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGVsZW1lbnQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjYy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSkgYXMgRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGMgY2hpbGQgcm93cyBzaXplcy9vZmZzZXRzXG4gICAqL1xuICBwcml2YXRlIGNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKSB7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cy5mb3JFYWNoKChlbDogYW55LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZGltcyA9IGVsLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGVsLnRvcCA9IGRpbXMudG9wO1xuICAgICAgZWwuaGVpZ2h0ID0gZGltcy5oZWlnaHQ7XG4gICAgICBlbC5jZW50ZXIgPSBkaW1zLnRvcCArIChkaW1zLmhlaWdodCAvIDIpO1xuICAgICAgZWwuaW5kZXggPSBpbmRleDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IGRyYWdnYWJsZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGluaXREcmFnZ2FibGVFbGVtZW50KCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBlbC5zdHlsZS53aWR0aCA9IGRhdGEud2lkdGggKyAncHgnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSBkYXRhLmxlZnQgKyAncHgnO1xuICAgIGVsLnN0eWxlLnRvcCA9IGRhdGEudG9wICsgJ3B4JztcblxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2RyYWdnYWJsZScpO1xuXG4gICAgdGhpcy5fY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIGVsKTtcblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gZWw7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEhlaWdodCA9IGRhdGEuaGVpZ2h0O1xuXG4gICAgdGhpcy51cGRhdGVEcmFnZ2FibGVEaW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9va2luZyBieSBzdG9yZWQgcm93IGVsZW1lbnMgZm9yIG92ZXJsYXBwZWQgcm93XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBsb29rdXBFbGVtZW50VW5kZXIoZXZlbnQpIHtcbiAgICBjb25zdCB0b3AgPSBldmVudC55IHx8IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgYm90dG9tID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xuICAgIGxldCBlbGVtSW5kZXggPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaV07XG5cbiAgICAgIGlmICghZWwuYWN0aXZlKSB7XG4gICAgICAgIGlmICh0b3AgPCBlbC5jZW50ZXIgKyAoZWwuaGVpZ2h0IC8gMikgJiYgZWwuaW5kZXggPCB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXhcbiAgICAgICAgICB8fCBib3R0b20gPiBlbC5jZW50ZXIgLSAoZWwuaGVpZ2h0IC8gMikgICYmIGVsLmluZGV4ID4gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4KSB7XG4gICAgICAgICAgZWxlbUluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCByb3dzXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBzd2FwV2l0aEluZGV4KGluZGV4KSB7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXg7XG5cbiAgICAvLyBTd2FwIHJvd3MgaW4gZ2xvYmFsIHJvd3Mgc3RhY2tcbiAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlclxuICAgICAgLmRhdGFDb250cm9sbGVyXG4gICAgICAuc3dhcFJvd3ModGhpcy5fcm93c1thY3RpdmVJbmRleF0gLCB0aGlzLl9yb3dzW2luZGV4XSk7XG5cbiAgICAvLyBTd2FwIHZpc2libGUgcm93c1xuICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdO1xuICAgIHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdID0gdGhpcy5fcm93c1tpbmRleF07XG4gICAgdGhpcy5fcm93c1tpbmRleF0gPSBhY3RpdmVSb3c7XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0O1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbYWN0aXZlSW5kZXhdLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0udGFyZ2V0O1xuICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0uYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXggPSBpbmRleDtcblxuICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2VsbCB3aWR0aCBmb3IgZHJhZ2dhYmxlIGVsZW1cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dhYmxlRGltcygpIHtcbiAgICBjb25zdCBkcmFnZ2FibGVDZWxsczogYW55ID0gQXJyYXkuZnJvbSh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpKTtcblxuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpXG4gICAgKS5mb3JFYWNoKChlbGVtOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGRyYWdnYWJsZUNlbGxzW2luZGV4XS5zdHlsZS53aWR0aCA9IGRpbXMud2lkdGggKyAncHgnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsSXNOb3REb25lKGRvbmVSZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoZG9uZVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRpc2FibGVSZW9yZGVyQWN0aW9uKCk7XG5cbiAgICAgIGRvbmVSZXN1bHRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZW5hYmxlUmVvcmRlckFjdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRml4IGJhY2tncm91bmQgd2hlbiBtb2JpbGVcbiAgICogQHBhcmFtIGVcbiAgICovXG4gIHByaXZhdGUgdG91Y2hGaXgoZSkge1xuICAgIGlmICghKCdjbGllbnRYJyBpbiBlKSAmJiAhKCdjbGllbnRZJyBpbiBlKSkge1xuICAgICAgY29uc3QgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGUuY2xpZW50WCA9IHRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgZS5jbGllbnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUFXdEYsTUFBTSxPQUFPLDRCQUE0QjtJQXlCdkMsWUFDVSxNQUF5QixFQUN6QixLQUFhLEVBQ2IsaUJBQTZCLEVBQzdCLGtCQUFxQyxFQUNyQyxTQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN6QixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFZO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDckMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXRCOUIsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xD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QUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUMxQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ3JELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ2hDO1lBRUQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7MEhBeFlVLDRCQUE0Qjs4R0FBNUIsNEJBQTRCOzRGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtpQkFDbEM7OE1BcUJTLEtBQUs7c0JBRFosS0FBSzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVvcmRlckNvbnRyb2xsZXIsIFJlb3JkZXJTdHJhdGVneSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvcmVvcmRlci1jb250cm9sbGVyJztcbmltcG9ydCB7IFNlbGVjdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3NlbGVjdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFJvdyB9IGZyb20gJy4uLy4uL21vZGVscy9yb3cnO1xuaW1wb3J0IHsgRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZHJhZ2dhYmxlLWxpc3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzTGlzdFJlb3JkZXJEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmUgfSBmcm9tICcuLi9kcmFnZ2FibGUtcm93L2RyYWdnYWJsZS1yb3cuZGlyZWN0aXZlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZnNMaXN0RHJhZ2dhYmxlTGlzdF0nLFxufSlcbmV4cG9ydCBjbGFzcyBGc0xpc3REcmFnZ2FibGVMaXN0RGlyZWN0aXZlIHtcbiAgLy8gRHJhZ2dhYmxlIEVsZW1lbnRcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcHJpdmF0ZSBfZHJhZ1RvSGFuZGxlciA9IHRoaXMuZHJhZ1RvLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX2RyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIF9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NoaWxkUm93RWxlbWVudHM6IEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RyYWdFbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoJ3Jvd3MnKVxuICBwcml2YXRlIF9yb3dzOiBSb3dbXTtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmVbXSA9IFtdO1xuICBwcml2YXRlIF9zZWxlY3RlZFJvd3NEaXJlY3RpdmVzOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmVbXSA9IFtdO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX3Jlb3JkZXJDb250cm9sbGVyOiBSZW9yZGVyQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkcmFnU3RhcnQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnU3RhcnQkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyYWdFbmQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnRW5kJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcmFnZ2FibGVJdGVtKCk6IFJvdyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NbdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9pc011bHRpcGxlRHJhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIubXVsdGlwbGUgJiYgdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcy5sZW5ndGggPiAxO1xuICB9XG5cbiAgcHVibGljIGFkZERyYWdnYWJsZURpcmVjdGl2ZShkaXI6IEZzTGlzdERyYWdnYWJsZVJvd0RpcmVjdGl2ZSk6IHZvaWQge1xuICAgIHRoaXMuX2RyYWdnYWJsZUNoaWxkcmVuRGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRHJhZ2dhYmxlRGlyZWN0aXZlKGRpcjogRnNMaXN0RHJhZ2dhYmxlUm93RGlyZWN0aXZlKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzLmluZGV4T2YoZGlyKTtcblxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kcmFnZ2FibGVDaGlsZHJlbkRpcmVjdGl2ZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBhZGQgZXZlbnRzXG4gICAqIEBwYXJhbSBkcmFnZ2FibGVFbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZHJhZ1N0YXJ0KGRyYWdnYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2RyYWdJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RhcnRDYWxsYmFja1xuICAgICAgJiYgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RyYXRlZ3kgPT09IFJlb3JkZXJTdHJhdGVneS5BbHdheXNcbiAgICApIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0YXJ0Q2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdyZW9yZGVyLWluLXByb2dyZXNzJyk7XG5cbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50ID0gZHJhZ2dhYmxlRWxlbWVudDtcblxuICAgIHRoaXMuX2RldGVjdFNlbGVjdGVkUm93cygpO1xuICAgIHRoaXMucHJlcGFyZUVsZW1lbnRzKCk7XG5cbiAgICB0aGlzLmluaXREcmFnZ2FibGVFbGVtZW50KCk7XG5cbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnYWJsZS1lbGVtJyk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgdGhpcy5fd2luZG93VG91Y2hNb3ZlSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcmFnU3RhcnQkLm5leHQoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE1vdmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBzd2FwIGl0ZW1zXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHVibGljIGRyYWdUbyhldmVudCkge1xuICAgIHRoaXMudG91Y2hGaXgoZXZlbnQpO1xuICAgIGNvbnN0IGVsZW1JbmRleCA9IHRoaXMubG9va3VwRWxlbWVudFVuZGVyKGV2ZW50KTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSB0aGlzLl9yb3dzW2VsZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldykge1xuICAgICAgdGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldy5zdHlsZS5sZWZ0ID0gZXZlbnQuY2xpZW50WCArICdweCc7XG4gICAgICB0aGlzLl9tdWx0aXBsZURyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnN0eWxlLnRvcCA9IGV2ZW50LmNsaWVudFkgKyAncHgnO1xuICAgIH1cblxuICAgIC8vIENhbiBub3QgZHJhZyBiZWZvcmUgZmlyc3QgZ3JvdXAgYW5kIGFmdGVyIGxhc3QgZ3JvdXBcbiAgICBjb25zdCBzd2FwV2l0aEJvdW5kYXJ5R3JvdXBFbGVtZW50ID1cbiAgICAgIChlbGVtSW5kZXggPT09IDAgfHwgZWxlbUluZGV4ID09PSB0aGlzLl9yb3dzLmxlbmd0aCAtIDEpXG4gICAgICAmJiB0YXJnZXRSb3cuaXNHcm91cFxuICAgICAgJiYgdGhpcy5kcmFnZ2FibGVJdGVtLmlzQ2hpbGQ7XG5cblxuICAgIGlmICghc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCkge1xuICAgICAgaWYgKGVsZW1JbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGFyZ2V0Um93LnJlYWR5VG9Td2FwKSB7XG4gICAgICAgICAgdGhpcy5zd2FwV2l0aEluZGV4KGVsZW1JbmRleCk7XG4gICAgICAgICAgaWYgKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QucmVtb3ZlKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QuYWRkKCdmcy1saXN0LW5vLWRyb3AnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYTUVcbiAgICAgIGlmICh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldykge1xuICAgICAgICBjb25zdCB0b3BPZmZzZXQgPSAoZXZlbnQueSB8fCBldmVudC5jbGllbnRZKSAtICh0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0IC8gMik7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnN0eWxlLnRvcCA9ICB0b3BPZmZzZXQgKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnRzIGFuZCBjbGFzc2VzIGFmdGVyIGRyYWcgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgZHJhZ0VuZCgpIHtcbiAgICB0aGlzLl9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLmZpbmlzaFJlb3JkZXIoKTtcblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5tb3ZlZENhbGxiYWNrKSB7XG5cbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLm1vdmVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5LkFsd2F5cykge1xuICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKFxuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIucmVvcmRlckRhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdFVudGlsSXNOb3REb25lKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnVwZGF0ZU9yZGVyQnlSb3dzKHRoaXMuX3Jvd3MpO1xuICAgIC8vL1xuICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLWhpZGRlbicpO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dhYmxlLWVsZW0nKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW9yZGVyLWluLXByb2dyZXNzJyk7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5fZHJhZ2dhYmxlRWxlbWVudFByZXZpZXcpIHtcbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnJlbW92ZSgpO1xuXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMuX211bHRpcGxlRHJhZ2dhYmxlRWxlbWVudFByZXZpZXcpO1xuICAgICAgdGhpcy5fbXVsdGlwbGVEcmFnZ2FibGVFbGVtZW50UHJldmlldyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEhlaWdodCA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3NEaXJlY3RpdmVzID0gW107XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIHRoaXMuX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcblxuICAgIHRoaXMuX2RyYWdFbmQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsb29raW5nIHJvdyBlbGVtZW50cyBhbmQgc2F2ZSB0aGVpciBkaW1zXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVFbGVtZW50cygpIHtcbiAgICB0aGlzLmxvb2t1cENoaWxkRWxlbWVudHMoKTtcbiAgICB0aGlzLmNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBjaGlsZCByb3dzXG4gICAqL1xuICBwcml2YXRlIGxvb2t1cENoaWxkRWxlbWVudHMoKSB7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5fY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyOm5vdCguZHJhZy1oaWRkZW4pJykpXG4gICAgICAucmVkdWNlKChhY2M6IGFueVtdLCByb3dFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSB7IHRhcmdldDogcm93RWxlbWVudCB9O1xuXG4gICAgICAgIGlmIChyb3dFbGVtZW50ID09PSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgZWxlbWVudC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKSBhcyBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50W107XG4gIH1cblxuICAvKipcbiAgICogQ2FsYyBjaGlsZCByb3dzIHNpemVzL29mZnNldHNcbiAgICovXG4gIHByaXZhdGUgY2FsY0VsZW1lbnRzRGltZW5zaW9ucygpIHtcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmZvckVhY2goKGVsOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWwudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZWwudG9wID0gZGltcy50b3A7XG4gICAgICBlbC5oZWlnaHQgPSBkaW1zLmhlaWdodDtcbiAgICAgIGVsLmNlbnRlciA9IGRpbXMudG9wICsgKGRpbXMuaGVpZ2h0IC8gMik7XG4gICAgICBlbC5pbmRleCA9IGluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgaW5pdERyYWdnYWJsZUVsZW1lbnQoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghKHRoaXMuX2lzTXVsdGlwbGVEcmFnKSkge1xuICAgICAgZWwuc3R5bGUud2lkdGggPSBkYXRhLndpZHRoICsgJ3B4JztcbiAgICAgIGVsLnN0eWxlLmxlZnQgPSBkYXRhLmxlZnQgKyAncHgnO1xuICAgICAgZWwuc3R5bGUudG9wID0gZGF0YS50b3AgKyAncHgnO1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlJyk7XG5cbiAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBlbCk7XG5cbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gZWw7XG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gZGF0YS5oZWlnaHQ7XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ2dhYmxlRGltcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgcHJldmlldyBESVZcbiAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnLWhpZGRlbicpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcz8ubGVuZ3RoO1xuICAgICAgY29uc3QgcHJldmlld0Jsb2NrID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwcmV2aWV3QmxvY2suc3R5bGUubGVmdCA9IGRhdGEubGVmdCArICdweCc7XG4gICAgICBwcmV2aWV3QmxvY2suc3R5bGUudG9wID0gZGF0YS50b3AgKyAncHgnO1xuXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlVGV4dChgJHtzZWxlY3RlZENvdW50fSBzZWxlY3RlZCBpdGVtc2ApO1xuXG4gICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChwcmV2aWV3QmxvY2ssIHRleHQpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3MocHJldmlld0Jsb2NrLCAncHJldmlldy1ibG9jaycpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgcHJldmlld0Jsb2NrKTtcbiAgICAgIHRoaXMuX211bHRpcGxlRHJhZ2dhYmxlRWxlbWVudFByZXZpZXcgPSBwcmV2aWV3QmxvY2s7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogTG9va2luZyBieSBzdG9yZWQgcm93IGVsZW1lbnRzIGZvciBvdmVybGFwcGVkIHJvd1xuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHByaXZhdGUgbG9va3VwRWxlbWVudFVuZGVyKGV2ZW50KSB7XG4gICAgY29uc3QgdG9wID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IGJvdHRvbSA9IGV2ZW50LnkgfHwgZXZlbnQuY2xpZW50WTtcbiAgICBsZXQgZWxlbUluZGV4ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2hpbGRSb3dFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2ldO1xuXG4gICAgICBpZiAoIWVsLmFjdGl2ZSkge1xuICAgICAgICBpZiAodG9wIDwgZWwuY2VudGVyICsgKGVsLmhlaWdodCAvIDIpICYmIGVsLmluZGV4IDwgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4XG4gICAgICAgICAgfHwgYm90dG9tID4gZWwuY2VudGVyIC0gKGVsLmhlaWdodCAvIDIpICAmJiBlbC5pbmRleCA+IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCkge1xuICAgICAgICAgIGVsZW1JbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbUluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgcm93c1xuICAgKiBAcGFyYW0gaW5kZXhcbiAgICovXG4gIHByaXZhdGUgc3dhcFdpdGhJbmRleChpbmRleCkge1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4O1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX3NlbGVjdGVkUm93c0RpcmVjdGl2ZXNcbiAgICAgIC5tYXAoKGQpID0+IGQucm93KVxuICAgICAgLmZpbHRlcigoZCkgPT4gZC5yZWFkeVRvU3dhcCk7XG5cbiAgICAvLyBTd2FwIHJvd3MgaW4gZ2xvYmFsIHJvd3Mgc3RhY2tcbiAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlclxuICAgICAgLmRhdGFDb250cm9sbGVyXG4gICAgICAuc3dhcFJvd3MoXG4gICAgICAgIHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdLFxuICAgICAgICB0aGlzLl9yb3dzW2luZGV4XSxcbiAgICAgICAgc2VsZWN0ZWRSb3dzLFxuICAgICAgICB0aGlzLl9pc011bHRpcGxlRHJhZyxcbiAgICAgICk7XG5cbiAgICAvLyBTd2FwIHZpc2libGUgcm93c1xuICAgIGlmICghdGhpcy5faXNNdWx0aXBsZURyYWcpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdO1xuICAgICAgdGhpcy5fcm93c1thY3RpdmVJbmRleF0gPSB0aGlzLl9yb3dzW2luZGV4XTtcbiAgICAgIHRoaXMuX3Jvd3NbaW5kZXhdID0gYWN0aXZlUm93O1xuXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0udGFyZ2V0O1xuICAgICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0uYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbYWN0aXZlSW5kZXhdLnRhcmdldCA9IHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldDtcbiAgICAgIHRoaXMuX2NoaWxkUm93RWxlbWVudHNbaW5kZXhdLnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2VsbCB3aWR0aCBmb3IgZHJhZ2dhYmxlIGVsZW1cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dhYmxlRGltcygpIHtcbiAgICBjb25zdCBkcmFnZ2FibGVDZWxsczogYW55ID0gQXJyYXkuZnJvbSh0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpKTtcblxuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpXG4gICAgKS5mb3JFYWNoKChlbGVtOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGRyYWdnYWJsZUNlbGxzW2luZGV4XS5zdHlsZS53aWR0aCA9IGRpbXMud2lkdGggKyAncHgnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsSXNOb3REb25lKGRvbmVSZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoZG9uZVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRpc2FibGVSZW9yZGVyQWN0aW9uKCk7XG5cbiAgICAgIGRvbmVSZXN1bHRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZW5hYmxlUmVvcmRlckFjdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXRlY3RTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ2dhYmxlQ2hpbGRyZW5EaXJlY3RpdmVzXG4gICAgICAuZm9yRWFjaCgoZGlyOiBGc0xpc3REcmFnZ2FibGVSb3dEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgY29uc3QgaXNSb3dTZWxlY3RlZCA9IHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnNlbGVjdGlvbkNvbnRyb2xsZXI/LmlzUm93U2VsZWN0ZWQoZGlyLnJvdy5kYXRhKTtcblxuICAgICAgICBpZiAoaXNSb3dTZWxlY3RlZCAmJiAhZGlyLnJvdy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzRGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeCBiYWNrZ3JvdW5kIHdoZW4gbW9iaWxlXG4gICAqIEBwYXJhbSBlXG4gICAqL1xuICBwcml2YXRlIHRvdWNoRml4KGUpIHtcbiAgICBpZiAoISgnY2xpZW50WCcgaW4gZSkgJiYgISgnY2xpZW50WScgaW4gZSkpIHtcbiAgICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBlLmNsaWVudFggPSB0b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgIGUuY2xpZW50WSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuIl19