abstract-3d 2.10.4 → 2.10.5

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.
@@ -3,7 +3,9 @@ import React from "react";
3
3
  import type { Group as Group_1 } from "../../abstract-3d.js";
4
4
  import type { MaterialState } from "./react-material.js";
5
5
  import type { ReactPopover } from "./react-types.js";
6
- export declare function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }: {
6
+ export declare const ReactGroup: React.MemoExoticComponent<typeof ReactGroupBase>;
7
+ declare function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }: ReactGroupProps): React.JSX.Element;
8
+ export type ReactGroupProps = {
7
9
  readonly g: Group_1;
8
10
  readonly materialStateImages?: Record<string, string>;
9
11
  readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
@@ -19,5 +21,8 @@ export declare function ReactGroup({ g, materialStateImages, hoveredIdsExternal,
19
21
  readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, e: ThreeEvent<MouseEvent>) => void;
20
22
  readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
21
23
  readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
22
- }): React.JSX.Element;
24
+ };
25
+ /** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
26
+ export declare function groupPropsEqual(prev: ReactGroupProps, next: ReactGroupProps): boolean;
27
+ export {};
23
28
  //# sourceMappingURL=react-group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,wBAAgB,UAAU,CAAC,EACzB,CAAC,EACD,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,EAAE,EACF,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,CAAC,YAAY,CAAC,CAAC;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACzH,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqHpB"}
1
+ {"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"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"}
@@ -5,7 +5,8 @@ import React from "react";
5
5
  import { ImageMaterial } from "./react-image-material.js";
6
6
  import { ReactMaterial } from "./react-material.js";
7
7
  import { ReactMesh } from "./react-mesh.js";
8
- export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }) {
8
+ export const ReactGroup = React.memo(ReactGroupBase, groupPropsEqual);
9
+ function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }) {
9
10
  const ref = React.useRef(undefined);
10
11
  useFrame(({ invalidate }, delta) => {
11
12
  if (g.animation) {
@@ -24,6 +25,11 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
24
25
  }
25
26
  });
26
27
  const [hovered, setHovered] = React.useState(false);
28
+ // Stable so the memoized child groups below can skip rendering
29
+ const onChildHoverGroup = React.useCallback((hId, rData, data, e) => {
30
+ setHovered(hId !== undefined);
31
+ onHoverGroup?.(hId, rData, data, e);
32
+ }, [onHoverGroup]);
27
33
  // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
28
34
  const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
29
35
  const selected = selectedIds?.[id ?? ""];
@@ -58,12 +64,19 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
58
64
  onContextMenuGroup(id, rootData, g.data, e.nativeEvent.x, e.nativeEvent.y, e);
59
65
  }
60
66
  },
61
- }), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: (hId, rData, data, e) => {
62
- setHovered(hId !== undefined);
63
- onHoverGroup?.(hId, rData, data, e);
64
- }, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
67
+ }), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: onChildHoverGroup, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
65
68
  id &&
66
69
  getTooltips &&
67
70
  getTooltips(id).map((p) => (_jsx(Html, { position: [p.pos.x, p.pos.y, p.pos.z], center: true, pointerEvents: "none", style: { pointerEvents: "none" }, children: p.content }, p.id)))] }));
68
71
  }
72
+ /** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
73
+ export function groupPropsEqual(prev, next) {
74
+ const id = next.id ?? "";
75
+ if (prev.selectedIds?.[id] !== next.selectedIds?.[id] || prev.activeComponents?.[id] !== next.activeComponents?.[id]) {
76
+ return false;
77
+ }
78
+ const keys = Object.keys(next);
79
+ return (keys.length === Object.keys(prev).length &&
80
+ keys.every((key) => key === "selectedIds" || key === "activeComponents" || Object.is(prev[key], next[key])));
81
+ }
69
82
  //# sourceMappingURL=react-group.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "abstract-3d",
3
- "version": "2.10.4",
4
- "gitHead": "3b89c07f73237736facd6511e618fd0a5aebb02d",
3
+ "version": "2.10.5",
4
+ "gitHead": "752f155ce88522ae076c4e09d7881403ad35f653",
5
5
  "description": "Abstract 3D",
6
6
  "license": "MIT",
7
7
  "author": "Divid AB <info@divid.se>",
@@ -0,0 +1,56 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { group } from "../../abstract-3d.js";
3
+ import { groupPropsEqual, type ReactGroupProps } from "./react-group.js";
4
+
5
+ const base: ReactGroupProps = {
6
+ g: group([]),
7
+ hoveredIdsExternal: undefined,
8
+ selectedIds: { a: true },
9
+ hotSpotsActive: false,
10
+ activeComponents: { a: "Error" },
11
+ id: "a",
12
+ rootData: undefined,
13
+ onClickGroup: () => undefined,
14
+ };
15
+
16
+ describe("groupPropsEqual", () => {
17
+ it("is equal for the same props", () => {
18
+ expect(groupPropsEqual(base, { ...base })).toBe(true);
19
+ });
20
+
21
+ it("ignores selectedIds and activeComponents objects that hold the same values for the group's id", () => {
22
+ expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: false }, activeComponents: { a: "Error", b: "Warning" } })).toBe(true);
23
+ });
24
+
25
+ it("is not equal when the group's own selection changes", () => {
26
+ expect(groupPropsEqual(base, { ...base, selectedIds: {} })).toBe(false);
27
+ expect(groupPropsEqual(base, { ...base, selectedIds: { a: false } })).toBe(false);
28
+ });
29
+
30
+ it("is not equal when the group's own material state changes", () => {
31
+ expect(groupPropsEqual(base, { ...base, activeComponents: { a: "Warning" } })).toBe(false);
32
+ expect(groupPropsEqual(base, { ...base, activeComponents: undefined })).toBe(false);
33
+ });
34
+
35
+ it("is equal when only other groups' selection or material state changes", () => {
36
+ expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: true }, activeComponents: { a: "Error", b: "Accept" } })).toBe(true);
37
+ });
38
+
39
+ it("is not equal when another prop changes identity", () => {
40
+ expect(groupPropsEqual(base, { ...base, g: group([]) })).toBe(false);
41
+ expect(groupPropsEqual(base, { ...base, onClickGroup: () => undefined })).toBe(false);
42
+ expect(groupPropsEqual(base, { ...base, hotSpotsActive: true })).toBe(false);
43
+ expect(groupPropsEqual(base, { ...base, id: "b" })).toBe(false);
44
+ });
45
+
46
+ it("is not equal when a prop is added or removed", () => {
47
+ expect(groupPropsEqual(base, { ...base, useAlphaTest: true })).toBe(false);
48
+ expect(groupPropsEqual({ ...base, useAlphaTest: true }, base)).toBe(false);
49
+ });
50
+
51
+ it("looks up the next id when the group has none", () => {
52
+ const anonymous = { ...base, id: undefined, selectedIds: { "": true }, activeComponents: undefined };
53
+ expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: { "": true, a: true } })).toBe(true);
54
+ expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: {} })).toBe(false);
55
+ });
56
+ });
@@ -10,7 +10,9 @@ import { ReactMaterial } from "./react-material.js";
10
10
  import { ReactMesh } from "./react-mesh.js";
11
11
  import type { ReactPopover } from "./react-types.js";
12
12
 
13
- export function ReactGroup({
13
+ export const ReactGroup = React.memo(ReactGroupBase, groupPropsEqual);
14
+
15
+ function ReactGroupBase({
14
16
  g,
15
17
  materialStateImages,
16
18
  hoveredIdsExternal,
@@ -26,40 +28,7 @@ export function ReactGroup({
26
28
  onContextMenuGroup,
27
29
  createGroupKey,
28
30
  getTooltips,
29
- }: {
30
- readonly g: Group_1;
31
- readonly materialStateImages?: Record<string, string>;
32
- readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
33
- readonly hoveredParent?: boolean;
34
- readonly selectedIds: Record<string, boolean> | undefined;
35
- readonly hotSpotsActive: boolean;
36
- readonly useAlphaTest?: boolean;
37
- readonly activeComponents: Record<string, MaterialState> | undefined;
38
- readonly id: string | undefined;
39
- readonly rootData: Record<string, string> | undefined;
40
- readonly onClickGroup?: (
41
- id: string | undefined,
42
- rootData: Record<string, string> | undefined,
43
- data: Record<string, string> | undefined,
44
- e: ThreeEvent<MouseEvent>
45
- ) => void;
46
- readonly onHoverGroup?: (
47
- id: string | undefined,
48
- rootData: Record<string, string> | undefined,
49
- data: Record<string, string> | undefined,
50
- e: ThreeEvent<MouseEvent>
51
- ) => void;
52
- readonly onContextMenuGroup?: (
53
- id: string,
54
- rootData: Record<string, string> | undefined,
55
- data: Record<string, string> | undefined,
56
- left: number,
57
- top: number,
58
- e: ThreeEvent<MouseEvent>
59
- ) => void;
60
- readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
61
- readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
62
- }): React.JSX.Element {
31
+ }: ReactGroupProps): React.JSX.Element {
63
32
  const ref = React.useRef<Group>(undefined!);
64
33
  useFrame(({ invalidate }, delta) => {
65
34
  if (g.animation) {
@@ -77,6 +46,14 @@ export function ReactGroup({
77
46
  }
78
47
  });
79
48
  const [hovered, setHovered] = React.useState<boolean>(false);
49
+ // Stable so the memoized child groups below can skip rendering
50
+ const onChildHoverGroup = React.useCallback<NonNullable<ReactGroupProps["onHoverGroup"]>>(
51
+ (hId, rData, data, e) => {
52
+ setHovered(hId !== undefined);
53
+ onHoverGroup?.(hId, rData, data, e);
54
+ },
55
+ [onHoverGroup]
56
+ );
80
57
  // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
81
58
  const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
82
59
  const selected = selectedIds?.[id ?? ""];
@@ -130,10 +107,7 @@ export function ReactGroup({
130
107
  hoveredIdsExternal={hoveredIdsExternal}
131
108
  hoveredParent={hoveredFinal}
132
109
  onClickGroup={onClickGroup}
133
- onHoverGroup={(hId, rData, data, e) => {
134
- setHovered(hId !== undefined);
135
- onHoverGroup?.(hId, rData, data, e);
136
- }}
110
+ onHoverGroup={onChildHoverGroup}
137
111
  onContextMenuGroup={onContextMenuGroup}
138
112
  getTooltips={getTooltips}
139
113
  id={id}
@@ -177,3 +151,51 @@ export function ReactGroup({
177
151
  </group>
178
152
  );
179
153
  }
154
+
155
+ export type ReactGroupProps = {
156
+ readonly g: Group_1;
157
+ readonly materialStateImages?: Record<string, string>;
158
+ readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
159
+ readonly hoveredParent?: boolean;
160
+ readonly selectedIds: Record<string, boolean> | undefined;
161
+ readonly hotSpotsActive: boolean;
162
+ readonly useAlphaTest?: boolean;
163
+ readonly activeComponents: Record<string, MaterialState> | undefined;
164
+ readonly id: string | undefined;
165
+ readonly rootData: Record<string, string> | undefined;
166
+ readonly onClickGroup?: (
167
+ id: string | undefined,
168
+ rootData: Record<string, string> | undefined,
169
+ data: Record<string, string> | undefined,
170
+ e: ThreeEvent<MouseEvent>
171
+ ) => void;
172
+ readonly onHoverGroup?: (
173
+ id: string | undefined,
174
+ rootData: Record<string, string> | undefined,
175
+ data: Record<string, string> | undefined,
176
+ e: ThreeEvent<MouseEvent>
177
+ ) => void;
178
+ readonly onContextMenuGroup?: (
179
+ id: string,
180
+ rootData: Record<string, string> | undefined,
181
+ data: Record<string, string> | undefined,
182
+ left: number,
183
+ top: number,
184
+ e: ThreeEvent<MouseEvent>
185
+ ) => void;
186
+ readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
187
+ readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
188
+ };
189
+
190
+ /** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
191
+ export function groupPropsEqual(prev: ReactGroupProps, next: ReactGroupProps): boolean {
192
+ const id = next.id ?? "";
193
+ if (prev.selectedIds?.[id] !== next.selectedIds?.[id] || prev.activeComponents?.[id] !== next.activeComponents?.[id]) {
194
+ return false;
195
+ }
196
+ const keys = Object.keys(next) as Array<keyof ReactGroupProps>;
197
+ return (
198
+ keys.length === Object.keys(prev).length &&
199
+ keys.every((key) => key === "selectedIds" || key === "activeComponents" || Object.is(prev[key], next[key]))
200
+ );
201
+ }
@@ -1,7 +0,0 @@
1
- import { Color } from "abstract-image";
2
- import { Vec3 } from "../../abstract-3d.js";
3
- export declare function colorToInteger(color: string): number;
4
- export declare function colorHexFromAbstractImageColor(color: Color): string;
5
- export declare function color(colorNormal: string | undefined): number;
6
- export declare const ACI_COLOR_TABLE: ReadonlyArray<Vec3>;
7
- //# sourceMappingURL=color.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../src/renderers/dxf/color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAyB,MAAM,sBAAsB,CAAC;AAEnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnE;AAED,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB7D;AAsBD,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,IAAI,CAiQ/C,CAAC"}
@@ -1,311 +0,0 @@
1
- import { vec3, vec3DistSquared } from "../../abstract-3d.js";
2
- export function colorToInteger(color) {
3
- const originalColor = colorNormalToVec3Color(color);
4
- const colorAsInt = (originalColor.x << 16) + (originalColor.y << 8) + originalColor.z;
5
- if (Number.isNaN(colorAsInt)) {
6
- return 0;
7
- }
8
- return colorAsInt;
9
- }
10
- export function colorHexFromAbstractImageColor(color) {
11
- return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;
12
- }
13
- export function color(colorNormal) {
14
- const ERROR_COLOR = 6; //magenta
15
- const ACI_COLOR_COUNT = 256;
16
- if (ACI_COLOR_TABLE.length !== ACI_COLOR_COUNT || colorNormal === undefined) {
17
- return ERROR_COLOR; //magenta
18
- }
19
- const originalColor = colorNormalToVec3Color(colorNormal);
20
- let closestColor = 0;
21
- let smallestDistance = Number.POSITIVE_INFINITY;
22
- for (let i = 0; i < ACI_COLOR_COUNT; i++) {
23
- const color = ACI_COLOR_TABLE[i];
24
- if (color !== undefined) {
25
- const distance = vec3DistSquared(originalColor, color);
26
- if (distance < smallestDistance) {
27
- smallestDistance = distance;
28
- closestColor = i;
29
- }
30
- }
31
- }
32
- return closestColor;
33
- }
34
- function colorNormalToVec3Color(colorNormal) {
35
- const errorColor = vec3(255, 0, 255); // #ff00ff, magenta
36
- const paranthesisRegex = /(?<=\().+?(?=\))/;
37
- const inside = paranthesisRegex.exec(colorNormal);
38
- if (inside === null || inside.length < 1) {
39
- return errorColor;
40
- }
41
- const values = inside[0].replaceAll(" ", "").split(",");
42
- if (values.length < 3) {
43
- return errorColor;
44
- }
45
- const r = parseInt(values[0], 10);
46
- const g = parseInt(values[1], 10);
47
- const b = parseInt(values[2], 10);
48
- if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) {
49
- return errorColor;
50
- }
51
- return vec3(r % 256, g % 256, b % 256);
52
- }
53
- export const ACI_COLOR_TABLE = [
54
- vec3(0, 0, 0),
55
- vec3(255, 0, 0),
56
- vec3(255, 255, 0),
57
- vec3(0, 255, 0),
58
- vec3(0, 255, 255),
59
- vec3(0, 0, 255),
60
- vec3(255, 0, 255),
61
- vec3(255, 255, 255),
62
- vec3(128, 128, 128),
63
- vec3(192, 192, 192),
64
- vec3(255, 0, 0),
65
- vec3(255, 127, 127),
66
- vec3(204, 0, 0),
67
- vec3(204, 102, 102),
68
- vec3(153, 0, 0),
69
- vec3(153, 76, 76),
70
- vec3(127, 0, 0),
71
- vec3(127, 63, 63),
72
- vec3(76, 0, 0),
73
- vec3(76, 38, 38),
74
- vec3(255, 63, 0),
75
- vec3(255, 159, 127),
76
- vec3(204, 51, 0),
77
- vec3(204, 127, 102),
78
- vec3(153, 38, 0),
79
- vec3(153, 95, 76),
80
- vec3(127, 31, 0),
81
- vec3(127, 79, 63),
82
- vec3(76, 19, 0),
83
- vec3(76, 47, 38),
84
- vec3(255, 127, 0),
85
- vec3(255, 191, 127),
86
- vec3(204, 102, 0),
87
- vec3(204, 153, 102),
88
- vec3(153, 76, 0),
89
- vec3(153, 114, 76),
90
- vec3(127, 63, 0),
91
- vec3(127, 95, 63),
92
- vec3(76, 38, 0),
93
- vec3(76, 57, 38),
94
- vec3(255, 191, 0),
95
- vec3(255, 223, 127),
96
- vec3(204, 153, 0),
97
- vec3(204, 178, 102),
98
- vec3(153, 114, 0),
99
- vec3(153, 133, 76),
100
- vec3(127, 95, 0),
101
- vec3(127, 111, 63),
102
- vec3(76, 57, 0),
103
- vec3(76, 66, 38),
104
- vec3(255, 255, 0),
105
- vec3(255, 255, 127),
106
- vec3(204, 204, 0),
107
- vec3(204, 204, 102),
108
- vec3(153, 153, 0),
109
- vec3(153, 153, 76),
110
- vec3(127, 127, 0),
111
- vec3(127, 127, 63),
112
- vec3(76, 76, 0),
113
- vec3(76, 76, 38),
114
- vec3(191, 255, 0),
115
- vec3(223, 255, 127),
116
- vec3(153, 204, 0),
117
- vec3(178, 204, 102),
118
- vec3(114, 153, 0),
119
- vec3(133, 153, 76),
120
- vec3(95, 127, 0),
121
- vec3(111, 127, 63),
122
- vec3(57, 76, 0),
123
- vec3(66, 76, 38),
124
- vec3(127, 255, 0),
125
- vec3(191, 255, 127),
126
- vec3(102, 204, 0),
127
- vec3(153, 204, 102),
128
- vec3(76, 153, 0),
129
- vec3(114, 153, 76),
130
- vec3(63, 127, 0),
131
- vec3(95, 127, 63),
132
- vec3(38, 76, 0),
133
- vec3(57, 76, 38),
134
- vec3(63, 255, 0),
135
- vec3(159, 255, 127),
136
- vec3(51, 204, 0),
137
- vec3(127, 204, 102),
138
- vec3(38, 153, 0),
139
- vec3(95, 153, 76),
140
- vec3(31, 127, 0),
141
- vec3(79, 127, 63),
142
- vec3(19, 76, 0),
143
- vec3(47, 76, 38),
144
- vec3(0, 255, 0),
145
- vec3(127, 255, 127),
146
- vec3(0, 204, 0),
147
- vec3(102, 204, 102),
148
- vec3(0, 153, 0),
149
- vec3(76, 153, 76),
150
- vec3(0, 127, 0),
151
- vec3(63, 127, 63),
152
- vec3(0, 76, 0),
153
- vec3(38, 76, 38),
154
- vec3(0, 255, 63),
155
- vec3(127, 255, 191),
156
- vec3(0, 204, 51),
157
- vec3(102, 204, 127),
158
- vec3(0, 153, 38),
159
- vec3(76, 153, 114),
160
- vec3(0, 127, 31),
161
- vec3(63, 127, 95),
162
- vec3(0, 76, 19),
163
- vec3(38, 76, 47),
164
- vec3(0, 255, 127),
165
- vec3(127, 255, 223),
166
- vec3(0, 204, 102),
167
- vec3(102, 204, 153),
168
- vec3(0, 153, 76),
169
- vec3(76, 153, 133),
170
- vec3(0, 127, 63),
171
- vec3(63, 127, 111),
172
- vec3(0, 76, 38),
173
- vec3(38, 76, 57),
174
- vec3(0, 255, 191),
175
- vec3(127, 255, 255),
176
- vec3(0, 204, 153),
177
- vec3(102, 204, 178),
178
- vec3(0, 153, 114),
179
- vec3(76, 153, 144),
180
- vec3(0, 127, 95),
181
- vec3(63, 127, 119),
182
- vec3(0, 76, 57),
183
- vec3(38, 76, 66),
184
- vec3(0, 255, 255),
185
- vec3(127, 255, 255),
186
- vec3(0, 204, 204),
187
- vec3(102, 204, 204),
188
- vec3(0, 153, 153),
189
- vec3(76, 153, 153),
190
- vec3(0, 127, 127),
191
- vec3(63, 127, 127),
192
- vec3(0, 76, 76),
193
- vec3(38, 76, 76),
194
- vec3(0, 191, 255),
195
- vec3(127, 223, 255),
196
- vec3(0, 153, 204),
197
- vec3(102, 178, 204),
198
- vec3(0, 114, 153),
199
- vec3(76, 133, 153),
200
- vec3(0, 95, 127),
201
- vec3(63, 111, 127),
202
- vec3(0, 57, 76),
203
- vec3(38, 66, 76),
204
- vec3(0, 127, 255),
205
- vec3(127, 191, 255),
206
- vec3(0, 102, 204),
207
- vec3(102, 153, 204),
208
- vec3(0, 76, 153),
209
- vec3(76, 114, 153),
210
- vec3(0, 63, 127),
211
- vec3(63, 95, 127),
212
- vec3(0, 38, 76),
213
- vec3(38, 57, 76),
214
- vec3(0, 63, 255),
215
- vec3(127, 159, 255),
216
- vec3(0, 51, 204),
217
- vec3(102, 127, 204),
218
- vec3(0, 38, 153),
219
- vec3(76, 95, 153),
220
- vec3(0, 31, 127),
221
- vec3(63, 79, 127),
222
- vec3(0, 19, 76),
223
- vec3(38, 47, 76),
224
- vec3(0, 0, 255),
225
- vec3(127, 127, 255),
226
- vec3(0, 0, 204),
227
- vec3(102, 102, 204),
228
- vec3(0, 0, 153),
229
- vec3(76, 76, 153),
230
- vec3(0, 0, 127),
231
- vec3(63, 63, 127),
232
- vec3(0, 0, 76),
233
- vec3(38, 38, 76),
234
- vec3(63, 0, 255),
235
- vec3(159, 127, 255),
236
- vec3(51, 0, 204),
237
- vec3(127, 102, 204),
238
- vec3(38, 0, 153),
239
- vec3(95, 76, 153),
240
- vec3(31, 0, 127),
241
- vec3(79, 63, 127),
242
- vec3(19, 0, 76),
243
- vec3(47, 38, 76),
244
- vec3(127, 0, 255),
245
- vec3(191, 127, 255),
246
- vec3(102, 0, 204),
247
- vec3(153, 102, 204),
248
- vec3(76, 0, 153),
249
- vec3(114, 76, 153),
250
- vec3(63, 0, 127),
251
- vec3(95, 63, 127),
252
- vec3(38, 0, 76),
253
- vec3(57, 38, 76),
254
- vec3(191, 0, 255),
255
- vec3(223, 127, 255),
256
- vec3(153, 0, 204),
257
- vec3(178, 102, 204),
258
- vec3(114, 0, 153),
259
- vec3(133, 76, 153),
260
- vec3(95, 0, 127),
261
- vec3(111, 63, 127),
262
- vec3(57, 0, 76),
263
- vec3(66, 38, 76),
264
- vec3(255, 0, 255),
265
- vec3(255, 127, 255),
266
- vec3(204, 0, 204),
267
- vec3(204, 102, 204),
268
- vec3(153, 0, 153),
269
- vec3(153, 76, 153),
270
- vec3(127, 0, 127),
271
- vec3(127, 63, 127),
272
- vec3(76, 0, 76),
273
- vec3(76, 38, 76),
274
- vec3(255, 0, 191),
275
- vec3(255, 127, 223),
276
- vec3(204, 0, 153),
277
- vec3(204, 102, 178),
278
- vec3(153, 0, 114),
279
- vec3(153, 76, 133),
280
- vec3(127, 0, 95),
281
- vec3(127, 63, 111),
282
- vec3(76, 0, 57),
283
- vec3(76, 38, 66),
284
- vec3(255, 0, 127),
285
- vec3(255, 127, 191),
286
- vec3(204, 0, 102),
287
- vec3(204, 102, 153),
288
- vec3(153, 0, 76),
289
- vec3(153, 76, 114),
290
- vec3(127, 0, 63),
291
- vec3(127, 63, 95),
292
- vec3(76, 0, 38),
293
- vec3(76, 38, 57),
294
- vec3(255, 0, 63),
295
- vec3(255, 127, 159),
296
- vec3(204, 0, 51),
297
- vec3(204, 102, 127),
298
- vec3(153, 0, 38),
299
- vec3(153, 76, 95),
300
- vec3(127, 0, 31),
301
- vec3(127, 63, 79),
302
- vec3(76, 0, 19),
303
- vec3(76, 38, 47),
304
- vec3(255, 255, 255),
305
- vec3(192, 192, 192),
306
- vec3(128, 128, 128),
307
- vec3(64, 64, 64),
308
- vec3(0, 0, 0),
309
- vec3(0, 0, 0)
310
- ];
311
- //# sourceMappingURL=color.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/renderers/dxf/color.ts"],"names":[],"mappings":"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E,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACd,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACd,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACb,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CACd,CAAC"}