@plait/mind 0.20.0 → 0.21.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/base/image-base.component.d.ts +5 -3
- package/drawer/node-image.drawer.d.ts +3 -5
- package/esm2020/base/image-base.component.mjs +9 -5
- package/esm2020/drawer/node-image.drawer.mjs +34 -39
- package/esm2020/interfaces/element.mjs +1 -1
- package/esm2020/node.component.mjs +8 -9
- package/esm2020/plugins/with-abstract-resize.mjs +1 -2
- package/esm2020/plugins/with-mind-hotkey.mjs +3 -2
- package/esm2020/plugins/with-mind.mjs +4 -3
- package/esm2020/plugins/with-node-dnd.mjs +3 -3
- package/esm2020/plugins/with-node-image.mjs +46 -0
- package/esm2020/plugins/with-node-resize.mjs +119 -0
- package/esm2020/transforms/index.mjs +3 -2
- package/esm2020/transforms/node.mjs +13 -2
- package/esm2020/utils/node/common.mjs +11 -2
- package/esm2020/utils/node/image.mjs +23 -0
- package/esm2020/utils/position/image.mjs +9 -4
- package/esm2020/utils/position/topic.mjs +3 -3
- package/esm2020/utils/space/node-space.mjs +23 -22
- package/fesm2015/plait-mind.mjs +252 -99
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +253 -99
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/interfaces/element.d.ts +1 -0
- package/node.component.d.ts +0 -1
- package/package.json +1 -1
- package/plugins/with-mind-hotkey.d.ts +1 -1
- package/plugins/with-node-image.d.ts +2 -0
- package/plugins/with-node-resize.d.ts +10 -0
- package/styles/styles.scss +9 -2
- package/transforms/index.d.ts +1 -0
- package/transforms/node.d.ts +1 -0
- package/utils/node/common.d.ts +2 -0
- package/utils/node/image.d.ts +6 -0
- package/utils/space/node-space.d.ts +3 -3
- package/esm2020/plugins/with-mind-image.mjs +0 -49
- package/plugins/with-mind-image.d.ts +0 -2
package/interfaces/element.d.ts
CHANGED
package/node.component.d.ts
CHANGED
|
@@ -35,7 +35,6 @@ export declare class MindNodeComponent extends PlaitPluginElementComponent<MindE
|
|
|
35
35
|
editTopic(): void;
|
|
36
36
|
onContextChanged(value: PlaitPluginElementContext<MindElement, PlaitMindBoard>, previous: PlaitPluginElementContext<MindElement, PlaitMindBoard>): void;
|
|
37
37
|
drawEmojis(): void;
|
|
38
|
-
drawImage(): void;
|
|
39
38
|
drawShape(): void;
|
|
40
39
|
destroyShape(): void;
|
|
41
40
|
drawLink(): void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../interfaces';
|
|
3
3
|
import { PlaitMindBoard } from './with-mind.board';
|
|
4
|
-
export declare const withMindHotkey: (
|
|
4
|
+
export declare const withMindHotkey: (baseBoard: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
5
5
|
export declare const getNextSelectedElement: (board: PlaitBoard, firstLevelElements: MindElement[]) => MindElement<import("../interfaces").BaseData> | undefined;
|
|
6
6
|
export declare const isExpandHotkey: (event: KeyboardEvent) => boolean;
|
|
7
7
|
export declare const isTabHotkey: (event: KeyboardEvent) => boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PlaitBoard, Point, RectangleClient } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces/element';
|
|
3
|
+
import { PlaitMindBoard } from './with-mind.board';
|
|
4
|
+
export declare const withNodeResize: (board: PlaitBoard) => PlaitBoard;
|
|
5
|
+
export declare const IS_MIND_NODE_RESIZING: WeakMap<PlaitBoard, boolean>;
|
|
6
|
+
export declare const isMindNodeResizing: (board: PlaitBoard) => boolean;
|
|
7
|
+
export declare const addResizing: (board: PlaitBoard, element: MindElement) => void;
|
|
8
|
+
export declare const removeResizing: (board: PlaitBoard, element: MindElement) => void;
|
|
9
|
+
export declare const getTargetElement: (board: PlaitMindBoard, point: Point) => MindElement<import("@plait/mind").BaseData> | null;
|
|
10
|
+
export declare const getResizeActiveRectangle: (board: PlaitBoard, element: MindElement) => RectangleClient;
|
package/styles/styles.scss
CHANGED
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
$primary: #4e8afa;
|
|
4
4
|
|
|
5
5
|
.plait-board-container {
|
|
6
|
-
g[plait-mindmap='true'],
|
|
6
|
+
g[plait-mindmap='true'],
|
|
7
|
+
g[plait-mind-temporary='true'] {
|
|
7
8
|
// The font family under SAFARI affects the measurement of the text size,
|
|
8
9
|
// so specify the default font family to avoid unexpected text breaks in different scene
|
|
9
10
|
font-family: PingFangSC-Regular, 'PingFang SC';
|
|
10
|
-
.root,
|
|
11
|
+
.root,
|
|
12
|
+
&.root {
|
|
11
13
|
.text {
|
|
12
14
|
font-family: PingFangSC-Medium, 'PingFang SC';
|
|
13
15
|
font-weight: 400;
|
|
@@ -128,5 +130,10 @@ $primary: #4e8afa;
|
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
132
|
|
|
133
|
+
.mind-node-image {
|
|
134
|
+
margin: 6px;
|
|
135
|
+
display: block
|
|
136
|
+
}
|
|
137
|
+
|
|
131
138
|
@include mixins.node-color();
|
|
132
139
|
}
|
package/transforms/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare const MindTransforms: {
|
|
|
2
2
|
setLayout: (board: import("@plait/core").PlaitBoard, layout: import("@plait/layouts").MindLayoutType, path: import("@plait/core").Path) => void;
|
|
3
3
|
setTopic: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, topic: import("slate").BaseElement, width: number, height: number) => void;
|
|
4
4
|
setTopicSize: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, width: number, height: number) => void;
|
|
5
|
+
setNodeManualWidth: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, width: number, height: number) => void;
|
|
5
6
|
addEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, emojiItem: import("@plait/mind").EmojiItem) => void;
|
|
6
7
|
removeEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").EmojiData>, emojiItem: import("@plait/mind").EmojiItem) => void;
|
|
7
8
|
replaceEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").EmojiData>, oldEmoji: import("@plait/mind").EmojiItem, newEmoji: import("@plait/mind").EmojiItem) => void;
|
package/transforms/node.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { AbstractRef } from '../utils/abstract/common';
|
|
|
5
5
|
import { RightNodeCountRef } from '../utils/node/right-node-count';
|
|
6
6
|
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
7
7
|
export declare const setTopic: (board: PlaitMindBoard, element: MindElement, topic: Element, width: number, height: number) => void;
|
|
8
|
+
export declare const setNodeManualWidth: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
|
|
8
9
|
export declare const setTopicSize: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
|
|
9
10
|
export declare const removeElements: (board: PlaitBoard, elements: MindElement[]) => void;
|
|
10
11
|
export declare const insertNodes: (board: PlaitBoard, elements: MindElement[], path: Path) => void;
|
package/utils/node/common.d.ts
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../../interfaces';
|
|
3
|
+
export declare const getSelectedImageElement: (board: PlaitBoard) => MindElement<import("../../interfaces").BaseData> | undefined;
|
|
4
|
+
export declare const addSelectedImageElement: (board: PlaitBoard, element: MindElement) => void;
|
|
5
|
+
export declare const removeSelectedImageElement: (board: PlaitBoard) => void;
|
|
6
|
+
export declare const setImageFocus: (board: PlaitBoard, element: MindElement, isFocus: boolean) => void;
|
|
@@ -9,10 +9,10 @@ export declare const NodeSpace: {
|
|
|
9
9
|
getNodeResizableMinWidth(board: PlaitMindBoard, element: MindElement): number;
|
|
10
10
|
getNodeTopicMinWidth(board: PlaitMindBoard, element: MindElement, isRoot?: boolean): number;
|
|
11
11
|
getTextLeftSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
12
|
-
getTextTopSpace(element: MindElement): number;
|
|
13
|
-
getImageTopSpace(element: MindElement): number;
|
|
12
|
+
getTextTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
13
|
+
getImageTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
14
14
|
getEmojiLeftSpace(board: PlaitMindBoard, element: MindElement<EmojiData>): number;
|
|
15
|
-
getEmojiTopSpace(element: MindElement): number;
|
|
15
|
+
getEmojiTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
16
16
|
};
|
|
17
17
|
export declare const getFontSizeBySlateElement: (text: string | Element) => number;
|
|
18
18
|
export declare const getNodeDefaultFontSize: (isRoot?: boolean) => 14 | 18;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, getHitElements, isMainPointer, toPoint, transformPoint, PlaitPluginKey, PlaitElement, hotkeys, clearSelectedElement, PlaitPointerType } from '@plait/core';
|
|
2
|
-
import { MindElement } from '../interfaces';
|
|
3
|
-
import { MindTransforms, isHitImage } from '../public-api';
|
|
4
|
-
export const withMindImage = (board) => {
|
|
5
|
-
let selectedImageElement = null;
|
|
6
|
-
const { keydown, mousedown } = board;
|
|
7
|
-
board.mousedown = (event) => {
|
|
8
|
-
if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
|
|
9
|
-
mousedown(event);
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
13
|
-
const range = { anchor: point, focus: point };
|
|
14
|
-
const hitElements = getHitElements(board, { ranges: [range] });
|
|
15
|
-
const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
|
|
16
|
-
const hitImage = hasImage && isHitImage(board, hitElements[0], range);
|
|
17
|
-
if (hitImage) {
|
|
18
|
-
const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
|
|
19
|
-
board.setPluginOptions(PlaitPluginKey.withSelection, {
|
|
20
|
-
isDisabledSelect: true
|
|
21
|
-
});
|
|
22
|
-
setTimeout(() => {
|
|
23
|
-
board.setPluginOptions(PlaitPluginKey.withSelection, { ...currentOptions });
|
|
24
|
-
}, 0);
|
|
25
|
-
selectedImageElement = hitElements[0];
|
|
26
|
-
const component = PlaitElement.getComponent(selectedImageElement);
|
|
27
|
-
component.imageDrawer.drawActive(selectedImageElement);
|
|
28
|
-
clearSelectedElement(board);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
if (selectedImageElement) {
|
|
32
|
-
const component = PlaitElement.getComponent(selectedImageElement);
|
|
33
|
-
component && component.imageDrawer.destroyActive();
|
|
34
|
-
}
|
|
35
|
-
selectedImageElement = null;
|
|
36
|
-
}
|
|
37
|
-
mousedown(event);
|
|
38
|
-
};
|
|
39
|
-
board.keydown = (event) => {
|
|
40
|
-
if (!PlaitBoard.isReadonly(board) && selectedImageElement && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
|
|
41
|
-
MindTransforms.removeImage(board, selectedImageElement);
|
|
42
|
-
selectedImageElement = null;
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
keydown(event);
|
|
46
|
-
};
|
|
47
|
-
return board;
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1taW5kLWltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy93aXRoLW1pbmQtaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFVBQVUsRUFDVixjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUCxjQUFjLEVBR2QsY0FBYyxFQUNkLFlBQVksRUFDWixPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBcUIsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5RSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDL0MsSUFBSSxvQkFBb0IsR0FBa0MsSUFBSSxDQUFDO0lBRS9ELE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRXJDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDcEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkgsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pCLE9BQU87U0FDVjtRQUNELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixNQUFNLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQWdCLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxRQUFRLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhHLElBQUksUUFBUSxFQUFFO1lBQ1YsTUFBTSxjQUFjLEdBQUksS0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEcsS0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBb0IsY0FBYyxDQUFDLGFBQWEsRUFBRTtnQkFDM0YsZ0JBQWdCLEVBQUUsSUFBSTthQUN6QixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNYLEtBQTJCLENBQUMsZ0JBQWdCLENBQW9CLGNBQWMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDMUgsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRU4sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBMkIsQ0FBQztZQUNoRSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFzQixDQUFDO1lBQ3ZGLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkQsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNILElBQUksb0JBQW9CLEVBQUU7Z0JBQ3RCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQXNCLENBQUM7Z0JBQ3ZGLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3REO1lBQ0Qsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlILGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE9BQU87U0FDVjtRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgZ2V0SGl0RWxlbWVudHMsXG4gICAgaXNNYWluUG9pbnRlcixcbiAgICB0b1BvaW50LFxuICAgIHRyYW5zZm9ybVBvaW50LFxuICAgIFBsYWl0T3B0aW9uc0JvYXJkLFxuICAgIFdpdGhQbHVnaW5PcHRpb25zLFxuICAgIFBsYWl0UGx1Z2luS2V5LFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBob3RrZXlzLFxuICAgIGNsZWFyU2VsZWN0ZWRFbGVtZW50LFxuICAgIFBsYWl0UG9pbnRlclR5cGVcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmROb2RlQ29tcG9uZW50LCBNaW5kVHJhbnNmb3JtcywgaXNIaXRJbWFnZSB9IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuXG5leHBvcnQgY29uc3Qgd2l0aE1pbmRJbWFnZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGxldCBzZWxlY3RlZEltYWdlRWxlbWVudDogTWluZEVsZW1lbnQ8SW1hZ2VEYXRhPiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3QgeyBrZXlkb3duLCBtb3VzZWRvd24gfSA9IGJvYXJkO1xuXG4gICAgYm9hcmQubW91c2Vkb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpIHx8ICFpc01haW5Qb2ludGVyKGV2ZW50KSB8fCAhUGxhaXRCb2FyZC5pc1BvaW50ZXIoYm9hcmQsIFBsYWl0UG9pbnRlclR5cGUuc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgbW91c2Vkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludCA9IHRyYW5zZm9ybVBvaW50KGJvYXJkLCB0b1BvaW50KGV2ZW50LngsIGV2ZW50LnksIFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCkpKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7IGFuY2hvcjogcG9pbnQsIGZvY3VzOiBwb2ludCB9O1xuICAgICAgICBjb25zdCBoaXRFbGVtZW50cyA9IGdldEhpdEVsZW1lbnRzKGJvYXJkLCB7IHJhbmdlczogW3JhbmdlXSB9KTtcbiAgICAgICAgY29uc3QgaGFzSW1hZ2UgPSBoaXRFbGVtZW50cy5sZW5ndGggJiYgTWluZEVsZW1lbnQuaGFzSW1hZ2UoaGl0RWxlbWVudHNbMF0gYXMgTWluZEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBoaXRJbWFnZSA9IGhhc0ltYWdlICYmIGlzSGl0SW1hZ2UoYm9hcmQsIGhpdEVsZW1lbnRzWzBdIGFzIE1pbmRFbGVtZW50PEltYWdlRGF0YT4sIHJhbmdlKTtcblxuICAgICAgICBpZiAoaGl0SW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gKGJvYXJkIGFzIFBsYWl0T3B0aW9uc0JvYXJkKS5nZXRQbHVnaW5PcHRpb25zKFBsYWl0UGx1Z2luS2V5LndpdGhTZWxlY3Rpb24pO1xuICAgICAgICAgICAgKGJvYXJkIGFzIFBsYWl0T3B0aW9uc0JvYXJkKS5zZXRQbHVnaW5PcHRpb25zPFdpdGhQbHVnaW5PcHRpb25zPihQbGFpdFBsdWdpbktleS53aXRoU2VsZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZFNlbGVjdDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAoYm9hcmQgYXMgUGxhaXRPcHRpb25zQm9hcmQpLnNldFBsdWdpbk9wdGlvbnM8V2l0aFBsdWdpbk9wdGlvbnM+KFBsYWl0UGx1Z2luS2V5LndpdGhTZWxlY3Rpb24sIHsgLi4uY3VycmVudE9wdGlvbnMgfSk7XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAgICAgc2VsZWN0ZWRJbWFnZUVsZW1lbnQgPSBoaXRFbGVtZW50c1swXSBhcyBNaW5kRWxlbWVudDxJbWFnZURhdGE+O1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChzZWxlY3RlZEltYWdlRWxlbWVudCkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICBjb21wb25lbnQuaW1hZ2VEcmF3ZXIuZHJhd0FjdGl2ZShzZWxlY3RlZEltYWdlRWxlbWVudCk7XG4gICAgICAgICAgICBjbGVhclNlbGVjdGVkRWxlbWVudChib2FyZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KHNlbGVjdGVkSW1hZ2VFbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgJiYgY29tcG9uZW50LmltYWdlRHJhd2VyLmRlc3Ryb3lBY3RpdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGVkSW1hZ2VFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmtleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpICYmIHNlbGVjdGVkSW1hZ2VFbGVtZW50ICYmIChob3RrZXlzLmlzRGVsZXRlQmFja3dhcmQoZXZlbnQpIHx8IGhvdGtleXMuaXNEZWxldGVGb3J3YXJkKGV2ZW50KSkpIHtcbiAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLnJlbW92ZUltYWdlKGJvYXJkLCBzZWxlY3RlZEltYWdlRWxlbWVudCk7XG4gICAgICAgICAgICBzZWxlY3RlZEltYWdlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBrZXlkb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcbiJdfQ==
|