@libs-ui/components-drag-drop 0.1.1-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.
- package/README.md +451 -0
- package/defines/css.define.d.ts +4 -0
- package/demo/demo.component.d.ts +56 -0
- package/drag-drop.directive.d.ts +39 -0
- package/drag-drop.service.d.ts +45 -0
- package/drag-item-in-container-virtual-scroll.directive.d.ts +25 -0
- package/drag-item.directive.d.ts +30 -0
- package/drag-scroll.directive.d.ts +24 -0
- package/esm2022/defines/css.define.mjs +104 -0
- package/esm2022/demo/demo.component.mjs +833 -0
- package/esm2022/drag-drop.directive.mjs +482 -0
- package/esm2022/drag-drop.service.mjs +96 -0
- package/esm2022/drag-item-in-container-virtual-scroll.directive.mjs +134 -0
- package/esm2022/drag-item.directive.mjs +267 -0
- package/esm2022/drag-scroll.directive.mjs +144 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/interfaces/event.interface.mjs +2 -0
- package/esm2022/libs-ui-components-drag-drop.mjs +5 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs +2043 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/interfaces/event.interface.d.ts +60 -0
- package/package.json +28 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, effect, inject, input, model, output, signal, untracked } from '@angular/core';
|
|
2
|
+
import { checkMouseOverInContainer, cloneDeep, get, set, uuid } from '@libs-ui/utils';
|
|
3
|
+
import { debounceTime, filter, takeUntil } from 'rxjs';
|
|
4
|
+
import { styleContainer } from './defines/css.define';
|
|
5
|
+
import { LibsUiComponentsDragScrollDirective } from './drag-scroll.directive';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective {
|
|
8
|
+
// #region PROPERTY
|
|
9
|
+
groupID = signal(uuid());
|
|
10
|
+
isDragOver = signal(false);
|
|
11
|
+
cdr = inject(ChangeDetectorRef);
|
|
12
|
+
// #region INPUT
|
|
13
|
+
disableDragContainer = input();
|
|
14
|
+
mode = input('move', { transform: (value) => value ?? 'move' });
|
|
15
|
+
directionDrag = input();
|
|
16
|
+
viewEncapsulation = input('emulated', { transform: (value) => value ?? 'emulated' });
|
|
17
|
+
acceptDragSameGroup = input(false, { transform: (value) => value ?? false });
|
|
18
|
+
placeholder = input(true, { transform: (value) => value ?? true });
|
|
19
|
+
groupName = input('groupDragAndDropDefault', { transform: (value) => value ?? 'groupDragAndDropDefault' }); // nếu các group có tên trùng nhau sẽ được drop
|
|
20
|
+
dropToGroupName = input(null); // nếu item trong các group A được drop vào group B nhưng group B không được drop vào group A
|
|
21
|
+
items = model.required();
|
|
22
|
+
stylesOverride = input();
|
|
23
|
+
// #region OUTPUT
|
|
24
|
+
outDragStartContainer = output();
|
|
25
|
+
outDragOverContainer = output();
|
|
26
|
+
outDragLeaveContainer = output();
|
|
27
|
+
outDragEndContainer = output();
|
|
28
|
+
outDroppedContainer = output();
|
|
29
|
+
outDroppedContainerEmpty = output();
|
|
30
|
+
outFunctionControl = output();
|
|
31
|
+
constructor() {
|
|
32
|
+
super();
|
|
33
|
+
const element = this.elementRef.nativeElement;
|
|
34
|
+
const container = { element };
|
|
35
|
+
this.dragDropService.Container().set(this.groupID(), container);
|
|
36
|
+
effect(() => {
|
|
37
|
+
const elementScroll = this.rootElementScroll();
|
|
38
|
+
if (!elementScroll) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
untracked(() => {
|
|
42
|
+
set(container, 'elementScroll', elementScroll);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
effect(() => {
|
|
46
|
+
if (this.directionDrag() && this.elementRef.nativeElement) {
|
|
47
|
+
this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
effect(() => {
|
|
51
|
+
if (this.disableDragContainer() && this.elementRef.nativeElement) {
|
|
52
|
+
this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
ngAfterViewInit() {
|
|
57
|
+
this.outFunctionControl.emit(this.FunctionsControl);
|
|
58
|
+
this.outDroppedContainer.subscribe((eventDropped) => {
|
|
59
|
+
this.dragDropService.OnDropContainer.next(eventDropped);
|
|
60
|
+
});
|
|
61
|
+
this.onDestroy.subscribe(() => {
|
|
62
|
+
if (indexSpliceListTo > -1) {
|
|
63
|
+
this.items.update((items) => {
|
|
64
|
+
items.splice(indexSpliceListTo, 1);
|
|
65
|
+
return [...items];
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
this.dragDropService.Container().delete(this.groupID());
|
|
69
|
+
});
|
|
70
|
+
const elementContainer = this.elementRef.nativeElement;
|
|
71
|
+
this.initStyleAndAttribute(elementContainer, true);
|
|
72
|
+
this.dragDropService.OnItemInit.pipe(debounceTime(250), filter((groupName) => groupName === this.groupName()), takeUntil(this.onDestroy)).subscribe(() => this.initStyleAndAttribute(elementContainer));
|
|
73
|
+
const styleTag = document.createElement('style');
|
|
74
|
+
styleTag.textContent = styleContainer(this.stylesOverride() || [], this.viewEncapsulation(), this.groupID());
|
|
75
|
+
elementContainer.appendChild(styleTag);
|
|
76
|
+
elementContainer.classList.add(this.dragDropService.ClassContainerDefine);
|
|
77
|
+
const handlerDragStart = (eventDragStart) => {
|
|
78
|
+
this.setAttributeElementAndItemDrag(elementContainer, true);
|
|
79
|
+
if (this.groupID() === eventDragStart.elementDrag.getAttribute('groupID')) {
|
|
80
|
+
this.outDragStartContainer.emit({ ...eventDragStart, itemDragInfo: this.dragDropService.ItemDragInfo });
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const storeIndex = { indexDrag: -1, indexDragOver: -1 };
|
|
84
|
+
let indexSpliceListTo = -1;
|
|
85
|
+
const handlerDragOver = (eventDragOver) => {
|
|
86
|
+
const { elementDrag, elementDragOver } = eventDragOver;
|
|
87
|
+
if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const indexDrag = Number(elementDrag.getAttribute('index')).valueOf();
|
|
91
|
+
const indexDragOver = Number(elementDragOver.getAttribute('index')).valueOf();
|
|
92
|
+
const idGroupElementDrag = elementDrag.getAttribute('groupID');
|
|
93
|
+
const idGroupElementDragOver = elementDragOver.getAttribute('groupID');
|
|
94
|
+
if (this.groupID() !== idGroupElementDrag || idGroupElementDrag !== idGroupElementDragOver) {
|
|
95
|
+
// xử lý cho item drag over qua 1 item khác container
|
|
96
|
+
if (idGroupElementDragOver === this.groupID() && this.placeholder()) {
|
|
97
|
+
const item = this.mode() === 'copy' ? cloneDeep(this.dragDropService.ItemDragInfo?.item) : this.dragDropService.ItemDragInfo?.item;
|
|
98
|
+
this.items.update((items) => {
|
|
99
|
+
if (indexSpliceListTo >= 0) {
|
|
100
|
+
items.splice(indexSpliceListTo, 1);
|
|
101
|
+
}
|
|
102
|
+
items.splice(indexDragOver, 0, item);
|
|
103
|
+
return [...items];
|
|
104
|
+
});
|
|
105
|
+
indexSpliceListTo = indexDragOver;
|
|
106
|
+
this.cdr.detectChanges();
|
|
107
|
+
this.setAttributeElementAndItemDrag(elementContainer, false, indexSpliceListTo);
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!this.acceptDragSameGroup() ||
|
|
112
|
+
indexDrag < 0 ||
|
|
113
|
+
indexDragOver < 0 ||
|
|
114
|
+
!this.items().length ||
|
|
115
|
+
indexDrag > this.items().length ||
|
|
116
|
+
indexDragOver > this.items().length ||
|
|
117
|
+
(storeIndex.indexDrag === indexDrag && storeIndex.indexDragOver === indexDragOver)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// xử lý cho item drag over qua 1 item cùng container
|
|
121
|
+
const itemDrag = this.items()[indexDrag];
|
|
122
|
+
this.setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver);
|
|
123
|
+
storeIndex.indexDrag = indexDrag;
|
|
124
|
+
storeIndex.indexDragOver = indexDragOver;
|
|
125
|
+
this.items.update((items) => {
|
|
126
|
+
items.splice(indexDrag, 1);
|
|
127
|
+
items.splice(indexDragOver, 0, itemDrag);
|
|
128
|
+
return [...items];
|
|
129
|
+
});
|
|
130
|
+
elementDrag.setAttribute('index', indexDragOver.toString());
|
|
131
|
+
this.cdr.detectChanges();
|
|
132
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
133
|
+
};
|
|
134
|
+
const removePlaceholderDrag = (eventDrag, isDragging) => {
|
|
135
|
+
clearInterval(this.intervalScrollToElement());
|
|
136
|
+
storeIndex.indexDrag = -1;
|
|
137
|
+
storeIndex.indexDragOver = -1;
|
|
138
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
139
|
+
if (!checkMouseOverInContainer(eventDrag.mousePosition, this.rootElementScroll() || elementContainer)) {
|
|
140
|
+
const childElementIndex = Array.from(childrenElement).findIndex((child) => child.classList.contains('libs-ui-drag-drop-item-drop-placeholder'));
|
|
141
|
+
if (childElementIndex >= 0 && this.groupID() !== eventDrag.elementDrag.getAttribute('groupID')) {
|
|
142
|
+
this.items.update((items) => {
|
|
143
|
+
items.splice(childElementIndex, 1);
|
|
144
|
+
return [...items];
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
indexSpliceListTo = -1;
|
|
148
|
+
this.removeAttributes(elementContainer, isDragging);
|
|
149
|
+
this.setIndexElement(elementContainer);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (indexSpliceListTo >= 0) {
|
|
153
|
+
this.items.update((items) => {
|
|
154
|
+
items.splice(indexSpliceListTo, 1);
|
|
155
|
+
return [...items];
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
indexSpliceListTo = -1;
|
|
159
|
+
};
|
|
160
|
+
const handlerDragging = (eventDragging) => {
|
|
161
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
162
|
+
const { elementDrag } = eventDragging;
|
|
163
|
+
const fieldIdItem = elementDrag.getAttribute('field_id');
|
|
164
|
+
const idItemDrag = elementDrag.getAttribute('item_id');
|
|
165
|
+
if (fieldIdItem && idItemDrag && this.items().find((item) => get(item, fieldIdItem) === idItemDrag)) {
|
|
166
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
167
|
+
const childElement = Array.from(childrenElement).find((child) => child.getAttribute('item_id') === idItemDrag);
|
|
168
|
+
if (this.items() === eventDragging.itemDragInfo?.itemsDrag() && childElement && !childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder') && !childElement.getAttribute(this.dragDropService.TargetItemDragFlag)) {
|
|
169
|
+
childElement.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');
|
|
170
|
+
this.groupID.set(elementDrag.getAttribute('groupID') || '');
|
|
171
|
+
styleTag.remove();
|
|
172
|
+
styleTag.textContent = styleContainer(this.stylesOverride() || [], this.viewEncapsulation(), this.groupID());
|
|
173
|
+
elementContainer.appendChild(styleTag);
|
|
174
|
+
this.setAttributeElementAndItemDrag(elementContainer, true);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (this.disableDragContainer()) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (this.groupID() === elementDrag.getAttribute('groupID') && !this.acceptDragSameGroup()) {
|
|
181
|
+
this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll() || !this.acceptDragSameGroup());
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (!checkMouseOverInContainer(eventDragging.mousePosition, this.rootElementScroll() || elementContainer)) {
|
|
185
|
+
if (this.isDragOver()) {
|
|
186
|
+
this.isDragOver.set(false);
|
|
187
|
+
this.outDragLeaveContainer.emit({ ...eventDragging, elementDragLeave: elementContainer });
|
|
188
|
+
}
|
|
189
|
+
return removePlaceholderDrag(eventDragging, true);
|
|
190
|
+
}
|
|
191
|
+
this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll());
|
|
192
|
+
// Đoạn code xử lý cho việc kéo một element vào 1 container nhưng container không có item hoặc item drag không over qua item trong container
|
|
193
|
+
if (!this.isDragOver()) {
|
|
194
|
+
elementContainer.classList.add('libs-ui-drag-drop-container-dragover');
|
|
195
|
+
this.isDragOver.set(true);
|
|
196
|
+
this.outDragOverContainer.emit({ ...eventDragging, elementDragOver: elementContainer });
|
|
197
|
+
}
|
|
198
|
+
const eventDragOver = { ...eventDragging, elementDragOver: elementContainer };
|
|
199
|
+
if (!this.items().length) {
|
|
200
|
+
eventDragOver.elementDragOver = {
|
|
201
|
+
getAttribute: (name) => {
|
|
202
|
+
if (name === 'groupID') {
|
|
203
|
+
return this.groupID();
|
|
204
|
+
}
|
|
205
|
+
if (name !== 'index') {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
return 0;
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
this.dragDropService.OnDragOver.next(eventDragOver);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
215
|
+
let childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(eventDragging.mousePosition, child));
|
|
216
|
+
if (childElement) {
|
|
217
|
+
// nếu tìm thấy thì sẽ nhận qua sự kiện của drag-item.directive emit
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
childElement = Array.from(childrenElement).pop();
|
|
221
|
+
if (childElement) {
|
|
222
|
+
eventDragOver.elementDragOver = childElement;
|
|
223
|
+
this.dragDropService.OnDragOver.next(eventDragOver);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const handlerDragEnd = (eventDragEnd) => {
|
|
227
|
+
if (this.disableDragContainer()) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
let rect = undefined;
|
|
231
|
+
if (this.rootElementScroll() || elementContainer) {
|
|
232
|
+
rect = (this.rootElementScroll() || elementContainer)?.getBoundingClientRect();
|
|
233
|
+
}
|
|
234
|
+
removePlaceholderDrag(eventDragEnd);
|
|
235
|
+
const { elementDrag, mousePosition, itemDragInfo } = eventDragEnd;
|
|
236
|
+
if (this.groupID() === elementDrag.getAttribute('groupID')) {
|
|
237
|
+
this.outDragEndContainer.emit({ ...eventDragEnd });
|
|
238
|
+
}
|
|
239
|
+
if (!checkMouseOverInContainer(mousePosition, this.rootElementScroll() || elementContainer, rect)) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const eventDrop = { elementDrag: elementDrag, elementDrop: elementContainer, itemDragInfo: itemDragInfo };
|
|
243
|
+
if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
247
|
+
const childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(mousePosition, child));
|
|
248
|
+
if (childElement) {
|
|
249
|
+
eventDrop.elementDrop = childElement;
|
|
250
|
+
this.dragDropService.OnDrop.next(eventDrop);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
eventDrop.elementDrop = {
|
|
254
|
+
getAttribute: (name) => {
|
|
255
|
+
if (name === 'dropContainer') {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
if (name === 'groupID') {
|
|
259
|
+
return this.groupID();
|
|
260
|
+
}
|
|
261
|
+
if (name !== 'index') {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
return childrenElement.length;
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
this.dragDropService.OnDrop.next(eventDrop);
|
|
268
|
+
};
|
|
269
|
+
const handlerDrop = (eventDrop) => {
|
|
270
|
+
if (this.disableDragContainer()) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const { elementDrag, elementDrop, itemDragInfo } = eventDrop;
|
|
274
|
+
if (this.groupID() === elementDrag.getAttribute('groupID') && this.groupID() === elementDrop.getAttribute('groupID')) {
|
|
275
|
+
if (itemDragInfo) {
|
|
276
|
+
itemDragInfo.indexDrop = Number(elementDrop.getAttribute('index')).valueOf();
|
|
277
|
+
itemDragInfo.itemsDrop = this.items;
|
|
278
|
+
itemDragInfo.containerDrop = elementContainer;
|
|
279
|
+
}
|
|
280
|
+
if (this.acceptDragSameGroup()) {
|
|
281
|
+
this.outDroppedContainer.emit(eventDrop);
|
|
282
|
+
}
|
|
283
|
+
this.removeAttributes(elementContainer);
|
|
284
|
+
this.setIndexElement(elementContainer);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (this.groupID() !== elementDrop.getAttribute('groupID') || elementDrag.getAttribute('groupID') === elementDrop.getAttribute('groupID')) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const indexDragOver = this.groupID() !== elementDrag.getAttribute('groupID') ? Number(elementDrop.getAttribute('index')).valueOf() : Number(elementDrop.getAttribute('index')).valueOf() - (elementDrop.getAttribute('dropContainer') ? 0 : 1);
|
|
291
|
+
const item = this.mode() === 'copy' ? cloneDeep(itemDragInfo?.item) : itemDragInfo?.item;
|
|
292
|
+
if (itemDragInfo) {
|
|
293
|
+
itemDragInfo.indexDrop = indexDragOver;
|
|
294
|
+
itemDragInfo.itemsDrop = this.items;
|
|
295
|
+
itemDragInfo.containerDrop = elementContainer;
|
|
296
|
+
}
|
|
297
|
+
if (!this.items().length) {
|
|
298
|
+
this.outDroppedContainerEmpty.emit(eventDrop);
|
|
299
|
+
}
|
|
300
|
+
this.items.update((items) => {
|
|
301
|
+
items.splice(indexDragOver, 0, item);
|
|
302
|
+
return [...items];
|
|
303
|
+
});
|
|
304
|
+
if (itemDragInfo && itemDragInfo.itemsMove && itemDragInfo.itemsMove()) {
|
|
305
|
+
itemDragInfo.itemsDrag.set([...itemDragInfo.itemsMove()]);
|
|
306
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
307
|
+
}
|
|
308
|
+
this.outDroppedContainer.emit(eventDrop);
|
|
309
|
+
this.removeAttributes(elementContainer);
|
|
310
|
+
this.setIndexElement(elementContainer);
|
|
311
|
+
};
|
|
312
|
+
[
|
|
313
|
+
{
|
|
314
|
+
name: 'OnDragStart',
|
|
315
|
+
event: this.dragDropService.OnDragStart,
|
|
316
|
+
functionCall: handlerDragStart,
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
name: 'OnDragOver',
|
|
320
|
+
event: this.dragDropService.OnDragOver,
|
|
321
|
+
functionCall: handlerDragOver,
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'OnDragging',
|
|
325
|
+
event: this.dragDropService.OnDragging,
|
|
326
|
+
functionCall: handlerDragging,
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'OnDragEnd',
|
|
330
|
+
event: this.dragDropService.OnDragEnd,
|
|
331
|
+
functionCall: handlerDragEnd,
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
name: 'OnDrop',
|
|
335
|
+
event: this.dragDropService.OnDrop,
|
|
336
|
+
functionCall: handlerDrop,
|
|
337
|
+
},
|
|
338
|
+
].forEach((item) => item.event.pipe(takeUntil(this.onDestroy)).subscribe(item.functionCall));
|
|
339
|
+
}
|
|
340
|
+
get FunctionsControl() {
|
|
341
|
+
return {
|
|
342
|
+
setAttributeElementAndItemDrag: () => this.setAttributeElementAndItemDrag(this.elementRef.nativeElement),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/* */
|
|
346
|
+
async setAttributeElementAndItemDrag(elementContainer, setItemDrag, indexInsert) {
|
|
347
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
348
|
+
let index = -1;
|
|
349
|
+
elementContainer.setAttribute('groupID', this.groupID());
|
|
350
|
+
elementContainer.removeAttribute('disableDragContainer');
|
|
351
|
+
if (this.disableDragContainer()) {
|
|
352
|
+
elementContainer.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
|
|
353
|
+
}
|
|
354
|
+
if (this.groupName()) {
|
|
355
|
+
elementContainer.setAttribute('groupName', this.groupName() || '');
|
|
356
|
+
}
|
|
357
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
358
|
+
if (!childElement.hasAttribute('groupName') || childElement.getAttribute('groupName') === this.groupName()) {
|
|
359
|
+
childElement.setAttribute('groupID', this.groupID());
|
|
360
|
+
}
|
|
361
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
index += 1;
|
|
365
|
+
childElement.setAttribute('index', `${index}`);
|
|
366
|
+
childElement.removeAttribute('disableDragContainer');
|
|
367
|
+
if (this.disableDragContainer()) {
|
|
368
|
+
childElement.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
|
|
369
|
+
}
|
|
370
|
+
if (this.groupName() && !childElement.hasAttribute('groupName')) {
|
|
371
|
+
childElement.setAttribute('groupName', this.groupName() || '');
|
|
372
|
+
}
|
|
373
|
+
if (this.placeholder()) {
|
|
374
|
+
childElement.setAttribute('placeholder', `${this.placeholder()}`);
|
|
375
|
+
}
|
|
376
|
+
if (this.dropToGroupName()) {
|
|
377
|
+
childElement.setAttribute('dropToGroupName', `${this.dropToGroupName()?.join(';')}`);
|
|
378
|
+
}
|
|
379
|
+
if (indexInsert === index && this.placeholder()) {
|
|
380
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
|
|
381
|
+
childElement.classList.add('libs-ui-drag-drop-item-placeholder');
|
|
382
|
+
}
|
|
383
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder')) {
|
|
384
|
+
childElement.classList.add('libs-ui-drag-drop-item-drop-placeholder');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (setItemDrag && childElement.getAttribute(this.dragDropService.TargetItemDragFlag) && this.items().length >= index) {
|
|
388
|
+
if (this.placeholder()) {
|
|
389
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
|
|
390
|
+
childElement.classList.add('libs-ui-drag-drop-item-placeholder');
|
|
391
|
+
}
|
|
392
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-origin-placeholder')) {
|
|
393
|
+
childElement.classList.add('libs-ui-drag-drop-item-origin-placeholder');
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
this.dragDropService.ItemDragInfo = { item: this.items()[index], indexDrag: index, itemsDrag: this.items, containerDrag: elementContainer, itemsMove: signal([...this.items()]) };
|
|
397
|
+
if (this.mode() === 'move') {
|
|
398
|
+
this.dragDropService.ItemDragInfo.itemsMove?.update((items) => {
|
|
399
|
+
items.splice(index, 1);
|
|
400
|
+
return [...items];
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
initStyleAndAttribute(elementContainer, hasRemoveAttribute = false) {
|
|
407
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
408
|
+
if (hasRemoveAttribute) {
|
|
409
|
+
this.removeAttributes(elementContainer);
|
|
410
|
+
}
|
|
411
|
+
this.setIndexElement(elementContainer);
|
|
412
|
+
}
|
|
413
|
+
setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver) {
|
|
414
|
+
if (!this.directionDrag() || !elementDragOver) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
if (this.directionDrag() === 'vertical') {
|
|
418
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-bottom');
|
|
419
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-top');
|
|
420
|
+
if (indexDrag > indexDragOver) {
|
|
421
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-bottom');
|
|
422
|
+
}
|
|
423
|
+
if (indexDrag < indexDragOver) {
|
|
424
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-top');
|
|
425
|
+
}
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-left');
|
|
429
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-right');
|
|
430
|
+
if (indexDrag > indexDragOver) {
|
|
431
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-right');
|
|
432
|
+
}
|
|
433
|
+
if (indexDrag < indexDragOver) {
|
|
434
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-left');
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
setIndexElement(elementContainer) {
|
|
438
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
439
|
+
let index = -1;
|
|
440
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
441
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
index += 1;
|
|
445
|
+
childElement.setAttribute('index', `${index}`);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
removeAttributes(elementContainer, ignoreRemoveClassItemOriginPlaceholder) {
|
|
449
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
450
|
+
elementContainer.classList.remove('libs-ui-drag-drop-container-dragover');
|
|
451
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
452
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
childElement.removeAttribute('index');
|
|
456
|
+
if (!this.dropToGroupName() || !this.dropToGroupName()?.length) {
|
|
457
|
+
childElement.removeAttribute('dropToGroupName');
|
|
458
|
+
}
|
|
459
|
+
if (!this.placeholder()) {
|
|
460
|
+
childElement.removeAttribute('placeholder');
|
|
461
|
+
}
|
|
462
|
+
if (this.placeholder()) {
|
|
463
|
+
childElement.classList.remove('libs-ui-drag-drop-item-placeholder');
|
|
464
|
+
if (!ignoreRemoveClassItemOriginPlaceholder) {
|
|
465
|
+
childElement.classList.remove('libs-ui-drag-drop-item-origin-placeholder');
|
|
466
|
+
}
|
|
467
|
+
childElement.classList.remove('libs-ui-drag-drop-item-drop-placeholder');
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDragContainerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
472
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiComponentsDragContainerDirective, isStandalone: true, selector: "[LibsUiComponentsDragContainerDirective]", inputs: { disableDragContainer: { classPropertyName: "disableDragContainer", publicName: "disableDragContainer", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, directionDrag: { classPropertyName: "directionDrag", publicName: "directionDrag", isSignal: true, isRequired: false, transformFunction: null }, viewEncapsulation: { classPropertyName: "viewEncapsulation", publicName: "viewEncapsulation", isSignal: true, isRequired: false, transformFunction: null }, acceptDragSameGroup: { classPropertyName: "acceptDragSameGroup", publicName: "acceptDragSameGroup", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, groupName: { classPropertyName: "groupName", publicName: "groupName", isSignal: true, isRequired: false, transformFunction: null }, dropToGroupName: { classPropertyName: "dropToGroupName", publicName: "dropToGroupName", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, stylesOverride: { classPropertyName: "stylesOverride", publicName: "stylesOverride", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", outDragStartContainer: "outDragStartContainer", outDragOverContainer: "outDragOverContainer", outDragLeaveContainer: "outDragLeaveContainer", outDragEndContainer: "outDragEndContainer", outDroppedContainer: "outDroppedContainer", outDroppedContainerEmpty: "outDroppedContainerEmpty", outFunctionControl: "outFunctionControl" }, usesInheritance: true, ngImport: i0 });
|
|
473
|
+
}
|
|
474
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDragContainerDirective, decorators: [{
|
|
475
|
+
type: Directive,
|
|
476
|
+
args: [{
|
|
477
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
478
|
+
selector: '[LibsUiComponentsDragContainerDirective]',
|
|
479
|
+
standalone: true,
|
|
480
|
+
}]
|
|
481
|
+
}], ctorParameters: () => [] });
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hKLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU85RSxNQUFNLE9BQU8sc0NBQXVDLFNBQVEsbUNBQW1DO0lBQzdGLG1CQUFtQjtJQUNYLE9BQU8sR0FBRyxNQUFNLENBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqQyxVQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxnQkFBZ0I7SUFDUCxvQkFBb0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUEwQixNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLGFBQWEsR0FBRyxLQUFLLEVBQTZCLENBQUM7SUFDbkQsaUJBQWlC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LElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDO29CQUM1QyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2dCQUM3RSxDQUFDO2dCQUNELFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F2aEJVLHNDQUFzQzs0RkFBdEMsc0NBQXNDOzs0RkFBdEMsc0NBQXNDO2tCQUxsRCxTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLDBDQUEwQztvQkFDcEQsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgT25EZXN0cm95LCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBjbG9uZURlZXAsIGdldCwgc2V0LCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3R5bGVDb250YWluZXIgfSBmcm9tICcuL2RlZmluZXMvY3NzLmRlZmluZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSB9IGZyb20gJy4vZHJhZy1zY3JvbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRHJhZ0VuZCwgSURyYWdMZWF2ZSwgSURyYWdPdmVyLCBJRHJhZ1N0YXJ0LCBJRHJhZ2dpbmcsIElEcm9wIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2V2ZW50LmludGVyZmFjZSc7XG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgZXh0ZW5kcyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBncm91cElEID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJpdmF0ZSBpc0RyYWdPdmVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgZGlzYWJsZURyYWdDb250YWluZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBtb2RlID0gaW5wdXQ8c3RyaW5nLCAnbW92ZScgfCAnY29weSc+KCdtb3ZlJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ21vdmUnIH0pO1xuICByZWFkb25seSBkaXJlY3Rpb25EcmFnID0gaW5wdXQ8J2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJz4oKTtcbiAgcmVhZG9ubHkgdmlld0VuY2Fwc3VsYXRpb24gPSBpbnB1dDwnZW11bGF0ZWQnIHwgJ25vbmUnLCAnZW11bGF0ZWQnIHwgJ25vbmUnIHwgdW5kZWZpbmVkPignZW11bGF0ZWQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnZW11bGF0ZWQnIH0pO1xuICByZWFkb25seSBhY2NlcHREcmFnU2FtZUdyb3VwID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHRydWUgfSk7XG4gIHJlYWRvbmx5IGdyb3VwTmFtZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnIH0pOyAvLyBu4bq/dSBjw6FjIGdyb3VwIGPDsyB0w6puIHRyw7luZyBuaGF1IHPhur0gxJHGsOG7o2MgZHJvcFxuICByZWFkb25seSBkcm9wVG9Hcm91cE5hbWUgPSBpbnB1dDxBcnJheTxzdHJpbmc+IHwgbnVsbD4obnVsbCk7IC8vIG7hur91IGl0ZW0gdHJvbmcgY8OhYyBncm91cCBBIMSRxrDhu6NjIGRyb3AgdsOgbyBncm91cCBCIG5oxrBuZyBncm91cCBCIGtow7RuZyDEkcaw4bujYyBkcm9wIHbDoG8gZ3JvdXAgQVxuICByZWFkb25seSBpdGVtcyA9IG1vZGVsLnJlcXVpcmVkPEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBzdHlsZXNPdmVycmlkZSA9IGlucHV0PEFycmF5PHsgY2xhc3NOYW1lOiBzdHJpbmc7IHN0eWxlczogc3RyaW5nIH0+PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dERyYWdTdGFydENvbnRhaW5lciA9IG91dHB1dDxJRHJhZ1N0YXJ0PigpO1xuICByZWFkb25seSBvdXREcmFnT3ZlckNvbnRhaW5lciA9IG91dHB1dDxJRHJhZ092ZXI+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdMZWF2ZUNvbnRhaW5lciA9IG91dHB1dDxJRHJhZ0xlYXZlPigpO1xuICByZWFkb25seSBvdXREcmFnRW5kQ29udGFpbmVyID0gb3V0cHV0PElEcmFnRW5kPigpO1xuICByZWFkb25seSBvdXREcm9wcGVkQ29udGFpbmVyID0gb3V0cHV0PElEcm9wPigpO1xuICByZWFkb25seSBvdXREcm9wcGVkQ29udGFpbmVyRW1wdHkgPSBvdXRwdXQ8SURyb3A+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJRHJhZ0Ryb3BGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjb250YWluZXI6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQsIGVsZW1lbnRTY3JvbGw/OiBIVE1MRWxlbWVudCB9ID0geyBlbGVtZW50IH07XG5cbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Db250YWluZXIoKS5zZXQodGhpcy5ncm91cElEKCksIGNvbnRhaW5lcik7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudFNjcm9sbCA9IHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKTtcbiAgICAgIGlmICghZWxlbWVudFNjcm9sbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBzZXQoY29udGFpbmVyLCAnZWxlbWVudFNjcm9sbCcsIGVsZW1lbnRTY3JvbGwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uRHJhZygpICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbkNvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuXG4gICAgdGhpcy5vdXREcm9wcGVkQ29udGFpbmVyLnN1YnNjcmliZSgoZXZlbnREcm9wcGVkKSA9PiB7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3BDb250YWluZXIubmV4dChldmVudERyb3BwZWQpO1xuICAgIH0pO1xuICAgIHRoaXMub25EZXN0cm95LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoaW5kZXhTcGxpY2VMaXN0VG8gPiAtMSkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhTcGxpY2VMaXN0VG8sIDEpO1xuICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuQ29udGFpbmVyKCkuZGVsZXRlKHRoaXMuZ3JvdXBJRCgpKTtcbiAgICB9KTtcbiAgICBjb25zdCBlbGVtZW50Q29udGFpbmVyID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICB0aGlzLmluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyLCB0cnVlKTtcbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Pbkl0ZW1Jbml0LnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgIGZpbHRlcigoZ3JvdXBOYW1lKSA9PiBncm91cE5hbWUgPT09IHRoaXMuZ3JvdXBOYW1lKCkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaW5pdFN0eWxlQW5kQXR0cmlidXRlKGVsZW1lbnRDb250YWluZXIpKTtcbiAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlQ29udGFpbmVyKHRoaXMuc3R5bGVzT3ZlcnJpZGUoKSB8fCBbXSwgdGhpcy52aWV3RW5jYXBzdWxhdGlvbigpLCB0aGlzLmdyb3VwSUQoKSk7XG4gICAgZWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgZWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzQ29udGFpbmVyRGVmaW5lKTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcmFnU3RhcnQgPSAoZXZlbnREcmFnU3RhcnQ6IElEcmFnU3RhcnQpID0+IHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBldmVudERyYWdTdGFydC5lbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICB0aGlzLm91dERyYWdTdGFydENvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnU3RhcnQsIGl0ZW1EcmFnSW5mbzogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzdG9yZUluZGV4ID0geyBpbmRleERyYWc6IC0xLCBpbmRleERyYWdPdmVyOiAtMSB9O1xuICAgIGxldCBpbmRleFNwbGljZUxpc3RUbyA9IC0xO1xuICAgIGNvbnN0IGhhbmRsZXJEcmFnT3ZlciA9IChldmVudERyYWdPdmVyOiBJRHJhZ092ZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIGVsZW1lbnREcmFnT3ZlciB9ID0gZXZlbnREcmFnT3ZlcjtcblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSB8fCAhdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2hlY2tFbGVtZW50T3ZlckFjY2VwdEVsZW1lbnREcmFnKHRoaXMuZ3JvdXBOYW1lKCksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJyksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4RHJhZyA9IE51bWJlcihlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKTtcbiAgICAgIGNvbnN0IGluZGV4RHJhZ092ZXIgPSBOdW1iZXIoZWxlbWVudERyYWdPdmVyLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpO1xuICAgICAgY29uc3QgaWRHcm91cEVsZW1lbnREcmFnID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJyk7XG4gICAgICBjb25zdCBpZEdyb3VwRWxlbWVudERyYWdPdmVyID0gZWxlbWVudERyYWdPdmVyLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpO1xuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgIT09IGlkR3JvdXBFbGVtZW50RHJhZyB8fCBpZEdyb3VwRWxlbWVudERyYWcgIT09IGlkR3JvdXBFbGVtZW50RHJhZ092ZXIpIHtcbiAgICAgICAgLy8geOG7rSBsw70gY2hvIGl0ZW0gZHJhZyBvdmVyIHF1YSAxIGl0ZW0ga2jDoWMgY29udGFpbmVyXG4gICAgICAgIGlmIChpZEdyb3VwRWxlbWVudERyYWdPdmVyID09PSB0aGlzLmdyb3VwSUQoKSAmJiB0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5tb2RlKCkgPT09ICdjb3B5JyA/IGNsb25lRGVlcCh0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8/Lml0ZW0pIDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvPy5pdGVtO1xuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZGV4U3BsaWNlTGlzdFRvID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgZmFsc2UsIGluZGV4U3BsaWNlTGlzdFRvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkgfHxcbiAgICAgICAgaW5kZXhEcmFnIDwgMCB8fFxuICAgICAgICBpbmRleERyYWdPdmVyIDwgMCB8fFxuICAgICAgICAhdGhpcy5pdGVtcygpLmxlbmd0aCB8fFxuICAgICAgICBpbmRleERyYWcgPiB0aGlzLml0ZW1zKCkubGVuZ3RoIHx8XG4gICAgICAgIGluZGV4RHJhZ092ZXIgPiB0aGlzLml0ZW1zKCkubGVuZ3RoIHx8XG4gICAgICAgIChzdG9yZUluZGV4LmluZGV4RHJhZyA9PT0gaW5kZXhEcmFnICYmIHN0b3JlSW5kZXguaW5kZXhEcmFnT3ZlciA9PT0gaW5kZXhEcmFnT3ZlcilcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB44butIGzDvSBjaG8gaXRlbSBkcmFnIG92ZXIgcXVhIDEgaXRlbSBjw7luZyBjb250YWluZXJcbiAgICAgIGNvbnN0IGl0ZW1EcmFnID0gdGhpcy5pdGVtcygpW2luZGV4RHJhZ107XG5cbiAgICAgIHRoaXMuc2V0QW5pbWF0aW9uRWxlbWVudERyYWdPdmVyKGluZGV4RHJhZywgaW5kZXhEcmFnT3ZlciwgZWxlbWVudERyYWdPdmVyKTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnID0gaW5kZXhEcmFnO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnLCAxKTtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZ092ZXIsIDAsIGl0ZW1EcmFnKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnREcmFnLnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBpbmRleERyYWdPdmVyLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbW92ZVBsYWNlaG9sZGVyRHJhZyA9IChldmVudERyYWc6IElEcmFnRW5kLCBpc0RyYWdnaW5nPzogYm9vbGVhbikgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsU2Nyb2xsVG9FbGVtZW50KCkpO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWcgPSAtMTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnT3ZlciA9IC0xO1xuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWcubW91c2VQb3NpdGlvbiwgdGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudEluZGV4ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kSW5kZXgoKGNoaWxkKSA9PiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJvcC1wbGFjZWhvbGRlcicpKTtcblxuICAgICAgICBpZiAoY2hpbGRFbGVtZW50SW5kZXggPj0gMCAmJiB0aGlzLmdyb3VwSUQoKSAhPT0gZXZlbnREcmFnLmVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoY2hpbGRFbGVtZW50SW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcblxuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lciwgaXNEcmFnZ2luZyk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleFNwbGljZUxpc3RUbyA+PSAwKSB7XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleFNwbGljZUxpc3RUbywgMSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdnaW5nID0gKGV2ZW50RHJhZ2dpbmc6IElEcmFnZ2luZykgPT4ge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnIH0gPSBldmVudERyYWdnaW5nO1xuICAgICAgY29uc3QgZmllbGRJZEl0ZW0gPSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2ZpZWxkX2lkJyk7XG4gICAgICBjb25zdCBpZEl0ZW1EcmFnID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJyk7XG5cbiAgICAgIGlmIChmaWVsZElkSXRlbSAmJiBpZEl0ZW1EcmFnICYmIHRoaXMuaXRlbXMoKS5maW5kKChpdGVtKSA9PiBnZXQoaXRlbSwgZmllbGRJZEl0ZW0pID09PSBpZEl0ZW1EcmFnKSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kKChjaGlsZCkgPT4gY2hpbGQuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJykgPT09IGlkSXRlbURyYWcpO1xuXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKCkgPT09IGV2ZW50RHJhZ2dpbmcuaXRlbURyYWdJbmZvPy5pdGVtc0RyYWcoKSAmJiBjaGlsZEVsZW1lbnQgJiYgIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJvcC1wbGFjZWhvbGRlcicpICYmICFjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLlRhcmdldEl0ZW1EcmFnRmxhZykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLlRhcmdldEl0ZW1EcmFnRmxhZywgJ3RydWUnKTtcbiAgICAgICAgICB0aGlzLmdyb3VwSUQuc2V0KGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8ICcnKTtcbiAgICAgICAgICBzdHlsZVRhZy5yZW1vdmUoKTtcbiAgICAgICAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlQ29udGFpbmVyKHRoaXMuc3R5bGVzT3ZlcnJpZGUoKSB8fCBbXSwgdGhpcy52aWV3RW5jYXBzdWxhdGlvbigpLCB0aGlzLmdyb3VwSUQoKSk7XG4gICAgICAgICAgZWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgJiYgIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRTY3JvbGxFbGVtZW50VG9Qb3NpdGlvbihldmVudERyYWdnaW5nLCB0aGlzLmlnbm9yZUF1dG9TY3JvbGwoKSB8fCAhdGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWdnaW5nLm1vdXNlUG9zaXRpb24sIHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSkge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdPdmVyKCkpIHtcbiAgICAgICAgICB0aGlzLmlzRHJhZ092ZXIuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLm91dERyYWdMZWF2ZUNvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnZ2luZywgZWxlbWVudERyYWdMZWF2ZTogZWxlbWVudENvbnRhaW5lciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW1vdmVQbGFjZWhvbGRlckRyYWcoZXZlbnREcmFnZ2luZywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrQW5kU2Nyb2xsRWxlbWVudFRvUG9zaXRpb24oZXZlbnREcmFnZ2luZywgdGhpcy5pZ25vcmVBdXRvU2Nyb2xsKCkpO1xuXG4gICAgICAvLyDEkG/huqFuIGNvZGUgeOG7rSBsw70gY2hvIHZp4buHYyBrw6lvIG3hu5l0IGVsZW1lbnQgdsOgbyAxIGNvbnRhaW5lciBuaMawbmcgY29udGFpbmVyIGtow7RuZyBjw7MgaXRlbSBob+G6t2MgaXRlbSBkcmFnIGtow7RuZyBvdmVyIHF1YSBpdGVtIHRyb25nIGNvbnRhaW5lclxuICAgICAgaWYgKCF0aGlzLmlzRHJhZ092ZXIoKSkge1xuICAgICAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lci1kcmFnb3ZlcicpO1xuICAgICAgICB0aGlzLmlzRHJhZ092ZXIuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLm91dERyYWdPdmVyQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ092ZXI6IGVsZW1lbnRDb250YWluZXIgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudERyYWdPdmVyID0geyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ092ZXI6IGVsZW1lbnRDb250YWluZXIgfTtcblxuICAgICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIGV2ZW50RHJhZ092ZXIuZWxlbWVudERyYWdPdmVyID0ge1xuICAgICAgICAgIGdldEF0dHJpYnV0ZTogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdncm91cElEJykge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cElEKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdPdmVyLm5leHQoZXZlbnREcmFnT3Zlcik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgIGxldCBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmQoKGNoaWxkKSA9PiBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50RHJhZ2dpbmcubW91c2VQb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkge1xuICAgICAgICAvLyBu4bq/dSB0w6xtIHRo4bqleSB0aMOsIHPhur0gbmjhuq1uIHF1YSBz4buxIGtp4buHbiBj4bunYSBkcmFnLWl0ZW0uZGlyZWN0aXZlIGVtaXRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5wb3AoKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkge1xuICAgICAgICBldmVudERyYWdPdmVyLmVsZW1lbnREcmFnT3ZlciA9IGNoaWxkRWxlbWVudDtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3Zlci5uZXh0KGV2ZW50RHJhZ092ZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJhZ0VuZCA9IChldmVudERyYWdFbmQ6IElEcmFnRW5kKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCByZWN0ID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpIHtcbiAgICAgICAgcmVjdCA9ICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcik/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgfVxuICAgICAgcmVtb3ZlUGxhY2Vob2xkZXJEcmFnKGV2ZW50RHJhZ0VuZCk7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnLCBtb3VzZVBvc2l0aW9uLCBpdGVtRHJhZ0luZm8gfSA9IGV2ZW50RHJhZ0VuZDtcblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICB0aGlzLm91dERyYWdFbmRDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ0VuZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihtb3VzZVBvc2l0aW9uLCB0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lciwgcmVjdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZXZlbnREcm9wID0geyBlbGVtZW50RHJhZzogZWxlbWVudERyYWcsIGVsZW1lbnREcm9wOiBlbGVtZW50Q29udGFpbmVyLCBpdGVtRHJhZ0luZm86IGl0ZW1EcmFnSW5mbyB9O1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpIHx8ICF0aGlzLmRyYWdEcm9wU2VydmljZS5jaGVja0VsZW1lbnRPdmVyQWNjZXB0RWxlbWVudERyYWcodGhpcy5ncm91cE5hbWUoKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cE5hbWUnKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZCgoY2hpbGQpID0+IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VQb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkge1xuICAgICAgICBldmVudERyb3AuZWxlbWVudERyb3AgPSBjaGlsZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcC5uZXh0KGV2ZW50RHJvcCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZlbnREcm9wLmVsZW1lbnREcm9wID0ge1xuICAgICAgICBnZXRBdHRyaWJ1dGU6IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAobmFtZSA9PT0gJ2Ryb3BDb250YWluZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5hbWUgPT09ICdncm91cElEJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBJRCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmFtZSAhPT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkcmVuRWxlbWVudC5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AubmV4dChldmVudERyb3ApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJvcCA9IChldmVudERyb3A6IElEcm9wKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIGVsZW1lbnREcm9wLCBpdGVtRHJhZ0luZm8gfSA9IGV2ZW50RHJvcDtcblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAmJiB0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgaWYgKGl0ZW1EcmFnSW5mbykge1xuICAgICAgICAgIGl0ZW1EcmFnSW5mby5pbmRleERyb3AgPSBOdW1iZXIoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJvcCA9IHRoaXMuaXRlbXM7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLmNvbnRhaW5lckRyb3AgPSBlbGVtZW50Q29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSkge1xuICAgICAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lci5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgIT09IGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpID09PSBlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleERyYWdPdmVyID0gdGhpcy5ncm91cElEKCkgIT09IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpID8gTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpIDogTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpIC0gKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZHJvcENvbnRhaW5lcicpID8gMCA6IDEpO1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZSgpID09PSAnY29weScgPyBjbG9uZURlZXAoaXRlbURyYWdJbmZvPy5pdGVtKSA6IGl0ZW1EcmFnSW5mbz8uaXRlbTtcblxuICAgICAgaWYgKGl0ZW1EcmFnSW5mbykge1xuICAgICAgICBpdGVtRHJhZ0luZm8uaW5kZXhEcm9wID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJvcCA9IHRoaXMuaXRlbXM7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5jb250YWluZXJEcm9wID0gZWxlbWVudENvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lckVtcHR5LmVtaXQoZXZlbnREcm9wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcbiAgICAgIGlmIChpdGVtRHJhZ0luZm8gJiYgaXRlbURyYWdJbmZvLml0ZW1zTW92ZSAmJiBpdGVtRHJhZ0luZm8uaXRlbXNNb3ZlKCkpIHtcbiAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJhZy5zZXQoWy4uLml0ZW1EcmFnSW5mby5pdGVtc01vdmUoKV0pO1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lci5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnT25EcmFnU3RhcnQnLFxuICAgICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnU3RhcnQsXG4gICAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdTdGFydCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdPbkRyYWdPdmVyJyxcbiAgICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIsXG4gICAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdPdmVyLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ09uRHJhZ2dpbmcnLFxuICAgICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnZ2luZyxcbiAgICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ2dpbmcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnT25EcmFnRW5kJyxcbiAgICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ0VuZCxcbiAgICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ0VuZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdPbkRyb3AnLFxuICAgICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wLFxuICAgICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcm9wLFxuICAgICAgfSxcbiAgICBdLmZvckVhY2goKGl0ZW06IHsgbmFtZTogc3RyaW5nOyBldmVudDogT2JzZXJ2YWJsZTx1bmtub3duPjsgZnVuY3Rpb25DYWxsOiBvYmplY3QgfSkgPT4gaXRlbS5ldmVudC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShpdGVtLmZ1bmN0aW9uQ2FsbCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnOiAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCksXG4gICAgfTtcbiAgfVxuXG4gIC8qICovXG4gIHByaXZhdGUgYXN5bmMgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBzZXRJdGVtRHJhZz86IGJvb2xlYW4sIGluZGV4SW5zZXJ0PzogbnVtYmVyKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicsIGAke3RoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdncm91cE5hbWUnLCB0aGlzLmdyb3VwTmFtZSgpIHx8ICcnKTtcbiAgICB9XG4gICAgQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgfHwgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgPT09IHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgIT09IHRoaXMuZ3JvdXBJRCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdpbmRleCcsIGAke2luZGV4fWApO1xuICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInLCBgJHt0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCl9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ncm91cE5hbWUoKSAmJiAhY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJywgdGhpcy5ncm91cE5hbWUoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgYCR7dGhpcy5wbGFjZWhvbGRlcigpfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJvcFRvR3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJywgYCR7dGhpcy5kcm9wVG9Hcm91cE5hbWUoKT8uam9pbignOycpfWApO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4SW5zZXJ0ID09PSBpbmRleCAmJiB0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNldEl0ZW1EcmFnICYmIGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUodGhpcy5kcmFnRHJvcFNlcnZpY2UuVGFyZ2V0SXRlbURyYWdGbGFnKSAmJiB0aGlzLml0ZW1zKCkubGVuZ3RoID49IGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgICAgY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gPSB7IGl0ZW06IHRoaXMuaXRlbXMoKVtpbmRleF0gYXMgb2JqZWN0LCBpbmRleERyYWc6IGluZGV4LCBpdGVtc0RyYWc6IHRoaXMuaXRlbXMsIGNvbnRhaW5lckRyYWc6IGVsZW1lbnRDb250YWluZXIsIGl0ZW1zTW92ZTogc2lnbmFsKFsuLi50aGlzLml0ZW1zKCldKSB9O1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb3ZlJykge1xuICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mby5pdGVtc01vdmU/LnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGhhc1JlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgaWYgKGhhc1JlbW92ZUF0dHJpYnV0ZSkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QW5pbWF0aW9uRWxlbWVudERyYWdPdmVyKGluZGV4RHJhZzogbnVtYmVyLCBpbmRleERyYWdPdmVyOiBudW1iZXIsIGVsZW1lbnREcmFnT3ZlcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuZGlyZWN0aW9uRHJhZygpIHx8ICFlbGVtZW50RHJhZ092ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uRHJhZygpID09PSAndmVydGljYWwnKSB7XG4gICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtYm90dG9tJyk7XG4gICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtdG9wJyk7XG4gICAgICBpZiAoaW5kZXhEcmFnID4gaW5kZXhEcmFnT3Zlcikge1xuICAgICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtYm90dG9tJyk7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhEcmFnIDwgaW5kZXhEcmFnT3Zlcikge1xuICAgICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtdG9wJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtbGVmdCcpO1xuICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1yaWdodCcpO1xuICAgIGlmIChpbmRleERyYWcgPiBpbmRleERyYWdPdmVyKSB7XG4gICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtcmlnaHQnKTtcbiAgICB9XG4gICAgaWYgKGluZGV4RHJhZyA8IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1sZWZ0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBgJHtpbmRleH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCwgaWdub3JlUmVtb3ZlQ2xhc3NJdGVtT3JpZ2luUGxhY2Vob2xkZXI/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lci1kcmFnb3ZlcicpO1xuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpbmRleCcpO1xuICAgICAgaWYgKCF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpIHx8ICF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpPy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICBpZiAoIWlnbm9yZVJlbW92ZUNsYXNzSXRlbU9yaWdpblBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tb3JpZ2luLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJvcC1wbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|