@plait/draw 0.55.0 → 0.56.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.
Files changed (56) hide show
  1. package/constants/geometry.d.ts +52 -0
  2. package/engines/basic-shapes/ellipse.d.ts +8 -3
  3. package/engines/flowchart/database.d.ts +2 -0
  4. package/engines/flowchart/document.d.ts +2 -0
  5. package/engines/flowchart/hard-disk.d.ts +2 -0
  6. package/engines/flowchart/internal-storage.d.ts +2 -0
  7. package/engines/flowchart/multi-document.d.ts +4 -0
  8. package/engines/flowchart/note-curly-left.d.ts +2 -0
  9. package/engines/flowchart/note-curly-right.d.ts +2 -0
  10. package/engines/flowchart/note-square.d.ts +2 -0
  11. package/esm2022/constants/geometry.mjs +30 -2
  12. package/esm2022/engines/basic-shapes/ellipse.mjs +49 -36
  13. package/esm2022/engines/basic-shapes/round-rectangle.mjs +2 -3
  14. package/esm2022/engines/flowchart/database.mjs +84 -0
  15. package/esm2022/engines/flowchart/delay.mjs +2 -3
  16. package/esm2022/engines/flowchart/document.mjs +81 -0
  17. package/esm2022/engines/flowchart/hard-disk.mjs +84 -0
  18. package/esm2022/engines/flowchart/internal-storage.mjs +47 -0
  19. package/esm2022/engines/flowchart/multi-document.mjs +143 -0
  20. package/esm2022/engines/flowchart/note-curly-left.mjs +50 -0
  21. package/esm2022/engines/flowchart/note-curly-right.mjs +50 -0
  22. package/esm2022/engines/flowchart/note-square.mjs +46 -0
  23. package/esm2022/engines/flowchart/or.mjs +2 -2
  24. package/esm2022/engines/flowchart/stored-data.mjs +2 -3
  25. package/esm2022/engines/flowchart/summing-junction.mjs +2 -2
  26. package/esm2022/engines/flowchart/terminal.mjs +2 -3
  27. package/esm2022/engines/index.mjs +18 -2
  28. package/esm2022/generators/line-active.generator.mjs +15 -13
  29. package/esm2022/generators/line-auto-complete.generator.mjs +2 -1
  30. package/esm2022/geometry.component.mjs +12 -20
  31. package/esm2022/image.component.mjs +8 -8
  32. package/esm2022/interfaces/geometry.mjs +9 -1
  33. package/esm2022/line.component.mjs +6 -6
  34. package/esm2022/plugins/with-draw-fragment.mjs +4 -4
  35. package/esm2022/plugins/with-draw-hotkey.mjs +5 -5
  36. package/esm2022/plugins/with-draw-rotate.mjs +6 -7
  37. package/esm2022/plugins/with-draw.mjs +3 -3
  38. package/esm2022/plugins/with-geometry-create.mjs +35 -22
  39. package/esm2022/plugins/with-geometry-resize.mjs +4 -5
  40. package/esm2022/plugins/with-line-auto-complete-reaction.mjs +6 -4
  41. package/esm2022/plugins/with-line-text-move.mjs +5 -5
  42. package/esm2022/plugins/with-line-text.mjs +11 -7
  43. package/esm2022/utils/geometry.mjs +7 -3
  44. package/esm2022/utils/selected.mjs +4 -4
  45. package/fesm2022/plait-draw.mjs +699 -131
  46. package/fesm2022/plait-draw.mjs.map +1 -1
  47. package/generators/line-auto-complete.generator.d.ts +1 -0
  48. package/geometry.component.d.ts +1 -4
  49. package/image.component.d.ts +1 -3
  50. package/interfaces/geometry.d.ts +9 -1
  51. package/line.component.d.ts +1 -3
  52. package/package.json +1 -1
  53. package/utils/geometry.d.ts +16 -0
  54. package/utils/selected.d.ts +2 -2
  55. package/engines/basic-shapes/circle.d.ts +0 -8
  56. package/esm2022/engines/basic-shapes/circle.mjs +0 -51
@@ -3,6 +3,7 @@ import { PlaitGeometry, PlaitShapeElement } from '../interfaces';
3
3
  import { ActiveGeneratorExtraData, Generator } from '@plait/common';
4
4
  export declare class LineAutoCompleteGenerator extends Generator<PlaitShapeElement, ActiveGeneratorExtraData> {
5
5
  board: PlaitBoard;
6
+ static key: string;
6
7
  autoCompleteG: SVGGElement;
7
8
  hoverElement: SVGGElement | null;
8
9
  constructor(board: PlaitBoard);
@@ -1,4 +1,4 @@
1
- import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { PlaitBoard, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import { PlaitGeometry } from './interfaces/geometry';
@@ -8,17 +8,14 @@ import { ActiveGenerator, CommonPluginElement } from '@plait/common';
8
8
  import { LineAutoCompleteGenerator } from './generators/line-auto-complete.generator';
9
9
  import * as i0 from "@angular/core";
10
10
  export declare class GeometryComponent extends CommonPluginElement<PlaitGeometry, PlaitBoard> implements OnInit, OnDestroy, OnContextChanged<PlaitGeometry, PlaitBoard> {
11
- protected cdr: ChangeDetectorRef;
12
11
  destroy$: Subject<void>;
13
12
  activeGenerator: ActiveGenerator<PlaitGeometry>;
14
13
  lineAutoCompleteGenerator: LineAutoCompleteGenerator;
15
14
  shapeGenerator: GeometryShapeGenerator;
16
15
  get textManage(): TextManage;
17
- constructor(cdr: ChangeDetectorRef);
18
16
  initializeGenerator(): void;
19
17
  ngOnInit(): void;
20
18
  onContextChanged(value: PlaitPluginElementContext<PlaitGeometry, PlaitBoard>, previous: PlaitPluginElementContext<PlaitGeometry, PlaitBoard>): void;
21
- editText(): void;
22
19
  drawText(): void;
23
20
  updateText(): void;
24
21
  initializeTextManage(): void;
@@ -1,4 +1,4 @@
1
- import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { PlaitBoard, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import { CommonPluginElement, ImageGenerator } from '@plait/common';
@@ -6,12 +6,10 @@ import { PlaitImage } from './interfaces/image';
6
6
  import { LineAutoCompleteGenerator } from './generators/line-auto-complete.generator';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class ImageComponent extends CommonPluginElement<PlaitImage, PlaitBoard> implements OnInit, OnDestroy, OnContextChanged<PlaitImage, PlaitBoard> {
9
- protected cdr: ChangeDetectorRef;
10
9
  destroy$: Subject<void>;
11
10
  get activeGenerator(): import("@plait/common").ActiveGenerator<import("@plait/core").PlaitElement>;
12
11
  imageGenerator: ImageGenerator<PlaitImage>;
13
12
  lineAutoCompleteGenerator: LineAutoCompleteGenerator;
14
- constructor(cdr: ChangeDetectorRef);
15
13
  initializeGenerator(): void;
16
14
  ngOnInit(): void;
17
15
  onContextChanged(value: PlaitPluginElementContext<PlaitImage, PlaitBoard>, previous: PlaitPluginElementContext<PlaitImage, PlaitBoard>): void;
@@ -40,7 +40,15 @@ export declare enum FlowchartSymbols {
40
40
  or = "or",
41
41
  summingJunction = "summingJunction",
42
42
  predefinedProcess = "predefinedProcess",
43
- offPage = "offPage"
43
+ offPage = "offPage",
44
+ document = "document",
45
+ multiDocument = "multiDocument",
46
+ database = "database",
47
+ hardDisk = "hardDisk",
48
+ internalStorage = "internalStorage",
49
+ noteCurlyRight = "noteCurlyRight",
50
+ noteCurlyLeft = "noteCurlyLeft",
51
+ noteSquare = "noteSquare"
44
52
  }
45
53
  export type GeometryShapes = BasicShapes | FlowchartSymbols;
46
54
  export interface PlaitGeometry extends PlaitElement {
@@ -1,4 +1,4 @@
1
- import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { PlaitBoard, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import { LineText, PlaitGeometry, PlaitLine } from './interfaces';
@@ -12,12 +12,10 @@ interface BoundedElements {
12
12
  target?: PlaitGeometry;
13
13
  }
14
14
  export declare class LineComponent extends CommonPluginElement<PlaitLine, PlaitBoard> implements OnInit, OnDestroy, OnContextChanged<PlaitLine, PlaitBoard> {
15
- protected cdr: ChangeDetectorRef;
16
15
  destroy$: Subject<void>;
17
16
  shapeGenerator: LineShapeGenerator;
18
17
  activeGenerator: LineActiveGenerator;
19
18
  boundedElements: BoundedElements;
20
- constructor(cdr: ChangeDetectorRef);
21
19
  initializeGenerator(): void;
22
20
  ngOnInit(): void;
23
21
  getBoundedElements(): BoundedElements;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/draw",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.2.4",
6
6
  "@angular/core": "^17.2.4",
@@ -42,6 +42,21 @@ export declare const getDefaultFlowchartProperty: (symbol: FlowchartSymbols) =>
42
42
  } | {
43
43
  width: number;
44
44
  height: number;
45
+ } | {
46
+ width: number;
47
+ height: number;
48
+ } | {
49
+ width: number;
50
+ height: number;
51
+ } | {
52
+ width: number;
53
+ height: number;
54
+ } | {
55
+ width: number;
56
+ height: number;
57
+ } | {
58
+ width: number;
59
+ height: number;
45
60
  };
46
61
  export declare const createDefaultFlowchart: (point: Point) => (PlaitGeometry | import("../interfaces").PlaitLine)[];
47
62
  export declare const getAutoCompletePoints: (element: PlaitShapeElement) => [Point, Point, Point, Point];
@@ -61,3 +76,4 @@ export declare const getDefaultTextPoints: (board: PlaitBoard, centerPoint: Poin
61
76
  export declare const insertElement: (board: PlaitBoard, element: PlaitGeometry) => void;
62
77
  export declare const createTextElement: (board: PlaitBoard, points: [Point, Point], text?: string | Element, textHeight?: number) => PlaitGeometry;
63
78
  export declare const createDefaultGeometry: (board: PlaitBoard, points: [Point, Point], shape: GeometryShapes) => PlaitGeometry;
79
+ export declare const editText: (element: PlaitGeometry) => void;
@@ -1,7 +1,7 @@
1
- import { PlaitBoard } from '@plait/core';
1
+ import { PlaitBoard, PlaitElement } from '@plait/core';
2
2
  import { PlaitDrawElement, PlaitGeometry, PlaitLine } from '../interfaces';
3
3
  import { PlaitImage } from '../interfaces/image';
4
- export declare const getSelectedDrawElements: (board: PlaitBoard) => PlaitDrawElement[];
4
+ export declare const getSelectedDrawElements: (board: PlaitBoard, elements?: PlaitElement[]) => PlaitDrawElement[];
5
5
  export declare const getSelectedGeometryElements: (board: PlaitBoard) => PlaitGeometry[];
6
6
  export declare const getSelectedLineElements: (board: PlaitBoard) => PlaitLine[];
7
7
  export declare const getSelectedImageElements: (board: PlaitBoard) => PlaitImage[];
@@ -1,8 +0,0 @@
1
- import { PlaitBoard, RectangleClient } from '@plait/core';
2
- import { PlaitGeometry, ShapeEngine } from '../../interfaces';
3
- import { Options } from 'roughjs/bin/core';
4
- export interface CreateCircleOptions {
5
- draw?: (board: PlaitBoard, rectangle: RectangleClient, options: Options) => SVGGElement;
6
- getTextRectangle?: (element: PlaitGeometry) => RectangleClient;
7
- }
8
- export declare function createEllipseEngine(createOptions?: CreateCircleOptions): ShapeEngine;
@@ -1,51 +0,0 @@
1
- import { PlaitBoard, RectangleClient, getEllipseTangentSlope, getVectorFromPointAndSlope, isPointInEllipse } from '@plait/core';
2
- import { getTextRectangle } from '../../utils';
3
- import { getNearestPointBetweenPointAndEllipse } from './ellipse';
4
- export function createEllipseEngine(createOptions) {
5
- const engine = {
6
- draw(board, rectangle, options) {
7
- const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
8
- const rs = PlaitBoard.getRoughSVG(board);
9
- return rs.ellipse(centerPoint[0], centerPoint[1], rectangle.width, rectangle.height, { ...options, fillStyle: 'solid' });
10
- },
11
- isInsidePoint(rectangle, point) {
12
- const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
13
- return isPointInEllipse(point, centerPoint, rectangle.width / 2, rectangle.height / 2);
14
- },
15
- getCornerPoints(rectangle) {
16
- return RectangleClient.getEdgeCenterPoints(rectangle);
17
- },
18
- getNearestPoint(rectangle, point) {
19
- const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
20
- return getNearestPointBetweenPointAndEllipse(point, centerPoint, rectangle.width / 2, rectangle.height / 2);
21
- },
22
- getTangentVectorByConnectionPoint(rectangle, pointOfRectangle) {
23
- const connectionPoint = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
24
- const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
25
- const point = [connectionPoint[0] - centerPoint[0], -(connectionPoint[1] - centerPoint[1])];
26
- const a = rectangle.width / 2;
27
- const b = rectangle.height / 2;
28
- const slope = getEllipseTangentSlope(point[0], point[1], a, b);
29
- const vector = getVectorFromPointAndSlope(point[0], point[1], slope);
30
- return vector;
31
- },
32
- getConnectorPoints(rectangle) {
33
- return RectangleClient.getEdgeCenterPoints(rectangle);
34
- },
35
- getTextRectangle(element) {
36
- const rectangle = getTextRectangle(element);
37
- const width = rectangle.width;
38
- rectangle.width = (rectangle.width * 3) / 4;
39
- rectangle.x += width / 8;
40
- return rectangle;
41
- }
42
- };
43
- if (createOptions?.draw) {
44
- engine.draw = createOptions.draw;
45
- }
46
- if (createOptions?.getTextRectangle) {
47
- engine.getTextRectangle = createOptions.getTextRectangle;
48
- }
49
- return engine;
50
- }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvZW5naW5lcy9iYXNpYy1zaGFwZXMvY2lyY2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxVQUFVLEVBR1YsZUFBZSxFQUNmLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ25CLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPbEUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGFBQW1DO0lBQ25FLE1BQU0sTUFBTSxHQUFnQjtRQUN4QixJQUFJLENBQUMsS0FBaUIsRUFBRSxTQUEwQixFQUFFLE9BQWdCO1lBQ2hFLE1BQU0sV0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUYsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3SCxDQUFDO1FBQ0QsYUFBYSxDQUFDLFNBQTBCLEVBQUUsS0FBWTtZQUNsRCxNQUFNLFdBQVcsR0FBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUs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Q0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUG9pbnRPZlJlY3RhbmdsZSxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZ2V0RWxsaXBzZVRhbmdlbnRTbG9wZSxcbiAgICBnZXRWZWN0b3JGcm9tUG9pbnRBbmRTbG9wZSxcbiAgICBpc1BvaW50SW5FbGxpcHNlXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0R2VvbWV0cnksIFNoYXBlRW5naW5lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBnZXRUZXh0UmVjdGFuZ2xlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kRWxsaXBzZSB9IGZyb20gJy4vZWxsaXBzZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ2lyY2xlT3B0aW9ucyB7XG4gICAgZHJhdz86IChib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IFNWR0dFbGVtZW50O1xuICAgIGdldFRleHRSZWN0YW5nbGU/OiAoZWxlbWVudDogUGxhaXRHZW9tZXRyeSkgPT4gUmVjdGFuZ2xlQ2xpZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxsaXBzZUVuZ2luZShjcmVhdGVPcHRpb25zPzogQ3JlYXRlQ2lyY2xlT3B0aW9ucyk6IFNoYXBlRW5naW5lIHtcbiAgICBjb25zdCBlbmdpbmU6IFNoYXBlRW5naW5lID0ge1xuICAgICAgICBkcmF3KGJvYXJkOiBQbGFpdEJvYXJkLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBbcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyAyLCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyAyXTtcbiAgICAgICAgICAgIGNvbnN0IHJzID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgICAgICAgICByZXR1cm4gcnMuZWxsaXBzZShjZW50ZXJQb2ludFswXSwgY2VudGVyUG9pbnRbMV0sIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLmhlaWdodCwgeyAuLi5vcHRpb25zLCBmaWxsU3R5bGU6ICdzb2xpZCcgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGlzSW5zaWRlUG9pbnQocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQ6IFBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgICAgICByZXR1cm4gaXNQb2ludEluRWxsaXBzZShwb2ludCwgY2VudGVyUG9pbnQsIHJlY3RhbmdsZS53aWR0aCAvIDIsIHJlY3RhbmdsZS5oZWlnaHQgLyAyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q29ybmVyUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldEVkZ2VDZW50ZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclBvaW50OiBQb2ludCA9IFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAvIDIsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCAvIDJdO1xuICAgICAgICAgICAgcmV0dXJuIGdldE5lYXJlc3RQb2ludEJldHdlZW5Qb2ludEFuZEVsbGlwc2UocG9pbnQsIGNlbnRlclBvaW50LCByZWN0YW5nbGUud2lkdGggLyAyLCByZWN0YW5nbGUuaGVpZ2h0IC8gMik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFRhbmdlbnRWZWN0b3JCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcG9pbnRPZlJlY3RhbmdsZTogUG9pbnRPZlJlY3RhbmdsZSkge1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblBvaW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldENvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIHBvaW50T2ZSZWN0YW5nbGUpO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQ6IFBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IFtjb25uZWN0aW9uUG9pbnRbMF0gLSBjZW50ZXJQb2ludFswXSwgLShjb25uZWN0aW9uUG9pbnRbMV0gLSBjZW50ZXJQb2ludFsxXSldO1xuICAgICAgICAgICAgY29uc3QgYSA9IHJlY3RhbmdsZS53aWR0aCAvIDI7XG4gICAgICAgICAgICBjb25zdCBiID0gcmVjdGFuZ2xlLmhlaWdodCAvIDI7XG4gICAgICAgICAgICBjb25zdCBzbG9wZSA9IGdldEVsbGlwc2VUYW5nZW50U2xvcGUocG9pbnRbMF0sIHBvaW50WzFdLCBhLCBiKSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCB2ZWN0b3IgPSBnZXRWZWN0b3JGcm9tUG9pbnRBbmRTbG9wZShwb2ludFswXSwgcG9pbnRbMV0sIHNsb3BlKTtcbiAgICAgICAgICAgIHJldHVybiB2ZWN0b3I7XG4gICAgICAgIH0sXG4gICAgICAgIGdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRFZGdlQ2VudGVyUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFRleHRSZWN0YW5nbGUoZWxlbWVudDogUGxhaXRHZW9tZXRyeSkge1xuICAgICAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0VGV4dFJlY3RhbmdsZShlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICAgICAgcmVjdGFuZ2xlLndpZHRoID0gKHJlY3RhbmdsZS53aWR0aCAqIDMpIC8gNDtcbiAgICAgICAgICAgIHJlY3RhbmdsZS54ICs9IHdpZHRoIC8gODtcbiAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGNyZWF0ZU9wdGlvbnM/LmRyYXcpIHtcbiAgICAgICAgZW5naW5lLmRyYXcgPSBjcmVhdGVPcHRpb25zLmRyYXc7XG4gICAgfVxuICAgIGlmIChjcmVhdGVPcHRpb25zPy5nZXRUZXh0UmVjdGFuZ2xlKSB7XG4gICAgICAgIGVuZ2luZS5nZXRUZXh0UmVjdGFuZ2xlID0gY3JlYXRlT3B0aW9ucy5nZXRUZXh0UmVjdGFuZ2xlO1xuICAgIH1cblxuICAgIHJldHVybiBlbmdpbmU7XG59XG4iXX0=