ngx-drag-drop 2.0.0-rc.7 → 13.0.1

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 (53) hide show
  1. package/README.md +2 -44
  2. package/esm2020/lib/dnd-draggable.directive.mjs +195 -0
  3. package/esm2020/lib/dnd-dropzone.directive.mjs +277 -0
  4. package/esm2020/lib/dnd-handle.directive.mjs +30 -0
  5. package/esm2020/lib/dnd-state.mjs +71 -0
  6. package/esm2020/lib/dnd-types.mjs +2 -0
  7. package/esm2020/lib/dnd-utils.mjs +114 -0
  8. package/esm2020/lib/dnd.module.mjs +44 -0
  9. package/esm2020/ngx-drag-drop.mjs +5 -0
  10. package/esm2020/public-api.mjs +9 -0
  11. package/fesm2015/ngx-drag-drop.mjs +731 -0
  12. package/fesm2015/ngx-drag-drop.mjs.map +1 -0
  13. package/{fesm2015/ngx-drag-drop.js → fesm2020/ngx-drag-drop.mjs} +209 -442
  14. package/fesm2020/ngx-drag-drop.mjs.map +1 -0
  15. package/{dnd-draggable.directive.d.ts → lib/dnd-draggable.directive.d.ts} +7 -2
  16. package/{dnd-dropzone.directive.d.ts → lib/dnd-dropzone.directive.d.ts} +8 -3
  17. package/{dnd-handle.directive.d.ts → lib/dnd-handle.directive.d.ts} +3 -0
  18. package/{dnd-state.d.ts → lib/dnd-state.d.ts} +0 -0
  19. package/{dnd-types.d.ts → lib/dnd-types.d.ts} +0 -0
  20. package/{dnd-utils.d.ts → lib/dnd-utils.d.ts} +0 -0
  21. package/lib/dnd.module.d.ts +10 -0
  22. package/ngx-drag-drop.d.ts +2 -1
  23. package/package.json +24 -54
  24. package/public-api.d.ts +6 -0
  25. package/LICENSE +0 -29
  26. package/bundles/ngx-drag-drop.umd.js +0 -1056
  27. package/bundles/ngx-drag-drop.umd.js.map +0 -1
  28. package/bundles/ngx-drag-drop.umd.min.js +0 -2
  29. package/bundles/ngx-drag-drop.umd.min.js.map +0 -1
  30. package/dnd.module.d.ts +0 -2
  31. package/esm2015/dnd-draggable.directive.js +0 -314
  32. package/esm2015/dnd-dropzone.directive.js +0 -446
  33. package/esm2015/dnd-handle.directive.js +0 -40
  34. package/esm2015/dnd-state.js +0 -116
  35. package/esm2015/dnd-types.js +0 -5
  36. package/esm2015/dnd-utils.js +0 -199
  37. package/esm2015/dnd.module.js +0 -33
  38. package/esm2015/ngx-drag-drop.js +0 -9
  39. package/esm2015/public_api.js +0 -10
  40. package/esm5/dnd-draggable.directive.js +0 -351
  41. package/esm5/dnd-dropzone.directive.js +0 -500
  42. package/esm5/dnd-handle.directive.js +0 -43
  43. package/esm5/dnd-state.js +0 -116
  44. package/esm5/dnd-types.js +0 -5
  45. package/esm5/dnd-utils.js +0 -199
  46. package/esm5/dnd.module.js +0 -37
  47. package/esm5/ngx-drag-drop.js +0 -9
  48. package/esm5/public_api.js +0 -10
  49. package/fesm2015/ngx-drag-drop.js.map +0 -1
  50. package/fesm5/ngx-drag-drop.js +0 -1052
  51. package/fesm5/ngx-drag-drop.js.map +0 -1
  52. package/ngx-drag-drop.metadata.json +0 -1
  53. package/public_api.d.ts +0 -6
package/README.md CHANGED
@@ -28,15 +28,6 @@ This has `dropzones` though :+1:
28
28
  The idea is that the directive does not handle lists internally so the `dndDropzone` can be general purpose.
29
29
 
30
30
 
31
- **Upcoming version release**
32
-
33
- Currently the next version including some performance optimizations is pending. See the [CHANGELOG](https://github.com/reppners/ngx-drag-drop/blob/master/CHANGELOG.md) for details.
34
-
35
- You can try it out by installing the `next` version.
36
-
37
- `npm install ngx-drag-drop@next --save`
38
-
39
-
40
31
  ## Usage
41
32
 
42
33
  `app.component.html`
@@ -327,8 +318,8 @@ https://github.com/timruffles/mobile-drag-drop
327
318
  ### Firefox
328
319
 
329
320
  * Beware that Firefox does not support dragging on `<button>` elements.
330
- * `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
331
- * See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
321
+ * `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
322
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
332
323
 
333
324
 
334
325
  ## Why?
@@ -338,36 +329,3 @@ HTML Drag-And-Drop API implementations are not behaving the same way across brow
338
329
  The directives contained in this module enable declarative drag and drop that "just works" across browsers in a consistent way.
339
330
 
340
331
  Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
341
-
342
- ## Maintenance
343
-
344
- This project was generated with [Angular CLI](https://github.com/angular/angular-cli).
345
-
346
- For the library build it uses [ng-packagr](https://github.com/dherges/ng-packagr).
347
-
348
- #### Edit Library
349
-
350
- * edit lib code
351
- * run `npm start` (currently needs to be re-run on every lib code change)
352
-
353
- #### Release Library
354
-
355
- * assure correct version is set in `package.json`
356
- * build library with `npm run build:lib`
357
- * publish library with `npm run publish:stable` (use `npm run publish:next` for pre-releases)
358
-
359
- #### Release Docs
360
-
361
- * build docs site with `npm run build:docs`
362
- * commit and push changes in `docs` to `master`
363
-
364
-
365
- ---
366
-
367
- <p align="center">
368
- Made with :heart: &
369
- <a href="https://www.jetbrains.com/?from=ngx-drag-drop">
370
- <img align="center" alt="jetbrains" src="jetbrains.svg" width="120px" />
371
- </a>
372
- & :coffee:
373
- </p>
@@ -0,0 +1,195 @@
1
+ import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Output } from "@angular/core";
2
+ import { calculateDragImageOffset, setDragData, setDragImage } from "./dnd-utils";
3
+ import { dndState, endDrag, startDrag } from "./dnd-state";
4
+ import * as i0 from "@angular/core";
5
+ export class DndDragImageRefDirective {
6
+ constructor(parent, elementRef) {
7
+ parent.registerDragImage(elementRef);
8
+ }
9
+ }
10
+ DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDragImageRefDirective, deps: [{ token: forwardRef(() => DndDraggableDirective) }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
11
+ DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
13
+ type: Directive,
14
+ args: [{
15
+ selector: "[dndDragImageRef]"
16
+ }]
17
+ }], ctorParameters: function () { return [{ type: DndDraggableDirective, decorators: [{
18
+ type: Inject,
19
+ args: [forwardRef(() => DndDraggableDirective)]
20
+ }] }, { type: i0.ElementRef }]; } });
21
+ export class DndDraggableDirective {
22
+ constructor(elementRef, renderer, ngZone) {
23
+ this.elementRef = elementRef;
24
+ this.renderer = renderer;
25
+ this.ngZone = ngZone;
26
+ this.dndEffectAllowed = "copy";
27
+ this.dndDraggingClass = "dndDragging";
28
+ this.dndDraggingSourceClass = "dndDraggingSource";
29
+ this.dndDraggableDisabledClass = "dndDraggableDisabled";
30
+ this.dndDragImageOffsetFunction = calculateDragImageOffset;
31
+ this.dndStart = new EventEmitter();
32
+ this.dndDrag = new EventEmitter();
33
+ this.dndEnd = new EventEmitter();
34
+ this.dndMoved = new EventEmitter();
35
+ this.dndCopied = new EventEmitter();
36
+ this.dndLinked = new EventEmitter();
37
+ this.dndCanceled = new EventEmitter();
38
+ this.draggable = true;
39
+ this.isDragStarted = false;
40
+ this.dragEventHandler = (event) => this.onDrag(event);
41
+ }
42
+ set dndDisableIf(value) {
43
+ this.draggable = !value;
44
+ if (this.draggable) {
45
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
46
+ }
47
+ else {
48
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
49
+ }
50
+ }
51
+ set dndDisableDragIf(value) {
52
+ this.dndDisableIf = value;
53
+ }
54
+ ngAfterViewInit() {
55
+ this.ngZone.runOutsideAngular(() => {
56
+ this.elementRef.nativeElement.addEventListener("drag", this.dragEventHandler);
57
+ });
58
+ }
59
+ ngOnDestroy() {
60
+ this.elementRef.nativeElement.removeEventListener("drag", this.dragEventHandler);
61
+ if (this.isDragStarted === true) {
62
+ endDrag();
63
+ }
64
+ }
65
+ onDragStart(event) {
66
+ if (this.draggable === false) {
67
+ return false;
68
+ }
69
+ // check if there is dnd handle and if the dnd handle was used to start the drag
70
+ if (typeof this.dndHandle !== "undefined"
71
+ && typeof event._dndUsingHandle === "undefined") {
72
+ return false;
73
+ }
74
+ // initialize global state
75
+ startDrag(event, this.dndEffectAllowed, this.dndType);
76
+ this.isDragStarted = true;
77
+ setDragData(event, { data: this.dndDraggable, type: this.dndType }, dndState.effectAllowed);
78
+ this.dragImage = this.determineDragImage();
79
+ // set dragging css class prior to setDragImage so styles are applied before
80
+ // TODO breaking change: add class to elementRef rather than drag image which could be another element
81
+ this.renderer.addClass(this.dragImage, this.dndDraggingClass);
82
+ // set custom dragimage if present
83
+ // set dragimage if drag is started from dndHandle
84
+ if (typeof this.dndDragImageElementRef !== "undefined"
85
+ || typeof event._dndUsingHandle !== "undefined") {
86
+ setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
87
+ }
88
+ // add dragging source css class on first drag event
89
+ const unregister = this.renderer.listen(this.elementRef.nativeElement, "drag", () => {
90
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
91
+ unregister();
92
+ });
93
+ this.dndStart.emit(event);
94
+ event.stopPropagation();
95
+ return true;
96
+ }
97
+ onDrag(event) {
98
+ this.dndDrag.emit(event);
99
+ }
100
+ onDragEnd(event) {
101
+ // get drop effect from custom stored state as its not reliable across browsers
102
+ const dropEffect = dndState.dropEffect;
103
+ let dropEffectEmitter;
104
+ switch (dropEffect) {
105
+ case "copy":
106
+ dropEffectEmitter = this.dndCopied;
107
+ break;
108
+ case "link":
109
+ dropEffectEmitter = this.dndLinked;
110
+ break;
111
+ case "move":
112
+ dropEffectEmitter = this.dndMoved;
113
+ break;
114
+ default:
115
+ dropEffectEmitter = this.dndCanceled;
116
+ break;
117
+ }
118
+ dropEffectEmitter.emit(event);
119
+ this.dndEnd.emit(event);
120
+ // reset global state
121
+ endDrag();
122
+ this.isDragStarted = false;
123
+ this.renderer.removeClass(this.dragImage, this.dndDraggingClass);
124
+ // IE9 special hammering
125
+ window.setTimeout(() => {
126
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
127
+ }, 0);
128
+ event.stopPropagation();
129
+ }
130
+ registerDragHandle(handle) {
131
+ this.dndHandle = handle;
132
+ }
133
+ registerDragImage(elementRef) {
134
+ this.dndDragImageElementRef = elementRef;
135
+ }
136
+ determineDragImage() {
137
+ // evaluate custom drag image existence
138
+ if (typeof this.dndDragImageElementRef !== "undefined") {
139
+ return this.dndDragImageElementRef.nativeElement;
140
+ }
141
+ else {
142
+ return this.elementRef.nativeElement;
143
+ }
144
+ }
145
+ }
146
+ DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
147
+ DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndDraggableDirective, selector: "[dndDraggable]", inputs: { dndDraggable: "dndDraggable", dndEffectAllowed: "dndEffectAllowed", dndType: "dndType", dndDraggingClass: "dndDraggingClass", dndDraggingSourceClass: "dndDraggingSourceClass", dndDraggableDisabledClass: "dndDraggableDisabledClass", dndDragImageOffsetFunction: "dndDragImageOffsetFunction", dndDisableIf: "dndDisableIf", dndDisableDragIf: "dndDisableDragIf" }, outputs: { dndStart: "dndStart", dndDrag: "dndDrag", dndEnd: "dndEnd", dndMoved: "dndMoved", dndCopied: "dndCopied", dndLinked: "dndLinked", dndCanceled: "dndCanceled" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDraggableDirective, decorators: [{
149
+ type: Directive,
150
+ args: [{
151
+ selector: "[dndDraggable]"
152
+ }]
153
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { dndDraggable: [{
154
+ type: Input
155
+ }], dndEffectAllowed: [{
156
+ type: Input
157
+ }], dndType: [{
158
+ type: Input
159
+ }], dndDraggingClass: [{
160
+ type: Input
161
+ }], dndDraggingSourceClass: [{
162
+ type: Input
163
+ }], dndDraggableDisabledClass: [{
164
+ type: Input
165
+ }], dndDragImageOffsetFunction: [{
166
+ type: Input
167
+ }], dndStart: [{
168
+ type: Output
169
+ }], dndDrag: [{
170
+ type: Output
171
+ }], dndEnd: [{
172
+ type: Output
173
+ }], dndMoved: [{
174
+ type: Output
175
+ }], dndCopied: [{
176
+ type: Output
177
+ }], dndLinked: [{
178
+ type: Output
179
+ }], dndCanceled: [{
180
+ type: Output
181
+ }], draggable: [{
182
+ type: HostBinding,
183
+ args: ["attr.draggable"]
184
+ }], dndDisableIf: [{
185
+ type: Input
186
+ }], dndDisableDragIf: [{
187
+ type: Input
188
+ }], onDragStart: [{
189
+ type: HostListener,
190
+ args: ["dragstart", ["$event"]]
191
+ }], onDragEnd: [{
192
+ type: HostListener,
193
+ args: ["dragend", ["$event"]]
194
+ }] } });
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQXdDLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQU0zRCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFlBQTZELE1BQTZCLEVBQUUsVUFBcUI7UUFDL0csTUFBTSxDQUFDLGlCQUFpQixDQUFFLFVBQVUsQ0FBRSxDQUFDO0lBQ3pDLENBQUM7O3NIQUpVLHdCQUF3QixrQkFFZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7MEdBRmhELHdCQUF3Qjs0RkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzBEQUdzRSxxQkFBcUI7MEJBQTdFLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDOztBQVE3RCxNQUFNLE9BQU8scUJBQXFCO0lBNkVoQyxZQUFxQixVQUFxQixFQUNyQixRQUFrQixFQUNsQixNQUFhO1FBRmIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQU87UUF6RWxDLHFCQUFnQixHQUFpQixNQUFNLENBQUM7UUFNeEMscUJBQWdCLEdBQUcsYUFBYSxDQUFDO1FBR2pDLDJCQUFzQixHQUFHLG1CQUFtQixDQUFDO1FBRzdDLDhCQUF5QixHQUFHLHNCQUFzQixDQUFDO1FBR25ELCtCQUEwQixHQUE4Qix3QkFBd0IsQ0FBQztRQUd4RSxhQUFRLEdBQTJCLElBQUksWUFBWSxFQUFhLENBQUM7UUFHakUsWUFBTyxHQUEyQixJQUFJLFlBQVksRUFBYSxDQUFDO1FBR2hFLFdBQU0sR0FBMkIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUcvRCxhQUFRLEdBQTJCLElBQUksWUFBWSxFQUFhLENBQUM7UUFHakUsY0FBUyxHQUEyQixJQUFJLFlBQVksRUFBYSxDQUFDO1FBR2xFLGNBQVMsR0FBMkIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUdsRSxnQkFBVyxHQUEyQixJQUFJLFlBQVksRUFBYSxDQUFDO1FBRzdFLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFRVCxrQkFBYSxHQUFXLEtBQUssQ0FBQztRQUVyQixxQkFBZ0IsR0FBK0IsQ0FBRSxLQUFlLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUUsS0FBSyxDQUFFLENBQUM7SUF5QjVHLENBQUM7SUF2QkQsSUFDSSxZQUFZLENBQUUsS0FBYTtRQUU3QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRztZQUVuQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQztTQUM1RjthQUNJO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFFLENBQUM7U0FDekY7SUFDSCxDQUFDO0lBRUQsSUFDSSxnQkFBZ0IsQ0FBRSxLQUFhO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFPRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBRSxHQUFHLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDO1FBQ2xGLENBQUMsQ0FBRSxDQUFDO0lBQ04sQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFFLENBQUM7UUFDbkYsSUFBRyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUM5QixPQUFPLEVBQUUsQ0FBQTtTQUNWO0lBQ0gsQ0FBQztJQUdELFdBQVcsQ0FBRSxLQUFjO1FBRXpCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUc7WUFFN0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELGdGQUFnRjtRQUNoRixJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXO2VBQ3BDLE9BQU8sS0FBSyxDQUFDLGVBQWUsS0FBSyxXQUFXLEVBQUc7WUFFbEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELDBCQUEwQjtRQUMxQixTQUFTLENBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUM7UUFFeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFMUIsV0FBVyxDQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLEVBQUUsUUFBUSxDQUFDLGFBQWMsQ0FBRSxDQUFDO1FBRTdGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFM0MsNEVBQTRFO1FBQzVFLHNHQUFzRztRQUN0RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDO1FBRWhFLGtDQUFrQztRQUNsQyxrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxXQUFXO2VBQ2pELE9BQU8sS0FBSyxDQUFDLGVBQWUsS0FBSyxXQUFXLEVBQUc7WUFFbEQsWUFBWSxDQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBRSxDQUFDO1NBQ3hFO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFFbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFFLENBQUM7WUFDckYsVUFBVSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUUsQ0FBQztRQUVKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBRSxDQUFDO1FBRTVCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUUsS0FBZTtRQUVyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxLQUFLLENBQUUsQ0FBQztJQUM3QixDQUFDO0lBR0QsU0FBUyxDQUFFLEtBQWU7UUFFeEIsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFdkMsSUFBSSxpQkFBeUMsQ0FBQztRQUU5QyxRQUFRLFVBQVUsRUFBRztZQUVuQixLQUFLLE1BQU07Z0JBQ1QsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkMsTUFBTTtZQUVSLEtBQUssTUFBTTtnQkFDVCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxNQUFNO1lBRVIsS0FBSyxNQUFNO2dCQUNULGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLE1BQU07WUFFUjtnQkFDRSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxNQUFNO1NBQ1Q7UUFFRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFFLENBQUM7UUFFMUIscUJBQXFCO1FBQ3JCLE9BQU8sRUFBRSxDQUFDO1FBRVYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsQ0FBQztRQUVuRSx3QkFBd0I7UUFDeEIsTUFBTSxDQUFDLFVBQVUsQ0FBRSxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFFLENBQUM7UUFDMUYsQ0FBQyxFQUFFLENBQUMsQ0FBRSxDQUFDO1FBRVAsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQkFBa0IsQ0FBRSxNQUFxQztRQUV2RCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCLENBQUUsVUFBaUM7UUFFbEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztJQUMzQyxDQUFDO0lBRU8sa0JBQWtCO1FBRXhCLHVDQUF1QztRQUN2QyxJQUFJLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixLQUFLLFdBQVcsRUFBRztZQUV2RCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUF3QixDQUFDO1NBQzdEO2FBQ0k7WUFFSCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7bUhBdk5VLHFCQUFxQjt1R0FBckIscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7OElBSUMsWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBSU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQUlOLDBCQUEwQjtzQkFEekIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixNQUFNO2dCQUlFLE9BQU87c0JBRGYsTUFBTTtnQkFJRSxNQUFNO3NCQURkLE1BQU07Z0JBSUUsUUFBUTtzQkFEaEIsTUFBTTtnQkFJRSxTQUFTO3NCQURqQixNQUFNO2dCQUlFLFNBQVM7c0JBRGpCLE1BQU07Z0JBSUUsV0FBVztzQkFEbkIsTUFBTTtnQkFJUCxTQUFTO3NCQURSLFdBQVc7dUJBQUUsZ0JBQWdCO2dCQWMxQixZQUFZO3NCQURmLEtBQUs7Z0JBZ0JGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkF3Qk4sV0FBVztzQkFEVixZQUFZO3VCQUFFLFdBQVcsRUFBRSxDQUFFLFFBQVEsQ0FBRTtnQkF1RHhDLFNBQVM7c0JBRFIsWUFBWTt1QkFBRSxTQUFTLEVBQUUsQ0FBRSxRQUFRLENBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQsIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uLCBEbmRFdmVudCwgc2V0RHJhZ0RhdGEsIHNldERyYWdJbWFnZSB9IGZyb20gXCIuL2RuZC11dGlsc1wiO1xuaW1wb3J0IHsgRG5kSGFuZGxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZG5kLWhhbmRsZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IGRuZFN0YXRlLCBlbmREcmFnLCBzdGFydERyYWcgfSBmcm9tIFwiLi9kbmQtc3RhdGVcIjtcbmltcG9ydCB7IEVmZmVjdEFsbG93ZWQgfSBmcm9tIFwiLi9kbmQtdHlwZXNcIjtcblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJhZ0ltYWdlUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmREcmFnSW1hZ2VSZWZEaXJlY3RpdmUge1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBEbmREcmFnZ2FibGVEaXJlY3RpdmUpKSBwYXJlbnQ6IERuZERyYWdnYWJsZURpcmVjdGl2ZSwgZWxlbWVudFJlZjpFbGVtZW50UmVmICkge1xuICAgIHBhcmVudC5yZWdpc3RlckRyYWdJbWFnZSggZWxlbWVudFJlZiApO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZERyYWdnYWJsZV1cIlxufSApXG5leHBvcnQgY2xhc3MgRG5kRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2FibGU6YW55O1xuXG4gIEBJbnB1dCgpXG4gIGRuZEVmZmVjdEFsbG93ZWQ6RWZmZWN0QWxsb3dlZCA9IFwiY29weVwiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZFR5cGU/OnN0cmluZztcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2luZ0NsYXNzID0gXCJkbmREcmFnZ2luZ1wiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnaW5nU291cmNlQ2xhc3MgPSBcImRuZERyYWdnaW5nU291cmNlXCI7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyA9IFwiZG5kRHJhZ2dhYmxlRGlzYWJsZWRcIjtcblxuICBASW5wdXQoKVxuICBkbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbjpEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiA9IGNhbGN1bGF0ZURyYWdJbWFnZU9mZnNldDtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kU3RhcnQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJhZzpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRFbmQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kTW92ZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kQ29waWVkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZExpbmtlZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRDYW5jZWxlZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZyggXCJhdHRyLmRyYWdnYWJsZVwiIClcbiAgZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICBwcml2YXRlIGRuZEhhbmRsZT86RG5kSGFuZGxlRGlyZWN0aXZlO1xuXG4gIHByaXZhdGUgZG5kRHJhZ0ltYWdlRWxlbWVudFJlZj86RWxlbWVudFJlZjtcblxuICBwcml2YXRlIGRyYWdJbWFnZTpFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaXNEcmFnU3RhcnRlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRXZlbnRIYW5kbGVyOiggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdm9pZCA9ICggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdGhpcy5vbkRyYWcoIGV2ZW50ICk7XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVJZiggdmFsdWU6Ym9vbGVhbiApIHtcblxuICAgIHRoaXMuZHJhZ2dhYmxlID0gIXZhbHVlO1xuXG4gICAgaWYoIHRoaXMuZHJhZ2dhYmxlICkge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVEcmFnSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG4gICAgdGhpcy5kbmREaXNhYmxlSWYgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGVsZW1lbnRSZWY6RWxlbWVudFJlZixcbiAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6UmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6Tmdab25lICkge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6dm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoICgpID0+IHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiZHJhZ1wiLCB0aGlzLmRyYWdFdmVudEhhbmRsZXIgKTtcbiAgICB9ICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOnZvaWQge1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwiZHJhZ1wiLCB0aGlzLmRyYWdFdmVudEhhbmRsZXIgKTtcbiAgICBpZih0aGlzLmlzRHJhZ1N0YXJ0ZWQgPT09IHRydWUpIHtcbiAgICAgIGVuZERyYWcoKVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoIFwiZHJhZ3N0YXJ0XCIsIFsgXCIkZXZlbnRcIiBdIClcbiAgb25EcmFnU3RhcnQoIGV2ZW50OkRuZEV2ZW50ICk6IGJvb2xlYW4ge1xuXG4gICAgaWYoIHRoaXMuZHJhZ2dhYmxlID09PSBmYWxzZSApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGRuZCBoYW5kbGUgYW5kIGlmIHRoZSBkbmQgaGFuZGxlIHdhcyB1c2VkIHRvIHN0YXJ0IHRoZSBkcmFnXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZEhhbmRsZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgJiYgdHlwZW9mIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgZ2xvYmFsIHN0YXRlXG4gICAgc3RhcnREcmFnKCBldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkLCB0aGlzLmRuZFR5cGUgKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IHRydWU7XG5cbiAgICBzZXREcmFnRGF0YSggZXZlbnQsIHtkYXRhOiB0aGlzLmRuZERyYWdnYWJsZSwgdHlwZTogdGhpcy5kbmRUeXBlfSwgZG5kU3RhdGUuZWZmZWN0QWxsb3dlZCEgKTtcblxuICAgIHRoaXMuZHJhZ0ltYWdlID0gdGhpcy5kZXRlcm1pbmVEcmFnSW1hZ2UoKTtcblxuICAgIC8vIHNldCBkcmFnZ2luZyBjc3MgY2xhc3MgcHJpb3IgdG8gc2V0RHJhZ0ltYWdlIHNvIHN0eWxlcyBhcmUgYXBwbGllZCBiZWZvcmVcbiAgICAvLyBUT0RPIGJyZWFraW5nIGNoYW5nZTogYWRkIGNsYXNzIHRvIGVsZW1lbnRSZWYgcmF0aGVyIHRoYW4gZHJhZyBpbWFnZSB3aGljaCBjb3VsZCBiZSBhbm90aGVyIGVsZW1lbnRcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzICk7XG5cbiAgICAvLyBzZXQgY3VzdG9tIGRyYWdpbWFnZSBpZiBwcmVzZW50XG4gICAgLy8gc2V0IGRyYWdpbWFnZSBpZiBkcmFnIGlzIHN0YXJ0ZWQgZnJvbSBkbmRIYW5kbGVcbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgfHwgdHlwZW9mIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgc2V0RHJhZ0ltYWdlKCBldmVudCwgdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb24gKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgZHJhZ2dpbmcgc291cmNlIGNzcyBjbGFzcyBvbiBmaXJzdCBkcmFnIGV2ZW50XG4gICAgY29uc3QgdW5yZWdpc3RlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgXCJkcmFnXCIsICgpID0+IHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dpbmdTb3VyY2VDbGFzcyApO1xuICAgICAgdW5yZWdpc3RlcigpO1xuICAgIH0gKTtcblxuICAgIHRoaXMuZG5kU3RhcnQuZW1pdCggZXZlbnQgKTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25EcmFnKCBldmVudDpEcmFnRXZlbnQgKSB7XG5cbiAgICB0aGlzLmRuZERyYWcuZW1pdCggZXZlbnQgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoIFwiZHJhZ2VuZFwiLCBbIFwiJGV2ZW50XCIgXSApXG4gIG9uRHJhZ0VuZCggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuXG4gICAgLy8gZ2V0IGRyb3AgZWZmZWN0IGZyb20gY3VzdG9tIHN0b3JlZCBzdGF0ZSBhcyBpdHMgbm90IHJlbGlhYmxlIGFjcm9zcyBicm93c2Vyc1xuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBkbmRTdGF0ZS5kcm9wRWZmZWN0O1xuXG4gICAgbGV0IGRyb3BFZmZlY3RFbWl0dGVyOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+O1xuXG4gICAgc3dpdGNoKCBkcm9wRWZmZWN0ICkge1xuXG4gICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kQ29waWVkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZExpbmtlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJtb3ZlXCI6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRNb3ZlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRDYW5jZWxlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZHJvcEVmZmVjdEVtaXR0ZXIuZW1pdCggZXZlbnQgKTtcbiAgICB0aGlzLmRuZEVuZC5lbWl0KCBldmVudCApO1xuXG4gICAgLy8gcmVzZXQgZ2xvYmFsIHN0YXRlXG4gICAgZW5kRHJhZygpO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzICk7XG5cbiAgICAvLyBJRTkgc3BlY2lhbCBoYW1tZXJpbmdcbiAgICB3aW5kb3cuc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dpbmdTb3VyY2VDbGFzcyApO1xuICAgIH0sIDAgKTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcmVnaXN0ZXJEcmFnSGFuZGxlKCBoYW5kbGU6RG5kSGFuZGxlRGlyZWN0aXZlIHwgdW5kZWZpbmVkICkge1xuXG4gICAgdGhpcy5kbmRIYW5kbGUgPSBoYW5kbGU7XG4gIH1cblxuICByZWdpc3RlckRyYWdJbWFnZSggZWxlbWVudFJlZjpFbGVtZW50UmVmIHwgdW5kZWZpbmVkICkge1xuXG4gICAgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lRHJhZ0ltYWdlKCk6RWxlbWVudCB7XG5cbiAgICAvLyBldmFsdWF0ZSBjdXN0b20gZHJhZyBpbWFnZSBleGlzdGVuY2VcbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgcmV0dXJuIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,277 @@
1
+ import { ContentChild, Directive, EventEmitter, HostListener, Input, Output } from "@angular/core";
2
+ import { getDirectChildElement, getDropData, shouldPositionPlaceholderBeforeElement } from "./dnd-utils";
3
+ import { getDndType, getDropEffect, isExternalDrag, setDropEffect } from "./dnd-state";
4
+ import * as i0 from "@angular/core";
5
+ export class DndPlaceholderRefDirective {
6
+ constructor(elementRef) {
7
+ this.elementRef = elementRef;
8
+ }
9
+ }
10
+ DndPlaceholderRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndPlaceholderRefDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
11
+ DndPlaceholderRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]", ngImport: i0 });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndPlaceholderRefDirective, decorators: [{
13
+ type: Directive,
14
+ args: [{
15
+ selector: "[dndPlaceholderRef]"
16
+ }]
17
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
18
+ export class DndDropzoneDirective {
19
+ constructor(ngZone, elementRef, renderer) {
20
+ this.ngZone = ngZone;
21
+ this.elementRef = elementRef;
22
+ this.renderer = renderer;
23
+ this.dndDropzone = "";
24
+ this.dndEffectAllowed = "uninitialized";
25
+ this.dndAllowExternal = false;
26
+ this.dndHorizontal = false;
27
+ this.dndDragoverClass = "dndDragover";
28
+ this.dndDropzoneDisabledClass = "dndDropzoneDisabled";
29
+ this.dndDragover = new EventEmitter();
30
+ this.dndDrop = new EventEmitter();
31
+ this.placeholder = null;
32
+ this.disabled = false;
33
+ this.dragEnterEventHandler = (event) => this.onDragEnter(event);
34
+ this.dragOverEventHandler = (event) => this.onDragOver(event);
35
+ this.dragLeaveEventHandler = (event) => this.onDragLeave(event);
36
+ }
37
+ set dndDisableIf(value) {
38
+ this.disabled = !!value;
39
+ if (this.disabled) {
40
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
41
+ }
42
+ else {
43
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
44
+ }
45
+ }
46
+ set dndDisableDropIf(value) {
47
+ this.dndDisableIf = value;
48
+ }
49
+ ngAfterViewInit() {
50
+ this.placeholder = this.tryGetPlaceholder();
51
+ this.removePlaceholderFromDOM();
52
+ this.ngZone.runOutsideAngular(() => {
53
+ this.elementRef.nativeElement.addEventListener("dragenter", this.dragEnterEventHandler);
54
+ this.elementRef.nativeElement.addEventListener("dragover", this.dragOverEventHandler);
55
+ this.elementRef.nativeElement.addEventListener("dragleave", this.dragLeaveEventHandler);
56
+ });
57
+ }
58
+ ngOnDestroy() {
59
+ this.elementRef.nativeElement.removeEventListener("dragenter", this.dragEnterEventHandler);
60
+ this.elementRef.nativeElement.removeEventListener("dragover", this.dragOverEventHandler);
61
+ this.elementRef.nativeElement.removeEventListener("dragleave", this.dragLeaveEventHandler);
62
+ }
63
+ onDragEnter(event) {
64
+ // check if another dropzone is activated
65
+ if (event._dndDropzoneActive === true) {
66
+ this.cleanupDragoverState();
67
+ return;
68
+ }
69
+ // set as active if the target element is inside this dropzone
70
+ if (typeof event._dndDropzoneActive === "undefined") {
71
+ const newTarget = document.elementFromPoint(event.clientX, event.clientY);
72
+ if (this.elementRef.nativeElement.contains(newTarget)) {
73
+ event._dndDropzoneActive = true;
74
+ }
75
+ }
76
+ // check if this drag event is allowed to drop on this dropzone
77
+ const type = getDndType(event);
78
+ if (this.isDropAllowed(type) === false) {
79
+ return;
80
+ }
81
+ // allow the dragenter
82
+ event.preventDefault();
83
+ }
84
+ onDragOver(event) {
85
+ // With nested dropzones, we want to ignore this event if a child dropzone
86
+ // has already handled a dragover. Historically, event.stopPropagation() was
87
+ // used to prevent this bubbling, but that prevents any dragovers outside the
88
+ // ngx-drag-drop component, and stops other use cases such as scrolling on drag.
89
+ // Instead, we can check if the event was already prevented by a child and bail early.
90
+ if (event.defaultPrevented) {
91
+ return;
92
+ }
93
+ // check if this drag event is allowed to drop on this dropzone
94
+ const type = getDndType(event);
95
+ if (this.isDropAllowed(type) === false) {
96
+ return;
97
+ }
98
+ this.checkAndUpdatePlaceholderPosition(event);
99
+ const dropEffect = getDropEffect(event, this.dndEffectAllowed);
100
+ if (dropEffect === "none") {
101
+ this.cleanupDragoverState();
102
+ return;
103
+ }
104
+ // allow the dragover
105
+ event.preventDefault();
106
+ // set the drop effect
107
+ setDropEffect(event, dropEffect);
108
+ this.dndDragover.emit(event);
109
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDragoverClass);
110
+ }
111
+ onDrop(event) {
112
+ try {
113
+ // check if this drag event is allowed to drop on this dropzone
114
+ const type = getDndType(event);
115
+ if (this.isDropAllowed(type) === false) {
116
+ return;
117
+ }
118
+ const data = getDropData(event, isExternalDrag());
119
+ if (this.isDropAllowed(data.type) === false) {
120
+ return;
121
+ }
122
+ // signal custom drop handling
123
+ event.preventDefault();
124
+ const dropEffect = getDropEffect(event);
125
+ setDropEffect(event, dropEffect);
126
+ if (dropEffect === "none") {
127
+ return;
128
+ }
129
+ const dropIndex = this.getPlaceholderIndex();
130
+ // if for whatever reason the placeholder is not present in the DOM but it should be there
131
+ // we don't allow/emit the drop event since it breaks the contract
132
+ // seems to only happen if drag and drop is executed faster than the DOM updates
133
+ if (dropIndex === -1) {
134
+ return;
135
+ }
136
+ this.dndDrop.emit({
137
+ event: event,
138
+ dropEffect: dropEffect,
139
+ isExternal: isExternalDrag(),
140
+ data: data.data,
141
+ index: dropIndex,
142
+ type: type,
143
+ });
144
+ event.stopPropagation();
145
+ }
146
+ finally {
147
+ this.cleanupDragoverState();
148
+ }
149
+ }
150
+ onDragLeave(event) {
151
+ // check if still inside this dropzone and not yet handled by another dropzone
152
+ if (typeof event._dndDropzoneActive === "undefined") {
153
+ const newTarget = document.elementFromPoint(event.clientX, event.clientY);
154
+ if (this.elementRef.nativeElement.contains(newTarget)) {
155
+ event._dndDropzoneActive = true;
156
+ return;
157
+ }
158
+ }
159
+ this.cleanupDragoverState();
160
+ // cleanup drop effect when leaving dropzone
161
+ setDropEffect(event, "none");
162
+ }
163
+ isDropAllowed(type) {
164
+ // dropzone is disabled -> deny it
165
+ if (this.disabled === true) {
166
+ return false;
167
+ }
168
+ // if drag did not start from our directive
169
+ // and external drag sources are not allowed -> deny it
170
+ if (isExternalDrag() === true
171
+ && this.dndAllowExternal === false) {
172
+ return false;
173
+ }
174
+ // no filtering by types -> allow it
175
+ if (!this.dndDropzone) {
176
+ return true;
177
+ }
178
+ // no type set -> allow it
179
+ if (!type) {
180
+ return true;
181
+ }
182
+ if (Array.isArray(this.dndDropzone) === false) {
183
+ throw new Error("dndDropzone: bound value to [dndDropzone] must be an array!");
184
+ }
185
+ // if dropzone contains type -> allow it
186
+ return this.dndDropzone.indexOf(type) !== -1;
187
+ }
188
+ tryGetPlaceholder() {
189
+ if (typeof this.dndPlaceholderRef !== "undefined") {
190
+ return this.dndPlaceholderRef.elementRef.nativeElement;
191
+ }
192
+ // TODO nasty workaround needed because if ng-container / template is used @ContentChild() or DI will fail because
193
+ // of wrong context see angular bug https://github.com/angular/angular/issues/13517
194
+ return this.elementRef.nativeElement.querySelector("[dndPlaceholderRef]");
195
+ }
196
+ removePlaceholderFromDOM() {
197
+ if (this.placeholder !== null
198
+ && this.placeholder.parentNode !== null) {
199
+ this.placeholder.parentNode.removeChild(this.placeholder);
200
+ }
201
+ }
202
+ checkAndUpdatePlaceholderPosition(event) {
203
+ if (this.placeholder === null) {
204
+ return;
205
+ }
206
+ // make sure the placeholder is in the DOM
207
+ if (this.placeholder.parentNode !== this.elementRef.nativeElement) {
208
+ this.renderer.appendChild(this.elementRef.nativeElement, this.placeholder);
209
+ }
210
+ // update the position if the event originates from a child element of the dropzone
211
+ const directChild = getDirectChildElement(this.elementRef.nativeElement, event.target);
212
+ // early exit if no direct child or direct child is placeholder
213
+ if (directChild === null
214
+ || directChild === this.placeholder) {
215
+ return;
216
+ }
217
+ const positionPlaceholderBeforeDirectChild = shouldPositionPlaceholderBeforeElement(event, directChild, this.dndHorizontal);
218
+ if (positionPlaceholderBeforeDirectChild) {
219
+ // do insert before only if necessary
220
+ if (directChild.previousSibling !== this.placeholder) {
221
+ this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild);
222
+ }
223
+ }
224
+ else {
225
+ // do insert after only if necessary
226
+ if (directChild.nextSibling !== this.placeholder) {
227
+ this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild.nextSibling);
228
+ }
229
+ }
230
+ }
231
+ getPlaceholderIndex() {
232
+ if (this.placeholder === null) {
233
+ return undefined;
234
+ }
235
+ const element = this.elementRef.nativeElement;
236
+ return Array.prototype.indexOf.call(element.children, this.placeholder);
237
+ }
238
+ cleanupDragoverState() {
239
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDragoverClass);
240
+ this.removePlaceholderFromDOM();
241
+ }
242
+ }
243
+ DndDropzoneDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDropzoneDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
244
+ DndDropzoneDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndDropzoneDirective, selector: "[dndDropzone]", inputs: { dndDropzone: "dndDropzone", dndEffectAllowed: "dndEffectAllowed", dndAllowExternal: "dndAllowExternal", dndHorizontal: "dndHorizontal", dndDragoverClass: "dndDragoverClass", dndDropzoneDisabledClass: "dndDropzoneDisabledClass", dndDisableIf: "dndDisableIf", dndDisableDropIf: "dndDisableDropIf" }, outputs: { dndDragover: "dndDragover", dndDrop: "dndDrop" }, host: { listeners: { "drop": "onDrop($event)" } }, queries: [{ propertyName: "dndPlaceholderRef", first: true, predicate: DndPlaceholderRefDirective, descendants: true }], ngImport: i0 });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDropzoneDirective, decorators: [{
246
+ type: Directive,
247
+ args: [{
248
+ selector: "[dndDropzone]"
249
+ }]
250
+ }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { dndDropzone: [{
251
+ type: Input
252
+ }], dndEffectAllowed: [{
253
+ type: Input
254
+ }], dndAllowExternal: [{
255
+ type: Input
256
+ }], dndHorizontal: [{
257
+ type: Input
258
+ }], dndDragoverClass: [{
259
+ type: Input
260
+ }], dndDropzoneDisabledClass: [{
261
+ type: Input
262
+ }], dndDragover: [{
263
+ type: Output
264
+ }], dndDrop: [{
265
+ type: Output
266
+ }], dndPlaceholderRef: [{
267
+ type: ContentChild,
268
+ args: [DndPlaceholderRefDirective]
269
+ }], dndDisableIf: [{
270
+ type: Input
271
+ }], dndDisableDropIf: [{
272
+ type: Input
273
+ }], onDrop: [{
274
+ type: HostListener,
275
+ args: ["drop", ["$event"]]
276
+ }] } });
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyb3B6b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RuZC9zcmMvbGliL2RuZC1kcm9wem9uZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLHNDQUFzQyxFQUN2QyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQWV2RixNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFlBQTZCLFVBQXFCO1FBQXJCLGVBQVUsR0FBVixVQUFVLENBQVc7SUFDbEQsQ0FBQzs7d0hBSFUsMEJBQTBCOzRHQUExQiwwQkFBMEI7NEZBQTFCLDBCQUEwQjtrQkFIdEMsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUscUJBQXFCO2lCQUNoQzs7QUFVRCxNQUFNLE9BQU8sb0JBQW9CO0lBeUQvQixZQUFxQixNQUFhLEVBQ2IsVUFBcUIsRUFDckIsUUFBa0I7UUFGbEIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXhEdkMsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBR2hDLHFCQUFnQixHQUFpQixlQUFlLENBQUM7UUFHakQscUJBQWdCLEdBQVcsS0FBSyxDQUFDO1FBR2pDLGtCQUFhLEdBQVcsS0FBSyxDQUFDO1FBRzlCLHFCQUFnQixHQUFVLGFBQWEsQ0FBQztRQUd4Qyw2QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQztRQUd4QyxnQkFBVyxHQUEyQixJQUFJLFlBQVksRUFB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Q2xDLENBQUM7O2tIQTNWVSxvQkFBb0I7c0dBQXBCLG9CQUFvQix3Z0JBMEJoQiwwQkFBMEI7NEZBMUI5QixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGVBQWU7aUJBQzFCOzhJQUlDLFdBQVc7c0JBRFYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLE1BQU07Z0JBSUUsT0FBTztzQkFEZixNQUFNO2dCQUlVLGlCQUFpQjtzQkFEakMsWUFBWTt1QkFBRSwwQkFBMEI7Z0JBWXJDLFlBQVk7c0JBRGYsS0FBSztnQkFnQkYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQW9HTixNQUFNO3NCQURMLFlBQVk7dUJBQUUsTUFBTSxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29udGVudENoaWxkLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEbmRFdmVudCxcbiAgRHJhZ0Ryb3BEYXRhLFxuICBnZXREaXJlY3RDaGlsZEVsZW1lbnQsXG4gIGdldERyb3BEYXRhLFxuICBzaG91bGRQb3NpdGlvblBsYWNlaG9sZGVyQmVmb3JlRWxlbWVudFxufSBmcm9tIFwiLi9kbmQtdXRpbHNcIjtcbmltcG9ydCB7IGdldERuZFR5cGUsIGdldERyb3BFZmZlY3QsIGlzRXh0ZXJuYWxEcmFnLCBzZXREcm9wRWZmZWN0IH0gZnJvbSBcIi4vZG5kLXN0YXRlXCI7XG5pbXBvcnQgeyBEcm9wRWZmZWN0LCBFZmZlY3RBbGxvd2VkIH0gZnJvbSBcIi4vZG5kLXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG5kRHJvcEV2ZW50IHtcbiAgZXZlbnQ6RHJhZ0V2ZW50O1xuICBkcm9wRWZmZWN0OkRyb3BFZmZlY3Q7XG4gIGlzRXh0ZXJuYWw6Ym9vbGVhbjtcbiAgZGF0YT86YW55O1xuICBpbmRleD86bnVtYmVyO1xuICB0eXBlPzphbnk7XG59XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZFBsYWNlaG9sZGVyUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZSB7XG5cbiAgY29uc3RydWN0b3IoIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOkVsZW1lbnRSZWYgKSB7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJvcHpvbmVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZERyb3B6b25lRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZT86c3RyaW5nW10gfCBcIlwiID0gXCJcIjtcblxuICBASW5wdXQoKVxuICBkbmRFZmZlY3RBbGxvd2VkOkVmZmVjdEFsbG93ZWQgPSBcInVuaW5pdGlhbGl6ZWRcIjtcblxuICBASW5wdXQoKVxuICBkbmRBbGxvd0V4dGVybmFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmRIb3Jpem9udGFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmREcmFnb3ZlckNsYXNzOnN0cmluZyA9IFwiZG5kRHJhZ292ZXJcIjtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZURpc2FibGVkQ2xhc3MgPSBcImRuZERyb3B6b25lRGlzYWJsZWRcIjtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJhZ292ZXI6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJvcDpFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PigpO1xuXG4gIEBDb250ZW50Q2hpbGQoIERuZFBsYWNlaG9sZGVyUmVmRGlyZWN0aXZlIClcbiAgcHJpdmF0ZSByZWFkb25seSBkbmRQbGFjZWhvbGRlclJlZj86RG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBwbGFjZWhvbGRlcjpFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkaXNhYmxlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRW50ZXJFdmVudEhhbmRsZXI6KCBldmVudDpEcmFnRXZlbnQgKSA9PiB2b2lkID0gKCBldmVudDpEcmFnRXZlbnQgKSA9PiB0aGlzLm9uRHJhZ0VudGVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdPdmVyRXZlbnRIYW5kbGVyOiggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdm9pZCA9ICggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdGhpcy5vbkRyYWdPdmVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdMZWF2ZUV2ZW50SGFuZGxlcjooIGV2ZW50OkRyYWdFdmVudCApID0+IHZvaWQgPSAoIGV2ZW50OkRyYWdFdmVudCApID0+IHRoaXMub25EcmFnTGVhdmUoIGV2ZW50ICk7XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVJZiggdmFsdWU6Ym9vbGVhbiApIHtcblxuICAgIHRoaXMuZGlzYWJsZWQgPSAhIXZhbHVlO1xuXG4gICAgaWYoIHRoaXMuZGlzYWJsZWQgKSB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyb3B6b25lRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJvcHpvbmVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVEcm9wSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG4gICAgdGhpcy5kbmREaXNhYmxlSWYgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIG5nWm9uZTpOZ1pvbmUsXG4gICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6RWxlbWVudFJlZixcbiAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6UmVuZGVyZXIyICkge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6dm9pZCB7XG5cbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy50cnlHZXRQbGFjZWhvbGRlcigpO1xuXG4gICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCAoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdlbnRlclwiLCB0aGlzLmRyYWdFbnRlckV2ZW50SGFuZGxlciApO1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJkcmFnb3ZlclwiLCB0aGlzLmRyYWdPdmVyRXZlbnRIYW5kbGVyICk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdsZWF2ZVwiLCB0aGlzLmRyYWdMZWF2ZUV2ZW50SGFuZGxlciApO1xuICAgIH0gKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6dm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJkcmFnZW50ZXJcIiwgdGhpcy5kcmFnRW50ZXJFdmVudEhhbmRsZXIgKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdvdmVyXCIsIHRoaXMuZHJhZ092ZXJFdmVudEhhbmRsZXIgKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdsZWF2ZVwiLCB0aGlzLmRyYWdMZWF2ZUV2ZW50SGFuZGxlciApO1xuICB9XG5cbiAgb25EcmFnRW50ZXIoIGV2ZW50OkRuZEV2ZW50ICkge1xuXG4gICAgLy8gY2hlY2sgaWYgYW5vdGhlciBkcm9wem9uZSBpcyBhY3RpdmF0ZWRcbiAgICBpZiggZXZlbnQuX2RuZERyb3B6b25lQWN0aXZlID09PSB0cnVlICkge1xuXG4gICAgICB0aGlzLmNsZWFudXBEcmFnb3ZlclN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IGFzIGFjdGl2ZSBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgaW5zaWRlIHRoaXMgZHJvcHpvbmVcbiAgICBpZiggdHlwZW9mIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApO1xuXG4gICAgICBpZiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoIG5ld1RhcmdldCApICkge1xuXG4gICAgICAgIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBkcmFnIGV2ZW50IGlzIGFsbG93ZWQgdG8gZHJvcCBvbiB0aGlzIGRyb3B6b25lXG4gICAgY29uc3QgdHlwZSA9IGdldERuZFR5cGUoIGV2ZW50ICk7XG4gICAgaWYoIHRoaXMuaXNEcm9wQWxsb3dlZCggdHlwZSApID09PSBmYWxzZSApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFsbG93IHRoZSBkcmFnZW50ZXJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25EcmFnT3ZlciggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuICAgIC8vIFdpdGggbmVzdGVkIGRyb3B6b25lcywgd2Ugd2FudCB0byBpZ25vcmUgdGhpcyBldmVudCBpZiBhIGNoaWxkIGRyb3B6b25lXG4gICAgLy8gaGFzIGFscmVhZHkgaGFuZGxlZCBhIGRyYWdvdmVyLiAgSGlzdG9yaWNhbGx5LCBldmVudC5zdG9wUHJvcGFnYXRpb24oKSB3YXNcbiAgICAvLyB1c2VkIHRvIHByZXZlbnQgdGhpcyBidWJibGluZywgYnV0IHRoYXQgcHJldmVudHMgYW55IGRyYWdvdmVycyBvdXRzaWRlIHRoZVxuICAgIC8vIG5neC1kcmFnLWRyb3AgY29tcG9uZW50LCBhbmQgc3RvcHMgb3RoZXIgdXNlIGNhc2VzIHN1Y2ggYXMgc2Nyb2xsaW5nIG9uIGRyYWcuXG4gICAgLy8gSW5zdGVhZCwgd2UgY2FuIGNoZWNrIGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBwcmV2ZW50ZWQgYnkgYSBjaGlsZCBhbmQgYmFpbCBlYXJseS5cbiAgICBpZiggZXZlbnQuZGVmYXVsdFByZXZlbnRlZCApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoaXMgZHJhZyBldmVudCBpcyBhbGxvd2VkIHRvIGRyb3Agb24gdGhpcyBkcm9wem9uZVxuICAgIGNvbnN0IHR5cGUgPSBnZXREbmRUeXBlKCBldmVudCApO1xuICAgIGlmKCB0aGlzLmlzRHJvcEFsbG93ZWQoIHR5cGUgKSA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlUGxhY2Vob2xkZXJQb3NpdGlvbiggZXZlbnQgKTtcblxuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBnZXREcm9wRWZmZWN0KCBldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkICk7XG5cbiAgICBpZiggZHJvcEVmZmVjdCA9PT0gXCJub25lXCIgKSB7XG5cbiAgICAgIHRoaXMuY2xlYW51cERyYWdvdmVyU3RhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyB0aGUgZHJhZ292ZXJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gc2V0IHRoZSBkcm9wIGVmZmVjdFxuICAgIHNldERyb3BFZmZlY3QoIGV2ZW50LCBkcm9wRWZmZWN0ICk7XG5cbiAgICB0aGlzLmRuZERyYWdvdmVyLmVtaXQoIGV2ZW50ICk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnb3ZlckNsYXNzICk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyb3BcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyb3AoIGV2ZW50OkRyYWdFdmVudCApIHtcblxuICAgIHRyeSB7XG5cbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZHJhZyBldmVudCBpcyBhbGxvd2VkIHRvIGRyb3Agb24gdGhpcyBkcm9wem9uZVxuICAgICAgY29uc3QgdHlwZSA9IGdldERuZFR5cGUoIGV2ZW50ICk7XG4gICAgICBpZiggdGhpcy5pc0Ryb3BBbGxvd2VkKCB0eXBlICkgPT09IGZhbHNlICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTpEcmFnRHJvcERhdGEgPSBnZXREcm9wRGF0YSggZXZlbnQsIGlzRXh0ZXJuYWxEcmFnKCkgKTtcblxuICAgICAgaWYoIHRoaXMuaXNEcm9wQWxsb3dlZCggZGF0YS50eXBlICkgPT09IGZhbHNlICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gc2lnbmFsIGN1c3RvbSBkcm9wIGhhbmRsaW5nXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBkcm9wRWZmZWN0ID0gZ2V0RHJvcEVmZmVjdCggZXZlbnQgKTtcblxuICAgICAgc2V0RHJvcEVmZmVjdCggZXZlbnQsIGRyb3BFZmZlY3QgKTtcblxuICAgICAgaWYoIGRyb3BFZmZlY3QgPT09IFwibm9uZVwiICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJvcEluZGV4ID0gdGhpcy5nZXRQbGFjZWhvbGRlckluZGV4KCk7XG5cbiAgICAgIC8vIGlmIGZvciB3aGF0ZXZlciByZWFzb24gdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBwcmVzZW50IGluIHRoZSBET00gYnV0IGl0IHNob3VsZCBiZSB0aGVyZVxuICAgICAgLy8gd2UgZG9uJ3QgYWxsb3cvZW1pdCB0aGUgZHJvcCBldmVudCBzaW5jZSBpdCBicmVha3MgdGhlIGNvbnRyYWN0XG4gICAgICAvLyBzZWVtcyB0byBvbmx5IGhhcHBlbiBpZiBkcmFnIGFuZCBkcm9wIGlzIGV4ZWN1dGVkIGZhc3RlciB0aGFuIHRoZSBET00gdXBkYXRlc1xuICAgICAgaWYoIGRyb3BJbmRleCA9PT0gLTEgKSB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRuZERyb3AuZW1pdCgge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGRyb3BFZmZlY3Q6IGRyb3BFZmZlY3QsXG4gICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWxEcmFnKCksXG4gICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgaW5kZXg6IGRyb3BJbmRleCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgIH0gKTtcblxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB9XG4gICAgZmluYWxseSB7XG5cbiAgICAgIHRoaXMuY2xlYW51cERyYWdvdmVyU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBvbkRyYWdMZWF2ZSggZXZlbnQ6RG5kRXZlbnQgKSB7XG5cbiAgICAvLyBjaGVjayBpZiBzdGlsbCBpbnNpZGUgdGhpcyBkcm9wem9uZSBhbmQgbm90IHlldCBoYW5kbGVkIGJ5IGFub3RoZXIgZHJvcHpvbmVcbiAgICBpZiggdHlwZW9mIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApO1xuXG4gICAgICBpZiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoIG5ld1RhcmdldCApICkge1xuXG4gICAgICAgIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNsZWFudXBEcmFnb3ZlclN0YXRlKCk7XG5cbiAgICAvLyBjbGVhbnVwIGRyb3AgZWZmZWN0IHdoZW4gbGVhdmluZyBkcm9wem9uZVxuICAgIHNldERyb3BFZmZlY3QoIGV2ZW50LCBcIm5vbmVcIiApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Ryb3BBbGxvd2VkKCB0eXBlPzpzdHJpbmcgKTpib29sZWFuIHtcblxuICAgIC8vIGRyb3B6b25lIGlzIGRpc2FibGVkIC0+IGRlbnkgaXRcbiAgICBpZiggdGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIGRyYWcgZGlkIG5vdCBzdGFydCBmcm9tIG91ciBkaXJlY3RpdmVcbiAgICAvLyBhbmQgZXh0ZXJuYWwgZHJhZyBzb3VyY2VzIGFyZSBub3QgYWxsb3dlZCAtPiBkZW55IGl0XG4gICAgaWYoIGlzRXh0ZXJuYWxEcmFnKCkgPT09IHRydWVcbiAgICAgICYmIHRoaXMuZG5kQWxsb3dFeHRlcm5hbCA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBubyBmaWx0ZXJpbmcgYnkgdHlwZXMgLT4gYWxsb3cgaXRcbiAgICBpZiggIXRoaXMuZG5kRHJvcHpvbmUgKSB7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIG5vIHR5cGUgc2V0IC0+IGFsbG93IGl0XG4gICAgaWYoICF0eXBlICkge1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiggQXJyYXkuaXNBcnJheSggdGhpcy5kbmREcm9wem9uZSApID09PSBmYWxzZSApIHtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCBcImRuZERyb3B6b25lOiBib3VuZCB2YWx1ZSB0byBbZG5kRHJvcHpvbmVdIG11c3QgYmUgYW4gYXJyYXkhXCIgKTtcbiAgICB9XG5cbiAgICAvLyBpZiBkcm9wem9uZSBjb250YWlucyB0eXBlIC0+IGFsbG93IGl0XG4gICAgcmV0dXJuIHRoaXMuZG5kRHJvcHpvbmUuaW5kZXhPZiggdHlwZSApICE9PSAtMTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5R2V0UGxhY2Vob2xkZXIoKTpFbGVtZW50IHwgbnVsbCB7XG5cbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kUGxhY2Vob2xkZXJSZWYgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmRuZFBsYWNlaG9sZGVyUmVmLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFRPRE8gbmFzdHkgd29ya2Fyb3VuZCBuZWVkZWQgYmVjYXVzZSBpZiBuZy1jb250YWluZXIgLyB0ZW1wbGF0ZSBpcyB1c2VkIEBDb250ZW50Q2hpbGQoKSBvciBESSB3aWxsIGZhaWwgYmVjYXVzZVxuICAgIC8vIG9mIHdyb25nIGNvbnRleHQgc2VlIGFuZ3VsYXIgYnVnIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNTE3XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIFwiW2RuZFBsYWNlaG9sZGVyUmVmXVwiICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsYWNlaG9sZGVyRnJvbURPTSgpIHtcblxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyICE9PSBudWxsXG4gICAgICAmJiB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUgIT09IG51bGwgKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMucGxhY2Vob2xkZXIgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQW5kVXBkYXRlUGxhY2Vob2xkZXJQb3NpdGlvbiggZXZlbnQ6RHJhZ0V2ZW50ICk6dm9pZCB7XG5cbiAgICBpZiggdGhpcy5wbGFjZWhvbGRlciA9PT0gbnVsbCApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGxhY2Vob2xkZXIgaXMgaW4gdGhlIERPTVxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUgIT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ICkge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5wbGFjZWhvbGRlciApO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0aGUgcG9zaXRpb24gaWYgdGhlIGV2ZW50IG9yaWdpbmF0ZXMgZnJvbSBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRyb3B6b25lXG4gICAgY29uc3QgZGlyZWN0Q2hpbGQgPSBnZXREaXJlY3RDaGlsZEVsZW1lbnQoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBldmVudC50YXJnZXQgYXMgRWxlbWVudCApO1xuXG4gICAgLy8gZWFybHkgZXhpdCBpZiBubyBkaXJlY3QgY2hpbGQgb3IgZGlyZWN0IGNoaWxkIGlzIHBsYWNlaG9sZGVyXG4gICAgaWYoIGRpcmVjdENoaWxkID09PSBudWxsXG4gICAgICB8fCBkaXJlY3RDaGlsZCA9PT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVEaXJlY3RDaGlsZCA9IHNob3VsZFBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVFbGVtZW50KCBldmVudCwgZGlyZWN0Q2hpbGQsIHRoaXMuZG5kSG9yaXpvbnRhbCApO1xuXG4gICAgaWYoIHBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVEaXJlY3RDaGlsZCApIHtcblxuICAgICAgLy8gZG8gaW5zZXJ0IGJlZm9yZSBvbmx5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYoIGRpcmVjdENoaWxkLnByZXZpb3VzU2libGluZyAhPT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGxhY2Vob2xkZXIsIGRpcmVjdENoaWxkICk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICAvLyBkbyBpbnNlcnQgYWZ0ZXIgb25seSBpZiBuZWNlc3NhcnlcbiAgICAgIGlmKCBkaXJlY3RDaGlsZC5uZXh0U2libGluZyAhPT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGxhY2Vob2xkZXIsIGRpcmVjdENoaWxkLm5leHRTaWJsaW5nICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbGFjZWhvbGRlckluZGV4KCk6bnVtYmVyIHwgdW5kZWZpbmVkIHtcblxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyID09PSBudWxsICkge1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKCBlbGVtZW50LmNoaWxkcmVuLCB0aGlzLnBsYWNlaG9sZGVyICk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBEcmFnb3ZlclN0YXRlKCkge1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ292ZXJDbGFzcyApO1xuXG4gICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import { Directive, HostBinding, HostListener } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./dnd-draggable.directive";
4
+ export class DndHandleDirective {
5
+ constructor(parent) {
6
+ this.draggable = true;
7
+ parent.registerDragHandle(this);
8
+ }
9
+ onDragEvent(event) {
10
+ event._dndUsingHandle = true;
11
+ }
12
+ }
13
+ DndHandleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndHandleDirective, deps: [{ token: i1.DndDraggableDirective }], target: i0.ɵɵFactoryTarget.Directive });
14
+ DndHandleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndHandleDirective, selector: "[dndHandle]", host: { listeners: { "dragstart": "onDragEvent($event)", "dragend": "onDragEvent($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndHandleDirective, decorators: [{
16
+ type: Directive,
17
+ args: [{
18
+ selector: "[dndHandle]"
19
+ }]
20
+ }], ctorParameters: function () { return [{ type: i1.DndDraggableDirective }]; }, propDecorators: { draggable: [{
21
+ type: HostBinding,
22
+ args: ["attr.draggable"]
23
+ }], onDragEvent: [{
24
+ type: HostListener,
25
+ args: ["dragstart", ["$event"]]
26
+ }, {
27
+ type: HostListener,
28
+ args: ["dragend", ["$event"]]
29
+ }] } });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWhhbmRsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtaGFuZGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9yRSxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCLFlBQWEsTUFBNEI7UUFGekMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUlmLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUNwQyxDQUFDO0lBSUQsV0FBVyxDQUFFLEtBQWM7UUFFekIsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQzs7Z0hBZlUsa0JBQWtCO29HQUFsQixrQkFBa0I7NEZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUsYUFBYTtpQkFDeEI7NEdBSUMsU0FBUztzQkFEUixXQUFXO3VCQUFFLGdCQUFnQjtnQkFVOUIsV0FBVztzQkFGVixZQUFZO3VCQUFFLFdBQVcsRUFBRSxDQUFFLFFBQVEsQ0FBRTs7c0JBQ3ZDLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERuZEV2ZW50IH0gZnJvbSBcIi4vZG5kLXV0aWxzXCI7XG5pbXBvcnQgeyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZVwiO1xuXG5ARGlyZWN0aXZlKCB7XG4gIHNlbGVjdG9yOiBcIltkbmRIYW5kbGVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZEhhbmRsZURpcmVjdGl2ZSB7XG5cbiAgQEhvc3RCaW5kaW5nKCBcImF0dHIuZHJhZ2dhYmxlXCIgKVxuICBkcmFnZ2FibGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCBwYXJlbnQ6RG5kRHJhZ2dhYmxlRGlyZWN0aXZlICkge1xuXG4gICAgcGFyZW50LnJlZ2lzdGVyRHJhZ0hhbmRsZSggdGhpcyApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggXCJkcmFnc3RhcnRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBASG9zdExpc3RlbmVyKCBcImRyYWdlbmRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdFdmVudCggZXZlbnQ6RG5kRXZlbnQgKSB7XG5cbiAgICBldmVudC5fZG5kVXNpbmdIYW5kbGUgPSB0cnVlO1xuICB9XG59XG4iXX0=