@plait/mind 0.2.0-next.1 → 0.2.0-next.2

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.
@@ -0,0 +1,14 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ import { MindElement } from '../../interfaces';
3
+ export declare abstract class BaseDrawer {
4
+ protected board: PlaitBoard;
5
+ g?: SVGGElement;
6
+ constructor(board: PlaitBoard);
7
+ abstract canDraw(element: MindElement): boolean;
8
+ abstract draw(element: MindElement): SVGGElement | undefined;
9
+ destroy(): void;
10
+ }
11
+ export interface AfterDraw {
12
+ afterDraw(element: MindElement): void;
13
+ }
14
+ export declare function hasAfterDraw(value: any): value is AfterDraw;
@@ -0,0 +1,7 @@
1
+ import { MindElement, BaseData } from '../interfaces';
2
+ import { AfterDraw, BaseDrawer } from './base/base';
3
+ export declare class QuickInsertDrawer extends BaseDrawer implements AfterDraw {
4
+ canDraw(element: MindElement<BaseData>): boolean;
5
+ draw(element: MindElement<BaseData>): SVGGElement;
6
+ afterDraw(element: MindElement): void;
7
+ }
@@ -0,0 +1,17 @@
1
+ export class BaseDrawer {
2
+ constructor(board) {
3
+ this.board = board;
4
+ }
5
+ destroy() {
6
+ if (this.g) {
7
+ this.g.remove();
8
+ }
9
+ }
10
+ }
11
+ export function hasAfterDraw(value) {
12
+ if (value.afterDraw) {
13
+ return true;
14
+ }
15
+ return false;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9iYXNlL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFnQixVQUFVO0lBRzVCLFlBQXNCLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7SUFBRyxDQUFDO0lBTTNDLE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztDQUNKO0FBTUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFVO0lBQ25DLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURyYXdlciB7XG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJvYXJkOiBQbGFpdEJvYXJkKSB7fVxuXG4gICAgYWJzdHJhY3QgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCk6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBkcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50KTogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nKSB7XG4gICAgICAgICAgICB0aGlzLmcucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWZ0ZXJEcmF3IHtcbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQWZ0ZXJEcmF3KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBZnRlckRyYXcge1xuICAgIGlmICh2YWx1ZS5hZnRlckRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
@@ -0,0 +1,208 @@
1
+ import { PlaitBoard, createG } from '@plait/core';
2
+ import { MindElement } from '../interfaces';
3
+ import { BaseDrawer } from './base/base';
4
+ import { getRectangleByNode } from '../utils/graph';
5
+ import { getNodeShapeByElement } from '../utils/shape';
6
+ import { EXTEND_RADIUS, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, STROKE_WIDTH } from '../constants/default';
7
+ import { MindmapNodeShape } from '../constants/node';
8
+ import { AbstractNode, MindmapLayoutType, isStandardLayout } from '@plait/layouts';
9
+ import { getLinkLineColorByMindmapElement, getRootLinkLineColorByMindmapElement } from '../utils/colors';
10
+ import { MindmapQueries } from '../queries';
11
+ import { fromEvent, take } from 'rxjs';
12
+ import { insertMindElement } from '../utils/mindmap';
13
+ export class QuickInsertDrawer extends BaseDrawer {
14
+ canDraw(element) {
15
+ if (PlaitBoard.isReadonly(this.board)) {
16
+ return false;
17
+ }
18
+ return true;
19
+ }
20
+ draw(element) {
21
+ let offset = element.children.length > 0 && !element.isRoot ? EXTEND_RADIUS : 0;
22
+ const quickInsertG = createG();
23
+ this.g = quickInsertG;
24
+ quickInsertG.classList.add('quick-insert');
25
+ const node = MindElement.getNode(element);
26
+ const { x, y, width, height } = getRectangleByNode(node);
27
+ /**
28
+ * 方位:
29
+ * 1. 左、左上、左下
30
+ * 2. 右、右上、右下
31
+ * 3. 上、上左、上右
32
+ * 4. 下、下左、下右
33
+ */
34
+ const shape = getNodeShapeByElement(element);
35
+ // 形状是矩形要偏移边框的线宽
36
+ const strokeWidth = element.linkLineWidth ? element.linkLineWidth : STROKE_WIDTH;
37
+ let offsetBorderLineWidth = 0;
38
+ if (shape === MindmapNodeShape.roundRectangle && offset === 0) {
39
+ offsetBorderLineWidth = strokeWidth;
40
+ }
41
+ let offsetRootBorderLineWidth = 0;
42
+ if (element.isRoot) {
43
+ offsetRootBorderLineWidth = strokeWidth;
44
+ }
45
+ // 当没有子节点时,需要缩小的偏移量
46
+ const extraOffset = 3;
47
+ const underlineCoordinates = {
48
+ // 画线方向:右向左 <--
49
+ [MindmapLayoutType.left]: {
50
+ // EXTEND_RADIUS * 0.5 是 左方向,折叠/收起的偏移量
51
+ startX: x - (offset > 0 ? offset + EXTEND_RADIUS * 0.5 : 0) - offsetRootBorderLineWidth,
52
+ startY: y + height,
53
+ endX: x -
54
+ offsetBorderLineWidth -
55
+ offsetRootBorderLineWidth -
56
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
57
+ EXTEND_RADIUS,
58
+ endY: y + height
59
+ },
60
+ // 画线方向:左向右 -->
61
+ [MindmapLayoutType.right]: {
62
+ startX: x + width + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
63
+ startY: y + height,
64
+ endX: x +
65
+ width +
66
+ offsetBorderLineWidth +
67
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
68
+ EXTEND_RADIUS +
69
+ offsetRootBorderLineWidth,
70
+ endY: y + height
71
+ },
72
+ // 画线方向:下向上 -->
73
+ [MindmapLayoutType.upward]: {
74
+ startX: x + width * 0.5,
75
+ startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
76
+ endX: x + width * 0.5,
77
+ endY: y -
78
+ offsetBorderLineWidth -
79
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
80
+ EXTEND_RADIUS -
81
+ offsetRootBorderLineWidth
82
+ },
83
+ // 画线方向:上向下 -->
84
+ [MindmapLayoutType.downward]: {
85
+ startX: x + width * 0.5,
86
+ startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
87
+ endX: x + width * 0.5,
88
+ endY: y +
89
+ height +
90
+ offsetBorderLineWidth +
91
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
92
+ EXTEND_RADIUS +
93
+ offsetRootBorderLineWidth
94
+ },
95
+ [MindmapLayoutType.leftBottomIndented]: {
96
+ startX: x + width * 0.5,
97
+ startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
98
+ endX: x + width * 0.5,
99
+ endY: y +
100
+ height +
101
+ offsetBorderLineWidth +
102
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
103
+ EXTEND_RADIUS +
104
+ offsetRootBorderLineWidth
105
+ },
106
+ [MindmapLayoutType.leftTopIndented]: {
107
+ startX: x + width * 0.5,
108
+ startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
109
+ endX: x + width * 0.5,
110
+ endY: y -
111
+ offsetBorderLineWidth -
112
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
113
+ EXTEND_RADIUS -
114
+ offsetRootBorderLineWidth
115
+ },
116
+ [MindmapLayoutType.rightBottomIndented]: {
117
+ startX: x + width * 0.5,
118
+ startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
119
+ endX: x + width * 0.5,
120
+ endY: y +
121
+ height +
122
+ offsetBorderLineWidth +
123
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
124
+ EXTEND_RADIUS +
125
+ offsetRootBorderLineWidth
126
+ },
127
+ [MindmapLayoutType.rightTopIndented]: {
128
+ startX: x + width * 0.5,
129
+ startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
130
+ endX: x + width * 0.5,
131
+ endY: y -
132
+ offsetBorderLineWidth -
133
+ (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
134
+ EXTEND_RADIUS -
135
+ offsetRootBorderLineWidth
136
+ }
137
+ };
138
+ if (shape === MindmapNodeShape.roundRectangle || element.isRoot) {
139
+ underlineCoordinates[MindmapLayoutType.left].startY -= height * 0.5;
140
+ underlineCoordinates[MindmapLayoutType.left].endY -= height * 0.5;
141
+ underlineCoordinates[MindmapLayoutType.right].startY -= height * 0.5;
142
+ underlineCoordinates[MindmapLayoutType.right].endY -= height * 0.5;
143
+ }
144
+ const stroke = element.isRoot ? getRootLinkLineColorByMindmapElement(element) : getLinkLineColorByMindmapElement(element);
145
+ let nodeLayout = MindmapQueries.getCorrectLayoutByElement(element);
146
+ if (element.isRoot && isStandardLayout(nodeLayout)) {
147
+ const root = element;
148
+ nodeLayout = root.children.length >= root.rightNodeCount ? MindmapLayoutType.left : MindmapLayoutType.right;
149
+ }
150
+ const underlineCoordinate = underlineCoordinates[nodeLayout];
151
+ if (underlineCoordinate) {
152
+ const underline = PlaitBoard.getRoughSVG(this.board).line(underlineCoordinate.startX, underlineCoordinate.startY, underlineCoordinate.endX, underlineCoordinate.endY, { stroke, strokeWidth });
153
+ const circleCoordinates = {
154
+ startX: underlineCoordinate.endX,
155
+ startY: underlineCoordinate.endY
156
+ };
157
+ const circle = PlaitBoard.getRoughSVG(this.board).circle(circleCoordinates.startX, circleCoordinates.startY, EXTEND_RADIUS, {
158
+ fill: QUICK_INSERT_CIRCLE_COLOR,
159
+ stroke: QUICK_INSERT_CIRCLE_COLOR,
160
+ fillStyle: 'solid'
161
+ });
162
+ const innerCrossCoordinates = {
163
+ horizontal: {
164
+ startX: circleCoordinates.startX - EXTEND_RADIUS * 0.5 + 3,
165
+ startY: circleCoordinates.startY,
166
+ endX: circleCoordinates.startX + EXTEND_RADIUS * 0.5 - 3,
167
+ endY: circleCoordinates.startY
168
+ },
169
+ vertical: {
170
+ startX: circleCoordinates.startX,
171
+ startY: circleCoordinates.startY - EXTEND_RADIUS * 0.5 + 3,
172
+ endX: circleCoordinates.startX,
173
+ endY: circleCoordinates.startY + EXTEND_RADIUS * 0.5 - 3
174
+ }
175
+ };
176
+ const innerCrossHLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.horizontal.startX, innerCrossCoordinates.horizontal.startY, innerCrossCoordinates.horizontal.endX, innerCrossCoordinates.horizontal.endY, {
177
+ stroke: QUICK_INSERT_INNER_CROSS_COLOR,
178
+ strokeWidth: 2
179
+ });
180
+ const innerRingVLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.vertical.startX, innerCrossCoordinates.vertical.startY, innerCrossCoordinates.vertical.endX, innerCrossCoordinates.vertical.endY, {
181
+ stroke: QUICK_INSERT_INNER_CROSS_COLOR,
182
+ strokeWidth: 2
183
+ });
184
+ quickInsertG.appendChild(underline);
185
+ quickInsertG.appendChild(circle);
186
+ quickInsertG.appendChild(innerCrossHLine);
187
+ quickInsertG.appendChild(innerRingVLine);
188
+ }
189
+ return quickInsertG;
190
+ }
191
+ afterDraw(element) {
192
+ if (!this.g) {
193
+ throw new Error(`can not find quick insert g`);
194
+ }
195
+ fromEvent(this.g, 'mousedown')
196
+ .pipe(take(1))
197
+ .subscribe(e => {
198
+ e.stopPropagation();
199
+ });
200
+ fromEvent(this.g, 'mouseup')
201
+ .pipe(take(1))
202
+ .subscribe(() => {
203
+ const path = PlaitBoard.findPath(this.board, element).concat(element.children.filter(child => !AbstractNode.isAbstract(child)).length);
204
+ insertMindElement(this.board, element, path);
205
+ });
206
+ }
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9xdWljay1pbnNlcnQuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQTZELE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUNILGFBQWEsRUFDYix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLDhCQUE4QixFQUM5QixZQUFZLEVBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsVUFBVTtJQUM3QyxPQUFPLENBQUMsT0FBOEI7UUFDbEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQyxPQUFP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YUFDYixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDeEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzNFLENBQUM7WUFDRixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgQmFzZURhdGEsIEV4dGVuZFVuZGVybGluZUNvb3JkaW5hdGVUeXBlLCBFeHRlbmRMYXlvdXRUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBZnRlckRyYXcsIEJhc2VEcmF3ZXIgfSBmcm9tICcuL2Jhc2UvYmFzZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi91dGlscy9ncmFwaCc7XG5pbXBvcnQgeyBnZXROb2RlU2hhcGVCeUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGFwZSc7XG5pbXBvcnQge1xuICAgIEVYVEVORF9SQURJVVMsXG4gICAgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUixcbiAgICBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCxcbiAgICBRVUlDS19JTlNFUlRfSU5ORVJfQ1JPU1NfQ09MT1IsXG4gICAgU1RST0tFX1dJRFRIXG59IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE1pbmRtYXBOb2RlU2hhcGUgfSBmcm9tICcuLi9jb25zdGFudHMvbm9kZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5vZGUsIE1pbmRtYXBMYXlvdXRUeXBlLCBPcmlnaW5Ob2RlLCBpc1N0YW5kYXJkTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgZ2V0TGlua0xpbmVDb2xvckJ5TWluZG1hcEVsZW1lbnQsIGdldFJvb3RMaW5rTGluZUNvbG9yQnlNaW5kbWFwRWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL2NvbG9ycyc7XG5pbXBvcnQgeyBNaW5kbWFwUXVlcmllcyB9IGZyb20gJy4uL3F1ZXJpZXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbnNlcnRNaW5kRWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL21pbmRtYXAnO1xuXG5leHBvcnQgY2xhc3MgUXVpY2tJbnNlcnREcmF3ZXIgZXh0ZW5kcyBCYXNlRHJhd2VyIGltcGxlbWVudHMgQWZ0ZXJEcmF3IHtcbiAgICBjYW5EcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50PEJhc2VEYXRhPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc1JlYWRvbmx5KHRoaXMuYm9hcmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmICFlbGVtZW50LmlzUm9vdCA/IEVYVEVORF9SQURJVVMgOiAwO1xuICAgICAgICBjb25zdCBxdWlja0luc2VydEcgPSBjcmVhdGVHKCk7XG4gICAgICAgIHRoaXMuZyA9IHF1aWNrSW5zZXJ0RztcbiAgICAgICAgcXVpY2tJbnNlcnRHLmNsYXNzTGlzdC5hZGQoJ3F1aWNrLWluc2VydCcpO1xuICAgICAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaWueS9je+8mlxuICAgICAgICAgKiAgICAxLiDlt6bjgIHlt6bkuIrjgIHlt6bkuItcbiAgICAgICAgICogICAgMi4g5Y+z44CB5Y+z5LiK44CB5Y+z5LiLXG4gICAgICAgICAqICAgIDMuIOS4iuOAgeS4iuW3puOAgeS4iuWPs1xuICAgICAgICAgKiAgICA0LiDkuIvjgIHkuIvlt6bjgIHkuIvlj7NcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0Tm9kZVNoYXBlQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAvLyDlvaLnirbmmK/nn6nlvaLopoHlgY/np7vovrnmoYbnmoTnur/lrr1cbiAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBlbGVtZW50LmxpbmtMaW5lV2lkdGggPyBlbGVtZW50LmxpbmtMaW5lV2lkdGggOiBTVFJPS0VfV0lEVEg7XG4gICAgICAgIGxldCBvZmZzZXRCb3JkZXJMaW5lV2lkdGggPSAwO1xuICAgICAgICBpZiAoc2hhcGUgPT09IE1pbmRtYXBOb2RlU2hhcGUucm91bmRSZWN0YW5nbGUgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggPSBzdHJva2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCA9IDA7XG4gICAgICAgIGlmIChlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCA9IHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIOW9k+ayoeacieWtkOiKgueCueaXtu+8jOmcgOimgee8qeWwj+eahOWBj+enu+mHj1xuICAgICAgICBjb25zdCBleHRyYU9mZnNldCA9IDM7XG4gICAgICAgIGNvbnN0IHVuZGVybGluZUNvb3JkaW5hdGVzOiBFeHRlbmRVbmRlcmxpbmVDb29yZGluYXRlVHlwZSA9IHtcbiAgICAgICAgICAgIC8vIOeUu+e6v+aWueWQke+8muWPs+WQkeW3piA8LS1cbiAgICAgICAgICAgIFtNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0XToge1xuICAgICAgICAgICAgICAgIC8vIEVYVEVORF9SQURJVVMgKiAwLjUg5pivIOW3puaWueWQke+8jOaKmOWPoC/mlLbotbfnmoTlgY/np7vph49cbiAgICAgICAgICAgICAgICBzdGFydFg6IHggLSAob2Zmc2V0ID4gMCA/IG9mZnNldCArIEVYVEVORF9SQURJVVMgKiAwLjUgOiAwKSAtIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGVuZFg6XG4gICAgICAgICAgICAgICAgICAgIHggLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCAtIGV4dHJhT2Zmc2V0IDogMCkgLVxuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTLFxuICAgICAgICAgICAgICAgIGVuZFk6IHkgKyBoZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDnlLvnur/mlrnlkJHvvJrlt6blkJHlj7MgLS0+XG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUucmlnaHRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKyAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgKyBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSArIGhlaWdodCxcbiAgICAgICAgICAgICAgICBlbmRYOlxuICAgICAgICAgICAgICAgICAgICB4ICtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFk6IHkgKyBoZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDnlLvnur/mlrnlkJHvvJrkuIvlkJHkuIogLS0+XG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUudXB3YXJkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSAtIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSAtIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g55S757q/5pa55ZCR77ya5LiK5ZCR5LiLIC0tPlxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLmRvd253YXJkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTpcbiAgICAgICAgICAgICAgICAgICAgeSArIGhlaWdodCArIG9mZnNldEJvcmRlckxpbmVXaWR0aCArIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSArIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgK1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLmxlZnRCb3R0b21JbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6XG4gICAgICAgICAgICAgICAgICAgIHkgKyBoZWlnaHQgKyBvZmZzZXRCb3JkZXJMaW5lV2lkdGggKyAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgKyBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5ICtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCAtIGV4dHJhT2Zmc2V0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0VG9wSW5kZW50ZWRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5IC0gb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC0gKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC0gb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLnJpZ2h0Qm90dG9tSW5kZW50ZWRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOlxuICAgICAgICAgICAgICAgICAgICB5ICsgaGVpZ2h0ICsgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApICsgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSArXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgLSBleHRyYU9mZnNldCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUucmlnaHRUb3BJbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6IHkgLSBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLSAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgLSBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5IC1cbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC1cbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNoYXBlID09PSBNaW5kbWFwTm9kZVNoYXBlLnJvdW5kUmVjdGFuZ2xlIHx8IGVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICB1bmRlcmxpbmVDb29yZGluYXRlc1tNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0XS5zdGFydFkgLT0gaGVpZ2h0ICogMC41O1xuICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZXNbTWluZG1hcExheW91dFR5cGUubGVmdF0uZW5kWSAtPSBoZWlnaHQgKiAwLjU7XG4gICAgICAgICAgICB1bmRlcmxpbmVDb29yZGluYXRlc1tNaW5kbWFwTGF5b3V0VHlwZS5yaWdodF0uc3RhcnRZIC09IGhlaWdodCAqIDAuNTtcbiAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGVzW01pbmRtYXBMYXlvdXRUeXBlLnJpZ2h0XS5lbmRZIC09IGhlaWdodCAqIDAuNTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJva2UgPSBlbGVtZW50LmlzUm9vdCA/IGdldFJvb3RMaW5rTGluZUNvbG9yQnlNaW5kbWFwRWxlbWVudChlbGVtZW50KSA6IGdldExpbmtMaW5lQ29sb3JCeU1pbmRtYXBFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBsZXQgbm9kZUxheW91dCA9IE1pbmRtYXBRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQoZWxlbWVudCkgYXMgRXh0ZW5kTGF5b3V0VHlwZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNSb290ICYmIGlzU3RhbmRhcmRMYXlvdXQobm9kZUxheW91dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50IGFzIE9yaWdpbk5vZGU7XG4gICAgICAgICAgICBub2RlTGF5b3V0ID0gcm9vdC5jaGlsZHJlbi5sZW5ndGggPj0gcm9vdC5yaWdodE5vZGVDb3VudCA/IE1pbmRtYXBMYXlvdXRUeXBlLmxlZnQgOiBNaW5kbWFwTGF5b3V0VHlwZS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmRlcmxpbmVDb29yZGluYXRlID0gdW5kZXJsaW5lQ29vcmRpbmF0ZXNbbm9kZUxheW91dF07XG4gICAgICAgIGlmICh1bmRlcmxpbmVDb29yZGluYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1bmRlcmxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUoXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFgsXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFksXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRYLFxuICAgICAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGUuZW5kWSxcbiAgICAgICAgICAgICAgICB7IHN0cm9rZSwgc3Ryb2tlV2lkdGggfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUNvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRYLFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRZXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRYLCBjaXJjbGVDb29yZGluYXRlcy5zdGFydFksIEVYVEVORF9SQURJVVMsIHtcbiAgICAgICAgICAgICAgICBmaWxsOiBRVUlDS19JTlNFUlRfQ0lSQ0xFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUixcbiAgICAgICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgICAgIGhvcml6b250YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFggLSBFWFRFTkRfUkFESVVTICogMC41ICsgMyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRZOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFksXG4gICAgICAgICAgICAgICAgICAgIGVuZFg6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WCArIEVYVEVORF9SQURJVVMgKiAwLjUgLSAzLFxuICAgICAgICAgICAgICAgICAgICBlbmRZOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WDogY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRYLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSAtIEVYVEVORF9SQURJVVMgKiAwLjUgKyAzLFxuICAgICAgICAgICAgICAgICAgICBlbmRYOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFgsXG4gICAgICAgICAgICAgICAgICAgIGVuZFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSArIEVYVEVORF9SQURJVVMgKiAwLjUgLSAzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQ3Jvc3NITGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMuaG9yaXpvbnRhbC5zdGFydFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLmhvcml6b250YWwuc3RhcnRZLFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy5ob3Jpem9udGFsLmVuZFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLmhvcml6b250YWwuZW5kWSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0lOTkVSX0NST1NTX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbm5lclJpbmdWTGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMudmVydGljYWwuc3RhcnRYLFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy52ZXJ0aWNhbC5zdGFydFksXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLnZlcnRpY2FsLmVuZFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLnZlcnRpY2FsLmVuZFksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IFFVSUNLX0lOU0VSVF9JTk5FUl9DUk9TU19DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKHVuZGVybGluZSk7XG4gICAgICAgICAgICBxdWlja0luc2VydEcuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgICAgICAgICAgIHF1aWNrSW5zZXJ0Ry5hcHBlbmRDaGlsZChpbm5lckNyb3NzSExpbmUpO1xuICAgICAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKGlubmVyUmluZ1ZMaW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVpY2tJbnNlcnRHO1xuICAgIH1cbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuIG5vdCBmaW5kIHF1aWNrIGluc2VydCBnYCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuZywgJ21vdXNlZG93bicpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLmcsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aCh0aGlzLmJvYXJkLCBlbGVtZW50KS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+ICFBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChjaGlsZCkpLmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0TWluZEVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCwgcGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=