@fundamental-ngx/cdk 0.40.0-rc.13 → 0.40.0-rc.14

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.
@@ -1,4 +1,4 @@
1
- import { ContentChildren, Directive, EventEmitter, forwardRef, Input, Output, QueryList } from '@angular/core';
1
+ import { ContentChildren, Directive, EventEmitter, forwardRef, HostBinding, Input, Output, QueryList } from '@angular/core';
2
2
  import { merge, Subject } from 'rxjs';
3
3
  import { startWith, takeUntil } from 'rxjs/operators';
4
4
  import { DND_ITEM, DND_LIST } from '../tokens';
@@ -6,12 +6,27 @@ import * as i0 from "@angular/core";
6
6
  export class DndListDirective {
7
7
  constructor() {
8
8
  /**
9
- * Defines if the the element is allowed to be dragged in 2 dimensions,
9
+ * Defines if the element is allowed to be dragged in 2 dimensions,
10
10
  * When true - replace indicator will be displayed vertically
11
11
  */
12
12
  this.gridMode = false;
13
- /** When enabled, replace indicator will appear on whole element, instead of horizontal/vertical line before/after element */
14
- this.replaceMode = false;
13
+ /**
14
+ * Defines drop strategy:
15
+ * * `shift` mode will create line after closest drop element.
16
+ * * `group` mode will create replace indicator on whole closest drop element.
17
+ * * `auto` mode will create line after closest drop element,
18
+ * if dragged element coordinates are shifted for 30% from center of the closest drop element.
19
+ * Otherwise, it will create replace indicator on whole closest drop element.
20
+ *
21
+ * `shift` mode is the default.
22
+ */
23
+ this.dropMode = 'shift';
24
+ /**
25
+ * Threshold of dragged item over another item to define which type of `dropMode` should be used.
26
+ */
27
+ this.threshold = 0.3;
28
+ /** @hidden */
29
+ this._replaceMode = false;
15
30
  /** Event that is thrown, when items are reordered */
16
31
  this.itemsChange = new EventEmitter();
17
32
  /** Event that is thrown, when the item is dropped */
@@ -26,6 +41,27 @@ export class DndListDirective {
26
41
  this._onDestroy$ = new Subject();
27
42
  /** @hidden */
28
43
  this._draggable = true;
44
+ /** @hidden */
45
+ this._initialClass = 'fd-dnd-list';
46
+ /** @hidden */
47
+ this._linesRemoved = true;
48
+ /** @hidden */
49
+ this._indicatorsRemoved = true;
50
+ }
51
+ /**
52
+ * @deprecated
53
+ * Use `dropMode` property for better configuration.
54
+ *
55
+ * @description
56
+ * When enabled, replace indicator will appear on whole element, instead of horizontal/vertical line before/after element.
57
+ */
58
+ set replaceMode(value) {
59
+ this._replaceMode = value;
60
+ this.dropMode = value ? 'group' : 'shift';
61
+ this._detectedDropMode = this.dropMode;
62
+ }
63
+ get replaceMode() {
64
+ return this._replaceMode;
29
65
  }
30
66
  /** Defines if drag and drop feature should be enabled for list items */
31
67
  set draggable(draggable) {
@@ -60,8 +96,11 @@ export class DndListDirective {
60
96
  if (!closestItem) {
61
97
  closestItemIndex = null;
62
98
  }
63
- /** If the closest element is different than the old one, new one is picked. It prevents from performance issues */
64
- if ((closestItemIndex || closestItemIndex === 0) && closestItemIndex !== this._closestItemIndex) {
99
+ /** If the closest element is different from the old one, new one is picked. It prevents from performance issues */
100
+ if ((closestItemIndex || closestItemIndex === 0) &&
101
+ (closestItemIndex !== this._closestItemIndex || this.dropMode === 'auto')) {
102
+ this._removeAllLines();
103
+ this._removeAllReplaceIndicators();
65
104
  this._closestItemIndex = closestItemIndex;
66
105
  this._closestItemPosition = this._elementsCoordinates[closestItemIndex].position;
67
106
  // If closest item index is same as dragged item, just remove indicators
@@ -71,18 +110,21 @@ export class DndListDirective {
71
110
  return;
72
111
  }
73
112
  /** Generating line, that shows where the element will be placed, on drop */
74
- if (this.replaceMode) {
113
+ if (this.dropMode === 'group') {
75
114
  this._createReplaceIndicator(this._closestItemIndex);
76
115
  }
77
- else {
116
+ else if (this.dropMode === 'shift') {
78
117
  this._createLine(this._closestItemIndex, this._closestItemPosition);
79
118
  }
119
+ else {
120
+ this._selectDropModeIndicator(draggedItemIndex, closestItem, closestItemIndex);
121
+ }
80
122
  }
81
123
  }
82
124
  /** Method called, when element is started to be dragged */
83
125
  dragStart(index) {
84
126
  const draggedItemElement = this._dndItemReference[index].elementRef;
85
- /** Counting all of the elements's chords */
127
+ /** Counting all the element's chords */
86
128
  this._elementsCoordinates = this._dndItemReference.map((item) => item.getElementCoordinates(this._isBefore(draggedItemElement, item.elementRef), this.gridMode));
87
129
  }
88
130
  /** Method called, when element is released */
@@ -109,7 +151,9 @@ export class DndListDirective {
109
151
  this.itemDropped.emit({
110
152
  replacedItemIndex,
111
153
  draggedItemIndex,
112
- items
154
+ items,
155
+ insertAt: this._closestItemPosition,
156
+ mode: this.dropMode !== 'auto' ? this.dropMode : this._detectedDropMode
113
157
  });
114
158
  this._removeAllLines();
115
159
  this._removeAllReplaceIndicators();
@@ -120,21 +164,54 @@ export class DndListDirective {
120
164
  }
121
165
  }
122
166
  /** @hidden */
167
+ _selectDropModeIndicator(draggedItemIndex, closestItem, closestItemIndex) {
168
+ if (!closestItem || !this._dndItemReference[draggedItemIndex]) {
169
+ return;
170
+ }
171
+ let newDetectedDropMode;
172
+ const draggedElmCoords = this._dndItemReference[draggedItemIndex].elementRef.nativeElement.getBoundingClientRect();
173
+ const closestItemBoundaries = getElementBoundaries(closestItem, this.threshold);
174
+ const draggedItemStartCoords = getElementStartCoords(draggedElmCoords, closestItem.position);
175
+ if (_between(draggedItemStartCoords.x, closestItemBoundaries.x.start, closestItemBoundaries.x.end) &&
176
+ _between(draggedItemStartCoords.y, closestItemBoundaries.y.start, closestItemBoundaries.y.end)) {
177
+ newDetectedDropMode = 'group';
178
+ }
179
+ else {
180
+ newDetectedDropMode = 'shift';
181
+ }
182
+ if (newDetectedDropMode === this._detectedDropMode && (!this._linesRemoved || !this._indicatorsRemoved)) {
183
+ return;
184
+ }
185
+ this._detectedDropMode = newDetectedDropMode;
186
+ if (this._detectedDropMode === 'shift') {
187
+ this._createLine(closestItemIndex, this._elementsCoordinates[closestItemIndex].position);
188
+ }
189
+ else {
190
+ this._createReplaceIndicator(closestItemIndex);
191
+ }
192
+ }
193
+ /** @hidden */
123
194
  _removeAllLines() {
195
+ this._linesRemoved = true;
124
196
  this.dndItems.forEach((item) => item.removeLine());
125
197
  }
126
198
  /** @hidden */
127
199
  _removeAllReplaceIndicators() {
200
+ this._indicatorsRemoved = true;
128
201
  this.dndItems.forEach((item) => item.removeReplaceIndicator());
129
202
  }
130
203
  /** @hidden */
131
204
  _createLine(closestItemIndex, linkPosition) {
132
205
  this._removeAllLines();
206
+ this._removeAllReplaceIndicators();
207
+ this._linesRemoved = false;
133
208
  this._dndItemReference[closestItemIndex].createLine(linkPosition, this.gridMode);
134
209
  }
135
210
  /** @hidden */
136
211
  _createReplaceIndicator(closestItemIndex) {
212
+ this._removeAllLines();
137
213
  this._removeAllReplaceIndicators();
214
+ this._indicatorsRemoved = false;
138
215
  this._dndItemReference[closestItemIndex].createReplaceIndicator();
139
216
  }
140
217
  /** @hidden */
@@ -183,7 +260,7 @@ export class DndListDirective {
183
260
  }
184
261
  }
185
262
  DndListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
186
- DndListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: DndListDirective, selector: "[fdkDndList], [fd-dnd-list]", inputs: { gridMode: "gridMode", replaceMode: "replaceMode", items: "items", draggable: "draggable" }, outputs: { itemsChange: "itemsChange", itemDropped: "itemDropped" }, providers: [{ provide: DND_LIST, useExisting: forwardRef(() => DndListDirective) }], queries: [{ propertyName: "dndItems", predicate: DND_ITEM }], ngImport: i0 });
263
+ DndListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: DndListDirective, selector: "[fdkDndList], [fd-dnd-list]", inputs: { gridMode: "gridMode", dropMode: "dropMode", threshold: "threshold", replaceMode: "replaceMode", items: "items", draggable: "draggable" }, outputs: { itemsChange: "itemsChange", itemDropped: "itemDropped" }, host: { properties: { "class": "this._initialClass" } }, providers: [{ provide: DND_LIST, useExisting: forwardRef(() => DndListDirective) }], queries: [{ propertyName: "dndItems", predicate: DND_ITEM }], ngImport: i0 });
187
264
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DndListDirective, decorators: [{
188
265
  type: Directive,
189
266
  args: [{
@@ -192,6 +269,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
192
269
  }]
193
270
  }], propDecorators: { gridMode: [{
194
271
  type: Input
272
+ }], dropMode: [{
273
+ type: Input
274
+ }], threshold: [{
275
+ type: Input
195
276
  }], replaceMode: [{
196
277
  type: Input
197
278
  }], items: [{
@@ -205,6 +286,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
205
286
  }], dndItems: [{
206
287
  type: ContentChildren,
207
288
  args: [DND_ITEM]
289
+ }], _initialClass: [{
290
+ type: HostBinding,
291
+ args: ['class']
208
292
  }] } });
209
293
  function _isMouseOnElement(element, mousePosition) {
210
294
  const startX = element.x;
@@ -216,4 +300,28 @@ function _isMouseOnElement(element, mousePosition) {
216
300
  function _between(x, min, max) {
217
301
  return x >= min && x <= max;
218
302
  }
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi91dGlscy9kcmFnLWFuZC1kcm9wL2RuZC1saXN0L2RuZC1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBTS9DLE1BQU0sT0FBTyxnQkFBZ0I7SUFKN0I7UUFLSTs7O1dBR0c7UUFFSCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLDZIQUE2SDtRQUU3SCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQWFwQixxREFBcUQ7UUFFNUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRXBELHFEQUFxRDtRQUU1QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBUzFELGNBQWM7UUFDTixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBRWhELGNBQWM7UUFDTix5QkFBb0IsR0FBOEIsSUFBSSxDQUFDO1FBRS9ELGtGQUFrRjtRQUNqRSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVqRCxjQUFjO1FBQ0csZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS25ELGNBQWM7UUFDTixlQUFVLEdBQUcsSUFBSSxDQUFDO0tBK0s3QjtJQXJORyx3RUFBd0U7SUFDeEUsSUFDSSxTQUFTLENBQUMs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QUFROztBQXVNN0IsU0FBUyxpQkFBaUIsQ0FBQyxPQUFxQixFQUFFLGFBQThCO0lBQzVFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRXZDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBRXhDLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQ2pELE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWxlbWVudENob3JkLCBGZERyb3BFdmVudCwgTGlua1Bvc2l0aW9uLCBFbGVtZW50UG9zaXRpb24sIERuZEl0ZW0gfSBmcm9tICcuLi9kbmQuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBETkRfSVRFTSwgRE5EX0xJU1QgfSBmcm9tICcuLi90b2tlbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tmZGtEbmRMaXN0XSwgW2ZkLWRuZC1saXN0XScsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBETkRfTElTVCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRG5kTGlzdERpcmVjdGl2ZSkgfV1cbn0pXG5leHBvcnQgY2xhc3MgRG5kTGlzdERpcmVjdGl2ZTxUPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBpZiB0aGUgdGhlIGVsZW1lbnQgaXMgYWxsb3dlZCB0byBiZSBkcmFnZ2VkIGluIDIgZGltZW5zaW9ucyxcbiAgICAgKiBXaGVuIHRydWUgLSByZXBsYWNlIGluZGljYXRvciB3aWxsIGJlIGRpc3BsYXllZCB2ZXJ0aWNhbGx5XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBncmlkTW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZW4gZW5hYmxlZCwgcmVwbGFjZSBpbmRpY2F0b3Igd2lsbCBhcHBlYXIgb24gd2hvbGUgZWxlbWVudCwgaW5zdGVhZCBvZiBob3Jpem9udGFsL3ZlcnRpY2FsIGxpbmUgYmVmb3JlL2FmdGVyIGVsZW1lbnQgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlcGxhY2VNb2RlID0gZmFsc2U7XG5cbiAgICAvKiogQXJyYXkgb2YgaXRlbXMsIHRoYXQgd2lsbCBiZSBzb3J0ZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIGl0ZW1zOiBBcnJheTxUPjtcblxuICAgIC8qKiBEZWZpbmVzIGlmIGRyYWcgYW5kIGRyb3AgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgbGlzdCBpdGVtcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRyYWdnYWJsZShkcmFnZ2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2FibGVTdGF0ZShkcmFnZ2FibGUpO1xuICAgIH1cblxuICAgIC8qKiBFdmVudCB0aGF0IGlzIHRocm93biwgd2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaXRlbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+PigpO1xuXG4gICAgLyoqIEV2ZW50IHRoYXQgaXMgdGhyb3duLCB3aGVuIHRoZSBpdGVtIGlzIGRyb3BwZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBpdGVtRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmREcm9wRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oRE5EX0lURU0pXG4gICAgZG5kSXRlbXM6IFF1ZXJ5TGlzdDxEbmRJdGVtPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZWxlbWVudHNDb29yZGluYXRlczogRWxlbWVudENob3JkW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2Nsb3Nlc3RJdGVtSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jbG9zZXN0SXRlbVBvc2l0aW9uOiAnYmVmb3JlJyB8ICdhZnRlcicgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGN1cnJlbnQgZGF0YSBzdHJlYW0gKGZvciB1bnN1YnNjcmliaW5nKSAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZWZyZXNoJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gICovXG4gICAgcHJpdmF0ZSBfZG5kSXRlbVJlZmVyZW5jZTogRG5kSXRlbVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NoYW5nZURyYWdnYWJsZVN0YXRlKHRoaXMuX2RyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuZG5kSXRlbXMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSwgc3RhcnRXaXRoKDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaFF1ZXJ5TGlzdCgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgY2FsbGVkLCB3aGVuIHRoZSBpdGVtIGlzIGJlaW5nIG1vdmVkIGJ5IDEgcHggKi9cbiAgICBvbk1vdmUobW91c2VQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLCBkcmFnZ2VkSXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLyoqIFRlbXBvcmFyeSBvYmplY3QsIHRvIHN0b3JlIGxvd2VzdCBkaXN0YW5jZSB2YWx1ZXMgKi9cbiAgICAgICAgbGV0IGNsb3Nlc3RJdGVtSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNsb3Nlc3RJdGVtID0gdGhpcy5fZWxlbWVudHNDb29yZGluYXRlcy5maW5kKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgLyoqIENoZWNrIGlmIGVsZW1lbnQgY2FuIGJlIHJlcGxhY2VkICovXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuc3RpY2tUb1Bvc2l0aW9uICYmIGNsb3Nlc3RJdGVtSW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNb3VzZU9uRWxlbWVudCA9IF9pc01vdXNlT25FbGVtZW50KGVsZW1lbnQsIG1vdXNlUG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChpc01vdXNlT25FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RJdGVtSW5kZXggPSBpbmRleDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghY2xvc2VzdEl0ZW0pIHtcbiAgICAgICAgICAgIGNsb3Nlc3RJdGVtSW5kZXggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIElmIHRoZSBjbG9zZXN0IGVsZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIG9sZCBvbmUsIG5ldyBvbmUgaXMgcGlja2VkLiBJdCBwcmV2ZW50cyBmcm9tIHBlcmZvcm1hbmNlIGlzc3VlcyAqL1xuICAgICAgICBpZiAoKGNsb3Nlc3RJdGVtSW5kZXggfHwgY2xvc2VzdEl0ZW1JbmRleCA9PT0gMCkgJiYgY2xvc2VzdEl0ZW1JbmRleCAhPT0gdGhpcy5fY2xvc2VzdEl0ZW1JbmRleCkge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VzdEl0ZW1JbmRleCA9IGNsb3Nlc3RJdGVtSW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZXN0SXRlbVBvc2l0aW9uID0gdGhpcy5fZWxlbWVudHNDb29yZGluYXRlc1tjbG9zZXN0SXRlbUluZGV4XS5wb3NpdGlvbjtcbiAgICAgICAgICAgIC8vIElmIGNsb3Nlc3QgaXRlbSBpbmRleCBpcyBzYW1lIGFzIGRyYWdnZWQgaXRlbSwganVzdCByZW1vdmUgaW5kaWNhdG9yc1xuICAgICAgICAgICAgaWYgKGNsb3Nlc3RJdGVtSW5kZXggPT09IGRyYWdnZWRJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxMaW5lcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFJlcGxhY2VJbmRpY2F0b3JzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIEdlbmVyYXRpbmcgbGluZSwgdGhhdCBzaG93cyB3aGVyZSB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCwgb24gZHJvcCAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucmVwbGFjZU1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVSZXBsYWNlSW5kaWNhdG9yKHRoaXMuX2Nsb3Nlc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVMaW5lKHRoaXMuX2Nsb3Nlc3RJdGVtSW5kZXgsIHRoaXMuX2Nsb3Nlc3RJdGVtUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCBjYWxsZWQsIHdoZW4gZWxlbWVudCBpcyBzdGFydGVkIHRvIGJlIGRyYWdnZWQgKi9cbiAgICBkcmFnU3RhcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbUVsZW1lbnQgPSB0aGlzLl9kbmRJdGVtUmVmZXJlbmNlW2luZGV4XS5lbGVtZW50UmVmO1xuICAgICAgICAvKiogQ291bnRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cydzIGNob3JkcyAqL1xuICAgICAgICB0aGlzLl9lbGVtZW50c0Nvb3JkaW5hdGVzID0gdGhpcy5fZG5kSXRlbVJlZmVyZW5jZS5tYXAoKGl0ZW06IERuZEl0ZW0pID0+XG4gICAgICAgICAgICBpdGVtLmdldEVsZW1lbnRDb29yZGluYXRlcyh0aGlzLl9pc0JlZm9yZShkcmFnZ2VkSXRlbUVsZW1lbnQsIGl0ZW0uZWxlbWVudFJlZiksIHRoaXMuZ3JpZE1vZGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCBjYWxsZWQsIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAqL1xuICAgIGRyYWdFbmQoZHJhZ2dlZEl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZEl0ZW1JbmRleCA9IHRoaXMuX2Nsb3Nlc3RJdGVtSW5kZXg7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtID0gaXRlbXNbZHJhZ2dlZEl0ZW1JbmRleF07XG5cbiAgICAgICAgaWYgKHJlcGxhY2VkSXRlbUluZGV4IHx8IHJlcGxhY2VkSXRlbUluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW1JbmRleCAhPT0gcmVwbGFjZWRJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW1JbmRleCA8IHJlcGxhY2VkSXRlbUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBkcmFnZ2VkSXRlbUluZGV4OyBpIDwgcmVwbGFjZWRJdGVtSW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBpdGVtc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZHJhZ2dlZEl0ZW1JbmRleDsgaSA+IHJlcGxhY2VkSXRlbUluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldID0gaXRlbXNbaSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoqIFJlcGxhY2luZyBpdGVtcyAqL1xuICAgICAgICAgICAgICAgIGl0ZW1zW3JlcGxhY2VkSXRlbUluZGV4XSA9IGRyYWdnZWRJdGVtO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtRHJvcHBlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICByZXBsYWNlZEl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbUluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW1zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsTGluZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFJlcGxhY2VJbmRpY2F0b3JzKCk7XG5cbiAgICAgICAgICAgIC8qKiBSZXNldCAqL1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNDb29yZGluYXRlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VzdEl0ZW1JbmRleCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZXN0SXRlbVBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcmVtb3ZlQWxsTGluZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG5kSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5yZW1vdmVMaW5lKCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcmVtb3ZlQWxsUmVwbGFjZUluZGljYXRvcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG5kSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5yZW1vdmVSZXBsYWNlSW5kaWNhdG9yKCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlTGluZShjbG9zZXN0SXRlbUluZGV4OiBudW1iZXIsIGxpbmtQb3NpdGlvbjogTGlua1Bvc2l0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbExpbmVzKCk7XG4gICAgICAgIHRoaXMuX2RuZEl0ZW1SZWZlcmVuY2VbY2xvc2VzdEl0ZW1JbmRleF0uY3JlYXRlTGluZShsaW5rUG9zaXRpb24sIHRoaXMuZ3JpZE1vZGUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlUmVwbGFjZUluZGljYXRvcihjbG9zZXN0SXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQWxsUmVwbGFjZUluZGljYXRvcnMoKTtcbiAgICAgICAgdGhpcy5fZG5kSXRlbVJlZmVyZW5jZVtjbG9zZXN0SXRlbUluZGV4XS5jcmVhdGVSZXBsYWNlSW5kaWNhdG9yKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoUXVlcnlMaXN0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWZyZXNoJCA9IG1lcmdlKHRoaXMuX3JlZnJlc2gkLCB0aGlzLl9vbkRlc3Ryb3kkKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaCQubmV4dCgpO1xuXG4gICAgICAgIHRoaXMuX2RuZEl0ZW1SZWZlcmVuY2UgPSB0aGlzLmRuZEl0ZW1zLnRvQXJyYXkoKTtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2FibGVTdGF0ZSh0aGlzLl9kcmFnZ2FibGUpO1xuXG4gICAgICAgIHRoaXMuZG5kSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0ubW92ZWQucGlwZSh0YWtlVW50aWwocmVmcmVzaCQpKS5zdWJzY3JpYmUoKHBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24pID0+IHRoaXMub25Nb3ZlKHBvc2l0aW9uLCBpbmRleCkpO1xuICAgICAgICAgICAgaXRlbS5zdGFydGVkLnBpcGUodGFrZVVudGlsKHJlZnJlc2gkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZHJhZ1N0YXJ0KGluZGV4KSk7XG4gICAgICAgICAgICBpdGVtLnJlbGVhc2VkLnBpcGUodGFrZVVudGlsKHJlZnJlc2gkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZHJhZ0VuZChpbmRleCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQGhpZGRlblxuICAgICAqIFJldHVybiBpbmZvcm1hdGlvbiBpZiBlbGVtZW50IGlzIHBsYWNlZCBiZWZvcmUgdGhlIGRyYWdnZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHByaXZhdGUgX2lzQmVmb3JlKGRyYWdnZWRFbGVtZW50OiBFbGVtZW50UmVmLCB0YXJnZXRFbGVtZW50OiBFbGVtZW50UmVmKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKiBTb21ldGltZXMgdGhlIGVsZW1lbnQgYXJlIG5vdCBzdHJhaWdodCBpbiBvbmUgY29sdW1uLCB0aGF0J3Mgd2h5IG9mZnNldCBpcyBuZWVkZWQgKi9cbiAgICAgICAgY29uc3QgVkVSVElDQUxfT0ZGU0VUID0gMjA7XG5cbiAgICAgICAgLyoqIERpc3RhbmNlcyBmcm9tIHRoZSB0b3Agb2Ygc2NyZWVuICovXG4gICAgICAgIGNvbnN0IGRyYWdnZWRFbGVtZW50Qm91bmQgPSA8RE9NUmVjdD5kcmFnZ2VkRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50Qm91bmQgPSA8RE9NUmVjdD50YXJnZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgaWYgKGRyYWdnZWRFbGVtZW50Qm91bmQudG9wIC0gdGFyZ2V0RWxlbWVudEJvdW5kLnRvcCA+IFZFUlRJQ0FMX09GRlNFVCkge1xuICAgICAgICAgICAgLyoqIElmIGVsZW1lbnQgaXMgaGlnaGVyIHRoYW4gdGhlIGRyYWdnZWQgZWxlbWVudCwgaXQncyBmb3Igc3VyZSBiZWZvcmUgKi9cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEVsZW1lbnRCb3VuZC50b3AgLSBkcmFnZ2VkRWxlbWVudEJvdW5kLnRvcCA+IFZFUlRJQ0FMX09GRlNFVCkge1xuICAgICAgICAgICAgLyoqIElmIGVsZW1lbnQgaXMgbG93ZXIgdGhhbiB0aGUgZHJhZ2dlZCBlbGVtZW50LCBpdCdzIGZvciBzdXJlIGFmdGVyICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiogSWYgZWxlbWVudHMgYXJlIGluIHNhbWUgbGV2ZWwsIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIGRlY2lkZXMgaWYgaXQncyBiZWZvcmUvYWZ0ZXIgKi9cbiAgICAgICAgICAgIHJldHVybiBkcmFnZ2VkRWxlbWVudEJvdW5kLmxlZnQgLSB0YXJnZXRFbGVtZW50Qm91bmQubGVmdCA+IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NoYW5nZURyYWdnYWJsZVN0YXRlKGRyYWdnYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kbmRJdGVtcykge1xuICAgICAgICAgICAgdGhpcy5kbmRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5saXN0RHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgICAgIGl0ZW0uY2hhbmdlQ0RLRHJhZ1N0YXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gX2lzTW91c2VPbkVsZW1lbnQoZWxlbWVudDogRWxlbWVudENob3JkLCBtb3VzZVBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGFydFggPSBlbGVtZW50Lng7XG4gICAgY29uc3QgZW5kWCA9IGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGg7XG5cbiAgICBjb25zdCBzdGFydFkgPSBlbGVtZW50Lnk7XG4gICAgY29uc3QgZW5kWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIF9iZXR3ZWVuKG1vdXNlUG9zaXRpb24ueCwgc3RhcnRYLCBlbmRYKSAmJiBfYmV0d2Vlbihtb3VzZVBvc2l0aW9uLnksIHN0YXJ0WSwgZW5kWSk7XG59XG5cbmZ1bmN0aW9uIF9iZXR3ZWVuKHg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHggPj0gbWluICYmIHggPD0gbWF4O1xufVxuIl19
303
+ function getElementStartCoords(rect, position) {
304
+ return {
305
+ x: position === 'after' ? rect.x + rect.width : rect.x,
306
+ y: position === 'after' ? rect.y + rect.height : rect.y
307
+ };
308
+ }
309
+ function getElementBoundaries(coordinates, threshold) {
310
+ const widthOffset = coordinates.width * (coordinates.position === 'after' ? 1 : -1);
311
+ const heightOffset = coordinates.height * (coordinates.position === 'after' ? 1 : -1);
312
+ const xStart = coordinates.position === 'after' ? coordinates.x : coordinates.x + coordinates.width;
313
+ const xEnd = xStart + widthOffset + (widthOffset / 2) * threshold;
314
+ const yStart = coordinates.position === 'after' ? coordinates.y : coordinates.y + coordinates.height;
315
+ const yEnd = yStart + heightOffset + (heightOffset / 2) * threshold;
316
+ return {
317
+ x: {
318
+ start: xStart > xEnd ? xEnd : xStart,
319
+ end: xStart > xEnd ? xStart : xEnd
320
+ },
321
+ y: {
322
+ start: yStart > yEnd ? yEnd : yStart,
323
+ end: yStart > yEnd ? yStart : yEnd
324
+ }
325
+ };
326
+ }
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi91dGlscy9kcmFnLWFuZC1kcm9wL2RuZC1saXN0L2RuZC1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQU0vQyxNQUFNLE9BQU8sZ0JBQWdCO0lBSjdCO1FBS0k7OztXQUdHO1FBRUgsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQjs7Ozs7Ozs7O1dBU0c7UUFFSCxhQUFRLEdBQWtCLE9BQU8sQ0FBQztRQUVsQzs7V0FFRztRQUVILGNBQVMsR0FBRyxHQUFHLENBQUM7UUFvQmhCLGNBQWM7UUFDTixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQWE3QixxREFBcUQ7UUFFNUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRXBELHFEQUFxRDtRQUU1QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBUzFELGNBQWM7UUFDTixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBRWhELGNBQWM7UUFDTix5QkFBb0IsR0FBOEIsSUFBSSxDQUFDO1FBRS9ELGtGQUFrRjtRQUNqRSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVqRCxjQUFjO1FBQ0csZ0JBQVcsR0FBRyxJQUFJLE9B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LENBQUM7SUFDckcsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLFlBQVksR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDcEUsT0FBTztRQUNILENBQUMsRUFBRTtZQUNDLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDcEMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUNyQztRQUNELENBQUMsRUFBRTtZQUNDLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDcEMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUNyQztLQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVsZW1lbnRDaG9yZCwgRmREcm9wRXZlbnQsIExpbmtQb3NpdGlvbiwgRWxlbWVudFBvc2l0aW9uLCBEbmRJdGVtLCBGZERuZERyb3BUeXBlIH0gZnJvbSAnLi4vZG5kLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgRE5EX0lURU0sIERORF9MSVNUIH0gZnJvbSAnLi4vdG9rZW5zJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZmRrRG5kTGlzdF0sIFtmZC1kbmQtbGlzdF0nLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogRE5EX0xJU1QsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERuZExpc3REaXJlY3RpdmUpIH1dXG59KVxuZXhwb3J0IGNsYXNzIERuZExpc3REaXJlY3RpdmU8VD4gaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgaWYgdGhlIGVsZW1lbnQgaXMgYWxsb3dlZCB0byBiZSBkcmFnZ2VkIGluIDIgZGltZW5zaW9ucyxcbiAgICAgKiBXaGVuIHRydWUgLSByZXBsYWNlIGluZGljYXRvciB3aWxsIGJlIGRpc3BsYXllZCB2ZXJ0aWNhbGx5XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBncmlkTW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkcm9wIHN0cmF0ZWd5OlxuICAgICAqICogYHNoaWZ0YCBtb2RlIHdpbGwgY3JlYXRlIGxpbmUgYWZ0ZXIgY2xvc2VzdCBkcm9wIGVsZW1lbnQuXG4gICAgICogKiBgZ3JvdXBgIG1vZGUgd2lsbCBjcmVhdGUgcmVwbGFjZSBpbmRpY2F0b3Igb24gd2hvbGUgY2xvc2VzdCBkcm9wIGVsZW1lbnQuXG4gICAgICogKiBgYXV0b2AgbW9kZSB3aWxsIGNyZWF0ZSBsaW5lIGFmdGVyIGNsb3Nlc3QgZHJvcCBlbGVtZW50LFxuICAgICAqIGlmIGRyYWdnZWQgZWxlbWVudCBjb29yZGluYXRlcyBhcmUgc2hpZnRlZCBmb3IgMzAlIGZyb20gY2VudGVyIG9mIHRoZSBjbG9zZXN0IGRyb3AgZWxlbWVudC5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgY3JlYXRlIHJlcGxhY2UgaW5kaWNhdG9yIG9uIHdob2xlIGNsb3Nlc3QgZHJvcCBlbGVtZW50LlxuICAgICAqXG4gICAgICogYHNoaWZ0YCBtb2RlIGlzIHRoZSBkZWZhdWx0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJvcE1vZGU6IEZkRG5kRHJvcFR5cGUgPSAnc2hpZnQnO1xuXG4gICAgLyoqXG4gICAgICogVGhyZXNob2xkIG9mIGRyYWdnZWQgaXRlbSBvdmVyIGFub3RoZXIgaXRlbSB0byBkZWZpbmUgd2hpY2ggdHlwZSBvZiBgZHJvcE1vZGVgIHNob3VsZCBiZSB1c2VkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGhyZXNob2xkID0gMC4zO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBVc2UgYGRyb3BNb2RlYCBwcm9wZXJ0eSBmb3IgYmV0dGVyIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBXaGVuIGVuYWJsZWQsIHJlcGxhY2UgaW5kaWNhdG9yIHdpbGwgYXBwZWFyIG9uIHdob2xlIGVsZW1lbnQsIGluc3RlYWQgb2YgaG9yaXpvbnRhbC92ZXJ0aWNhbCBsaW5lIGJlZm9yZS9hZnRlciBlbGVtZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHJlcGxhY2VNb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3JlcGxhY2VNb2RlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZHJvcE1vZGUgPSB2YWx1ZSA/ICdncm91cCcgOiAnc2hpZnQnO1xuICAgICAgICB0aGlzLl9kZXRlY3RlZERyb3BNb2RlID0gdGhpcy5kcm9wTW9kZTtcbiAgICB9XG5cbiAgICBnZXQgcmVwbGFjZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBsYWNlTW9kZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlcGxhY2VNb2RlID0gZmFsc2U7XG5cbiAgICAvKiogQXJyYXkgb2YgaXRlbXMsIHRoYXQgd2lsbCBiZSBzb3J0ZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIGl0ZW1zOiBBcnJheTxUPjtcblxuICAgIC8qKiBEZWZpbmVzIGlmIGRyYWcgYW5kIGRyb3AgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgbGlzdCBpdGVtcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRyYWdnYWJsZShkcmFnZ2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2FibGVTdGF0ZShkcmFnZ2FibGUpO1xuICAgIH1cblxuICAgIC8qKiBFdmVudCB0aGF0IGlzIHRocm93biwgd2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaXRlbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+PigpO1xuXG4gICAgLyoqIEV2ZW50IHRoYXQgaXMgdGhyb3duLCB3aGVuIHRoZSBpdGVtIGlzIGRyb3BwZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBpdGVtRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmREcm9wRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oRE5EX0lURU0pXG4gICAgZG5kSXRlbXM6IFF1ZXJ5TGlzdDxEbmRJdGVtPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZWxlbWVudHNDb29yZGluYXRlczogRWxlbWVudENob3JkW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2Nsb3Nlc3RJdGVtSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jbG9zZXN0SXRlbVBvc2l0aW9uOiAnYmVmb3JlJyB8ICdhZnRlcicgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGN1cnJlbnQgZGF0YSBzdHJlYW0gKGZvciB1bnN1YnNjcmliaW5nKSAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZWZyZXNoJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gICovXG4gICAgcHJpdmF0ZSBfZG5kSXRlbVJlZmVyZW5jZTogRG5kSXRlbVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsQ2xhc3MgPSAnZmQtZG5kLWxpc3QnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZXRlY3RlZERyb3BNb2RlOiAnc2hpZnQnIHwgJ2dyb3VwJztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbGluZXNSZW1vdmVkID0gdHJ1ZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaW5kaWNhdG9yc1JlbW92ZWQgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NoYW5nZURyYWdnYWJsZVN0YXRlKHRoaXMuX2RyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuZG5kSXRlbXMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSwgc3RhcnRXaXRoKDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaFF1ZXJ5TGlzdCgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgY2FsbGVkLCB3aGVuIHRoZSBpdGVtIGlzIGJlaW5nIG1vdmVkIGJ5IDEgcHggKi9cbiAgICBvbk1vdmUobW91c2VQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLCBkcmFnZ2VkSXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLyoqIFRlbXBvcmFyeSBvYmplY3QsIHRvIHN0b3JlIGxvd2VzdCBkaXN0YW5jZSB2YWx1ZXMgKi9cbiAgICAgICAgbGV0IGNsb3Nlc3RJdGVtSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNsb3Nlc3RJdGVtID0gdGhpcy5fZWxlbWVudHNDb29yZGluYXRlcy5maW5kKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgLyoqIENoZWNrIGlmIGVsZW1lbnQgY2FuIGJlIHJlcGxhY2VkICovXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuc3RpY2tUb1Bvc2l0aW9uICYmIGNsb3Nlc3RJdGVtSW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNb3VzZU9uRWxlbWVudCA9IF9pc01vdXNlT25FbGVtZW50KGVsZW1lbnQsIG1vdXNlUG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChpc01vdXNlT25FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RJdGVtSW5kZXggPSBpbmRleDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghY2xvc2VzdEl0ZW0pIHtcbiAgICAgICAgICAgIGNsb3Nlc3RJdGVtSW5kZXggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIElmIHRoZSBjbG9zZXN0IGVsZW1lbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBvbmUsIG5ldyBvbmUgaXMgcGlja2VkLiBJdCBwcmV2ZW50cyBmcm9tIHBlcmZvcm1hbmNlIGlzc3VlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoY2xvc2VzdEl0ZW1JbmRleCB8fCBjbG9zZXN0SXRlbUluZGV4ID09PSAwKSAmJlxuICAgICAgICAgICAgKGNsb3Nlc3RJdGVtSW5kZXggIT09IHRoaXMuX2Nsb3Nlc3RJdGVtSW5kZXggfHwgdGhpcy5kcm9wTW9kZSA9PT0gJ2F1dG8nKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbExpbmVzKCk7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxSZXBsYWNlSW5kaWNhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VzdEl0ZW1JbmRleCA9IGNsb3Nlc3RJdGVtSW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZXN0SXRlbVBvc2l0aW9uID0gdGhpcy5fZWxlbWVudHNDb29yZGluYXRlc1tjbG9zZXN0SXRlbUluZGV4XS5wb3NpdGlvbjtcbiAgICAgICAgICAgIC8vIElmIGNsb3Nlc3QgaXRlbSBpbmRleCBpcyBzYW1lIGFzIGRyYWdnZWQgaXRlbSwganVzdCByZW1vdmUgaW5kaWNhdG9yc1xuICAgICAgICAgICAgaWYgKGNsb3Nlc3RJdGVtSW5kZXggPT09IGRyYWdnZWRJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxMaW5lcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFJlcGxhY2VJbmRpY2F0b3JzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIEdlbmVyYXRpbmcgbGluZSwgdGhhdCBzaG93cyB3aGVyZSB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCwgb24gZHJvcCAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcE1vZGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVSZXBsYWNlSW5kaWNhdG9yKHRoaXMuX2Nsb3Nlc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyb3BNb2RlID09PSAnc2hpZnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTGluZSh0aGlzLl9jbG9zZXN0SXRlbUluZGV4LCB0aGlzLl9jbG9zZXN0SXRlbVBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0RHJvcE1vZGVJbmRpY2F0b3IoZHJhZ2dlZEl0ZW1JbmRleCwgY2xvc2VzdEl0ZW0sIGNsb3Nlc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCBjYWxsZWQsIHdoZW4gZWxlbWVudCBpcyBzdGFydGVkIHRvIGJlIGRyYWdnZWQgKi9cbiAgICBkcmFnU3RhcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbUVsZW1lbnQgPSB0aGlzLl9kbmRJdGVtUmVmZXJlbmNlW2luZGV4XS5lbGVtZW50UmVmO1xuICAgICAgICAvKiogQ291bnRpbmcgYWxsIHRoZSBlbGVtZW50J3MgY2hvcmRzICovXG4gICAgICAgIHRoaXMuX2VsZW1lbnRzQ29vcmRpbmF0ZXMgPSB0aGlzLl9kbmRJdGVtUmVmZXJlbmNlLm1hcCgoaXRlbTogRG5kSXRlbSkgPT5cbiAgICAgICAgICAgIGl0ZW0uZ2V0RWxlbWVudENvb3JkaW5hdGVzKHRoaXMuX2lzQmVmb3JlKGRyYWdnZWRJdGVtRWxlbWVudCwgaXRlbS5lbGVtZW50UmVmKSwgdGhpcy5ncmlkTW9kZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIGNhbGxlZCwgd2hlbiBlbGVtZW50IGlzIHJlbGVhc2VkICovXG4gICAgZHJhZ0VuZChkcmFnZ2VkSXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkSXRlbUluZGV4ID0gdGhpcy5fY2xvc2VzdEl0ZW1JbmRleDtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSBpdGVtc1tkcmFnZ2VkSXRlbUluZGV4XTtcblxuICAgICAgICBpZiAocmVwbGFjZWRJdGVtSW5kZXggfHwgcmVwbGFjZWRJdGVtSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbUluZGV4ICE9PSByZXBsYWNlZEl0ZW1JbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbUluZGV4IDwgcmVwbGFjZWRJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGRyYWdnZWRJdGVtSW5kZXg7IGkgPCByZXBsYWNlZEl0ZW1JbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IGl0ZW1zW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBkcmFnZ2VkSXRlbUluZGV4OyBpID4gcmVwbGFjZWRJdGVtSW5kZXg7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBpdGVtc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiogUmVwbGFjaW5nIGl0ZW1zICovXG4gICAgICAgICAgICAgICAgaXRlbXNbcmVwbGFjZWRJdGVtSW5kZXhdID0gZHJhZ2dlZEl0ZW07XG5cbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLml0ZW1Ecm9wcGVkLmVtaXQoe1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkSXRlbUluZGV4LFxuICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtSW5kZXgsXG4gICAgICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICAgICAgaW5zZXJ0QXQ6IHRoaXMuX2Nsb3Nlc3RJdGVtUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbW9kZTogdGhpcy5kcm9wTW9kZSAhPT0gJ2F1dG8nID8gdGhpcy5kcm9wTW9kZSA6IHRoaXMuX2RldGVjdGVkRHJvcE1vZGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxMaW5lcygpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsUmVwbGFjZUluZGljYXRvcnMoKTtcblxuICAgICAgICAgICAgLyoqIFJlc2V0ICovXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50c0Nvb3JkaW5hdGVzID0gW107XG4gICAgICAgICAgICB0aGlzLl9jbG9zZXN0SXRlbUluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3Nlc3RJdGVtUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3REcm9wTW9kZUluZGljYXRvcihcbiAgICAgICAgZHJhZ2dlZEl0ZW1JbmRleDogbnVtYmVyLFxuICAgICAgICBjbG9zZXN0SXRlbTogRWxlbWVudENob3JkIHwgdW5kZWZpbmVkLFxuICAgICAgICBjbG9zZXN0SXRlbUluZGV4OiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKCFjbG9zZXN0SXRlbSB8fCAhdGhpcy5fZG5kSXRlbVJlZmVyZW5jZVtkcmFnZ2VkSXRlbUluZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld0RldGVjdGVkRHJvcE1vZGU6ICdzaGlmdCcgfCAnZ3JvdXAnO1xuICAgICAgICBjb25zdCBkcmFnZ2VkRWxtQ29vcmRzID1cbiAgICAgICAgICAgIHRoaXMuX2RuZEl0ZW1SZWZlcmVuY2VbZHJhZ2dlZEl0ZW1JbmRleF0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IGNsb3Nlc3RJdGVtQm91bmRhcmllcyA9IGdldEVsZW1lbnRCb3VuZGFyaWVzKGNsb3Nlc3RJdGVtLCB0aGlzLnRocmVzaG9sZCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtU3RhcnRDb29yZHMgPSBnZXRFbGVtZW50U3RhcnRDb29yZHMoZHJhZ2dlZEVsbUNvb3JkcywgY2xvc2VzdEl0ZW0ucG9zaXRpb24pO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIF9iZXR3ZWVuKGRyYWdnZWRJdGVtU3RhcnRDb29yZHMueCwgY2xvc2VzdEl0ZW1Cb3VuZGFyaWVzLnguc3RhcnQsIGNsb3Nlc3RJdGVtQm91bmRhcmllcy54LmVuZCkgJiZcbiAgICAgICAgICAgIF9iZXR3ZWVuKGRyYWdnZWRJdGVtU3RhcnRDb29yZHMueSwgY2xvc2VzdEl0ZW1Cb3VuZGFyaWVzLnkuc3RhcnQsIGNsb3Nlc3RJdGVtQm91bmRhcmllcy55LmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBuZXdEZXRlY3RlZERyb3BNb2RlID0gJ2dyb3VwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0RldGVjdGVkRHJvcE1vZGUgPSAnc2hpZnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0RldGVjdGVkRHJvcE1vZGUgPT09IHRoaXMuX2RldGVjdGVkRHJvcE1vZGUgJiYgKCF0aGlzLl9saW5lc1JlbW92ZWQgfHwgIXRoaXMuX2luZGljYXRvcnNSZW1vdmVkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGV0ZWN0ZWREcm9wTW9kZSA9IG5ld0RldGVjdGVkRHJvcE1vZGU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RldGVjdGVkRHJvcE1vZGUgPT09ICdzaGlmdCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUxpbmUoY2xvc2VzdEl0ZW1JbmRleCwgdGhpcy5fZWxlbWVudHNDb29yZGluYXRlc1tjbG9zZXN0SXRlbUluZGV4XS5wb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVSZXBsYWNlSW5kaWNhdG9yKGNsb3Nlc3RJdGVtSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZW1vdmVBbGxMaW5lcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGluZXNSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kbmRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLnJlbW92ZUxpbmUoKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZW1vdmVBbGxSZXBsYWNlSW5kaWNhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5kaWNhdG9yc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRuZEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ucmVtb3ZlUmVwbGFjZUluZGljYXRvcigpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NyZWF0ZUxpbmUoY2xvc2VzdEl0ZW1JbmRleDogbnVtYmVyLCBsaW5rUG9zaXRpb246IExpbmtQb3NpdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxMaW5lcygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxSZXBsYWNlSW5kaWNhdG9ycygpO1xuICAgICAgICB0aGlzLl9saW5lc1JlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZG5kSXRlbVJlZmVyZW5jZVtjbG9zZXN0SXRlbUluZGV4XS5jcmVhdGVMaW5lKGxpbmtQb3NpdGlvbiwgdGhpcy5ncmlkTW9kZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jcmVhdGVSZXBsYWNlSW5kaWNhdG9yKGNsb3Nlc3RJdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxMaW5lcygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxSZXBsYWNlSW5kaWNhdG9ycygpO1xuICAgICAgICB0aGlzLl9pbmRpY2F0b3JzUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kbmRJdGVtUmVmZXJlbmNlW2Nsb3Nlc3RJdGVtSW5kZXhdLmNyZWF0ZVJlcGxhY2VJbmRpY2F0b3IoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hRdWVyeUxpc3QoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2gkID0gbWVyZ2UodGhpcy5fcmVmcmVzaCQsIHRoaXMuX29uRGVzdHJveSQpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoJC5uZXh0KCk7XG5cbiAgICAgICAgdGhpcy5fZG5kSXRlbVJlZmVyZW5jZSA9IHRoaXMuZG5kSXRlbXMudG9BcnJheSgpO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURyYWdnYWJsZVN0YXRlKHRoaXMuX2RyYWdnYWJsZSk7XG5cbiAgICAgICAgdGhpcy5kbmRJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5tb3ZlZC5waXBlKHRha2VVbnRpbChyZWZyZXNoJCkpLnN1YnNjcmliZSgocG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbikgPT4gdGhpcy5vbk1vdmUocG9zaXRpb24sIGluZGV4KSk7XG4gICAgICAgICAgICBpdGVtLnN0YXJ0ZWQucGlwZSh0YWtlVW50aWwocmVmcmVzaCQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kcmFnU3RhcnQoaW5kZXgpKTtcbiAgICAgICAgICAgIGl0ZW0ucmVsZWFzZWQucGlwZSh0YWtlVW50aWwocmVmcmVzaCQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kcmFnRW5kKGluZGV4KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBAaGlkZGVuXG4gICAgICogUmV0dXJuIGluZm9ybWF0aW9uIGlmIGVsZW1lbnQgaXMgcGxhY2VkIGJlZm9yZSB0aGUgZHJhZ2dlZCBlbGVtZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfaXNCZWZvcmUoZHJhZ2dlZEVsZW1lbnQ6IEVsZW1lbnRSZWYsIHRhcmdldEVsZW1lbnQ6IEVsZW1lbnRSZWYpOiBib29sZWFuIHtcbiAgICAgICAgLyoqIFNvbWV0aW1lcyB0aGUgZWxlbWVudCBhcmUgbm90IHN0cmFpZ2h0IGluIG9uZSBjb2x1bW4sIHRoYXQncyB3aHkgb2Zmc2V0IGlzIG5lZWRlZCAqL1xuICAgICAgICBjb25zdCBWRVJUSUNBTF9PRkZTRVQgPSAyMDtcblxuICAgICAgICAvKiogRGlzdGFuY2VzIGZyb20gdGhlIHRvcCBvZiBzY3JlZW4gKi9cbiAgICAgICAgY29uc3QgZHJhZ2dlZEVsZW1lbnRCb3VuZCA9IDxET01SZWN0PmRyYWdnZWRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRCb3VuZCA9IDxET01SZWN0PnRhcmdldEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAoZHJhZ2dlZEVsZW1lbnRCb3VuZC50b3AgLSB0YXJnZXRFbGVtZW50Qm91bmQudG9wID4gVkVSVElDQUxfT0ZGU0VUKSB7XG4gICAgICAgICAgICAvKiogSWYgZWxlbWVudCBpcyBoaWdoZXIgdGhhbiB0aGUgZHJhZ2dlZCBlbGVtZW50LCBpdCdzIGZvciBzdXJlIGJlZm9yZSAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0RWxlbWVudEJvdW5kLnRvcCAtIGRyYWdnZWRFbGVtZW50Qm91bmQudG9wID4gVkVSVElDQUxfT0ZGU0VUKSB7XG4gICAgICAgICAgICAvKiogSWYgZWxlbWVudCBpcyBsb3dlciB0aGFuIHRoZSBkcmFnZ2VkIGVsZW1lbnQsIGl0J3MgZm9yIHN1cmUgYWZ0ZXIgKi9cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qKiBJZiBlbGVtZW50cyBhcmUgaW4gc2FtZSBsZXZlbCwgdGhlIGhvcml6b250YWwgcG9zaXRpb24gZGVjaWRlcyBpZiBpdCdzIGJlZm9yZS9hZnRlciAqL1xuICAgICAgICAgICAgcmV0dXJuIGRyYWdnZWRFbGVtZW50Qm91bmQubGVmdCAtIHRhcmdldEVsZW1lbnRCb3VuZC5sZWZ0ID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlRHJhZ2dhYmxlU3RhdGUoZHJhZ2dhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRuZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmRuZEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmxpc3REcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gICAgICAgICAgICAgICAgaXRlbS5jaGFuZ2VDREtEcmFnU3RhdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfaXNNb3VzZU9uRWxlbWVudChlbGVtZW50OiBFbGVtZW50Q2hvcmQsIG1vdXNlUG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0WCA9IGVsZW1lbnQueDtcbiAgICBjb25zdCBlbmRYID0gZWxlbWVudC54ICsgZWxlbWVudC53aWR0aDtcblxuICAgIGNvbnN0IHN0YXJ0WSA9IGVsZW1lbnQueTtcbiAgICBjb25zdCBlbmRZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQ7XG5cbiAgICByZXR1cm4gX2JldHdlZW4obW91c2VQb3NpdGlvbi54LCBzdGFydFgsIGVuZFgpICYmIF9iZXR3ZWVuKG1vdXNlUG9zaXRpb24ueSwgc3RhcnRZLCBlbmRZKTtcbn1cblxuZnVuY3Rpb24gX2JldHdlZW4oeDogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4geCA+PSBtaW4gJiYgeCA8PSBtYXg7XG59XG5cbmludGVyZmFjZSBFbGVtZW50Qm91bmRhcmllcyB7XG4gICAgeDoge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICB9O1xuICAgIHk6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFN0YXJ0Q29vcmRzKHJlY3Q6IERPTVJlY3QsIHBvc2l0aW9uOiBFbGVtZW50Q2hvcmRbJ3Bvc2l0aW9uJ10pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHBvc2l0aW9uID09PSAnYWZ0ZXInID8gcmVjdC54ICsgcmVjdC53aWR0aCA6IHJlY3QueCxcbiAgICAgICAgeTogcG9zaXRpb24gPT09ICdhZnRlcicgPyByZWN0LnkgKyByZWN0LmhlaWdodCA6IHJlY3QueVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRCb3VuZGFyaWVzKGNvb3JkaW5hdGVzOiBFbGVtZW50Q2hvcmQsIHRocmVzaG9sZDogbnVtYmVyKTogRWxlbWVudEJvdW5kYXJpZXMge1xuICAgIGNvbnN0IHdpZHRoT2Zmc2V0ID0gY29vcmRpbmF0ZXMud2lkdGggKiAoY29vcmRpbmF0ZXMucG9zaXRpb24gPT09ICdhZnRlcicgPyAxIDogLTEpO1xuICAgIGNvbnN0IGhlaWdodE9mZnNldCA9IGNvb3JkaW5hdGVzLmhlaWdodCAqIChjb29yZGluYXRlcy5wb3NpdGlvbiA9PT0gJ2FmdGVyJyA/IDEgOiAtMSk7XG4gICAgY29uc3QgeFN0YXJ0ID0gY29vcmRpbmF0ZXMucG9zaXRpb24gPT09ICdhZnRlcicgPyBjb29yZGluYXRlcy54IDogY29vcmRpbmF0ZXMueCArIGNvb3JkaW5hdGVzLndpZHRoO1xuICAgIGNvbnN0IHhFbmQgPSB4U3RhcnQgKyB3aWR0aE9mZnNldCArICh3aWR0aE9mZnNldCAvIDIpICogdGhyZXNob2xkO1xuICAgIGNvbnN0IHlTdGFydCA9IGNvb3JkaW5hdGVzLnBvc2l0aW9uID09PSAnYWZ0ZXInID8gY29vcmRpbmF0ZXMueSA6IGNvb3JkaW5hdGVzLnkgKyBjb29yZGluYXRlcy5oZWlnaHQ7XG4gICAgY29uc3QgeUVuZCA9IHlTdGFydCArIGhlaWdodE9mZnNldCArIChoZWlnaHRPZmZzZXQgLyAyKSAqIHRocmVzaG9sZDtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB7XG4gICAgICAgICAgICBzdGFydDogeFN0YXJ0ID4geEVuZCA/IHhFbmQgOiB4U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHhTdGFydCA+IHhFbmQgPyB4U3RhcnQgOiB4RW5kXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICAgIHN0YXJ0OiB5U3RhcnQgPiB5RW5kID8geUVuZCA6IHlTdGFydCxcbiAgICAgICAgICAgIGVuZDogeVN0YXJ0ID4geUVuZCA/IHlTdGFydCA6IHlFbmRcbiAgICAgICAgfVxuICAgIH07XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL3V0aWxzL2RyYWctYW5kLWRyb3AvZG5kLmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgTGlua1Bvc2l0aW9uID0gJ2FmdGVyJyB8ICdiZWZvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDaG9yZCB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBwb3NpdGlvbjogTGlua1Bvc2l0aW9uO1xuICAgIHN0aWNrVG9Qb3NpdGlvbj86IGJvb2xlYW47XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZERyb3BFdmVudDxUPiB7XG4gICAgaXRlbXM6IEFycmF5PFQ+O1xuICAgIHJlcGxhY2VkSXRlbUluZGV4OiBudW1iZXI7XG4gICAgZHJhZ2dlZEl0ZW1JbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRQb3NpdGlvbiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEbmRJdGVtIHtcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIGdldEVsZW1lbnRDb29yZGluYXRlczogKGlzQmVmb3JlOiBib29sZWFuLCBncmlkTW9kZTogYm9vbGVhbikgPT4gRWxlbWVudENob3JkO1xuICAgIHJlbW92ZUxpbmU6ICgpID0+IHZvaWQ7XG4gICAgcmVtb3ZlUmVwbGFjZUluZGljYXRvcjogKCkgPT4gdm9pZDtcbiAgICBjcmVhdGVMaW5lOiAobGlua1Bvc2l0aW9uOiBMaW5rUG9zaXRpb24sIGdyaWRNb2RlOiBib29sZWFuKSA9PiB2b2lkO1xuICAgIGNyZWF0ZVJlcGxhY2VJbmRpY2F0b3I6ICgpID0+IHZvaWQ7XG4gICAgbW92ZWQ6IE9ic2VydmFibGU8RWxlbWVudFBvc2l0aW9uPjtcbiAgICByZWxlYXNlZDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICBzdGFydGVkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIGxpc3REcmFnZ2FibGU6IGJvb2xlYW47XG4gICAgY2hhbmdlQ0RLRHJhZ1N0YXRlOiAoKSA9PiB2b2lkO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL3V0aWxzL2RyYWctYW5kLWRyb3AvZG5kLmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgTGlua1Bvc2l0aW9uID0gJ2FmdGVyJyB8ICdiZWZvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDaG9yZCB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBwb3NpdGlvbjogTGlua1Bvc2l0aW9uO1xuICAgIHN0aWNrVG9Qb3NpdGlvbj86IGJvb2xlYW47XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZERyb3BFdmVudDxUPiB7XG4gICAgaXRlbXM6IEFycmF5PFQ+O1xuICAgIHJlcGxhY2VkSXRlbUluZGV4OiBudW1iZXI7XG4gICAgZHJhZ2dlZEl0ZW1JbmRleDogbnVtYmVyO1xuICAgIGluc2VydEF0OiAnYmVmb3JlJyB8ICdhZnRlcicgfCBudWxsO1xuICAgIG1vZGU6IEZkRG5kRHJvcEV2ZW50TW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UG9zaXRpb24ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG5kSXRlbSB7XG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBnZXRFbGVtZW50Q29vcmRpbmF0ZXM6IChpc0JlZm9yZTogYm9vbGVhbiwgZ3JpZE1vZGU6IGJvb2xlYW4pID0+IEVsZW1lbnRDaG9yZDtcbiAgICByZW1vdmVMaW5lOiAoKSA9PiB2b2lkO1xuICAgIHJlbW92ZVJlcGxhY2VJbmRpY2F0b3I6ICgpID0+IHZvaWQ7XG4gICAgY3JlYXRlTGluZTogKGxpbmtQb3NpdGlvbjogTGlua1Bvc2l0aW9uLCBncmlkTW9kZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBjcmVhdGVSZXBsYWNlSW5kaWNhdG9yOiAoKSA9PiB2b2lkO1xuICAgIG1vdmVkOiBPYnNlcnZhYmxlPEVsZW1lbnRQb3NpdGlvbj47XG4gICAgcmVsZWFzZWQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgc3RhcnRlZDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICBsaXN0RHJhZ2dhYmxlOiBib29sZWFuO1xuICAgIGNoYW5nZUNES0RyYWdTdGF0ZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgRmREbmREcm9wVHlwZSA9ICdzaGlmdCcgfCAnZ3JvdXAnIHwgJ2F1dG8nO1xuZXhwb3J0IHR5cGUgRmREbmREcm9wRXZlbnRNb2RlID0gJ3NoaWZ0JyB8ICdncm91cCc7XG4iXX0=
@@ -4915,12 +4915,27 @@ const DND_LIST = new InjectionToken('Drag and drop List');
4915
4915
  class DndListDirective {
4916
4916
  constructor() {
4917
4917
  /**
4918
- * Defines if the the element is allowed to be dragged in 2 dimensions,
4918
+ * Defines if the element is allowed to be dragged in 2 dimensions,
4919
4919
  * When true - replace indicator will be displayed vertically
4920
4920
  */
4921
4921
  this.gridMode = false;
4922
- /** When enabled, replace indicator will appear on whole element, instead of horizontal/vertical line before/after element */
4923
- this.replaceMode = false;
4922
+ /**
4923
+ * Defines drop strategy:
4924
+ * * `shift` mode will create line after closest drop element.
4925
+ * * `group` mode will create replace indicator on whole closest drop element.
4926
+ * * `auto` mode will create line after closest drop element,
4927
+ * if dragged element coordinates are shifted for 30% from center of the closest drop element.
4928
+ * Otherwise, it will create replace indicator on whole closest drop element.
4929
+ *
4930
+ * `shift` mode is the default.
4931
+ */
4932
+ this.dropMode = 'shift';
4933
+ /**
4934
+ * Threshold of dragged item over another item to define which type of `dropMode` should be used.
4935
+ */
4936
+ this.threshold = 0.3;
4937
+ /** @hidden */
4938
+ this._replaceMode = false;
4924
4939
  /** Event that is thrown, when items are reordered */
4925
4940
  this.itemsChange = new EventEmitter();
4926
4941
  /** Event that is thrown, when the item is dropped */
@@ -4935,6 +4950,27 @@ class DndListDirective {
4935
4950
  this._onDestroy$ = new Subject();
4936
4951
  /** @hidden */
4937
4952
  this._draggable = true;
4953
+ /** @hidden */
4954
+ this._initialClass = 'fd-dnd-list';
4955
+ /** @hidden */
4956
+ this._linesRemoved = true;
4957
+ /** @hidden */
4958
+ this._indicatorsRemoved = true;
4959
+ }
4960
+ /**
4961
+ * @deprecated
4962
+ * Use `dropMode` property for better configuration.
4963
+ *
4964
+ * @description
4965
+ * When enabled, replace indicator will appear on whole element, instead of horizontal/vertical line before/after element.
4966
+ */
4967
+ set replaceMode(value) {
4968
+ this._replaceMode = value;
4969
+ this.dropMode = value ? 'group' : 'shift';
4970
+ this._detectedDropMode = this.dropMode;
4971
+ }
4972
+ get replaceMode() {
4973
+ return this._replaceMode;
4938
4974
  }
4939
4975
  /** Defines if drag and drop feature should be enabled for list items */
4940
4976
  set draggable(draggable) {
@@ -4969,8 +5005,11 @@ class DndListDirective {
4969
5005
  if (!closestItem) {
4970
5006
  closestItemIndex = null;
4971
5007
  }
4972
- /** If the closest element is different than the old one, new one is picked. It prevents from performance issues */
4973
- if ((closestItemIndex || closestItemIndex === 0) && closestItemIndex !== this._closestItemIndex) {
5008
+ /** If the closest element is different from the old one, new one is picked. It prevents from performance issues */
5009
+ if ((closestItemIndex || closestItemIndex === 0) &&
5010
+ (closestItemIndex !== this._closestItemIndex || this.dropMode === 'auto')) {
5011
+ this._removeAllLines();
5012
+ this._removeAllReplaceIndicators();
4974
5013
  this._closestItemIndex = closestItemIndex;
4975
5014
  this._closestItemPosition = this._elementsCoordinates[closestItemIndex].position;
4976
5015
  // If closest item index is same as dragged item, just remove indicators
@@ -4980,18 +5019,21 @@ class DndListDirective {
4980
5019
  return;
4981
5020
  }
4982
5021
  /** Generating line, that shows where the element will be placed, on drop */
4983
- if (this.replaceMode) {
5022
+ if (this.dropMode === 'group') {
4984
5023
  this._createReplaceIndicator(this._closestItemIndex);
4985
5024
  }
4986
- else {
5025
+ else if (this.dropMode === 'shift') {
4987
5026
  this._createLine(this._closestItemIndex, this._closestItemPosition);
4988
5027
  }
5028
+ else {
5029
+ this._selectDropModeIndicator(draggedItemIndex, closestItem, closestItemIndex);
5030
+ }
4989
5031
  }
4990
5032
  }
4991
5033
  /** Method called, when element is started to be dragged */
4992
5034
  dragStart(index) {
4993
5035
  const draggedItemElement = this._dndItemReference[index].elementRef;
4994
- /** Counting all of the elements's chords */
5036
+ /** Counting all the element's chords */
4995
5037
  this._elementsCoordinates = this._dndItemReference.map((item) => item.getElementCoordinates(this._isBefore(draggedItemElement, item.elementRef), this.gridMode));
4996
5038
  }
4997
5039
  /** Method called, when element is released */
@@ -5018,7 +5060,9 @@ class DndListDirective {
5018
5060
  this.itemDropped.emit({
5019
5061
  replacedItemIndex,
5020
5062
  draggedItemIndex,
5021
- items
5063
+ items,
5064
+ insertAt: this._closestItemPosition,
5065
+ mode: this.dropMode !== 'auto' ? this.dropMode : this._detectedDropMode
5022
5066
  });
5023
5067
  this._removeAllLines();
5024
5068
  this._removeAllReplaceIndicators();
@@ -5029,21 +5073,54 @@ class DndListDirective {
5029
5073
  }
5030
5074
  }
5031
5075
  /** @hidden */
5076
+ _selectDropModeIndicator(draggedItemIndex, closestItem, closestItemIndex) {
5077
+ if (!closestItem || !this._dndItemReference[draggedItemIndex]) {
5078
+ return;
5079
+ }
5080
+ let newDetectedDropMode;
5081
+ const draggedElmCoords = this._dndItemReference[draggedItemIndex].elementRef.nativeElement.getBoundingClientRect();
5082
+ const closestItemBoundaries = getElementBoundaries(closestItem, this.threshold);
5083
+ const draggedItemStartCoords = getElementStartCoords(draggedElmCoords, closestItem.position);
5084
+ if (_between(draggedItemStartCoords.x, closestItemBoundaries.x.start, closestItemBoundaries.x.end) &&
5085
+ _between(draggedItemStartCoords.y, closestItemBoundaries.y.start, closestItemBoundaries.y.end)) {
5086
+ newDetectedDropMode = 'group';
5087
+ }
5088
+ else {
5089
+ newDetectedDropMode = 'shift';
5090
+ }
5091
+ if (newDetectedDropMode === this._detectedDropMode && (!this._linesRemoved || !this._indicatorsRemoved)) {
5092
+ return;
5093
+ }
5094
+ this._detectedDropMode = newDetectedDropMode;
5095
+ if (this._detectedDropMode === 'shift') {
5096
+ this._createLine(closestItemIndex, this._elementsCoordinates[closestItemIndex].position);
5097
+ }
5098
+ else {
5099
+ this._createReplaceIndicator(closestItemIndex);
5100
+ }
5101
+ }
5102
+ /** @hidden */
5032
5103
  _removeAllLines() {
5104
+ this._linesRemoved = true;
5033
5105
  this.dndItems.forEach((item) => item.removeLine());
5034
5106
  }
5035
5107
  /** @hidden */
5036
5108
  _removeAllReplaceIndicators() {
5109
+ this._indicatorsRemoved = true;
5037
5110
  this.dndItems.forEach((item) => item.removeReplaceIndicator());
5038
5111
  }
5039
5112
  /** @hidden */
5040
5113
  _createLine(closestItemIndex, linkPosition) {
5041
5114
  this._removeAllLines();
5115
+ this._removeAllReplaceIndicators();
5116
+ this._linesRemoved = false;
5042
5117
  this._dndItemReference[closestItemIndex].createLine(linkPosition, this.gridMode);
5043
5118
  }
5044
5119
  /** @hidden */
5045
5120
  _createReplaceIndicator(closestItemIndex) {
5121
+ this._removeAllLines();
5046
5122
  this._removeAllReplaceIndicators();
5123
+ this._indicatorsRemoved = false;
5047
5124
  this._dndItemReference[closestItemIndex].createReplaceIndicator();
5048
5125
  }
5049
5126
  /** @hidden */
@@ -5092,7 +5169,7 @@ class DndListDirective {
5092
5169
  }
5093
5170
  }
5094
5171
  DndListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5095
- DndListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: DndListDirective, selector: "[fdkDndList], [fd-dnd-list]", inputs: { gridMode: "gridMode", replaceMode: "replaceMode", items: "items", draggable: "draggable" }, outputs: { itemsChange: "itemsChange", itemDropped: "itemDropped" }, providers: [{ provide: DND_LIST, useExisting: forwardRef(() => DndListDirective) }], queries: [{ propertyName: "dndItems", predicate: DND_ITEM }], ngImport: i0 });
5172
+ DndListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: DndListDirective, selector: "[fdkDndList], [fd-dnd-list]", inputs: { gridMode: "gridMode", dropMode: "dropMode", threshold: "threshold", replaceMode: "replaceMode", items: "items", draggable: "draggable" }, outputs: { itemsChange: "itemsChange", itemDropped: "itemDropped" }, host: { properties: { "class": "this._initialClass" } }, providers: [{ provide: DND_LIST, useExisting: forwardRef(() => DndListDirective) }], queries: [{ propertyName: "dndItems", predicate: DND_ITEM }], ngImport: i0 });
5096
5173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DndListDirective, decorators: [{
5097
5174
  type: Directive,
5098
5175
  args: [{
@@ -5101,6 +5178,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
5101
5178
  }]
5102
5179
  }], propDecorators: { gridMode: [{
5103
5180
  type: Input
5181
+ }], dropMode: [{
5182
+ type: Input
5183
+ }], threshold: [{
5184
+ type: Input
5104
5185
  }], replaceMode: [{
5105
5186
  type: Input
5106
5187
  }], items: [{
@@ -5114,6 +5195,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
5114
5195
  }], dndItems: [{
5115
5196
  type: ContentChildren,
5116
5197
  args: [DND_ITEM]
5198
+ }], _initialClass: [{
5199
+ type: HostBinding,
5200
+ args: ['class']
5117
5201
  }] } });
5118
5202
  function _isMouseOnElement(element, mousePosition) {
5119
5203
  const startX = element.x;
@@ -5125,6 +5209,30 @@ function _isMouseOnElement(element, mousePosition) {
5125
5209
  function _between(x, min, max) {
5126
5210
  return x >= min && x <= max;
5127
5211
  }
5212
+ function getElementStartCoords(rect, position) {
5213
+ return {
5214
+ x: position === 'after' ? rect.x + rect.width : rect.x,
5215
+ y: position === 'after' ? rect.y + rect.height : rect.y
5216
+ };
5217
+ }
5218
+ function getElementBoundaries(coordinates, threshold) {
5219
+ const widthOffset = coordinates.width * (coordinates.position === 'after' ? 1 : -1);
5220
+ const heightOffset = coordinates.height * (coordinates.position === 'after' ? 1 : -1);
5221
+ const xStart = coordinates.position === 'after' ? coordinates.x : coordinates.x + coordinates.width;
5222
+ const xEnd = xStart + widthOffset + (widthOffset / 2) * threshold;
5223
+ const yStart = coordinates.position === 'after' ? coordinates.y : coordinates.y + coordinates.height;
5224
+ const yEnd = yStart + heightOffset + (heightOffset / 2) * threshold;
5225
+ return {
5226
+ x: {
5227
+ start: xStart > xEnd ? xEnd : xStart,
5228
+ end: xStart > xEnd ? xStart : xEnd
5229
+ },
5230
+ y: {
5231
+ start: yStart > yEnd ? yEnd : yStart,
5232
+ end: yStart > yEnd ? yStart : yEnd
5233
+ }
5234
+ };
5235
+ }
5128
5236
 
5129
5237
  class DndItemDirective {
5130
5238
  /** Defines if element is draggable */