@plait/mind 0.19.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/base.drawer.d.ts +3 -3
- package/base/image-base.component.d.ts +5 -3
- package/constants/index.d.ts +0 -1
- package/drawer/node-image.drawer.d.ts +3 -5
- package/esm2020/base/base.drawer.mjs +1 -1
- package/esm2020/base/image-base.component.mjs +9 -5
- package/esm2020/constants/index.mjs +1 -2
- 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 +9 -14
- package/esm2020/plugins/with-node-dnd.mjs +5 -5
- package/esm2020/plugins/with-node-hover.mjs +3 -10
- 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 +19 -7
- package/esm2020/utils/clipboard.mjs +4 -4
- package/esm2020/utils/dnd/detector.mjs +3 -10
- package/esm2020/utils/mind.mjs +3 -3
- package/esm2020/utils/node/adjust-node.mjs +3 -3
- 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 +59 -24
- package/fesm2015/plait-mind.mjs +312 -148
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +312 -147
- 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 +2 -1
- package/plugins/with-mind.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 +3 -2
- package/transforms/node.d.ts +4 -2
- package/utils/clipboard.d.ts +3 -2
- package/utils/mind.d.ts +3 -2
- package/utils/node/adjust-node.d.ts +2 -1
- package/utils/node/common.d.ts +2 -0
- package/utils/node/image.d.ts +6 -0
- package/utils/space/node-space.d.ts +9 -3
- package/constants/node-rule.d.ts +0 -1
- package/esm2020/constants/node-rule.mjs +0 -2
- 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,6 +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: (baseBoard: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
4
5
|
export declare const getNextSelectedElement: (board: PlaitBoard, firstLevelElements: MindElement[]) => MindElement<import("../interfaces").BaseData> | undefined;
|
|
5
6
|
export declare const isExpandHotkey: (event: KeyboardEvent) => boolean;
|
|
6
7
|
export declare const isTabHotkey: (event: KeyboardEvent) => boolean;
|
package/plugins/with-mind.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
|
-
export declare const withMind: (
|
|
2
|
+
export declare const withMind: (baseBoard: PlaitBoard) => PlaitBoard;
|
|
@@ -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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare const MindTransforms: {
|
|
2
2
|
setLayout: (board: import("@plait/core").PlaitBoard, layout: import("@plait/layouts").MindLayoutType, path: import("@plait/core").Path) => void;
|
|
3
|
-
setTopic: (board: import("@plait/
|
|
4
|
-
setTopicSize: (board: import("@plait/
|
|
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
|
+
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
|
@@ -3,8 +3,10 @@ import { MindElement } from '../interfaces/element';
|
|
|
3
3
|
import { PlaitBoard } from '@plait/core';
|
|
4
4
|
import { AbstractRef } from '../utils/abstract/common';
|
|
5
5
|
import { RightNodeCountRef } from '../utils/node/right-node-count';
|
|
6
|
-
|
|
7
|
-
export declare const
|
|
6
|
+
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
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;
|
|
9
|
+
export declare const setTopicSize: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
|
|
8
10
|
export declare const removeElements: (board: PlaitBoard, elements: MindElement[]) => void;
|
|
9
11
|
export declare const insertNodes: (board: PlaitBoard, elements: MindElement[], path: Path) => void;
|
|
10
12
|
export declare const insertAbstractNodes: (board: PlaitBoard, validAbstractRefs: AbstractRef[], elements: MindElement[], path: Path) => void;
|
package/utils/clipboard.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { PlaitBoard, PlaitElement, Point } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../interfaces';
|
|
3
3
|
import { Element } from 'slate';
|
|
4
|
+
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
4
5
|
export declare const buildClipboardData: (board: PlaitBoard, selectedElements: MindElement[]) => MindElement<import("../interfaces").BaseData>[];
|
|
5
6
|
export declare const setClipboardData: (data: DataTransfer | null, elements: MindElement[]) => void;
|
|
6
7
|
export declare const getDataFromClipboard: (data: DataTransfer | null) => PlaitElement[];
|
|
7
|
-
export declare const insertClipboardData: (board:
|
|
8
|
-
export declare const insertClipboardText: (board:
|
|
8
|
+
export declare const insertClipboardData: (board: PlaitMindBoard, elements: PlaitElement[], targetPoint: Point) => void;
|
|
9
|
+
export declare const insertClipboardText: (board: PlaitMindBoard, targetParent: PlaitElement, text: string | Element) => void;
|
package/utils/mind.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Path
|
|
1
|
+
import { Path } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../interfaces/element';
|
|
3
3
|
import { MindNode } from '../interfaces/node';
|
|
4
|
+
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
4
5
|
export declare const getChildrenCount: (element: MindElement) => number;
|
|
5
6
|
export declare const isChildElement: (origin: MindElement, child: MindElement) => boolean;
|
|
6
7
|
export declare const getFirstLevelElement: (elements: MindElement[]) => MindElement<import("@plait/mind").BaseData>[];
|
|
@@ -8,7 +9,7 @@ export declare const isChildRight: (node: MindNode, child: MindNode) => boolean;
|
|
|
8
9
|
export declare const isChildUp: (node: MindNode, child: MindNode) => boolean;
|
|
9
10
|
export declare const copyNewNode: (node: MindElement) => MindElement<import("@plait/mind").BaseData>;
|
|
10
11
|
export declare const extractNodesText: (node: MindElement) => string;
|
|
11
|
-
export declare const insertMindElement: (board:
|
|
12
|
+
export declare const insertMindElement: (board: PlaitMindBoard, inheritNode: MindElement, path: Path) => void;
|
|
12
13
|
export declare const findLastChild: (child: MindNode) => MindNode;
|
|
13
14
|
export declare const divideElementByParent: (elements: MindElement[]) => {
|
|
14
15
|
parentElements: MindElement<import("@plait/mind").BaseData>[];
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../../interfaces/element';
|
|
3
|
+
import { PlaitMindBoard } from '../../plugins/with-mind.board';
|
|
3
4
|
export declare const adjustRootToNode: (board: PlaitBoard, node: MindElement) => MindElement<import("@plait/mind").BaseData>;
|
|
4
5
|
export declare const adjustAbstractToNode: (node: MindElement) => MindElement<import("@plait/mind").BaseData>;
|
|
5
|
-
export declare const adjustNodeToRoot: (board:
|
|
6
|
+
export declare const adjustNodeToRoot: (board: PlaitMindBoard, node: MindElement) => MindElement;
|
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;
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { MindElement } from '../../interfaces/element';
|
|
2
2
|
import { EmojiData } from '../../interfaces/element-data';
|
|
3
3
|
import { PlaitMindBoard } from '../../plugins/with-mind.board';
|
|
4
|
+
import { Element } from 'slate';
|
|
4
5
|
export declare const NodeSpace: {
|
|
5
6
|
getNodeWidth(board: PlaitMindBoard, element: MindElement): number;
|
|
6
7
|
getNodeHeight(board: PlaitMindBoard, element: MindElement): number;
|
|
8
|
+
getNodeResizableWidth(board: PlaitMindBoard, element: MindElement): number;
|
|
9
|
+
getNodeResizableMinWidth(board: PlaitMindBoard, element: MindElement): number;
|
|
10
|
+
getNodeTopicMinWidth(board: PlaitMindBoard, element: MindElement, isRoot?: boolean): number;
|
|
7
11
|
getTextLeftSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
8
|
-
getTextTopSpace(element: MindElement): number;
|
|
9
|
-
getImageTopSpace(element: MindElement): number;
|
|
12
|
+
getTextTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
13
|
+
getImageTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
10
14
|
getEmojiLeftSpace(board: PlaitMindBoard, element: MindElement<EmojiData>): number;
|
|
11
|
-
getEmojiTopSpace(element: MindElement): number;
|
|
15
|
+
getEmojiTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
12
16
|
};
|
|
17
|
+
export declare const getFontSizeBySlateElement: (text: string | Element) => number;
|
|
18
|
+
export declare const getNodeDefaultFontSize: (isRoot?: boolean) => 14 | 18;
|
package/constants/node-rule.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const NODE_MIN_WIDTH = 18;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const NODE_MIN_WIDTH = 18;
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1ydWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvY29uc3RhbnRzL25vZGUtcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE5PREVfTUlOX1dJRFRIID0gMTg7XG4iXX0=
|
|
@@ -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==
|