ngx-drag-drop 15.0.0 → 15.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -109
- package/esm2020/lib/dnd-draggable.directive.mjs +47 -47
- package/esm2020/lib/dnd-dropzone.directive.mjs +47 -48
- package/esm2020/lib/dnd-handle.directive.mjs +16 -15
- package/esm2020/lib/dnd-state.mjs +15 -14
- package/esm2020/lib/dnd-types.mjs +1 -1
- package/esm2020/lib/dnd-utils.mjs +16 -18
- package/esm2020/lib/dnd.module.mjs +14 -16
- package/esm2020/public-api.mjs +6 -6
- package/fesm2015/ngx-drag-drop.mjs +136 -142
- package/fesm2015/ngx-drag-drop.mjs.map +1 -1
- package/fesm2020/ngx-drag-drop.mjs +136 -140
- package/fesm2020/ngx-drag-drop.mjs.map +1 -1
- package/lib/dnd-draggable.directive.d.ts +12 -11
- package/lib/dnd-dropzone.directive.d.ts +12 -11
- package/lib/dnd-handle.directive.d.ts +6 -4
- package/lib/dnd-state.d.ts +1 -1
- package/lib/dnd-types.d.ts +2 -2
- package/lib/dnd-utils.d.ts +1 -1
- package/package.json +7 -1
- package/public-api.d.ts +6 -6
package/README.md
CHANGED
|
@@ -6,128 +6,134 @@
|
|
|
6
6
|
|
|
7
7
|
# NgxDragDrop
|
|
8
8
|
|
|
9
|
-
[_Demo_](https://reppners.github.io/ngx-drag-drop/) / [_StackBlitz Issue
|
|
9
|
+
[_Demo_](https://reppners.github.io/ngx-drag-drop/) / [_StackBlitz Issue
|
|
10
|
+
Template_](https://stackblitz.com/edit/ngx-drag-drop-issue-template)
|
|
10
11
|
|
|
11
12
|
`npm install ngx-drag-drop --save`
|
|
12
13
|
|
|
13
14
|
**Angular directives for declarative drag and drop using the HTML5 Drag-And-Drop API**
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
- sortable lists by using placeholder element (vertical and horizontal)
|
|
17
|
+
- nestable
|
|
18
|
+
- dropzones optionally support external/native draggables (img, txt, file)
|
|
19
|
+
- conditional drag/drop
|
|
20
|
+
- typed drag/drop
|
|
21
|
+
- utilize [EffectAllowed](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/effectAllowed)
|
|
22
|
+
- custom CSS classes
|
|
23
|
+
- touch support by using a [polyfill](#touch-support)
|
|
24
|
+
- [AOT](https://angular.io/guide/aot-compiler) compatible
|
|
24
25
|
|
|
25
26
|
Port of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists) but without the lists :wink:
|
|
26
27
|
|
|
27
28
|
This has `dropzones` though :+1:
|
|
28
29
|
The idea is that the directive does not handle lists internally so the `dndDropzone` can be general purpose.
|
|
29
30
|
|
|
30
|
-
|
|
31
31
|
## Usage
|
|
32
32
|
|
|
33
33
|
`app.component.html`
|
|
34
|
+
|
|
34
35
|
```HTML
|
|
35
36
|
<!--a draggable element-->
|
|
36
|
-
<div
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
37
|
+
<div
|
|
38
|
+
[dndDraggable]="draggable.data"
|
|
39
|
+
[dndEffectAllowed]="draggable.effectAllowed"
|
|
40
|
+
[dndDisableIf]="draggable.disable"
|
|
41
|
+
(dndStart)="onDragStart($event)"
|
|
42
|
+
(dndCopied)="onDraggableCopied($event)"
|
|
43
|
+
(dndLinked)="onDraggableLinked($event)"
|
|
44
|
+
(dndMoved)="onDraggableMoved($event)"
|
|
45
|
+
(dndCanceled)="onDragCanceled($event)"
|
|
46
|
+
(dndEnd)="onDragEnd($event)">
|
|
47
|
+
|
|
48
|
+
<!--if [dndHandle] is used inside dndDraggable drag can only start from the handle-->
|
|
49
|
+
<div
|
|
50
|
+
*ngIf="draggable.handle"
|
|
51
|
+
dndHandle>HANDLE
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
draggable ({{draggable.effectAllowed}}) <span [hidden]="!draggable.disable">DISABLED</span>
|
|
55
|
+
|
|
56
|
+
<!--optionally select a child element as drag image-->
|
|
57
|
+
<div dndDragImageRef>DRAG_IMAGE</div>
|
|
58
|
+
|
|
56
59
|
</div>
|
|
57
60
|
|
|
58
61
|
<!--a dropzone-->
|
|
59
62
|
<!--to allow dropping content that is not [dndDraggable] set dndAllowExternal to true-->
|
|
60
|
-
<section
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
<section
|
|
64
|
+
dndDropzone
|
|
65
|
+
(dndDragover)="onDragover($event)"
|
|
66
|
+
(dndDrop)="onDrop($event)">
|
|
67
|
+
|
|
68
|
+
dropzone
|
|
69
|
+
|
|
70
|
+
<!--optional placeholder element for dropzone-->
|
|
71
|
+
<!--will be removed from DOM on init-->
|
|
72
|
+
<div
|
|
73
|
+
style="border: 1px orangered solid; border-radius: 5px; padding: 15px;"
|
|
74
|
+
dndPlaceholderRef>
|
|
75
|
+
placeholder
|
|
76
|
+
</div>
|
|
72
77
|
|
|
73
78
|
</section>
|
|
74
79
|
```
|
|
75
80
|
|
|
76
81
|
`app.component`
|
|
82
|
+
|
|
77
83
|
```JS
|
|
78
|
-
import {
|
|
84
|
+
import {Component} from '@angular/core';
|
|
79
85
|
|
|
80
|
-
import {
|
|
86
|
+
import {DndDropEvent} from 'ngx-drag-drop';
|
|
81
87
|
|
|
82
88
|
@Component()
|
|
83
89
|
export class AppComponent {
|
|
84
|
-
|
|
90
|
+
|
|
85
91
|
draggable = {
|
|
86
92
|
// note that data is handled with JSON.stringify/JSON.parse
|
|
87
|
-
// only set simple data or POJO's as methods will be lost
|
|
93
|
+
// only set simple data or POJO's as methods will be lost
|
|
88
94
|
data: "myDragData",
|
|
89
95
|
effectAllowed: "all",
|
|
90
96
|
disable: false,
|
|
91
97
|
handle: false
|
|
92
98
|
};
|
|
93
|
-
|
|
94
|
-
onDragStart(event:DragEvent) {
|
|
99
|
+
|
|
100
|
+
onDragStart(event: DragEvent) {
|
|
95
101
|
|
|
96
102
|
console.log("drag started", JSON.stringify(event, null, 2));
|
|
97
103
|
}
|
|
98
|
-
|
|
99
|
-
onDragEnd(event:DragEvent) {
|
|
100
|
-
|
|
104
|
+
|
|
105
|
+
onDragEnd(event: DragEvent) {
|
|
106
|
+
|
|
101
107
|
console.log("drag ended", JSON.stringify(event, null, 2));
|
|
102
108
|
}
|
|
103
|
-
|
|
104
|
-
onDraggableCopied(event:DragEvent) {
|
|
105
|
-
|
|
109
|
+
|
|
110
|
+
onDraggableCopied(event: DragEvent) {
|
|
111
|
+
|
|
106
112
|
console.log("draggable copied", JSON.stringify(event, null, 2));
|
|
107
113
|
}
|
|
108
|
-
|
|
109
|
-
onDraggableLinked(event:DragEvent) {
|
|
110
|
-
|
|
114
|
+
|
|
115
|
+
onDraggableLinked(event: DragEvent) {
|
|
116
|
+
|
|
111
117
|
console.log("draggable linked", JSON.stringify(event, null, 2));
|
|
112
118
|
}
|
|
113
|
-
|
|
114
|
-
onDraggableMoved(event:DragEvent) {
|
|
115
|
-
|
|
119
|
+
|
|
120
|
+
onDraggableMoved(event: DragEvent) {
|
|
121
|
+
|
|
116
122
|
console.log("draggable moved", JSON.stringify(event, null, 2));
|
|
117
123
|
}
|
|
118
|
-
|
|
119
|
-
onDragCanceled(event:DragEvent) {
|
|
120
|
-
|
|
124
|
+
|
|
125
|
+
onDragCanceled(event: DragEvent) {
|
|
126
|
+
|
|
121
127
|
console.log("drag cancelled", JSON.stringify(event, null, 2));
|
|
122
128
|
}
|
|
123
|
-
|
|
124
|
-
onDragover(event:DragEvent) {
|
|
125
|
-
|
|
129
|
+
|
|
130
|
+
onDragover(event: DragEvent) {
|
|
131
|
+
|
|
126
132
|
console.log("dragover", JSON.stringify(event, null, 2));
|
|
127
133
|
}
|
|
128
|
-
|
|
129
|
-
onDrop(event:DndDropEvent) {
|
|
130
|
-
|
|
134
|
+
|
|
135
|
+
onDrop(event: DndDropEvent) {
|
|
136
|
+
|
|
131
137
|
console.log("dropped", JSON.stringify(event, null, 2));
|
|
132
138
|
}
|
|
133
139
|
}
|
|
@@ -136,12 +142,12 @@ export class AppComponent {
|
|
|
136
142
|
`app.module`
|
|
137
143
|
|
|
138
144
|
```JS
|
|
139
|
-
import {
|
|
140
|
-
import {
|
|
145
|
+
import {BrowserModule} from '@angular/platform-browser';
|
|
146
|
+
import {NgModule} from '@angular/core';
|
|
141
147
|
|
|
142
|
-
import {
|
|
148
|
+
import {DndModule} from 'ngx-drag-drop';
|
|
143
149
|
|
|
144
|
-
import {
|
|
150
|
+
import {AppComponent} from './app.component';
|
|
145
151
|
|
|
146
152
|
@NgModule({
|
|
147
153
|
declarations: [
|
|
@@ -154,7 +160,7 @@ import { AppComponent } from './app.component';
|
|
|
154
160
|
providers: [],
|
|
155
161
|
bootstrap: [AppComponent]
|
|
156
162
|
})
|
|
157
|
-
export class AppModule {
|
|
163
|
+
export class AppModule {
|
|
158
164
|
}
|
|
159
165
|
```
|
|
160
166
|
|
|
@@ -178,47 +184,47 @@ export declare class DndDraggableDirective {
|
|
|
178
184
|
|
|
179
185
|
// the data attached to the drag
|
|
180
186
|
dndDraggable: any;
|
|
181
|
-
|
|
187
|
+
|
|
182
188
|
// the allowed drop effect
|
|
183
189
|
dndEffectAllowed: EffectAllowed;
|
|
184
|
-
|
|
190
|
+
|
|
185
191
|
// optionally set the type of dragged data to restrict dropping on compatible dropzones
|
|
186
192
|
dndType?: string;
|
|
187
|
-
|
|
193
|
+
|
|
188
194
|
// conditionally disable the draggability
|
|
189
195
|
dndDisableIf: boolean;
|
|
190
196
|
dndDisableDragIf: boolean;
|
|
191
|
-
|
|
197
|
+
|
|
192
198
|
// set a custom class that is applied while dragging
|
|
193
199
|
dndDraggingClass: string = "dndDragging";
|
|
194
|
-
|
|
200
|
+
|
|
195
201
|
// set a custom class that is applied to only the src element while dragging
|
|
196
202
|
dndDraggingSourceClass: string = "dndDraggingSource";
|
|
197
|
-
|
|
203
|
+
|
|
198
204
|
// set the class that is applied when draggable is disabled by [dndDisableIf]
|
|
199
205
|
dndDraggableDisabledClass = "dndDraggableDisabled";
|
|
200
|
-
|
|
206
|
+
|
|
201
207
|
// enables to set a function for calculating custom dragimage offset
|
|
202
208
|
dndDragImageOffsetFunction:DndDragImageOffsetFunction = calculateDragImageOffset;
|
|
203
|
-
|
|
209
|
+
|
|
204
210
|
// emits on drag start
|
|
205
211
|
readonly dndStart: EventEmitter<DragEvent>;
|
|
206
|
-
|
|
212
|
+
|
|
207
213
|
// emits on drag
|
|
208
214
|
readonly dndDrag: EventEmitter<DragEvent>;
|
|
209
|
-
|
|
215
|
+
|
|
210
216
|
// emits on drag end
|
|
211
217
|
readonly dndEnd: EventEmitter<DragEvent>;
|
|
212
|
-
|
|
218
|
+
|
|
213
219
|
// emits when the dragged item has been dropped with effect "move"
|
|
214
220
|
readonly dndMoved: EventEmitter<DragEvent>;
|
|
215
|
-
|
|
221
|
+
|
|
216
222
|
// emits when the dragged item has been dropped with effect "copy"
|
|
217
223
|
readonly dndCopied: EventEmitter<DragEvent>;
|
|
218
|
-
|
|
224
|
+
|
|
219
225
|
// emits when the dragged item has been dropped with effect "link"
|
|
220
226
|
readonly dndLinked: EventEmitter<DragEvent>;
|
|
221
|
-
|
|
227
|
+
|
|
222
228
|
// emits when the drag is canceled
|
|
223
229
|
readonly dndCanceled: EventEmitter<DragEvent>;
|
|
224
230
|
}
|
|
@@ -229,21 +235,21 @@ export interface DndDropEvent {
|
|
|
229
235
|
|
|
230
236
|
// the original drag event
|
|
231
237
|
event: DragEvent;
|
|
232
|
-
|
|
238
|
+
|
|
233
239
|
// the actual drop effect
|
|
234
240
|
dropEffect: DropEffect;
|
|
235
|
-
|
|
241
|
+
|
|
236
242
|
// true if the drag did not origin from a [dndDraggable]
|
|
237
243
|
isExternal:boolean;
|
|
238
|
-
|
|
239
|
-
// the data set on the [dndDraggable] that started the drag
|
|
244
|
+
|
|
245
|
+
// the data set on the [dndDraggable] that started the drag
|
|
240
246
|
// for external drags use the event property which contains the original drop event as this will be undefined
|
|
241
247
|
data?: any;
|
|
242
|
-
|
|
248
|
+
|
|
243
249
|
// the index where the draggable was dropped in a dropzone
|
|
244
250
|
// set only when using a placeholder
|
|
245
251
|
index?: number;
|
|
246
|
-
|
|
252
|
+
|
|
247
253
|
// if the dndType input on dndDraggable was set
|
|
248
254
|
// it will be transported here
|
|
249
255
|
type?: any;
|
|
@@ -256,33 +262,33 @@ export declare class DndDropzoneDirective {
|
|
|
256
262
|
|
|
257
263
|
// optionally restrict the allowed types
|
|
258
264
|
dndDropzone?: string[];
|
|
259
|
-
|
|
265
|
+
|
|
260
266
|
// set the allowed drop effect
|
|
261
267
|
dndEffectAllowed: EffectAllowed;
|
|
262
|
-
|
|
268
|
+
|
|
263
269
|
// conditionally disable the dropzone
|
|
264
270
|
dndDisableIf: boolean;
|
|
265
271
|
dndDisableDropIf: boolean;
|
|
266
|
-
|
|
272
|
+
|
|
267
273
|
// if draggables that are not [dndDraggable] are allowed to be dropped
|
|
268
274
|
// set to true if dragged text, images or files should be handled
|
|
269
275
|
dndAllowExternal: boolean;
|
|
270
|
-
|
|
276
|
+
|
|
271
277
|
// if its a horizontal list this influences how the placeholder position
|
|
272
278
|
// is calculated
|
|
273
279
|
dndHorizontal: boolean;
|
|
274
|
-
|
|
280
|
+
|
|
275
281
|
// set the class applied to the dropzone
|
|
276
282
|
// when a draggable is dragged over it
|
|
277
283
|
dndDragoverClass: string = "dndDragover";
|
|
278
|
-
|
|
284
|
+
|
|
279
285
|
// set the class applied to the dropzone
|
|
280
|
-
// when the dropzone is disabled by [dndDisableIf]
|
|
286
|
+
// when the dropzone is disabled by [dndDisableIf]
|
|
281
287
|
dndDropzoneDisabledClass = "dndDropzoneDisabled";
|
|
282
|
-
|
|
288
|
+
|
|
283
289
|
// emits when a draggable is dragged over the dropzone
|
|
284
290
|
readonly dndDragover: EventEmitter<DragEvent>;
|
|
285
|
-
|
|
291
|
+
|
|
286
292
|
// emits on successful drop
|
|
287
293
|
readonly dndDrop: EventEmitter<DndDropEvent>;
|
|
288
294
|
}
|
|
@@ -293,6 +299,7 @@ export declare class DndDropzoneDirective {
|
|
|
293
299
|
Install the `mobile-drag-drop` module available on npm.
|
|
294
300
|
|
|
295
301
|
Add the following lines to your js code
|
|
302
|
+
|
|
296
303
|
```JS
|
|
297
304
|
import { polyfill } from 'mobile-drag-drop';
|
|
298
305
|
// optional import of scroll behaviour
|
|
@@ -317,10 +324,9 @@ https://github.com/timruffles/mobile-drag-drop
|
|
|
317
324
|
|
|
318
325
|
### Firefox
|
|
319
326
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
327
|
+
- Beware that Firefox does not support dragging on `<button>` elements.
|
|
328
|
+
- `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
|
|
329
|
+
- See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
|
|
324
330
|
|
|
325
331
|
## Why?
|
|
326
332
|
|
|
@@ -328,4 +334,4 @@ HTML Drag-And-Drop API implementations are not behaving the same way across brow
|
|
|
328
334
|
|
|
329
335
|
The directives contained in this module enable declarative drag and drop that "just works" across browsers in a consistent way.
|
|
330
336
|
|
|
331
|
-
Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
|
|
337
|
+
Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
|
|
@@ -1,32 +1,28 @@
|
|
|
1
|
-
import { Directive, EventEmitter, forwardRef, HostBinding, HostListener,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, inject, Input, NgZone, Output, Renderer2, } from '@angular/core';
|
|
2
|
+
import { dndState, endDrag, startDrag } from './dnd-state';
|
|
3
|
+
import { calculateDragImageOffset, setDragData, setDragImage, } from './dnd-utils';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class DndDragImageRefDirective {
|
|
6
|
-
constructor(
|
|
7
|
-
|
|
6
|
+
constructor() {
|
|
7
|
+
this.dndDraggableDirective = inject(forwardRef(() => DndDraggableDirective));
|
|
8
|
+
this.elementRef = inject(ElementRef);
|
|
9
|
+
}
|
|
10
|
+
ngOnInit() {
|
|
11
|
+
this.dndDraggableDirective.registerDragImage(this.elementRef);
|
|
8
12
|
}
|
|
9
13
|
}
|
|
10
|
-
DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.
|
|
11
|
-
DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.
|
|
14
|
+
DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDragImageRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
15
|
+
DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
|
|
13
17
|
type: Directive,
|
|
14
|
-
args: [{
|
|
15
|
-
|
|
16
|
-
}]
|
|
17
|
-
}], ctorParameters: function () { return [{ type: DndDraggableDirective, decorators: [{
|
|
18
|
-
type: Inject,
|
|
19
|
-
args: [forwardRef(() => DndDraggableDirective)]
|
|
20
|
-
}] }, { type: i0.ElementRef }]; } });
|
|
18
|
+
args: [{ selector: '[dndDragImageRef]' }]
|
|
19
|
+
}] });
|
|
21
20
|
export class DndDraggableDirective {
|
|
22
|
-
constructor(
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
this.dndDraggingClass = "dndDragging";
|
|
28
|
-
this.dndDraggingSourceClass = "dndDraggingSource";
|
|
29
|
-
this.dndDraggableDisabledClass = "dndDraggableDisabled";
|
|
21
|
+
constructor() {
|
|
22
|
+
this.dndEffectAllowed = 'copy';
|
|
23
|
+
this.dndDraggingClass = 'dndDragging';
|
|
24
|
+
this.dndDraggingSourceClass = 'dndDraggingSource';
|
|
25
|
+
this.dndDraggableDisabledClass = 'dndDraggableDisabled';
|
|
30
26
|
this.dndDragImageOffsetFunction = calculateDragImageOffset;
|
|
31
27
|
this.dndStart = new EventEmitter();
|
|
32
28
|
this.dndDrag = new EventEmitter();
|
|
@@ -37,6 +33,9 @@ export class DndDraggableDirective {
|
|
|
37
33
|
this.dndCanceled = new EventEmitter();
|
|
38
34
|
this.draggable = true;
|
|
39
35
|
this.isDragStarted = false;
|
|
36
|
+
this.elementRef = inject(ElementRef);
|
|
37
|
+
this.renderer = inject(Renderer2);
|
|
38
|
+
this.ngZone = inject(NgZone);
|
|
40
39
|
this.dragEventHandler = (event) => this.onDrag(event);
|
|
41
40
|
}
|
|
42
41
|
set dndDisableIf(value) {
|
|
@@ -53,22 +52,22 @@ export class DndDraggableDirective {
|
|
|
53
52
|
}
|
|
54
53
|
ngAfterViewInit() {
|
|
55
54
|
this.ngZone.runOutsideAngular(() => {
|
|
56
|
-
this.elementRef.nativeElement.addEventListener(
|
|
55
|
+
this.elementRef.nativeElement.addEventListener('drag', this.dragEventHandler);
|
|
57
56
|
});
|
|
58
57
|
}
|
|
59
58
|
ngOnDestroy() {
|
|
60
|
-
this.elementRef.nativeElement.removeEventListener(
|
|
61
|
-
if (this.isDragStarted
|
|
59
|
+
this.elementRef.nativeElement.removeEventListener('drag', this.dragEventHandler);
|
|
60
|
+
if (this.isDragStarted) {
|
|
62
61
|
endDrag();
|
|
63
62
|
}
|
|
64
63
|
}
|
|
65
64
|
onDragStart(event) {
|
|
66
|
-
if (this.draggable
|
|
65
|
+
if (!this.draggable) {
|
|
67
66
|
return false;
|
|
68
67
|
}
|
|
69
68
|
// check if there is dnd handle and if the dnd handle was used to start the drag
|
|
70
|
-
if (
|
|
71
|
-
|
|
69
|
+
if (this.dndHandle != null && event._dndUsingHandle == null) {
|
|
70
|
+
event.stopPropagation();
|
|
72
71
|
return false;
|
|
73
72
|
}
|
|
74
73
|
// initialize global state
|
|
@@ -81,17 +80,19 @@ export class DndDraggableDirective {
|
|
|
81
80
|
this.renderer.addClass(this.dragImage, this.dndDraggingClass);
|
|
82
81
|
// set custom dragimage if present
|
|
83
82
|
// set dragimage if drag is started from dndHandle
|
|
84
|
-
if (
|
|
85
|
-
|| typeof event._dndUsingHandle !== "undefined") {
|
|
83
|
+
if (this.dndDragImageElementRef != null || event._dndUsingHandle != null) {
|
|
86
84
|
setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
|
|
87
85
|
}
|
|
88
86
|
// add dragging source css class on first drag event
|
|
89
|
-
const unregister = this.renderer.listen(this.elementRef.nativeElement,
|
|
87
|
+
const unregister = this.renderer.listen(this.elementRef.nativeElement, 'drag', () => {
|
|
90
88
|
this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
|
|
91
89
|
unregister();
|
|
92
90
|
});
|
|
93
91
|
this.dndStart.emit(event);
|
|
94
92
|
event.stopPropagation();
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
this.renderer.setStyle(this.dragImage, 'pointer-events', 'none');
|
|
95
|
+
}, 100);
|
|
95
96
|
return true;
|
|
96
97
|
}
|
|
97
98
|
onDrag(event) {
|
|
@@ -100,15 +101,16 @@ export class DndDraggableDirective {
|
|
|
100
101
|
onDragEnd(event) {
|
|
101
102
|
// get drop effect from custom stored state as its not reliable across browsers
|
|
102
103
|
const dropEffect = dndState.dropEffect;
|
|
104
|
+
this.renderer.setStyle(this.dragImage, 'pointer-events', 'unset');
|
|
103
105
|
let dropEffectEmitter;
|
|
104
106
|
switch (dropEffect) {
|
|
105
|
-
case
|
|
107
|
+
case 'copy':
|
|
106
108
|
dropEffectEmitter = this.dndCopied;
|
|
107
109
|
break;
|
|
108
|
-
case
|
|
110
|
+
case 'link':
|
|
109
111
|
dropEffectEmitter = this.dndLinked;
|
|
110
112
|
break;
|
|
111
|
-
case
|
|
113
|
+
case 'move':
|
|
112
114
|
dropEffectEmitter = this.dndMoved;
|
|
113
115
|
break;
|
|
114
116
|
default:
|
|
@@ -135,7 +137,7 @@ export class DndDraggableDirective {
|
|
|
135
137
|
}
|
|
136
138
|
determineDragImage() {
|
|
137
139
|
// evaluate custom drag image existence
|
|
138
|
-
if (typeof this.dndDragImageElementRef !==
|
|
140
|
+
if (typeof this.dndDragImageElementRef !== 'undefined') {
|
|
139
141
|
return this.dndDragImageElementRef.nativeElement;
|
|
140
142
|
}
|
|
141
143
|
else {
|
|
@@ -143,14 +145,12 @@ export class DndDraggableDirective {
|
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
|
-
DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.
|
|
147
|
-
DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.
|
|
148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.
|
|
148
|
+
DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDraggableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
149
|
+
DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", 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 });
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDraggableDirective, decorators: [{
|
|
149
151
|
type: Directive,
|
|
150
|
-
args: [{
|
|
151
|
-
|
|
152
|
-
}]
|
|
153
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { dndDraggable: [{
|
|
152
|
+
args: [{ selector: '[dndDraggable]' }]
|
|
153
|
+
}], propDecorators: { dndDraggable: [{
|
|
154
154
|
type: Input
|
|
155
155
|
}], dndEffectAllowed: [{
|
|
156
156
|
type: Input
|
|
@@ -180,16 +180,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImpor
|
|
|
180
180
|
type: Output
|
|
181
181
|
}], draggable: [{
|
|
182
182
|
type: HostBinding,
|
|
183
|
-
args: [
|
|
183
|
+
args: ['attr.draggable']
|
|
184
184
|
}], dndDisableIf: [{
|
|
185
185
|
type: Input
|
|
186
186
|
}], dndDisableDragIf: [{
|
|
187
187
|
type: Input
|
|
188
188
|
}], onDragStart: [{
|
|
189
189
|
type: HostListener,
|
|
190
|
-
args: [
|
|
190
|
+
args: ['dragstart', ['$event']]
|
|
191
191
|
}], onDragEnd: [{
|
|
192
192
|
type: HostListener,
|
|
193
|
-
args: [
|
|
193
|
+
args: ['dragend', ['$event']]
|
|
194
194
|
}] } });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQXdDLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQU0zRCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFlBQTZELE1BQTZCLEVBQUUsVUFBcUI7UUFDL0csTUFBTSxDQUFDLGlCQUFpQixDQUFFLFVBQVUsQ0FBRSxDQUFDO0lBQ3pDLENBQUM7O3FIQUpVLHdCQUF3QixrQkFFZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7eUdBRmhELHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzswQkFHYyxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQzs7QUFRN0QsTUFBTSxPQUFPLHFCQUFxQjtJQTZFaEMsWUFBcUIsVUFBcUIsRUFDckIsUUFBa0IsRUFDbEIsTUFBYTtRQUZiLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBekVsQyxxQkFBZ0IsR0FBaUIsTUFBTSxDQUFDO1FBTXhDLHFCQUFnQixHQUFHLGFBQWEsQ0FBQztRQUdqQywy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QUN0QztJQUNILENBQUM7O2tIQXZOVSxxQkFBcUI7c0dBQXJCLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzhJQUlDLFlBQVk7c0JBRFgsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTiwwQkFBMEI7c0JBRHpCLEtBQUs7Z0JBSUcsUUFBUTtzQkFEaEIsTUFBTTtnQkFJRSxPQUFPO3NCQURmLE1BQU07Z0JBSUUsTUFBTTtzQkFEZCxNQUFNO2dCQUlFLFFBQVE7c0JBRGhCLE1BQU07Z0JBSUUsU0FBUztzQkFEakIsTUFBTTtnQkFJRSxTQUFTO3NCQURqQixNQUFNO2dCQUlFLFdBQVc7c0JBRG5CLE1BQU07Z0JBSVAsU0FBUztzQkFEUixXQUFXO3VCQUFFLGdCQUFnQjtnQkFjMUIsWUFBWTtzQkFEZixLQUFLO2dCQWdCRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBd0JOLFdBQVc7c0JBRFYsWUFBWTt1QkFBRSxXQUFXLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBdUR4QyxTQUFTO3NCQURSLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHJhZ0ltYWdlT2Zmc2V0LCBEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiwgRG5kRXZlbnQsIHNldERyYWdEYXRhLCBzZXREcmFnSW1hZ2UgfSBmcm9tIFwiLi9kbmQtdXRpbHNcIjtcbmltcG9ydCB7IERuZEhhbmRsZURpcmVjdGl2ZSB9IGZyb20gXCIuL2RuZC1oYW5kbGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBkbmRTdGF0ZSwgZW5kRHJhZywgc3RhcnREcmFnIH0gZnJvbSBcIi4vZG5kLXN0YXRlXCI7XG5pbXBvcnQgeyBFZmZlY3RBbGxvd2VkIH0gZnJvbSBcIi4vZG5kLXR5cGVzXCI7XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZERyYWdJbWFnZVJlZl1cIlxufSApXG5leHBvcnQgY2xhc3MgRG5kRHJhZ0ltYWdlUmVmRGlyZWN0aXZlIHtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gRG5kRHJhZ2dhYmxlRGlyZWN0aXZlKSkgcGFyZW50OiBEbmREcmFnZ2FibGVEaXJlY3RpdmUsIGVsZW1lbnRSZWY6RWxlbWVudFJlZiApIHtcbiAgICBwYXJlbnQucmVnaXN0ZXJEcmFnSW1hZ2UoIGVsZW1lbnRSZWYgKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKCB7XG4gIHNlbGVjdG9yOiBcIltkbmREcmFnZ2FibGVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZERyYWdnYWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dhYmxlOmFueTtcblxuICBASW5wdXQoKVxuICBkbmRFZmZlY3RBbGxvd2VkOkVmZmVjdEFsbG93ZWQgPSBcImNvcHlcIjtcblxuICBASW5wdXQoKVxuICBkbmRUeXBlPzpzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dpbmdDbGFzcyA9IFwiZG5kRHJhZ2dpbmdcIjtcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2luZ1NvdXJjZUNsYXNzID0gXCJkbmREcmFnZ2luZ1NvdXJjZVwiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3MgPSBcImRuZERyYWdnYWJsZURpc2FibGVkXCI7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb246RG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb24gPSBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQ7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZFN0YXJ0OkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZERyYWc6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRW5kOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZE1vdmVkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZENvcGllZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRMaW5rZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kQ2FuY2VsZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoIFwiYXR0ci5kcmFnZ2FibGVcIiApXG4gIGRyYWdnYWJsZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBkbmRIYW5kbGU/OkRuZEhhbmRsZURpcmVjdGl2ZTtcblxuICBwcml2YXRlIGRuZERyYWdJbWFnZUVsZW1lbnRSZWY/OkVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBkcmFnSW1hZ2U6RWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGlzRHJhZ1N0YXJ0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0V2ZW50SGFuZGxlcjooIGV2ZW50OkRyYWdFdmVudCApID0+IHZvaWQgPSAoIGV2ZW50OkRyYWdFdmVudCApID0+IHRoaXMub25EcmFnKCBldmVudCApO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkbmREaXNhYmxlSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG5cbiAgICB0aGlzLmRyYWdnYWJsZSA9ICF2YWx1ZTtcblxuICAgIGlmKCB0aGlzLmRyYWdnYWJsZSApIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBkbmREaXNhYmxlRHJhZ0lmKCB2YWx1ZTpib29sZWFuICkge1xuICAgIHRoaXMuZG5kRGlzYWJsZUlmID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBlbGVtZW50UmVmOkVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOlJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgbmdab25lOk5nWm9uZSApIHtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOnZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCAoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdcIiwgdGhpcy5kcmFnRXZlbnRIYW5kbGVyICk7XG4gICAgfSApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTp2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdcIiwgdGhpcy5kcmFnRXZlbnRIYW5kbGVyICk7XG4gICAgaWYodGhpcy5pc0RyYWdTdGFydGVkID09PSB0cnVlKSB7XG4gICAgICBlbmREcmFnKClcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyYWdzdGFydFwiLCBbIFwiJGV2ZW50XCIgXSApXG4gIG9uRHJhZ1N0YXJ0KCBldmVudDpEbmRFdmVudCApOiBib29sZWFuIHtcblxuICAgIGlmKCB0aGlzLmRyYWdnYWJsZSA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBkbmQgaGFuZGxlIGFuZCBpZiB0aGUgZG5kIGhhbmRsZSB3YXMgdXNlZCB0byBzdGFydCB0aGUgZHJhZ1xuICAgIGlmKCB0eXBlb2YgdGhpcy5kbmRIYW5kbGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICYmIHR5cGVvZiBldmVudC5fZG5kVXNpbmdIYW5kbGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGdsb2JhbCBzdGF0ZVxuICAgIHN0YXJ0RHJhZyggZXZlbnQsIHRoaXMuZG5kRWZmZWN0QWxsb3dlZCwgdGhpcy5kbmRUeXBlICk7XG5cbiAgICB0aGlzLmlzRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgc2V0RHJhZ0RhdGEoIGV2ZW50LCB7ZGF0YTogdGhpcy5kbmREcmFnZ2FibGUsIHR5cGU6IHRoaXMuZG5kVHlwZX0sIGRuZFN0YXRlLmVmZmVjdEFsbG93ZWQhICk7XG5cbiAgICB0aGlzLmRyYWdJbWFnZSA9IHRoaXMuZGV0ZXJtaW5lRHJhZ0ltYWdlKCk7XG5cbiAgICAvLyBzZXQgZHJhZ2dpbmcgY3NzIGNsYXNzIHByaW9yIHRvIHNldERyYWdJbWFnZSBzbyBzdHlsZXMgYXJlIGFwcGxpZWQgYmVmb3JlXG4gICAgLy8gVE9ETyBicmVha2luZyBjaGFuZ2U6IGFkZCBjbGFzcyB0byBlbGVtZW50UmVmIHJhdGhlciB0aGFuIGRyYWcgaW1hZ2Ugd2hpY2ggY291bGQgYmUgYW5vdGhlciBlbGVtZW50XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyApO1xuXG4gICAgLy8gc2V0IGN1c3RvbSBkcmFnaW1hZ2UgaWYgcHJlc2VudFxuICAgIC8vIHNldCBkcmFnaW1hZ2UgaWYgZHJhZyBpcyBzdGFydGVkIGZyb20gZG5kSGFuZGxlXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgIHx8IHR5cGVvZiBldmVudC5fZG5kVXNpbmdIYW5kbGUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHNldERyYWdJbWFnZSggZXZlbnQsIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uICk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGRyYWdnaW5nIHNvdXJjZSBjc3MgY2xhc3Mgb24gZmlyc3QgZHJhZyBldmVudFxuICAgIGNvbnN0IHVucmVnaXN0ZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIFwiZHJhZ1wiLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnaW5nU291cmNlQ2xhc3MgKTtcbiAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICB9ICk7XG5cbiAgICB0aGlzLmRuZFN0YXJ0LmVtaXQoIGV2ZW50ICk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uRHJhZyggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuXG4gICAgdGhpcy5kbmREcmFnLmVtaXQoIGV2ZW50ICk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyYWdlbmRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdFbmQoIGV2ZW50OkRyYWdFdmVudCApIHtcblxuICAgIC8vIGdldCBkcm9wIGVmZmVjdCBmcm9tIGN1c3RvbSBzdG9yZWQgc3RhdGUgYXMgaXRzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYnJvd3NlcnNcbiAgICBjb25zdCBkcm9wRWZmZWN0ID0gZG5kU3RhdGUuZHJvcEVmZmVjdDtcblxuICAgIGxldCBkcm9wRWZmZWN0RW1pdHRlcjpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PjtcblxuICAgIHN3aXRjaCggZHJvcEVmZmVjdCApIHtcblxuICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENvcGllZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRMaW5rZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwibW92ZVwiOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kTW92ZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kQ2FuY2VsZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRyb3BFZmZlY3RFbWl0dGVyLmVtaXQoIGV2ZW50ICk7XG4gICAgdGhpcy5kbmRFbmQuZW1pdCggZXZlbnQgKTtcblxuICAgIC8vIHJlc2V0IGdsb2JhbCBzdGF0ZVxuICAgIGVuZERyYWcoKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyApO1xuXG4gICAgLy8gSUU5IHNwZWNpYWwgaGFtbWVyaW5nXG4gICAgd2luZG93LnNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnaW5nU291cmNlQ2xhc3MgKTtcbiAgICB9LCAwICk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0hhbmRsZSggaGFuZGxlOkRuZEhhbmRsZURpcmVjdGl2ZSB8IHVuZGVmaW5lZCApIHtcblxuICAgIHRoaXMuZG5kSGFuZGxlID0gaGFuZGxlO1xuICB9XG5cbiAgcmVnaXN0ZXJEcmFnSW1hZ2UoIGVsZW1lbnRSZWY6RWxlbWVudFJlZiB8IHVuZGVmaW5lZCApIHtcblxuICAgIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZURyYWdJbWFnZSgpOkVsZW1lbnQge1xuXG4gICAgLy8gZXZhbHVhdGUgY3VzdG9tIGRyYWcgaW1hZ2UgZXhpc3RlbmNlXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuIl19
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0QsT0FBTyxFQUNMLHdCQUF3QixFQUd4QixXQUFXLEVBQ1gsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDOztBQUdyQixNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBRUUsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDeEUsZUFBVSxHQUE0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FLMUQ7SUFIQyxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDOztxSEFOVSx3QkFBd0I7eUdBQXhCLHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQURwQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFOztBQVc1QyxNQUFNLE9BQU8scUJBQXFCO0lBRGxDO1FBR1cscUJBQWdCLEdBQWtCLE1BQU0sQ0FBQztRQUV6QyxxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDakMsMkJBQXNCLEdBQUcsbUJBQW1CLENBQUM7UUFDN0MsOEJBQXlCLEdBQUcsc0JBQXNCLENBQUM7UUFD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UyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERuZEhhbmRsZURpcmVjdGl2ZSB9IGZyb20gJy4vZG5kLWhhbmRsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZG5kU3RhdGUsIGVuZERyYWcsIHN0YXJ0RHJhZyB9IGZyb20gJy4vZG5kLXN0YXRlJztcbmltcG9ydCB7IEVmZmVjdEFsbG93ZWQgfSBmcm9tICcuL2RuZC10eXBlcyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQsXG4gIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uLFxuICBEbmRFdmVudCxcbiAgc2V0RHJhZ0RhdGEsXG4gIHNldERyYWdJbWFnZSxcbn0gZnJvbSAnLi9kbmQtdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZG5kRHJhZ0ltYWdlUmVmXScgfSlcbmV4cG9ydCBjbGFzcyBEbmREcmFnSW1hZ2VSZWZEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBkbmREcmFnZ2FibGVEaXJlY3RpdmUgPSBpbmplY3QoZm9yd2FyZFJlZigoKSA9PiBEbmREcmFnZ2FibGVEaXJlY3RpdmUpKTtcbiAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kbmREcmFnZ2FibGVEaXJlY3RpdmUucmVnaXN0ZXJEcmFnSW1hZ2UodGhpcy5lbGVtZW50UmVmKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZG5kRHJhZ2dhYmxlXScgfSlcbmV4cG9ydCBjbGFzcyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBkbmREcmFnZ2FibGU6IGFueTtcbiAgQElucHV0KCkgZG5kRWZmZWN0QWxsb3dlZDogRWZmZWN0QWxsb3dlZCA9ICdjb3B5JztcbiAgQElucHV0KCkgZG5kVHlwZT86IHN0cmluZztcbiAgQElucHV0KCkgZG5kRHJhZ2dpbmdDbGFzcyA9ICdkbmREcmFnZ2luZyc7XG4gIEBJbnB1dCgpIGRuZERyYWdnaW5nU291cmNlQ2xhc3MgPSAnZG5kRHJhZ2dpbmdTb3VyY2UnO1xuICBASW5wdXQoKSBkbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzID0gJ2RuZERyYWdnYWJsZURpc2FibGVkJztcbiAgQElucHV0KCkgZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb246IERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uID1cbiAgICBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQ7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZFN0YXJ0OiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmREcmFnOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRFbmQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZE1vdmVkOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRDb3BpZWQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZExpbmtlZDogRXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kQ2FuY2VsZWQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJykgZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICBwcml2YXRlIGRuZEhhbmRsZT86IERuZEhhbmRsZURpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBkbmREcmFnSW1hZ2VFbGVtZW50UmVmPzogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBkcmFnSW1hZ2U6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNEcmFnU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICBASW5wdXQoKSBzZXQgZG5kRGlzYWJsZUlmKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUgPSAhdmFsdWU7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2FibGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3NcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGRuZERpc2FibGVEcmFnSWYodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRuZERpc2FibGVJZiA9IHZhbHVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdkcmFnJyxcbiAgICAgICAgdGhpcy5kcmFnRXZlbnRIYW5kbGVyXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdkcmFnJyxcbiAgICAgIHRoaXMuZHJhZ0V2ZW50SGFuZGxlclxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgZW5kRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdzdGFydCcsIFsnJGV2ZW50J10pIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEbmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kcmFnZ2FibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBkbmQgaGFuZGxlIGFuZCBpZiB0aGUgZG5kIGhhbmRsZSB3YXMgdXNlZCB0byBzdGFydCB0aGUgZHJhZ1xuICAgIGlmICh0aGlzLmRuZEhhbmRsZSAhPSBudWxsICYmIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSA9PSBudWxsKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGdsb2JhbCBzdGF0ZVxuICAgIHN0YXJ0RHJhZyhldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkLCB0aGlzLmRuZFR5cGUpO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcblxuICAgIHNldERyYWdEYXRhKFxuICAgICAgZXZlbnQsXG4gICAgICB7IGRhdGE6IHRoaXMuZG5kRHJhZ2dhYmxlLCB0eXBlOiB0aGlzLmRuZFR5cGUgfSxcbiAgICAgIGRuZFN0YXRlLmVmZmVjdEFsbG93ZWQhXG4gICAgKTtcblxuICAgIHRoaXMuZHJhZ0ltYWdlID0gdGhpcy5kZXRlcm1pbmVEcmFnSW1hZ2UoKTtcblxuICAgIC8vIHNldCBkcmFnZ2luZyBjc3MgY2xhc3MgcHJpb3IgdG8gc2V0RHJhZ0ltYWdlIHNvIHN0eWxlcyBhcmUgYXBwbGllZCBiZWZvcmVcbiAgICAvLyBUT0RPIGJyZWFraW5nIGNoYW5nZTogYWRkIGNsYXNzIHRvIGVsZW1lbnRSZWYgcmF0aGVyIHRoYW4gZHJhZyBpbWFnZSB3aGljaCBjb3VsZCBiZSBhbm90aGVyIGVsZW1lbnRcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gc2V0IGN1c3RvbSBkcmFnaW1hZ2UgaWYgcHJlc2VudFxuICAgIC8vIHNldCBkcmFnaW1hZ2UgaWYgZHJhZyBpcyBzdGFydGVkIGZyb20gZG5kSGFuZGxlXG4gICAgaWYgKHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPSBudWxsIHx8IGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSAhPSBudWxsKSB7XG4gICAgICBzZXREcmFnSW1hZ2UoZXZlbnQsIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgZHJhZ2dpbmcgc291cmNlIGNzcyBjbGFzcyBvbiBmaXJzdCBkcmFnIGV2ZW50XG4gICAgY29uc3QgdW5yZWdpc3RlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZHJhZycsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzXG4gICAgICAgICk7XG4gICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5kbmRTdGFydC5lbWl0KGV2ZW50KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJhZ0ltYWdlLCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIH0sIDEwMCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uRHJhZyhldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgdGhpcy5kbmREcmFnLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2VuZCcsIFsnJGV2ZW50J10pIG9uRHJhZ0VuZChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgLy8gZ2V0IGRyb3AgZWZmZWN0IGZyb20gY3VzdG9tIHN0b3JlZCBzdGF0ZSBhcyBpdHMgbm90IHJlbGlhYmxlIGFjcm9zcyBicm93c2Vyc1xuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBkbmRTdGF0ZS5kcm9wRWZmZWN0O1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyYWdJbWFnZSwgJ3BvaW50ZXItZXZlbnRzJywgJ3Vuc2V0Jyk7XG5cbiAgICBsZXQgZHJvcEVmZmVjdEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+O1xuXG4gICAgc3dpdGNoIChkcm9wRWZmZWN0KSB7XG4gICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENvcGllZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kTGlua2VkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbW92ZSc6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRNb3ZlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRDYW5jZWxlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZHJvcEVmZmVjdEVtaXR0ZXIuZW1pdChldmVudCk7XG4gICAgdGhpcy5kbmRFbmQuZW1pdChldmVudCk7XG5cbiAgICAvLyByZXNldCBnbG9iYWwgc3RhdGVcbiAgICBlbmREcmFnKCk7XG5cbiAgICB0aGlzLmlzRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyk7XG5cbiAgICAvLyBJRTkgc3BlY2lhbCBoYW1tZXJpbmdcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzXG4gICAgICApO1xuICAgIH0sIDApO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICByZWdpc3RlckRyYWdIYW5kbGUoaGFuZGxlOiBEbmRIYW5kbGVEaXJlY3RpdmUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRuZEhhbmRsZSA9IGhhbmRsZTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0ltYWdlKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRXZlbnRIYW5kbGVyOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCA9IChcbiAgICBldmVudDogRHJhZ0V2ZW50XG4gICkgPT4gdGhpcy5vbkRyYWcoZXZlbnQpO1xuXG4gIHByaXZhdGUgZGV0ZXJtaW5lRHJhZ0ltYWdlKCk6IEVsZW1lbnQge1xuICAgIC8vIGV2YWx1YXRlIGN1c3RvbSBkcmFnIGltYWdlIGV4aXN0ZW5jZVxuICAgIGlmICh0eXBlb2YgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|