@worktile/gantt 18.1.0-next.2 → 19.0.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/components/main/gantt-main.component.d.ts +3 -2
- package/fesm2022/worktile-gantt.mjs +124 -127
- package/fesm2022/worktile-gantt.mjs.map +1 -1
- package/gantt-item-upper.d.ts +1 -1
- package/gantt-upper.d.ts +1 -1
- package/gantt.module.d.ts +1 -1
- package/gantt.pipe.d.ts +5 -5
- package/package.json +4 -6
- package/esm2022/class/baseline.mjs +0 -18
- package/esm2022/class/date-point.mjs +0 -11
- package/esm2022/class/event.mjs +0 -27
- package/esm2022/class/group.mjs +0 -17
- package/esm2022/class/index.mjs +0 -9
- package/esm2022/class/item.mjs +0 -85
- package/esm2022/class/link.mjs +0 -19
- package/esm2022/class/toolbar.mjs +0 -2
- package/esm2022/class/view-type.mjs +0 -10
- package/esm2022/components/bar/bar-drag.mjs +0 -560
- package/esm2022/components/bar/bar.component.mjs +0 -132
- package/esm2022/components/baseline/baseline.component.mjs +0 -43
- package/esm2022/components/calendar/grid/calendar-grid.component.mjs +0 -66
- package/esm2022/components/calendar/header/calendar-header.component.mjs +0 -70
- package/esm2022/components/drag-backdrop/drag-backdrop.component.mjs +0 -21
- package/esm2022/components/icon/icon.component.mjs +0 -37
- package/esm2022/components/icon/icons.mjs +0 -93
- package/esm2022/components/links/lines/curve.mjs +0 -95
- package/esm2022/components/links/lines/factory.mjs +0 -14
- package/esm2022/components/links/lines/line.mjs +0 -24
- package/esm2022/components/links/lines/straight.mjs +0 -58
- package/esm2022/components/links/links.component.mjs +0 -196
- package/esm2022/components/loader/loader.component.mjs +0 -30
- package/esm2022/components/main/gantt-main.component.mjs +0 -94
- package/esm2022/components/range/range.component.mjs +0 -25
- package/esm2022/components/scrollbar/scrollbar.component.mjs +0 -27
- package/esm2022/components/table/body/gantt-table-body.component.mjs +0 -329
- package/esm2022/components/table/header/gantt-table-header.component.mjs +0 -152
- package/esm2022/components/toolbar/toolbar.component.mjs +0 -37
- package/esm2022/gantt-abstract.mjs +0 -3
- package/esm2022/gantt-dom.service.mjs +0 -156
- package/esm2022/gantt-drag-container.mjs +0 -78
- package/esm2022/gantt-item-upper.mjs +0 -67
- package/esm2022/gantt-print.service.mjs +0 -94
- package/esm2022/gantt-upper.mjs +0 -402
- package/esm2022/gantt.component.mjs +0 -361
- package/esm2022/gantt.config.mjs +0 -69
- package/esm2022/gantt.module.mjs +0 -141
- package/esm2022/gantt.pipe.mjs +0 -61
- package/esm2022/gantt.styles.mjs +0 -10
- package/esm2022/i18n/i18n.mjs +0 -12
- package/esm2022/i18n/index.mjs +0 -18
- package/esm2022/i18n/locales/de-de.mjs +0 -51
- package/esm2022/i18n/locales/en-us.mjs +0 -49
- package/esm2022/i18n/locales/ja-jp.mjs +0 -49
- package/esm2022/i18n/locales/ru-ru.mjs +0 -51
- package/esm2022/i18n/locales/zh-hans.mjs +0 -49
- package/esm2022/i18n/locales/zh-hant.mjs +0 -49
- package/esm2022/public-api.mjs +0 -28
- package/esm2022/root.component.mjs +0 -174
- package/esm2022/table/gantt-column.component.mjs +0 -46
- package/esm2022/table/gantt-table.component.mjs +0 -49
- package/esm2022/utils/date.mjs +0 -180
- package/esm2022/utils/drag-scroll.mjs +0 -54
- package/esm2022/utils/helpers.mjs +0 -73
- package/esm2022/utils/passive-listeners.mjs +0 -30
- package/esm2022/utils/set-style-with-vendor-prefix.mjs +0 -15
- package/esm2022/views/day.mjs +0 -58
- package/esm2022/views/factory.mjs +0 -22
- package/esm2022/views/hour.mjs +0 -89
- package/esm2022/views/month.mjs +0 -52
- package/esm2022/views/quarter.mjs +0 -55
- package/esm2022/views/view.mjs +0 -177
- package/esm2022/views/week.mjs +0 -53
- package/esm2022/views/year.mjs +0 -54
- package/esm2022/worktile-gantt.mjs +0 -5
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
import { auditTime, filter, startWith, Subject, takeUntil } from 'rxjs';
|
|
2
|
-
import { Component, HostBinding, Input, Inject, Output, EventEmitter, ViewChildren } from '@angular/core';
|
|
3
|
-
import { coerceCssPixelValue } from '@angular/cdk/coercion';
|
|
4
|
-
import { GANTT_ABSTRACT_TOKEN } from '../../../gantt-abstract';
|
|
5
|
-
import { defaultColumnWidth } from '../header/gantt-table-header.component';
|
|
6
|
-
import { GANTT_UPPER_TOKEN } from '../../../gantt-upper';
|
|
7
|
-
import { CdkDrag, CdkDropList, CdkDragHandle } from '@angular/cdk/drag-drop';
|
|
8
|
-
import { DOCUMENT, NgIf, NgTemplateOutlet, NgFor, NgClass } from '@angular/common';
|
|
9
|
-
import { IsGanttRangeItemPipe } from '../../../gantt.pipe';
|
|
10
|
-
import { GanttIconComponent } from '../../icon/icon.component';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "../../../gantt-upper";
|
|
13
|
-
export class GanttTableBodyComponent {
|
|
14
|
-
set viewportItems(data) {
|
|
15
|
-
const firstData = data[0];
|
|
16
|
-
if (firstData && firstData.hasOwnProperty('items')) {
|
|
17
|
-
this.hasGroup = true;
|
|
18
|
-
}
|
|
19
|
-
this.ganttTableEmptyClass = data?.length ? false : true;
|
|
20
|
-
this._viewportItems = data;
|
|
21
|
-
}
|
|
22
|
-
get viewportItems() {
|
|
23
|
-
return this._viewportItems;
|
|
24
|
-
}
|
|
25
|
-
constructor(gantt, ganttUpper, cdr, document) {
|
|
26
|
-
this.gantt = gantt;
|
|
27
|
-
this.ganttUpper = ganttUpper;
|
|
28
|
-
this.cdr = cdr;
|
|
29
|
-
this.document = document;
|
|
30
|
-
this.draggable = false;
|
|
31
|
-
this.dragDropped = new EventEmitter();
|
|
32
|
-
this.dragStarted = new EventEmitter();
|
|
33
|
-
this.dragEnded = new EventEmitter();
|
|
34
|
-
this.itemClick = new EventEmitter();
|
|
35
|
-
this.ganttTableClass = true;
|
|
36
|
-
this.ganttTableEmptyClass = false;
|
|
37
|
-
this.ganttTableDragging = false;
|
|
38
|
-
this.hasExpandIcon = false;
|
|
39
|
-
// 缓存 Element 和 DragRef 的关系,方便在 Item 拖动时查找
|
|
40
|
-
this.itemDragsMap = new Map();
|
|
41
|
-
this.itemDragMoved = new Subject();
|
|
42
|
-
this.destroy$ = new Subject();
|
|
43
|
-
}
|
|
44
|
-
ngOnInit() {
|
|
45
|
-
this.columns.changes.pipe(startWith(this.columns), takeUntil(this.destroy$)).subscribe(() => {
|
|
46
|
-
this.hasExpandIcon = false;
|
|
47
|
-
this.columns.forEach((column) => {
|
|
48
|
-
if (!column.columnWidth) {
|
|
49
|
-
column.columnWidth = coerceCssPixelValue(defaultColumnWidth);
|
|
50
|
-
}
|
|
51
|
-
if (column.showExpandIcon) {
|
|
52
|
-
this.hasExpandIcon = true;
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
this.cdr.detectChanges();
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
ngAfterViewInit() {
|
|
59
|
-
this.cdkDrags.changes
|
|
60
|
-
.pipe(startWith(this.cdkDrags), takeUntil(this.destroy$))
|
|
61
|
-
.subscribe((drags) => {
|
|
62
|
-
this.itemDragsMap.clear();
|
|
63
|
-
drags.forEach((drag) => {
|
|
64
|
-
if (drag.data) {
|
|
65
|
-
// cdkDrag 变化时,缓存 Element 与 DragRef 的关系,方便 Drag Move 时查找
|
|
66
|
-
this.itemDragsMap.set(drag.element.nativeElement, drag);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
this.itemDragMoved
|
|
71
|
-
.pipe(auditTime(30),
|
|
72
|
-
// auditTime 可能会导致拖动结束后仍然执行 moved ,所以通过判断 dragging 状态来过滤无效 moved
|
|
73
|
-
filter((event) => event.source._dragRef.isDragging()), takeUntil(this.destroy$))
|
|
74
|
-
.subscribe((event) => {
|
|
75
|
-
this.onItemDragMoved(event);
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
expandGroup(group) {
|
|
79
|
-
this.gantt.expandGroup(group);
|
|
80
|
-
}
|
|
81
|
-
expandChildren(event, item) {
|
|
82
|
-
event.stopPropagation();
|
|
83
|
-
this.gantt.expandChildren(item);
|
|
84
|
-
}
|
|
85
|
-
onItemDragStarted(event) {
|
|
86
|
-
this.ganttTableDragging = true;
|
|
87
|
-
// 拖动开始时隐藏所有的子项
|
|
88
|
-
const children = this.getChildrenElementsByElement(event.source.element.nativeElement);
|
|
89
|
-
children.forEach((element) => {
|
|
90
|
-
element.classList.add('drag-item-hide');
|
|
91
|
-
});
|
|
92
|
-
this.dragStarted.emit({
|
|
93
|
-
source: event.source.data?.origin,
|
|
94
|
-
sourceParent: this.getParentByItem(event.source.data)?.origin
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
emitItemDragMoved(event) {
|
|
98
|
-
this.itemDragMoved.next(event);
|
|
99
|
-
}
|
|
100
|
-
onItemDragMoved(event) {
|
|
101
|
-
// 通过鼠标位置查找对应的目标 Item 元素
|
|
102
|
-
let currentPointElement = this.document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y);
|
|
103
|
-
if (!currentPointElement) {
|
|
104
|
-
this.cleanupDragArtifacts();
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
let targetElement = currentPointElement.classList.contains('gantt-table-item')
|
|
108
|
-
? currentPointElement
|
|
109
|
-
: currentPointElement.closest('.gantt-table-item');
|
|
110
|
-
if (!targetElement) {
|
|
111
|
-
this.cleanupDragArtifacts();
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
// 缓存放置目标Id 并计算鼠标相对应的位置
|
|
115
|
-
this.itemDropTarget = {
|
|
116
|
-
id: this.itemDragsMap.get(targetElement)?.data.id,
|
|
117
|
-
position: this.getTargetPosition(targetElement, event)
|
|
118
|
-
};
|
|
119
|
-
// 执行外部传入的 dropEnterPredicate 判断是否允许拖入目标项
|
|
120
|
-
if (this.dropEnterPredicate) {
|
|
121
|
-
const targetDragRef = this.itemDragsMap.get(targetElement);
|
|
122
|
-
if (this.dropEnterPredicate({
|
|
123
|
-
source: event.source.data.origin,
|
|
124
|
-
target: targetDragRef.data.origin,
|
|
125
|
-
dropPosition: this.itemDropTarget.position
|
|
126
|
-
})) {
|
|
127
|
-
this.showDropPositionPlaceholder(targetElement);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
this.itemDropTarget = null;
|
|
131
|
-
this.cleanupDragArtifacts(false);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
this.showDropPositionPlaceholder(targetElement);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
onItemDragEnded(event) {
|
|
139
|
-
this.ganttTableDragging = false;
|
|
140
|
-
this.dragEnded.emit({
|
|
141
|
-
source: event.source.data?.origin,
|
|
142
|
-
sourceParent: this.getParentByItem(event.source.data)?.origin
|
|
143
|
-
});
|
|
144
|
-
// dropEnterPredicate 方法返回值为 false 时,始终未执行 onListDropped,所以只能在 dragEnded 中移除 drag-item-hide
|
|
145
|
-
const children = this.getChildrenElementsByElement(event.source.element.nativeElement);
|
|
146
|
-
children.forEach((element) => {
|
|
147
|
-
element.classList.remove('drag-item-hide');
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
onListDropped(event) {
|
|
151
|
-
if (!this.itemDropTarget) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
const sourceItem = event.item.data;
|
|
155
|
-
const sourceParent = this.getParentByItem(sourceItem);
|
|
156
|
-
const sourceChildren = this.getExpandChildrenByDrag(event.item);
|
|
157
|
-
const targetDragRef = this.cdkDrags.find((item) => item.data?.id === this.itemDropTarget.id);
|
|
158
|
-
const targetItem = targetDragRef?.data;
|
|
159
|
-
const targetParent = this.getParentByItem(targetItem);
|
|
160
|
-
this.removeItem(sourceItem, sourceChildren);
|
|
161
|
-
switch (this.itemDropTarget.position) {
|
|
162
|
-
case 'before':
|
|
163
|
-
case 'after':
|
|
164
|
-
this.insertItem(targetItem, sourceItem, sourceChildren, this.itemDropTarget.position);
|
|
165
|
-
sourceItem.updateLevel(targetItem.level);
|
|
166
|
-
break;
|
|
167
|
-
case 'inside':
|
|
168
|
-
this.insertChildrenItem(targetItem, sourceItem, sourceChildren);
|
|
169
|
-
sourceItem.updateLevel(targetItem.level + 1);
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
this.dragDropped.emit({
|
|
173
|
-
source: sourceItem.origin,
|
|
174
|
-
sourceParent: sourceParent?.origin,
|
|
175
|
-
target: targetItem.origin,
|
|
176
|
-
targetParent: targetParent?.origin,
|
|
177
|
-
dropPosition: this.itemDropTarget.position
|
|
178
|
-
});
|
|
179
|
-
this.cleanupDragArtifacts(true);
|
|
180
|
-
}
|
|
181
|
-
trackBy(index, item) {
|
|
182
|
-
return item.id || index;
|
|
183
|
-
}
|
|
184
|
-
ngOnDestroy() {
|
|
185
|
-
this.destroy$.next();
|
|
186
|
-
this.destroy$.complete();
|
|
187
|
-
}
|
|
188
|
-
removeItem(item, children) {
|
|
189
|
-
this.viewportItems.splice(this.viewportItems.indexOf(item), 1 + children.length);
|
|
190
|
-
this.flatItems.splice(this.flatItems.indexOf(item), 1 + children.length);
|
|
191
|
-
}
|
|
192
|
-
insertItem(target, inserted, children, position) {
|
|
193
|
-
if (position === 'before') {
|
|
194
|
-
this.viewportItems.splice(this.viewportItems.indexOf(target), 0, inserted, ...children);
|
|
195
|
-
this.flatItems.splice(this.flatItems.indexOf(target), 0, inserted, ...children);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
const dragRef = this.cdkDrags.find((drag) => drag.data === target);
|
|
199
|
-
// 如果目标项是展开的,插入的 index 位置需要考虑子项的数量
|
|
200
|
-
let childrenCount = 0;
|
|
201
|
-
if (target.expanded) {
|
|
202
|
-
childrenCount = this.getChildrenElementsByElement(dragRef.element.nativeElement)?.length || 0;
|
|
203
|
-
}
|
|
204
|
-
this.viewportItems.splice(this.viewportItems.indexOf(target) + 1 + childrenCount, 0, inserted, ...children);
|
|
205
|
-
this.flatItems.splice(this.flatItems.indexOf(target) + 1 + childrenCount, 0, inserted, ...children);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
insertChildrenItem(target, inserted, children) {
|
|
209
|
-
if (target.expanded) {
|
|
210
|
-
this.viewportItems.splice(this.viewportItems.indexOf(target) + target.children.length + 1, 0, inserted, ...children);
|
|
211
|
-
this.flatItems.splice(this.flatItems.indexOf(target) + target.children.length + 1, 0, inserted, ...children);
|
|
212
|
-
}
|
|
213
|
-
target.children.push(inserted);
|
|
214
|
-
}
|
|
215
|
-
getParentByItem(item) {
|
|
216
|
-
return (this.flatItems || []).find((n) => {
|
|
217
|
-
return n.children?.includes(item);
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
getExpandChildrenByDrag(dragRef) {
|
|
221
|
-
if (!dragRef.data.expanded) {
|
|
222
|
-
return [];
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
const childrenElements = this.getChildrenElementsByElement(dragRef.element.nativeElement);
|
|
226
|
-
return childrenElements.map((element) => this.itemDragsMap.get(element).data);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
getChildrenElementsByElement(dragElement) {
|
|
230
|
-
// 通过循环持续查找 next element,如果 element 的 level 小于当前 item 的 level,则为它的 children
|
|
231
|
-
const children = [];
|
|
232
|
-
const dragRef = this.itemDragsMap.get(dragElement);
|
|
233
|
-
// 如果当前的 Drag 正在拖拽,会创建 PlaceholderElement 占位,所以以 PlaceholderElement 向下查找
|
|
234
|
-
let nextElement = (dragRef.getPlaceholderElement() || dragElement).nextElementSibling;
|
|
235
|
-
let nextDragRef = this.itemDragsMap.get(nextElement);
|
|
236
|
-
while (nextDragRef && nextDragRef.data.level > dragRef.data.level) {
|
|
237
|
-
children.push(nextElement);
|
|
238
|
-
nextElement = nextElement.nextElementSibling;
|
|
239
|
-
nextDragRef = this.itemDragsMap.get(nextElement);
|
|
240
|
-
}
|
|
241
|
-
return children;
|
|
242
|
-
}
|
|
243
|
-
getTargetPosition(target, event) {
|
|
244
|
-
const targetRect = target.getBoundingClientRect();
|
|
245
|
-
const beforeOrAfterGap = targetRect.height * 0.3;
|
|
246
|
-
// 将 Item 高度分为上中下三段,其中上下的 Gap 为 height 的 30%,通过判断鼠标位置在哪一段 gap 来计算对应的位置
|
|
247
|
-
if (event.pointerPosition.y - targetRect.top < beforeOrAfterGap) {
|
|
248
|
-
return 'before';
|
|
249
|
-
}
|
|
250
|
-
else if (event.pointerPosition.y >= targetRect.bottom - beforeOrAfterGap) {
|
|
251
|
-
return 'after';
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
return 'inside';
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
showDropPositionPlaceholder(targetElement) {
|
|
258
|
-
this.cleanupDragArtifacts();
|
|
259
|
-
if (this.itemDropTarget && targetElement) {
|
|
260
|
-
targetElement.classList.add(`drop-position-${this.itemDropTarget.position}`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
cleanupDragArtifacts(dropped = false) {
|
|
264
|
-
if (dropped) {
|
|
265
|
-
this.itemDropTarget = null;
|
|
266
|
-
this.document.querySelectorAll('.drag-item-hide').forEach((element) => element.classList.remove('drag-item-hide'));
|
|
267
|
-
}
|
|
268
|
-
this.document.querySelectorAll('.drop-position-before').forEach((element) => element.classList.remove('drop-position-before'));
|
|
269
|
-
this.document.querySelectorAll('.drop-position-after').forEach((element) => element.classList.remove('drop-position-after'));
|
|
270
|
-
this.document.querySelectorAll('.drop-position-inside').forEach((element) => element.classList.remove('drop-position-inside'));
|
|
271
|
-
}
|
|
272
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GanttTableBodyComponent, deps: [{ token: GANTT_ABSTRACT_TOKEN }, { token: GANTT_UPPER_TOKEN }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
273
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: GanttTableBodyComponent, isStandalone: true, selector: "gantt-table-body", inputs: { viewportItems: "viewportItems", flatItems: "flatItems", columns: "columns", groupTemplate: "groupTemplate", emptyTemplate: "emptyTemplate", rowBeforeTemplate: "rowBeforeTemplate", rowAfterTemplate: "rowAfterTemplate", draggable: "draggable", dropEnterPredicate: "dropEnterPredicate" }, outputs: { dragDropped: "dragDropped", dragStarted: "dragStarted", dragEnded: "dragEnded", itemClick: "itemClick" }, host: { properties: { "class.gantt-table-draggable": "this.draggable", "class.gantt-table-body": "this.ganttTableClass", "class.gantt-table-empty": "this.ganttTableEmptyClass", "class.gantt-table-dragging": "this.ganttTableDragging" } }, viewQueries: [{ propertyName: "cdkDrags", predicate: (CdkDrag), descendants: true }], ngImport: i0, template: "<div\n class=\"gantt-table-body-container\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"viewportItems\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n>\n <ng-container *ngIf=\"!viewportItems?.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"viewportItems && viewportItems.length > 0\">\n <ng-container *ngFor=\"let item of viewportItems; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [style.height.px]=\"gantt.styles.lineHeight\" [ngClass]=\"item.class\" *ngIf=\"item.items\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"item.expanded\" (click)=\"expandGroup(item)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, group: item.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ item.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <div\n *ngIf=\"!item.items\"\n (click)=\"itemClick.emit({ event: $event, current: item.origin, selectedValue: item.origin })\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n (cdkDragStarted)=\"onItemDragStarted($event)\"\n (cdkDragEnded)=\"onItemDragEnded($event)\"\n (cdkDragMoved)=\"emitItemDragMoved($event)\"\n class=\"gantt-table-item\"\n [class.gantt-table-item-with-group]=\"hasGroup\"\n [class.gantt-table-item-first-level-group]=\"item.level === 0 && (item.type | isGanttRangeItem)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n\n <div [classList]=\"column.classList\" *ngFor=\"let column of columns; let first = first\" [style.width]=\"column.columnWidth\">\n <!-- drag icon -->\n <gantt-icon\n *ngIf=\"first && draggable\"\n class=\"gantt-drag-handle\"\n iconName=\"drag\"\n cdkDragHandle\n [cdkDragHandleDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n ></gantt-icon>\n <!-- expand icon -->\n <div\n *ngIf=\"column?.showExpandIcon || (!hasExpandIcon && first)\"\n class=\"gantt-expand-icon\"\n [style.marginLeft.px]=\"item.level * 20\"\n >\n <ng-container *ngIf=\"item.level < gantt.maxLevel - 1 && ((gantt.async && item.expandable) || item.children?.length > 0)\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n >\n </gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <!-- column content -->\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GanttIconComponent, selector: "gantt-icon", inputs: ["iconName"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: IsGanttRangeItemPipe, name: "isGanttRangeItem" }] }); }
|
|
274
|
-
}
|
|
275
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GanttTableBodyComponent, decorators: [{
|
|
276
|
-
type: Component,
|
|
277
|
-
args: [{ selector: 'gantt-table-body', standalone: true, imports: [CdkDropList, NgIf, GanttIconComponent, NgTemplateOutlet, NgFor, NgClass, CdkDrag, CdkDragHandle, IsGanttRangeItemPipe], template: "<div\n class=\"gantt-table-body-container\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"viewportItems\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n>\n <ng-container *ngIf=\"!viewportItems?.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"viewportItems && viewportItems.length > 0\">\n <ng-container *ngFor=\"let item of viewportItems; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [style.height.px]=\"gantt.styles.lineHeight\" [ngClass]=\"item.class\" *ngIf=\"item.items\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"item.expanded\" (click)=\"expandGroup(item)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, group: item.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ item.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <div\n *ngIf=\"!item.items\"\n (click)=\"itemClick.emit({ event: $event, current: item.origin, selectedValue: item.origin })\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n (cdkDragStarted)=\"onItemDragStarted($event)\"\n (cdkDragEnded)=\"onItemDragEnded($event)\"\n (cdkDragMoved)=\"emitItemDragMoved($event)\"\n class=\"gantt-table-item\"\n [class.gantt-table-item-with-group]=\"hasGroup\"\n [class.gantt-table-item-first-level-group]=\"item.level === 0 && (item.type | isGanttRangeItem)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n\n <div [classList]=\"column.classList\" *ngFor=\"let column of columns; let first = first\" [style.width]=\"column.columnWidth\">\n <!-- drag icon -->\n <gantt-icon\n *ngIf=\"first && draggable\"\n class=\"gantt-drag-handle\"\n iconName=\"drag\"\n cdkDragHandle\n [cdkDragHandleDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n ></gantt-icon>\n <!-- expand icon -->\n <div\n *ngIf=\"column?.showExpandIcon || (!hasExpandIcon && first)\"\n class=\"gantt-expand-icon\"\n [style.marginLeft.px]=\"item.level * 20\"\n >\n <ng-container *ngIf=\"item.level < gantt.maxLevel - 1 && ((gantt.async && item.expandable) || item.children?.length > 0)\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n >\n </gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <!-- column content -->\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </ng-container>\n </ng-container>\n</div>\n" }]
|
|
278
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
279
|
-
type: Inject,
|
|
280
|
-
args: [GANTT_ABSTRACT_TOKEN]
|
|
281
|
-
}] }, { type: i1.GanttUpper, decorators: [{
|
|
282
|
-
type: Inject,
|
|
283
|
-
args: [GANTT_UPPER_TOKEN]
|
|
284
|
-
}] }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
285
|
-
type: Inject,
|
|
286
|
-
args: [DOCUMENT]
|
|
287
|
-
}] }], propDecorators: { viewportItems: [{
|
|
288
|
-
type: Input
|
|
289
|
-
}], flatItems: [{
|
|
290
|
-
type: Input
|
|
291
|
-
}], columns: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}], groupTemplate: [{
|
|
294
|
-
type: Input
|
|
295
|
-
}], emptyTemplate: [{
|
|
296
|
-
type: Input
|
|
297
|
-
}], rowBeforeTemplate: [{
|
|
298
|
-
type: Input
|
|
299
|
-
}], rowAfterTemplate: [{
|
|
300
|
-
type: Input
|
|
301
|
-
}], draggable: [{
|
|
302
|
-
type: HostBinding,
|
|
303
|
-
args: ['class.gantt-table-draggable']
|
|
304
|
-
}, {
|
|
305
|
-
type: Input
|
|
306
|
-
}], dropEnterPredicate: [{
|
|
307
|
-
type: Input
|
|
308
|
-
}], dragDropped: [{
|
|
309
|
-
type: Output
|
|
310
|
-
}], dragStarted: [{
|
|
311
|
-
type: Output
|
|
312
|
-
}], dragEnded: [{
|
|
313
|
-
type: Output
|
|
314
|
-
}], itemClick: [{
|
|
315
|
-
type: Output
|
|
316
|
-
}], ganttTableClass: [{
|
|
317
|
-
type: HostBinding,
|
|
318
|
-
args: ['class.gantt-table-body']
|
|
319
|
-
}], ganttTableEmptyClass: [{
|
|
320
|
-
type: HostBinding,
|
|
321
|
-
args: ['class.gantt-table-empty']
|
|
322
|
-
}], ganttTableDragging: [{
|
|
323
|
-
type: HostBinding,
|
|
324
|
-
args: ['class.gantt-table-dragging']
|
|
325
|
-
}], cdkDrags: [{
|
|
326
|
-
type: ViewChildren,
|
|
327
|
-
args: [(CdkDrag)]
|
|
328
|
-
}] } });
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtdGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy90YWJsZS9ib2R5L2dhbnR0LXRhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvdGFibGUvYm9keS9nYW50dC10YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQ0gsU0FBUyxFQUNULFdBQVcsRUFHWCxLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixZQUFZLEVBR1osWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBWXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBMEIsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUErRCxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUksT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFPL0QsTUFB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QyxLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVnQyxlQUFlO3NCQUFyRCxXQUFXO3VCQUFDLHdCQUF3QjtnQkFFRyxvQkFBb0I7c0JBQTNELFdBQVc7dUJBQUMseUJBQXlCO2dCQUVLLGtCQUFrQjtzQkFBNUQsV0FBVzt1QkFBQyw0QkFBNEI7Z0JBRVYsUUFBUTtzQkFBdEMsWUFBWTt1QkFBQyxDQUFBLE9BQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF1ZGl0VGltZSwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHN0YXJ0V2l0aCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBIb3N0QmluZGluZyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBRdWVyeUxpc3QsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIEluamVjdCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uRGVzdHJveSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgR2FudHRJdGVtSW50ZXJuYWwsXG4gICAgR2FudHRHcm91cEludGVybmFsLFxuICAgIEdhbnR0U2VsZWN0ZWRFdmVudCxcbiAgICBHYW50dFRhYmxlRHJvcFBvc2l0aW9uLFxuICAgIEdhbnR0VGFibGVEcmFnRW50ZXJQcmVkaWNhdGVDb250ZXh0LFxuICAgIEdhbnR0VGFibGVEcmFnRHJvcHBlZEV2ZW50LFxuICAgIEdhbnR0VGFibGVEcmFnU3RhcnRlZEV2ZW50LFxuICAgIEdhbnR0VGFibGVEcmFnRW5kZWRFdmVudFxufSBmcm9tICcuLi8uLi8uLi9jbGFzcyc7XG5pbXBvcnQgeyBOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGFibGUvZ2FudHQtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEdhbnR0QWJzdHJhY3RDb21wb25lbnQsIEdBTlRUX0FCU1RSQUNUX1RPS0VOIH0gZnJvbSAnLi4vLi4vLi4vZ2FudHQtYWJzdHJhY3QnO1xuaW1wb3J0IHsgZGVmYXVsdENvbHVtbldpZHRoIH0gZnJvbSAnLi4vaGVhZGVyL2dhbnR0LXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FudHRVcHBlciwgR0FOVFRfVVBQRVJfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi9nYW50dC11cHBlcic7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ01vdmUsIENka0RyYWdTdGFydCwgRHJhZ1JlZiwgQ2RrRHJvcExpc3QsIENka0RyYWdIYW5kbGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IERPQ1VNRU5ULCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0ZvciwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJc0dhbnR0UmFuZ2VJdGVtUGlwZSB9IGZyb20gJy4uLy4uLy4uL2dhbnR0LnBpcGUnO1xuaW1wb3J0IHsgR2FudHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dhbnR0LXRhYmxlLWJvZHknLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9nYW50dC10YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDZGtEcm9wTGlzdCwgTmdJZiwgR2FudHRJY29uQ29tcG9uZW50LCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0ZvciwgTmdDbGFzcywgQ2RrRHJhZywgQ2RrRHJhZ0hhbmRsZSwgSXNHYW50dFJhbmdlSXRlbVBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0VGFibGVCb2R5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICAgIHByaXZhdGUgX3ZpZXdwb3J0SXRlbXM6IChHYW50dEdyb3VwSW50ZXJuYWwgfCBHYW50dEl0ZW1JbnRlcm5hbClbXTtcbiAgICBASW5wdXQoKSBzZXQgdmlld3BvcnRJdGVtcyhkYXRhOiAoR2FudHRHcm91cEludGVybmFsIHwgR2FudHRJdGVtSW50ZXJuYWwpW10pIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRhID0gZGF0YVswXTtcbiAgICAgICAgaWYgKGZpcnN0RGF0YSAmJiBmaXJzdERhdGEuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2FudHRUYWJsZUVtcHR5Q2xhc3MgPSBkYXRhPy5sZW5ndGggPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0SXRlbXMgPSBkYXRhO1xuICAgIH1cblxuICAgIGdldCB2aWV3cG9ydEl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRJdGVtcztcbiAgICB9XG5cbiAgICBASW5wdXQoKSBmbGF0SXRlbXM6IChHYW50dEdyb3VwSW50ZXJuYWwgfCBHYW50dEl0ZW1JbnRlcm5hbClbXTtcblxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IFF1ZXJ5TGlzdDxOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50PjtcblxuICAgIEBJbnB1dCgpIGdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBASW5wdXQoKSBlbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgcm93QmVmb3JlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBASW5wdXQoKSByb3dBZnRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5nYW50dC10YWJsZS1kcmFnZ2FibGUnKVxuICAgIEBJbnB1dCgpXG4gICAgZHJhZ2dhYmxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBkcm9wRW50ZXJQcmVkaWNhdGU/OiAoY29udGV4dDogR2FudHRUYWJsZURyYWdFbnRlclByZWRpY2F0ZUNvbnRleHQpID0+IGJvb2xlYW47XG5cbiAgICBAT3V0cHV0KCkgZHJhZ0Ryb3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0VGFibGVEcmFnRHJvcHBlZEV2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpIGRyYWdTdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxHYW50dFRhYmxlRHJhZ1N0YXJ0ZWRFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKSBkcmFnRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0VGFibGVEcmFnRW5kZWRFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0U2VsZWN0ZWRFdmVudD4oKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUtYm9keScpIGdhbnR0VGFibGVDbGFzcyA9IHRydWU7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdhbnR0LXRhYmxlLWVtcHR5JykgZ2FudHRUYWJsZUVtcHR5Q2xhc3MgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUtZHJhZ2dpbmcnKSBnYW50dFRhYmxlRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJhZzxzdHJpbmc+KSBjZGtEcmFnczogUXVlcnlMaXN0PENka0RyYWc8R2FudHRJdGVtSW50ZXJuYWw+PjtcblxuICAgIHB1YmxpYyBoYXNHcm91cDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBoYXNFeHBhbmRJY29uID0gZmFsc2U7XG5cbiAgICAvLyDnvJPlrZggRWxlbWVudCDlkowgRHJhZ1JlZiDnmoTlhbPns7vvvIzmlrnkvr/lnKggSXRlbSDmi5bliqjml7bmn6Xmib5cbiAgICBwcml2YXRlIGl0ZW1EcmFnc01hcCA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIENka0RyYWc8R2FudHRJdGVtSW50ZXJuYWw+PigpO1xuXG4gICAgcHJpdmF0ZSBpdGVtRHJhZ01vdmVkID0gbmV3IFN1YmplY3Q8Q2RrRHJhZ01vdmU+KCk7XG5cbiAgICAvLyBJdGVtIOaLluWKqOe7j+i/h+ebruagh+aXtuS4tOaXtuiusOW9leebruagh2lk5Lul5Y+K55u45a+55bqU55uu5qCH55qE5L2N572uXG4gICAgcHJpdmF0ZSBpdGVtRHJvcFRhcmdldDoge1xuICAgICAgICBwb3NpdGlvbj86IEdhbnR0VGFibGVEcm9wUG9zaXRpb247XG4gICAgICAgIGlkPzogc3RyaW5nO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KEdBTlRUX0FCU1RSQUNUX1RPS0VOKSBwdWJsaWMgZ2FudHQ6IEdhbnR0QWJzdHJhY3RDb21wb25lbnQsXG4gICAgICAgIEBJbmplY3QoR0FOVFRfVVBQRVJfVE9LRU4pIHB1YmxpYyBnYW50dFVwcGVyOiBHYW50dFVwcGVyLFxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuY29sdW1ucyksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzRXhwYW5kSWNvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29sdW1uLmNvbHVtbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5XaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoZGVmYXVsdENvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zaG93RXhwYW5kSWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0V4cGFuZEljb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RrRHJhZ3MuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuY2RrRHJhZ3MpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkcmFnczogUXVlcnlMaXN0PENka0RyYWc8R2FudHRJdGVtSW50ZXJuYWw+PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbURyYWdzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgZHJhZ3MuZm9yRWFjaCgoZHJhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjZGtEcmFnIOWPmOWMluaXtu+8jOe8k+WtmCBFbGVtZW50IOS4jiBEcmFnUmVmIOeahOWFs+ezu++8jOaWueS+vyBEcmFnIE1vdmUg5pe25p+l5om+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1EcmFnc01hcC5zZXQoZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGRyYWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1EcmFnTW92ZWRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGF1ZGl0VGltZSgzMCksXG4gICAgICAgICAgICAgICAgLy8gIGF1ZGl0VGltZSDlj6/og73kvJrlr7zoh7Tmi5bliqjnu5PmnZ/lkI7ku43nhLbmiafooYwgbW92ZWQg77yM5omA5Lul6YCa6L+H5Yik5patIGRyYWdnaW5nIOeKtuaAgeadpei/h+a7pOaXoOaViCBtb3ZlZFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IENka0RyYWdNb3ZlKSA9PiBldmVudC5zb3VyY2UuX2RyYWdSZWYuaXNEcmFnZ2luZygpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1EcmFnTW92ZWQoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhwYW5kR3JvdXAoZ3JvdXA6IEdhbnR0R3JvdXBJbnRlcm5hbCkge1xuICAgICAgICB0aGlzLmdhbnR0LmV4cGFuZEdyb3VwKGdyb3VwKTtcbiAgICB9XG5cbiAgICBleHBhbmRDaGlsZHJlbihldmVudDogTW91c2VFdmVudCwgaXRlbTogR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZ2FudHQuZXhwYW5kQ2hpbGRyZW4oaXRlbSk7XG4gICAgfVxuXG4gICAgb25JdGVtRHJhZ1N0YXJ0ZWQoZXZlbnQ6IENka0RyYWdTdGFydDxHYW50dEl0ZW1JbnRlcm5hbD4pIHtcbiAgICAgICAgdGhpcy5nYW50dFRhYmxlRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAvLyDmi5bliqjlvIDlp4vml7bpmpDol4/miYDmnInnmoTlrZDpoblcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuRWxlbWVudHNCeUVsZW1lbnQoZXZlbnQuc291cmNlLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZy1pdGVtLWhpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0ZWQuZW1pdCh7XG4gICAgICAgICAgICBzb3VyY2U6IGV2ZW50LnNvdXJjZS5kYXRhPy5vcmlnaW4sXG4gICAgICAgICAgICBzb3VyY2VQYXJlbnQ6IHRoaXMuZ2V0UGFyZW50QnlJdGVtKGV2ZW50LnNvdXJjZS5kYXRhKT8ub3JpZ2luXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVtaXRJdGVtRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZSkge1xuICAgICAgICB0aGlzLml0ZW1EcmFnTW92ZWQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgb25JdGVtRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZTxHYW50dEl0ZW1JbnRlcm5hbD4pIHtcbiAgICAgICAgLy8g6YCa6L+H6byg5qCH5L2N572u5p+l5om+5a+55bqU55qE55uu5qCHIEl0ZW0g5YWD57SgXG4gICAgICAgIGxldCBjdXJyZW50UG9pbnRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghY3VycmVudFBvaW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gY3VycmVudFBvaW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dhbnR0LXRhYmxlLWl0ZW0nKVxuICAgICAgICAgICAgPyBjdXJyZW50UG9pbnRFbGVtZW50XG4gICAgICAgICAgICA6IChjdXJyZW50UG9pbnRFbGVtZW50LmNsb3Nlc3QoJy5nYW50dC10YWJsZS1pdGVtJykgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOe8k+WtmOaUvue9ruebruagh0lkIOW5tuiuoeeul+m8oOagh+ebuOWvueW6lOeahOS9jee9rlxuICAgICAgICB0aGlzLml0ZW1Ecm9wVGFyZ2V0ID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaXRlbURyYWdzTWFwLmdldCh0YXJnZXRFbGVtZW50KT8uZGF0YS5pZCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLmdldFRhcmdldFBvc2l0aW9uKHRhcmdldEVsZW1lbnQsIGV2ZW50KVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOaJp+ihjOWklumDqOS8oOWFpeeahCBkcm9wRW50ZXJQcmVkaWNhdGUg5Yik5pat5piv5ZCm5YWB6K645ouW5YWl55uu5qCH6aG5XG4gICAgICAgIGlmICh0aGlzLmRyb3BFbnRlclByZWRpY2F0ZSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RHJhZ1JlZiA9IHRoaXMuaXRlbURyYWdzTWFwLmdldCh0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BFbnRlclByZWRpY2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuc291cmNlLmRhdGEub3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldERyYWdSZWYuZGF0YS5vcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgIGRyb3BQb3NpdGlvbjogdGhpcy5pdGVtRHJvcFRhcmdldC5wb3NpdGlvblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEcm9wUG9zaXRpb25QbGFjZWhvbGRlcih0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtRHJvcFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cyhmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEcm9wUG9zaXRpb25QbGFjZWhvbGRlcih0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uSXRlbURyYWdFbmRlZChldmVudDogQ2RrRHJhZ0VuZDxHYW50dEl0ZW1JbnRlcm5hbD4pIHtcbiAgICAgICAgdGhpcy5nYW50dFRhYmxlRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmRyYWdFbmRlZC5lbWl0KHtcbiAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuc291cmNlLmRhdGE/Lm9yaWdpbixcbiAgICAgICAgICAgIHNvdXJjZVBhcmVudDogdGhpcy5nZXRQYXJlbnRCeUl0ZW0oZXZlbnQuc291cmNlLmRhdGEpPy5vcmlnaW5cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRyb3BFbnRlclByZWRpY2F0ZSDmlrnms5Xov5Tlm57lgLzkuLogZmFsc2Ug5pe277yM5aeL57uI5pyq5omn6KGMIG9uTGlzdERyb3BwZWTvvIzmiYDku6Xlj6rog73lnKggZHJhZ0VuZGVkIOS4reenu+mZpCBkcmFnLWl0ZW0taGlkZVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5FbGVtZW50c0J5RWxlbWVudChldmVudC5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLWl0ZW0taGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxpc3REcm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxHYW50dEl0ZW1JbnRlcm5hbFtdLCBHYW50dEl0ZW1JbnRlcm5hbFtdLCBHYW50dEl0ZW1JbnRlcm5hbD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1Ecm9wVGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VJdGVtID0gZXZlbnQuaXRlbS5kYXRhO1xuICAgICAgICBjb25zdCBzb3VyY2VQYXJlbnQgPSB0aGlzLmdldFBhcmVudEJ5SXRlbShzb3VyY2VJdGVtKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ2hpbGRyZW4gPSB0aGlzLmdldEV4cGFuZENoaWxkcmVuQnlEcmFnKGV2ZW50Lml0ZW0pO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldERyYWdSZWYgPSB0aGlzLmNka0RyYWdzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGF0YT8uaWQgPT09IHRoaXMuaXRlbURyb3BUYXJnZXQuaWQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGFyZ2V0RHJhZ1JlZj8uZGF0YTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFyZW50ID0gdGhpcy5nZXRQYXJlbnRCeUl0ZW0odGFyZ2V0SXRlbSk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKHNvdXJjZUl0ZW0sIHNvdXJjZUNoaWxkcmVuKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMuaXRlbURyb3BUYXJnZXQucG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2JlZm9yZSc6XG4gICAgICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJdGVtKHRhcmdldEl0ZW0sIHNvdXJjZUl0ZW0sIHNvdXJjZUNoaWxkcmVuLCB0aGlzLml0ZW1Ecm9wVGFyZ2V0LnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VJdGVtLnVwZGF0ZUxldmVsKHRhcmdldEl0ZW0ubGV2ZWwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydENoaWxkcmVuSXRlbSh0YXJnZXRJdGVtLCBzb3VyY2VJdGVtLCBzb3VyY2VDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgc291cmNlSXRlbS51cGRhdGVMZXZlbCh0YXJnZXRJdGVtLmxldmVsICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyYWdEcm9wcGVkLmVtaXQoe1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VJdGVtLm9yaWdpbixcbiAgICAgICAgICAgIHNvdXJjZVBhcmVudDogc291cmNlUGFyZW50Py5vcmlnaW4sXG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldEl0ZW0ub3JpZ2luLFxuICAgICAgICAgICAgdGFyZ2V0UGFyZW50OiB0YXJnZXRQYXJlbnQ/Lm9yaWdpbixcbiAgICAgICAgICAgIGRyb3BQb3NpdGlvbjogdGhpcy5pdGVtRHJvcFRhcmdldC5wb3NpdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsZWFudXBEcmFnQXJ0aWZhY3RzKHRydWUpO1xuICAgIH1cblxuICAgIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogR2FudHRHcm91cEludGVybmFsIHwgR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQgfHwgaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVJdGVtKGl0ZW06IEdhbnR0SXRlbUludGVybmFsLCBjaGlsZHJlbjogR2FudHRJdGVtSW50ZXJuYWxbXSkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0SXRlbXMuc3BsaWNlKHRoaXMudmlld3BvcnRJdGVtcy5pbmRleE9mKGl0ZW0pLCAxICsgY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5mbGF0SXRlbXMuc3BsaWNlKHRoaXMuZmxhdEl0ZW1zLmluZGV4T2YoaXRlbSksIDEgKyBjaGlsZHJlbi5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5zZXJ0SXRlbShcbiAgICAgICAgdGFyZ2V0OiBHYW50dEl0ZW1JbnRlcm5hbCxcbiAgICAgICAgaW5zZXJ0ZWQ6IEdhbnR0SXRlbUludGVybmFsLFxuICAgICAgICBjaGlsZHJlbjogR2FudHRJdGVtSW50ZXJuYWxbXSxcbiAgICAgICAgcG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJ1xuICAgICkge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0SXRlbXMuc3BsaWNlKHRoaXMudmlld3BvcnRJdGVtcy5pbmRleE9mKHRhcmdldCksIDAsIGluc2VydGVkLCAuLi5jaGlsZHJlbik7XG4gICAgICAgICAgICB0aGlzLmZsYXRJdGVtcy5zcGxpY2UodGhpcy5mbGF0SXRlbXMuaW5kZXhPZih0YXJnZXQpLCAwLCBpbnNlcnRlZCwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuY2RrRHJhZ3MuZmluZCgoZHJhZykgPT4gZHJhZy5kYXRhID09PSB0YXJnZXQpO1xuICAgICAgICAgICAgLy8g5aaC5p6c55uu5qCH6aG55piv5bGV5byA55qE77yM5o+S5YWl55qEIGluZGV4IOS9jee9rumcgOimgeiAg+iZkeWtkOmhueeahOaVsOmHj1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuQ291bnQgPSAwO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldENoaWxkcmVuRWxlbWVudHNCeUVsZW1lbnQoZHJhZ1JlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpPy5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRJdGVtcy5zcGxpY2UodGhpcy52aWV3cG9ydEl0ZW1zLmluZGV4T2YodGFyZ2V0KSArIDEgKyBjaGlsZHJlbkNvdW50LCAwLCBpbnNlcnRlZCwgLi4uY2hpbGRyZW4pO1xuICAgICAgICAgICAgdGhpcy5mbGF0SXRlbXMuc3BsaWNlKHRoaXMuZmxhdEl0ZW1zLmluZGV4T2YodGFyZ2V0KSArIDEgKyBjaGlsZHJlbkNvdW50LCAwLCBpbnNlcnRlZCwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnNlcnRDaGlsZHJlbkl0ZW0odGFyZ2V0OiBHYW50dEl0ZW1JbnRlcm5hbCwgaW5zZXJ0ZWQ6IEdhbnR0SXRlbUludGVybmFsLCBjaGlsZHJlbjogR2FudHRJdGVtSW50ZXJuYWxbXSkge1xuICAgICAgICBpZiAodGFyZ2V0LmV4cGFuZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0SXRlbXMuc3BsaWNlKHRoaXMudmlld3BvcnRJdGVtcy5pbmRleE9mKHRhcmdldCkgKyB0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoICsgMSwgMCwgaW5zZXJ0ZWQsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIHRoaXMuZmxhdEl0ZW1zLnNwbGljZSh0aGlzLmZsYXRJdGVtcy5pbmRleE9mKHRhcmdldCkgKyB0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoICsgMSwgMCwgaW5zZXJ0ZWQsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuY2hpbGRyZW4ucHVzaChpbnNlcnRlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnRCeUl0ZW0oaXRlbTogR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYXRJdGVtcyB8fCBbXSkuZmluZCgobjogR2FudHRJdGVtSW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuLmNoaWxkcmVuPy5pbmNsdWRlcyhpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFeHBhbmRDaGlsZHJlbkJ5RHJhZyhkcmFnUmVmOiBDZGtEcmFnPEdhbnR0SXRlbUludGVybmFsPikge1xuICAgICAgICBpZiAoIWRyYWdSZWYuZGF0YS5leHBhbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50cyA9IHRoaXMuZ2V0Q2hpbGRyZW5FbGVtZW50c0J5RWxlbWVudChkcmFnUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5FbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHRoaXMuaXRlbURyYWdzTWFwLmdldChlbGVtZW50KS5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2hpbGRyZW5FbGVtZW50c0J5RWxlbWVudChkcmFnRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8g6YCa6L+H5b6q546v5oyB57ut5p+l5om+IG5leHQgZWxlbWVudO+8jOWmguaenCBlbGVtZW50IOeahCBsZXZlbCDlsI/kuo7lvZPliY0gaXRlbSDnmoQgbGV2ZWzvvIzliJnkuLrlroPnmoQgY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuaXRlbURyYWdzTWFwLmdldChkcmFnRWxlbWVudCk7XG5cbiAgICAgICAgLy8g5aaC5p6c5b2T5YmN55qEIERyYWcg5q2j5Zyo5ouW5ou977yM5Lya5Yib5bu6IFBsYWNlaG9sZGVyRWxlbWVudCDljaDkvY3vvIzmiYDku6Xku6UgUGxhY2Vob2xkZXJFbGVtZW50IOWQkeS4i+afpeaJvlxuICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSAoZHJhZ1JlZi5nZXRQbGFjZWhvbGRlckVsZW1lbnQoKSB8fCBkcmFnRWxlbWVudCkubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbmV4dERyYWdSZWYgPSB0aGlzLml0ZW1EcmFnc01hcC5nZXQobmV4dEVsZW1lbnQpO1xuXG4gICAgICAgIHdoaWxlIChuZXh0RHJhZ1JlZiAmJiBuZXh0RHJhZ1JlZi5kYXRhLmxldmVsID4gZHJhZ1JlZi5kYXRhLmxldmVsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5leHRFbGVtZW50KTtcbiAgICAgICAgICAgIG5leHRFbGVtZW50ID0gbmV4dEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbmV4dERyYWdSZWYgPSB0aGlzLml0ZW1EcmFnc01hcC5nZXQobmV4dEVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFyZ2V0UG9zaXRpb24odGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IENka0RyYWdNb3ZlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZU9yQWZ0ZXJHYXAgPSB0YXJnZXRSZWN0LmhlaWdodCAqIDAuMztcbiAgICAgICAgLy8g5bCGIEl0ZW0g6auY5bqm5YiG5Li65LiK5Lit5LiL5LiJ5q6177yM5YW25Lit5LiK5LiL55qEIEdhcCDkuLogaGVpZ2h0IOeahCAzMCXvvIzpgJrov4fliKTmlq3pvKDmoIfkvY3nva7lnKjlk6rkuIDmrrUgZ2FwIOadpeiuoeeul+WvueW6lOeahOS9jee9rlxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiAnYmVmb3JlJztcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5wb2ludGVyUG9zaXRpb24ueSA+PSB0YXJnZXRSZWN0LmJvdHRvbSAtIGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiAnYWZ0ZXInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdpbnNpZGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICBpZiAodGhpcy5pdGVtRHJvcFRhcmdldCAmJiB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoYGRyb3AtcG9zaXRpb24tJHt0aGlzLml0ZW1Ecm9wVGFyZ2V0LnBvc2l0aW9ufWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbnVwRHJhZ0FydGlmYWN0cyhkcm9wcGVkID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRyb3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbURyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhZy1pdGVtLWhpZGUnKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctaXRlbS1oaWRlJykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtcG9zaXRpb24tYmVmb3JlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wLXBvc2l0aW9uLWJlZm9yZScpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1wb3NpdGlvbi1hZnRlcicpLmZvckVhY2goKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1wb3NpdGlvbi1hZnRlcicpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1wb3NpdGlvbi1pbnNpZGUnKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3AtcG9zaXRpb24taW5zaWRlJykpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJnYW50dC10YWJsZS1ib2R5LWNvbnRhaW5lclwiXG4gIGNka0Ryb3BMaXN0XG4gIFtjZGtEcm9wTGlzdEF1dG9TY3JvbGxTdGVwXT1cIjZcIlxuICBbY2RrRHJvcExpc3REYXRhXT1cInZpZXdwb3J0SXRlbXNcIlxuICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25MaXN0RHJvcHBlZCgkZXZlbnQpXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2aWV3cG9ydEl0ZW1zPy5sZW5ndGhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVtcHR5VGVtcGxhdGVcIj5cbiAgICAgIDxnYW50dC1pY29uIGNsYXNzPVwiZW1wdHktaWNvblwiIGljb25OYW1lPVwiZW1wdHlcIj48L2dhbnR0LWljb24+XG4gICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktdGV4dFwiPuayoeacieaVsOaNrjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJlbXB0eVRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdwb3J0SXRlbXMgJiYgdmlld3BvcnRJdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB2aWV3cG9ydEl0ZW1zOyB0cmFja0J5OiB0cmFja0J5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtZ3JvdXBcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImdhbnR0LnN0eWxlcy5saW5lSGVpZ2h0XCIgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc1wiICpuZ0lmPVwiaXRlbS5pdGVtc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtZ3JvdXAtdGl0bGVcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXRlbS5leHBhbmRlZFwiIChjbGljayk9XCJleHBhbmRHcm91cChpdGVtKVwiPlxuICAgICAgICAgIDxnYW50dC1pY29uIGNsYXNzPVwiZXhwYW5kLWljb25cIiBbaWNvbk5hbWVdPVwiaXRlbS5leHBhbmRlZCA/ICdhbmdsZS1kb3duJyA6ICdhbmdsZS1yaWdodCdcIj48L2dhbnR0LWljb24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwVGVtcGxhdGU7IGVsc2UgZGVmYXVsdFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0ub3JpZ2luLCBncm91cDogaXRlbS5vcmlnaW4gfVwiXG4gICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHQ+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiIWl0ZW0uaXRlbXNcIlxuICAgICAgICAoY2xpY2spPVwiaXRlbUNsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCBjdXJyZW50OiBpdGVtLm9yaWdpbiwgc2VsZWN0ZWRWYWx1ZTogaXRlbS5vcmlnaW4gfSlcIlxuICAgICAgICBjZGtEcmFnXG4gICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCJcbiAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIoZHJhZ2dhYmxlICYmIGl0ZW0uaXRlbURyYWdnYWJsZSA9PT0gZmFsc2UpIHx8ICFkcmFnZ2FibGVcIlxuICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25JdGVtRHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25JdGVtRHJhZ0VuZGVkKCRldmVudClcIlxuICAgICAgICAoY2RrRHJhZ01vdmVkKT1cImVtaXRJdGVtRHJhZ01vdmVkKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImdhbnR0LXRhYmxlLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS13aXRoLWdyb3VwXT1cImhhc0dyb3VwXCJcbiAgICAgICAgW2NsYXNzLmdhbnR0LXRhYmxlLWl0ZW0tZmlyc3QtbGV2ZWwtZ3JvdXBdPVwiaXRlbS5sZXZlbCA9PT0gMCAmJiAoaXRlbS50eXBlIHwgaXNHYW50dFJhbmdlSXRlbSlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdhbnR0LnN0eWxlcy5saW5lSGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLmxpbmVIZWlnaHQucHhdPVwiZ2FudHQuc3R5bGVzLmxpbmVIZWlnaHRcIlxuICAgICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS1hY3RpdmVdPVwiZ2FudHRVcHBlci5pc1NlbGVjdGVkKGl0ZW0uaWQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicm93QmVmb3JlVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8ZGl2IFtjbGFzc0xpc3RdPVwiY29sdW1uLmNsYXNzTGlzdFwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGZpcnN0ID0gZmlyc3RcIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLmNvbHVtbldpZHRoXCI+XG4gICAgICAgICAgPCEtLSBkcmFnIGljb24gLS0+XG4gICAgICAgICAgPGdhbnR0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiZmlyc3QgJiYgZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ2FudHQtZHJhZy1oYW5kbGVcIlxuICAgICAgICAgICAgaWNvbk5hbWU9XCJkcmFnXCJcbiAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgIFtjZGtEcmFnSGFuZGxlRGlzYWJsZWRdPVwiKGRyYWdnYWJsZSAmJiBpdGVtLml0ZW1EcmFnZ2FibGUgPT09IGZhbHNlKSB8fCAhZHJhZ2dhYmxlXCJcbiAgICAgICAgICA+PC9nYW50dC1pY29uPlxuICAgICAgICAgIDwhLS0gZXhwYW5kIGljb24gLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4/LnNob3dFeHBhbmRJY29uIHx8ICghaGFzRXhwYW5kSWNvbiAmJiBmaXJzdClcIlxuICAgICAgICAgICAgY2xhc3M9XCJnYW50dC1leHBhbmQtaWNvblwiXG4gICAgICAgICAgICBbc3R5bGUubWFyZ2luTGVmdC5weF09XCJpdGVtLmxldmVsICogMjBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmxldmVsIDwgZ2FudHQubWF4TGV2ZWwgLSAxICYmICgoZ2FudHQuYXN5bmMgJiYgaXRlbS5leHBhbmRhYmxlKSB8fCBpdGVtLmNoaWxkcmVuPy5sZW5ndGggPiAwKVwiPlxuICAgICAgICAgICAgICA8Z2FudHQtaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW0ubG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJleHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgW2ljb25OYW1lXT1cIml0ZW0uZXhwYW5kZWQgPyAnYW5nbGUtZG93bicgOiAnYW5nbGUtcmlnaHQnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kQ2hpbGRyZW4oJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9nYW50dC1pY29uPlxuICAgICAgICAgICAgICA8Z2FudHQtaWNvbiAqbmdJZj1cIml0ZW0ubG9hZGluZ1wiIFtpY29uTmFtZV09XCInbG9hZGluZydcIj48L2dhbnR0LWljb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIGNvbHVtbiBjb250ZW50IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1jb2x1bW4tY29udGVudFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dBZnRlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0ub3JpZ2luLCBpdGVtOiBpdGVtLm9yaWdpbiB9XCJcbiAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { Component, HostBinding, Input, ViewChild, Inject } from '@angular/core';
|
|
2
|
-
import { CdkDrag } from '@angular/cdk/drag-drop';
|
|
3
|
-
import { coerceCssPixelValue } from '@angular/cdk/coercion';
|
|
4
|
-
import { GANTT_ABSTRACT_TOKEN } from '../../../gantt-abstract';
|
|
5
|
-
import { setStyleWithVendorPrefix } from '../../../utils/set-style-with-vendor-prefix';
|
|
6
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
7
|
-
import { NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
export const defaultColumnWidth = 100;
|
|
10
|
-
export const minColumnWidth = 80;
|
|
11
|
-
export class GanttTableHeaderComponent {
|
|
12
|
-
get height() {
|
|
13
|
-
return this.gantt.styles.headerHeight + 'px';
|
|
14
|
-
}
|
|
15
|
-
get lineHeight() {
|
|
16
|
-
return this.gantt.styles.headerHeight + 'px';
|
|
17
|
-
}
|
|
18
|
-
constructor(elementRef, gantt, cdr) {
|
|
19
|
-
this.elementRef = elementRef;
|
|
20
|
-
this.gantt = gantt;
|
|
21
|
-
this.cdr = cdr;
|
|
22
|
-
this.tableWidth = 0;
|
|
23
|
-
this.unsubscribe$ = new Subject();
|
|
24
|
-
this.className = `gantt-table-header `;
|
|
25
|
-
}
|
|
26
|
-
ngOnInit() {
|
|
27
|
-
this.columnsChange();
|
|
28
|
-
this.columns.changes.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
29
|
-
this.columnsChange();
|
|
30
|
-
this.gantt.cdr.detectChanges();
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
columnsChange() {
|
|
34
|
-
let tableWidth = 0;
|
|
35
|
-
this.columns.forEach((column) => {
|
|
36
|
-
if (!column.columnWidth) {
|
|
37
|
-
column.columnWidth = coerceCssPixelValue(defaultColumnWidth);
|
|
38
|
-
}
|
|
39
|
-
tableWidth += Number(column.columnWidth.replace('px', ''));
|
|
40
|
-
});
|
|
41
|
-
this.tableWidth = tableWidth;
|
|
42
|
-
}
|
|
43
|
-
dragFixed(config) {
|
|
44
|
-
if (config.movedWidth < config.minWidth) {
|
|
45
|
-
setStyleWithVendorPrefix({
|
|
46
|
-
element: config.target,
|
|
47
|
-
style: 'transform',
|
|
48
|
-
value: `translate3d(${config.minWidth - config.originWidth}px, 0, 0)`
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
onResizeStarted(event) {
|
|
53
|
-
const target = event.source.element.nativeElement;
|
|
54
|
-
this.dragStartLeft = target.getBoundingClientRect().left;
|
|
55
|
-
}
|
|
56
|
-
onResizeMoved(event, column) {
|
|
57
|
-
const target = event.source.element.nativeElement;
|
|
58
|
-
const left = target.getBoundingClientRect().left;
|
|
59
|
-
let originWidth;
|
|
60
|
-
let movedWidth;
|
|
61
|
-
let minWidth;
|
|
62
|
-
if (column) {
|
|
63
|
-
originWidth = parseInt(column.columnWidth, 10);
|
|
64
|
-
movedWidth = originWidth + (left - this.dragStartLeft);
|
|
65
|
-
minWidth = minColumnWidth;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
originWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
|
|
69
|
-
movedWidth = originWidth + (left - this.dragStartLeft);
|
|
70
|
-
minWidth = minColumnWidth * this.columns.length;
|
|
71
|
-
}
|
|
72
|
-
this.dragFixed({
|
|
73
|
-
target,
|
|
74
|
-
originWidth,
|
|
75
|
-
movedWidth,
|
|
76
|
-
minWidth
|
|
77
|
-
});
|
|
78
|
-
this.showAuxiliaryLine(event);
|
|
79
|
-
}
|
|
80
|
-
onResizeEnded(event, column) {
|
|
81
|
-
const beforeWidth = parseInt(column.columnWidth, 10);
|
|
82
|
-
const target = event.source.element.nativeElement;
|
|
83
|
-
const left = target.getBoundingClientRect().left;
|
|
84
|
-
const width = parseInt(column.columnWidth, 10) + (left - this.dragStartLeft);
|
|
85
|
-
const columnWidth = Math.max(width || 0, minColumnWidth);
|
|
86
|
-
column.columnWidth = coerceCssPixelValue(columnWidth);
|
|
87
|
-
if (this.gantt.table) {
|
|
88
|
-
this.gantt.table.columnChanges.emit({ columns: this.columns });
|
|
89
|
-
}
|
|
90
|
-
this.tableWidth = this.tableWidth - beforeWidth + columnWidth;
|
|
91
|
-
this.hideAuxiliaryLine();
|
|
92
|
-
event.source.reset();
|
|
93
|
-
}
|
|
94
|
-
onOverallResizeEnded(event) {
|
|
95
|
-
const target = event.source.element.nativeElement;
|
|
96
|
-
const left = target.getBoundingClientRect().left;
|
|
97
|
-
const tableWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
|
|
98
|
-
const dragWidth = left - this.dragStartLeft;
|
|
99
|
-
let tempWidth = 0;
|
|
100
|
-
this.columns.forEach((column) => {
|
|
101
|
-
const lastColumnWidth = parseInt(column.columnWidth, 10);
|
|
102
|
-
const distributeWidth = parseInt(String(dragWidth * (lastColumnWidth / tableWidth)), 10);
|
|
103
|
-
const columnWidth = Math.max(lastColumnWidth + distributeWidth || 0, minColumnWidth);
|
|
104
|
-
column.columnWidth = coerceCssPixelValue(columnWidth);
|
|
105
|
-
tempWidth += columnWidth;
|
|
106
|
-
});
|
|
107
|
-
this.tableWidth = tempWidth;
|
|
108
|
-
if (this.gantt.table) {
|
|
109
|
-
this.gantt.table.columnChanges.emit({ columns: this.columns });
|
|
110
|
-
}
|
|
111
|
-
this.hideAuxiliaryLine();
|
|
112
|
-
event.source.reset();
|
|
113
|
-
}
|
|
114
|
-
showAuxiliaryLine(event) {
|
|
115
|
-
const tableRect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
116
|
-
const targetRect = event.source.element.nativeElement.getBoundingClientRect();
|
|
117
|
-
const distance = { x: targetRect.left - tableRect.left, y: targetRect.top - tableRect.top };
|
|
118
|
-
this.resizeLineElementRef.nativeElement.style.left = `${distance.x}px`;
|
|
119
|
-
this.resizeLineElementRef.nativeElement.style.display = 'block';
|
|
120
|
-
}
|
|
121
|
-
hideAuxiliaryLine() {
|
|
122
|
-
this.resizeLineElementRef.nativeElement.style.display = 'none';
|
|
123
|
-
}
|
|
124
|
-
ngOnDestroy() {
|
|
125
|
-
this.unsubscribe$.next();
|
|
126
|
-
this.unsubscribe$.complete();
|
|
127
|
-
}
|
|
128
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GanttTableHeaderComponent, deps: [{ token: i0.ElementRef }, { token: GANTT_ABSTRACT_TOKEN }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
129
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: GanttTableHeaderComponent, isStandalone: true, selector: "gantt-table-header", inputs: { columns: "columns" }, host: { properties: { "class": "this.className", "style.height": "this.height", "style.line-height": "this.lineHeight" } }, viewQueries: [{ propertyName: "resizeLineElementRef", first: true, predicate: ["resizeLine"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"gantt-table-header-container\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columns; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"> </ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"column-resize-handle\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"onResizeMoved($event, column)\"\n (cdkDragStarted)=\"onResizeStarted($event)\"\n (cdkDragEnded)=\"onResizeEnded($event, column)\"\n ></div>\n </div>\n</div>\n\n<div\n class=\"table-resize-handle\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"onResizeMoved($event)\"\n (cdkDragStarted)=\"onResizeStarted($event)\"\n (cdkDragEnded)=\"onOverallResizeEnded($event)\"\n></div>\n\n<div #resizeLine class=\"table-resize-auxiliary-line\"></div>\n", dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] }); }
|
|
130
|
-
}
|
|
131
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GanttTableHeaderComponent, decorators: [{
|
|
132
|
-
type: Component,
|
|
133
|
-
args: [{ selector: 'gantt-table-header', standalone: true, imports: [NgFor, NgIf, NgTemplateOutlet, CdkDrag], template: "<div class=\"gantt-table-header-container\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columns; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"> </ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"column-resize-handle\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"onResizeMoved($event, column)\"\n (cdkDragStarted)=\"onResizeStarted($event)\"\n (cdkDragEnded)=\"onResizeEnded($event, column)\"\n ></div>\n </div>\n</div>\n\n<div\n class=\"table-resize-handle\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"onResizeMoved($event)\"\n (cdkDragStarted)=\"onResizeStarted($event)\"\n (cdkDragEnded)=\"onOverallResizeEnded($event)\"\n></div>\n\n<div #resizeLine class=\"table-resize-auxiliary-line\"></div>\n" }]
|
|
134
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
135
|
-
type: Inject,
|
|
136
|
-
args: [GANTT_ABSTRACT_TOKEN]
|
|
137
|
-
}] }, { type: i0.ChangeDetectorRef }], propDecorators: { columns: [{
|
|
138
|
-
type: Input
|
|
139
|
-
}], resizeLineElementRef: [{
|
|
140
|
-
type: ViewChild,
|
|
141
|
-
args: ['resizeLine', { static: true }]
|
|
142
|
-
}], className: [{
|
|
143
|
-
type: HostBinding,
|
|
144
|
-
args: ['class']
|
|
145
|
-
}], height: [{
|
|
146
|
-
type: HostBinding,
|
|
147
|
-
args: ['style.height']
|
|
148
|
-
}], lineHeight: [{
|
|
149
|
-
type: HostBinding,
|
|
150
|
-
args: ['style.line-height']
|
|
151
|
-
}] } });
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtdGFibGUtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dhbnR0L3NyYy9jb21wb25lbnRzL3RhYmxlL2hlYWRlci9nYW50dC10YWJsZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvdGFibGUvaGVhZGVyL2dhbnR0LXRhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFdBQVcsRUFFWCxLQUFLLEVBRUwsU0FBUyxFQUVULE1BQU0sRUFHVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQXlDLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBMEIsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUNoRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFDdEMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQWFqQyxNQUFNLE9BQU8seUJBQXlCO0lBYWxDLElBQ0ksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFDSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENB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NFdDakN0Qyw4L0JBNkJBLDRDREVjLEtBQUssbUhBQUUsSUFBSSw2RkFBRSxnQkFBZ0Isb0pBQUUsT0FBTzs7MkZBRXZDLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDSSxvQkFBb0IsY0FFbEIsSUFBSSxXQUNQLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7OzBCQTJCNUMsTUFBTTsyQkFBQyxvQkFBb0I7eUVBbEJ2QixPQUFPO3NCQUFmLEtBQUs7Z0JBRXFDLG9CQUFvQjtzQkFBOUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVuQixTQUFTO3NCQUE5QixXQUFXO3VCQUFDLE9BQU87Z0JBR2hCLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxjQUFjO2dCQU12QixVQUFVO3NCQURiLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgUXVlcnlMaXN0LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgT25EZXN0cm95LFxuICAgIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4R2FudHRUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RhYmxlL2dhbnR0LWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ01vdmUsIENka0RyYWdTdGFydCwgQ2RrRHJhZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgY29lcmNlQ3NzUGl4ZWxWYWx1ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBHYW50dEFic3RyYWN0Q29tcG9uZW50LCBHQU5UVF9BQlNUUkFDVF9UT0tFTiB9IGZyb20gJy4uLy4uLy4uL2dhbnR0LWFic3RyYWN0JztcbmltcG9ydCB7IHNldFN0eWxlV2l0aFZlbmRvclByZWZpeCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3NldC1zdHlsZS13aXRoLXZlbmRvci1wcmVmaXgnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ0ZvciwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5leHBvcnQgY29uc3QgZGVmYXVsdENvbHVtbldpZHRoID0gMTAwO1xuZXhwb3J0IGNvbnN0IG1pbkNvbHVtbldpZHRoID0gODA7XG5pbnRlcmZhY2UgRHJhZ0ZpeGVkQ29uZmlnIHtcbiAgICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICAgIG9yaWdpbldpZHRoOiBudW1iZXI7XG4gICAgbW92ZWRXaWR0aDogbnVtYmVyO1xuICAgIG1pbldpZHRoOiBudW1iZXI7XG59XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dhbnR0LXRhYmxlLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dhbnR0LXRhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIENka0RyYWddXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0VGFibGVIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHVibGljIGRyYWdTdGFydExlZnQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyB0YWJsZVdpZHRoID0gMDtcblxuICAgIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IFF1ZXJ5TGlzdDxOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Jlc2l6ZUxpbmUnLCB7IHN0YXRpYzogdHJ1ZSB9KSByZXNpemVMaW5lRWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gYGdhbnR0LXRhYmxlLWhlYWRlciBgO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdhbnR0LnN0eWxlcy5oZWFkZXJIZWlnaHQgKyAncHgnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUubGluZS1oZWlnaHQnKVxuICAgIGdldCBsaW5lSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nYW50dC5zdHlsZXMuaGVhZGVySGVpZ2h0ICsgJ3B4JztcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBASW5qZWN0KEdBTlRUX0FCU1RSQUNUX1RPS0VOKSBwcml2YXRlIGdhbnR0OiBHYW50dEFic3RyYWN0Q29tcG9uZW50LFxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc0NoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5nYW50dC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbHVtbnNDaGFuZ2UoKSB7XG4gICAgICAgIGxldCB0YWJsZVdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb2x1bW4uY29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uY29sdW1uV2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGRlZmF1bHRDb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWJsZVdpZHRoICs9IE51bWJlcihjb2x1bW4uY29sdW1uV2lkdGgucmVwbGFjZSgncHgnLCAnJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YWJsZVdpZHRoID0gdGFibGVXaWR0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdGaXhlZChjb25maWc6IERyYWdGaXhlZENvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLm1vdmVkV2lkdGggPCBjb25maWcubWluV2lkdGgpIHtcbiAgICAgICAgICAgIHNldFN0eWxlV2l0aFZlbmRvclByZWZpeCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogY29uZmlnLnRhcmdldCxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGB0cmFuc2xhdGUzZCgke2NvbmZpZy5taW5XaWR0aCAtIGNvbmZpZy5vcmlnaW5XaWR0aH1weCwgMCwgMClgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVzaXplU3RhcnRlZChldmVudDogQ2RrRHJhZ1N0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0TGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIH1cblxuICAgIG9uUmVzaXplTW92ZWQoZXZlbnQ6IENka0RyYWdNb3ZlLCBjb2x1bW4/OiBOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICBsZXQgb3JpZ2luV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG1vdmVkV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG1pbldpZHRoOiBudW1iZXI7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIG9yaWdpbldpZHRoID0gcGFyc2VJbnQoY29sdW1uLmNvbHVtbldpZHRoLCAxMCk7XG4gICAgICAgICAgICBtb3ZlZFdpZHRoID0gb3JpZ2luV2lkdGggKyAobGVmdCAtIHRoaXMuZHJhZ1N0YXJ0TGVmdCk7XG4gICAgICAgICAgICBtaW5XaWR0aCA9IG1pbkNvbHVtbldpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3JpZ2luV2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIG1vdmVkV2lkdGggPSBvcmlnaW5XaWR0aCArIChsZWZ0IC0gdGhpcy5kcmFnU3RhcnRMZWZ0KTtcbiAgICAgICAgICAgIG1pbldpZHRoID0gbWluQ29sdW1uV2lkdGggKiB0aGlzLmNvbHVtbnMubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kcmFnRml4ZWQoe1xuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgb3JpZ2luV2lkdGgsXG4gICAgICAgICAgICBtb3ZlZFdpZHRoLFxuICAgICAgICAgICAgbWluV2lkdGhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zaG93QXV4aWxpYXJ5TGluZShldmVudCk7XG4gICAgfVxuXG4gICAgb25SZXNpemVFbmRlZChldmVudDogQ2RrRHJhZ0VuZCwgY29sdW1uOiBOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVdpZHRoID0gcGFyc2VJbnQoY29sdW1uLmNvbHVtbldpZHRoLCAxMCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJzZUludChjb2x1bW4uY29sdW1uV2lkdGgsIDEwKSArIChsZWZ0IC0gdGhpcy5kcmFnU3RhcnRMZWZ0KTtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBNYXRoLm1heCh3aWR0aCB8fCAwLCBtaW5Db2x1bW5XaWR0aCk7XG4gICAgICAgIGNvbHVtbi5jb2x1bW5XaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoY29sdW1uV2lkdGgpO1xuICAgICAgICBpZiAodGhpcy5nYW50dC50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5nYW50dC50YWJsZS5jb2x1bW5DaGFuZ2VzLmVtaXQoeyBjb2x1bW5zOiB0aGlzLmNvbHVtbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhYmxlV2lkdGggPSB0aGlzLnRhYmxlV2lkdGggLSBiZWZvcmVXaWR0aCArIGNvbHVtbldpZHRoO1xuICAgICAgICB0aGlzLmhpZGVBdXhpbGlhcnlMaW5lKCk7XG4gICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgIH1cblxuICAgIG9uT3ZlcmFsbFJlc2l6ZUVuZGVkKGV2ZW50OiBDZGtEcmFnRW5kKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgICAgY29uc3QgdGFibGVXaWR0aCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBkcmFnV2lkdGggPSBsZWZ0IC0gdGhpcy5kcmFnU3RhcnRMZWZ0O1xuICAgICAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGFzdENvbHVtbldpZHRoID0gcGFyc2VJbnQoY29sdW1uLmNvbHVtbldpZHRoLCAxMCk7XG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRlV2lkdGggPSBwYXJzZUludChTdHJpbmcoZHJhZ1dpZHRoICogKGxhc3RDb2x1bW5XaWR0aCAvIHRhYmxlV2lkdGgpKSwgMTApO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBNYXRoLm1heChsYXN0Q29sdW1uV2lkdGggKyBkaXN0cmlidXRlV2lkdGggfHwgMCwgbWluQ29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgY29sdW1uLmNvbHVtbldpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICB0ZW1wV2lkdGggKz0gY29sdW1uV2lkdGg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRhYmxlV2lkdGggPSB0ZW1wV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmdhbnR0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmdhbnR0LnRhYmxlLmNvbHVtbkNoYW5nZXMuZW1pdCh7IGNvbHVtbnM6IHRoaXMuY29sdW1ucyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGlkZUF1eGlsaWFyeUxpbmUoKTtcbiAgICAgICAgZXZlbnQuc291cmNlLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QXV4aWxpYXJ5TGluZShldmVudDogQ2RrRHJhZ01vdmUpIHtcbiAgICAgICAgY29uc3QgdGFibGVSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSBldmVudC5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHsgeDogdGFyZ2V0UmVjdC5sZWZ0IC0gdGFibGVSZWN0LmxlZnQsIHk6IHRhcmdldFJlY3QudG9wIC0gdGFibGVSZWN0LnRvcCB9O1xuICAgICAgICB0aGlzLnJlc2l6ZUxpbmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2Rpc3RhbmNlLnh9cHhgO1xuICAgICAgICB0aGlzLnJlc2l6ZUxpbmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlQXV4aWxpYXJ5TGluZSgpIHtcbiAgICAgICAgdGhpcy5yZXNpemVMaW5lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtaGVhZGVyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtY29sdW1uXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi5jb2x1bW5XaWR0aFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVSZWY7IGVsc2UgZGVmYXVsdFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZlwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHQ+XG4gICAgICB7eyBjb2x1bW4ubmFtZSB9fVxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjb2x1bW4tcmVzaXplLWhhbmRsZVwiXG4gICAgICBjZGtEcmFnXG4gICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgIGNka0RyYWdCb3VuZGFyeT1cIi5nYW50dFwiXG4gICAgICAoY2RrRHJhZ01vdmVkKT1cIm9uUmVzaXplTW92ZWQoJGV2ZW50LCBjb2x1bW4pXCJcbiAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvblJlc2l6ZVN0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uUmVzaXplRW5kZWQoJGV2ZW50LCBjb2x1bW4pXCJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXZcbiAgY2xhc3M9XCJ0YWJsZS1yZXNpemUtaGFuZGxlXCJcbiAgY2RrRHJhZ1xuICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgY2RrRHJhZ0JvdW5kYXJ5PVwiLmdhbnR0XCJcbiAgKGNka0RyYWdNb3ZlZCk9XCJvblJlc2l6ZU1vdmVkKCRldmVudClcIlxuICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25SZXNpemVTdGFydGVkKCRldmVudClcIlxuICAoY2RrRHJhZ0VuZGVkKT1cIm9uT3ZlcmFsbFJlc2l6ZUVuZGVkKCRldmVudClcIlxuPjwvZGl2PlxuXG48ZGl2ICNyZXNpemVMaW5lIGNsYXNzPVwidGFibGUtcmVzaXplLWF1eGlsaWFyeS1saW5lXCI+PC9kaXY+XG4iXX0=
|