@sigx/lynx-icons-fa-free 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,21 +19,36 @@ import { defineLynxConfig } from '@sigx/lynx-cli/config';
19
19
 
20
20
  export default defineLynxConfig({
21
21
  iconSets: [
22
- { id: 'fa', source: '@sigx/lynx-icons-fa-free', styles: ['solid'] },
22
+ { id: 'fas', source: '@sigx/lynx-icons-fa-free', styles: ['solid'] },
23
+ { id: 'far', source: '@sigx/lynx-icons-fa-free', styles: ['regular'] },
23
24
  { id: 'fab', source: '@sigx/lynx-icons-fa-free', styles: ['brands'] },
24
25
  ],
25
26
  });
26
27
  ```
27
28
 
28
- Each `iconSets` entry maps to one runtime `set` id. Declare one per style you want to use — they're tree-shaken independently.
29
+ **Set ids follow Font Awesome's own prefix convention** — the same strings FA uses in its CSS classes (`fa-solid` / `fa-regular` / `fa-brands`) and JS `IconPrefix` type (`fas` / `far` / `fab`). The pinned components below depend on these exact ids; renaming a set means those components won't find it. Declare one entry per style you want to use — they're tree-shaken independently.
29
30
 
30
31
  ## Usage
31
32
 
33
+ ### Pinned per-style components (recommended)
34
+
35
+ ```tsx
36
+ import { FaSolidIcon, FaRegularIcon, FaBrandIcon } from '@sigx/lynx-icons-fa-free/components';
37
+
38
+ <FaSolidIcon name="user" />
39
+ <FaSolidIcon name="chevron-right" size={20} color="#0D9488" />
40
+ <FaRegularIcon name="bell" size={20} />
41
+ <FaBrandIcon name="github" size={24} />
42
+ ```
43
+
44
+ Each component is a thin wrapper around `<Icon>` from `@sigx/lynx-icons` with the matching `set` pre-filled. Rendering, color sanitization, and theming behavior are identical to the generic form.
45
+
46
+ ### Generic `<Icon>` (dynamic `set` / non-conventional ids)
47
+
32
48
  ```tsx
33
49
  import { Icon } from '@sigx/lynx-icons';
34
50
 
35
- <Icon set="fa" name="user" />
36
- <Icon set="fa" name="chevron-right" size={20} color="#0D9488" />
51
+ <Icon set="fas" name="user" />
37
52
  <Icon set="fab" name="github" size={24} />
38
53
  ```
39
54
 
@@ -55,14 +70,14 @@ If the icon `name` comes from data (a JSON UI tree, a CMS field) the build-time
55
70
 
56
71
  ```ts
57
72
  iconSets: [
58
- { id: 'fa', source: '@sigx/lynx-icons-fa-free', styles: ['solid'], include: ['*'] },
73
+ { id: 'fas', source: '@sigx/lynx-icons-fa-free', styles: ['solid'], include: ['*'] },
59
74
  ],
60
75
  ```
61
76
 
62
77
  This bundles **all ~1 900 FA-solid glyphs** (~2 MB of JS). Use it only on sets that need it; mix with normally-tree-shaken sets for the rest. The build prints the exact glyph count:
63
78
 
64
79
  ```
65
- [@sigx/lynx-plugin] icons: fa bundling 1956 glyphs (include: ['*'])
80
+ [@sigx/lynx-plugin] icons: fas bundling 1956 glyphs (include: ['*'])
66
81
  ```
67
82
 
68
83
  `@sigx/lynx-icons`'s upcoming font mode (v1.1) will swap SVG-per-glyph for a single subsetted TTF — dramatically smaller for full-catalog scenarios. Stay tuned.
@@ -82,4 +97,4 @@ The adapter is normally consumed by `@sigx/lynx-plugin`'s icons slice — these
82
97
 
83
98
  ## Reference app
84
99
 
85
- `examples/showcase/src/screens/Settings.tsx` renders `<Icon set="fa" name="user" />`, `house`, `gear`, and `<Icon set="fab" name="github" />` in a card; the build-time scanner picks them up and writes their codepoints into `node_modules/.cache/sigx-lynx-icons/codepoints.mjs`.
100
+ `examples/showcase/src/screens/Settings.tsx` renders `<FaSolidIcon name="user" />`, `house`, `gear`, and `<FaBrandIcon name="github" />` in a card; the build-time scanner picks up the underlying `<Icon set="…" name="…">` calls and writes their codepoints into `node_modules/.cache/sigx-lynx-icons/codepoints.mjs`.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pinned per-style components — ergonomic shortcuts around `<Icon set= name=>`
3
+ * for the Font Awesome Free adapter. Set ids follow Font Awesome's own
4
+ * prefix convention (the same strings FA uses in its CSS classes and JS
5
+ * `IconPrefix` type):
6
+ *
7
+ * - `fas` — Solid (the default style most icons live in)
8
+ * - `far` — Regular
9
+ * - `fab` — Brands
10
+ *
11
+ * For these to resolve, the consumer's `signalx.config.ts` must declare a
12
+ * matching `iconSets` entry, e.g.
13
+ * `{ id: 'fas', source: '@sigx/lynx-icons-fa-free', styles: ['solid'] }`.
14
+ * If a different id is used, the pinned components won't find their set —
15
+ * fall back to the generic `<Icon set="…" name="…">` or write a one-line
16
+ * local pin.
17
+ *
18
+ * Rendering still goes through `@sigx/lynx-icons`' `<Icon>`, so the
19
+ * SVG/codepoint/missing-glyph branching, color sanitization, and theming
20
+ * behavior is shared with the rest of the icons pipeline. These wrappers
21
+ * only forward props.
22
+ *
23
+ * FA Pro styles (duotone, light, thin, sharp) are not shipped by FA Free;
24
+ * Pro adapters would expose their own pinned components alongside these.
25
+ */
26
+ import { type Define } from '@sigx/lynx';
27
+ import { type IconPropsExtensions } from '@sigx/lynx-icons';
28
+ type FaIconProps = Define.Prop<'name', string, true> & Define.Prop<'size', number, false> & Define.Prop<'color', string, false> & Define.Prop<'class', string, false>
29
+ /**
30
+ * Inherit any theme-augmented props (e.g. daisy's `variant?: DaisyColor`).
31
+ * The augmentation happens in core `@sigx/lynx-icons`'s
32
+ * `IconPropsExtensions`; intersecting it here keeps the pinned
33
+ * component's surface in sync without extra forwarding work.
34
+ */
35
+ & IconPropsExtensions;
36
+ /** Font Awesome **solid** icon — pins `set="fas"` to match FA's `IconPrefix`. */
37
+ export declare const FaSolidIcon: import("@sigx/runtime-core").ComponentFactory<FaIconProps, void, {}>;
38
+ /** Font Awesome **regular** (outlined) icon — pins `set="far"`. */
39
+ export declare const FaRegularIcon: import("@sigx/runtime-core").ComponentFactory<FaIconProps, void, {}>;
40
+ /** Font Awesome **brands** icon — pins `set="fab"`. */
41
+ export declare const FaBrandIcon: import("@sigx/runtime-core").ComponentFactory<FaIconProps, void, {}>;
42
+ export {};
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "@sigx/lynx/jsx-runtime";
2
+ /**
3
+ * Pinned per-style components — ergonomic shortcuts around `<Icon set= name=>`
4
+ * for the Font Awesome Free adapter. Set ids follow Font Awesome's own
5
+ * prefix convention (the same strings FA uses in its CSS classes and JS
6
+ * `IconPrefix` type):
7
+ *
8
+ * - `fas` — Solid (the default style most icons live in)
9
+ * - `far` — Regular
10
+ * - `fab` — Brands
11
+ *
12
+ * For these to resolve, the consumer's `signalx.config.ts` must declare a
13
+ * matching `iconSets` entry, e.g.
14
+ * `{ id: 'fas', source: '@sigx/lynx-icons-fa-free', styles: ['solid'] }`.
15
+ * If a different id is used, the pinned components won't find their set —
16
+ * fall back to the generic `<Icon set="…" name="…">` or write a one-line
17
+ * local pin.
18
+ *
19
+ * Rendering still goes through `@sigx/lynx-icons`' `<Icon>`, so the
20
+ * SVG/codepoint/missing-glyph branching, color sanitization, and theming
21
+ * behavior is shared with the rest of the icons pipeline. These wrappers
22
+ * only forward props.
23
+ *
24
+ * FA Pro styles (duotone, light, thin, sharp) are not shipped by FA Free;
25
+ * Pro adapters would expose their own pinned components alongside these.
26
+ */
27
+ import { component } from '@sigx/lynx';
28
+ import { Icon } from '@sigx/lynx-icons';
29
+ /** Font Awesome **solid** icon — pins `set="fas"` to match FA's `IconPrefix`. */
30
+ export const FaSolidIcon = component(({ props }) => () => (_jsx(Icon, { ...props, set: "fas" })));
31
+ /** Font Awesome **regular** (outlined) icon — pins `set="far"`. */
32
+ export const FaRegularIcon = component(({ props }) => () => (_jsx(Icon, { ...props, set: "far" })));
33
+ /** Font Awesome **brands** icon — pins `set="fab"`. */
34
+ export const FaBrandIcon = component(({ props }) => () => (_jsx(Icon, { ...props, set: "fab" })));
package/dist/index.js CHANGED
@@ -1,82 +1,114 @@
1
- import { createRequire as e } from "node:module";
2
- import { dirname as t, join as n } from "node:path";
3
- //#region src/index.ts
4
- var r = e(import.meta.url), i = {
5
- solid: "@fortawesome/free-solid-svg-icons",
6
- regular: "@fortawesome/free-regular-svg-icons",
7
- brands: "@fortawesome/free-brands-svg-icons"
8
- }, a = {
9
- solid: "fa-solid-900.ttf",
10
- regular: "fa-regular-400.ttf",
11
- brands: "fa-brands-400.ttf"
12
- }, o = /* @__PURE__ */ new Map();
13
- function s(e) {
14
- if (o.has(e)) return o.get(e) ?? null;
15
- let t = i[e];
16
- if (!t) return o.set(e, null), null;
17
- try {
18
- let n = r(t);
19
- return o.set(e, n), n;
20
- } catch {
21
- return o.set(e, null), null;
22
- }
1
+ import { createRequire } from 'node:module';
2
+ import { dirname, join } from 'node:path';
3
+ const require = createRequire(import.meta.url);
4
+ const STYLE_TO_PACKAGE = {
5
+ solid: '@fortawesome/free-solid-svg-icons',
6
+ regular: '@fortawesome/free-regular-svg-icons',
7
+ brands: '@fortawesome/free-brands-svg-icons',
8
+ };
9
+ const STYLE_TO_TTF = {
10
+ solid: 'fa-solid-900.ttf',
11
+ regular: 'fa-regular-400.ttf',
12
+ brands: 'fa-brands-400.ttf',
13
+ };
14
+ const moduleCache = new Map();
15
+ function loadStyleModule(style) {
16
+ if (moduleCache.has(style))
17
+ return moduleCache.get(style) ?? null;
18
+ const pkg = STYLE_TO_PACKAGE[style];
19
+ if (!pkg) {
20
+ moduleCache.set(style, null);
21
+ return null;
22
+ }
23
+ try {
24
+ const mod = require(pkg);
25
+ moduleCache.set(style, mod);
26
+ return mod;
27
+ }
28
+ catch {
29
+ moduleCache.set(style, null);
30
+ return null;
31
+ }
23
32
  }
24
- function c(e) {
25
- return "fa" + e.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("");
33
+ /** Convert kebab-case glyph name → FA's PascalCase export name (`faChevronRight`). */
34
+ function exportNameFor(name) {
35
+ return 'fa' + name.split('-').map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1)).join('');
26
36
  }
27
- function l(e) {
28
- let t = e.slice(2);
29
- if (t.length === 0) return "";
30
- let n = t.charAt(0).toLowerCase();
31
- for (let e = 1; e < t.length; e++) {
32
- let r = t.charAt(e);
33
- r >= "A" && r <= "Z" ? n += "-" + r.toLowerCase() : n += r;
34
- }
35
- return n;
37
+ /**
38
+ * Inverse of `exportNameFor`: `faChevronRight` → `chevron-right`.
39
+ * Used by `listGlyphs` to walk `Object.keys(module)` and emit canonical names.
40
+ */
41
+ function kebabFromExportName(exportName) {
42
+ // Strip the leading `fa` prefix.
43
+ const body = exportName.slice(2);
44
+ if (body.length === 0)
45
+ return '';
46
+ // Split on each uppercase letter and join with `-`, lowercasing everything.
47
+ let out = body.charAt(0).toLowerCase();
48
+ for (let i = 1; i < body.length; i++) {
49
+ const ch = body.charAt(i);
50
+ if (ch >= 'A' && ch <= 'Z') {
51
+ out += '-' + ch.toLowerCase();
52
+ }
53
+ else {
54
+ out += ch;
55
+ }
56
+ }
57
+ return out;
36
58
  }
37
- function u() {
38
- try {
39
- return n(t(r.resolve("@fortawesome/fontawesome-free/package.json")), "webfonts");
40
- } catch {
41
- return null;
42
- }
59
+ function webfontsDir() {
60
+ try {
61
+ const pkgJson = require.resolve('@fortawesome/fontawesome-free/package.json');
62
+ return join(dirname(pkgJson), 'webfonts');
63
+ }
64
+ catch {
65
+ return null;
66
+ }
43
67
  }
44
- var d = {
45
- styles: [
46
- "solid",
47
- "regular",
48
- "brands"
49
- ],
50
- getGlyph(e, t) {
51
- let n = s(e);
52
- if (!n) return null;
53
- let r = n[c(t)];
54
- if (!r || !Array.isArray(r.icon)) return null;
55
- let [i, a, , o, l] = r.icon, u = parseInt(o, 16);
56
- return Number.isFinite(u) ? {
57
- codepoint: u,
58
- svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${i} ${a}" fill="__COLOR__"><path d="${l}"/></svg>`
59
- } : null;
60
- },
61
- getFontPath(e) {
62
- let t = a[e];
63
- if (!t) return null;
64
- let r = u();
65
- return r ? n(r, t) : null;
66
- },
67
- listGlyphs(e) {
68
- let t = s(e);
69
- if (!t) return [];
70
- let n = [];
71
- for (let [e, r] of Object.entries(t)) {
72
- if (!e.startsWith("fa") || e.length < 3) continue;
73
- let t = e.charAt(2);
74
- t < "A" || t > "Z" || !r || typeof r != "object" || !Array.isArray(r.icon) || n.push(l(e));
75
- }
76
- return n;
77
- }
68
+ const adapter = {
69
+ styles: ['solid', 'regular', 'brands'],
70
+ getGlyph(style, name) {
71
+ const mod = loadStyleModule(style);
72
+ if (!mod)
73
+ return null;
74
+ const entry = mod[exportNameFor(name)];
75
+ if (!entry || !Array.isArray(entry.icon))
76
+ return null;
77
+ const [w, h, , unicodeHex, path] = entry.icon;
78
+ const codepoint = parseInt(unicodeHex, 16);
79
+ if (!Number.isFinite(codepoint))
80
+ return null;
81
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${w} ${h}" fill="__COLOR__"><path d="${path}"/></svg>`;
82
+ return { codepoint, svg };
83
+ },
84
+ getFontPath(style) {
85
+ const filename = STYLE_TO_TTF[style];
86
+ if (!filename)
87
+ return null;
88
+ const dir = webfontsDir();
89
+ if (!dir)
90
+ return null;
91
+ return join(dir, filename);
92
+ },
93
+ listGlyphs(style) {
94
+ const mod = loadStyleModule(style);
95
+ if (!mod)
96
+ return [];
97
+ const out = [];
98
+ for (const [key, entry] of Object.entries(mod)) {
99
+ // The FA modules also export `prefix` ('fas' / 'far' / 'fab') and a
100
+ // single-letter alias matching the prefix. Filter to real icon
101
+ // entries — objects with a numeric icon[0] and a string icon[4].
102
+ if (!key.startsWith('fa') || key.length < 3)
103
+ continue;
104
+ const ch = key.charAt(2);
105
+ if (ch < 'A' || ch > 'Z')
106
+ continue; // skip `fas`, `far`, `fab`
107
+ if (!entry || typeof entry !== 'object' || !Array.isArray(entry.icon))
108
+ continue;
109
+ out.push(kebabFromExportName(key));
110
+ }
111
+ return out;
112
+ },
78
113
  };
79
- //#endregion
80
- export { d as default };
81
-
82
- //# sourceMappingURL=index.js.map
114
+ export default adapter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigx/lynx-icons-fa-free",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Font Awesome Free adapter for @sigx/lynx-icons. Provides solid/regular/brands styles via the official @fortawesome/* packages.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,6 +11,11 @@
11
11
  "import": "./dist/index.js",
12
12
  "default": "./dist/index.js"
13
13
  },
14
+ "./components": {
15
+ "types": "./dist/components.d.ts",
16
+ "import": "./dist/components.js",
17
+ "default": "./dist/components.js"
18
+ },
14
19
  "./package.json": "./package.json"
15
20
  },
16
21
  "files": [
@@ -23,7 +28,8 @@
23
28
  "@fortawesome/free-brands-svg-icons": "^6.0.0",
24
29
  "@fortawesome/free-regular-svg-icons": "^6.0.0",
25
30
  "@fortawesome/free-solid-svg-icons": "^6.0.0",
26
- "@sigx/lynx-icons": "^0.4.0"
31
+ "@sigx/lynx": "^0.4.2",
32
+ "@sigx/lynx-icons": "^0.4.2"
27
33
  },
28
34
  "peerDependenciesMeta": {
29
35
  "@fortawesome/free-brands-svg-icons": {
@@ -38,10 +44,11 @@
38
44
  "@fortawesome/free-brands-svg-icons": "^6.7.2",
39
45
  "@fortawesome/free-regular-svg-icons": "^6.7.2",
40
46
  "@fortawesome/free-solid-svg-icons": "^6.7.2",
41
- "@sigx/vite": "^0.4.3",
42
- "@types/node": "^25.7.0",
47
+ "@types/node": "^25.9.1",
48
+ "@typescript/native-preview": "7.0.0-dev.20260521.1",
43
49
  "typescript": "^6.0.3",
44
- "@sigx/lynx-icons": "^0.4.0"
50
+ "@sigx/lynx": "^0.4.2",
51
+ "@sigx/lynx-icons": "^0.4.2"
45
52
  },
46
53
  "author": "Andreas Ekdahl",
47
54
  "license": "MIT",
@@ -66,7 +73,8 @@
66
73
  "fontawesome"
67
74
  ],
68
75
  "scripts": {
69
- "build": "vite build && tsgo --emitDeclarationOnly",
70
- "dev": "vite build --watch"
76
+ "build": "node ../../scripts/clean.mjs dist && tsgo",
77
+ "dev": "tsgo --watch",
78
+ "clean": "node ../../scripts/clean.mjs dist .turbo"
71
79
  }
72
80
  }
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport type { GlyphData, IconAdapter } from '@sigx/lynx-icons';\n\nconst require = createRequire(import.meta.url);\n\nconst STYLE_TO_PACKAGE: Record<string, string> = {\n solid: '@fortawesome/free-solid-svg-icons',\n regular: '@fortawesome/free-regular-svg-icons',\n brands: '@fortawesome/free-brands-svg-icons',\n};\n\nconst STYLE_TO_TTF: Record<string, string> = {\n solid: 'fa-solid-900.ttf',\n regular: 'fa-regular-400.ttf',\n brands: 'fa-brands-400.ttf',\n};\n\ninterface FaIconEntry {\n prefix: string;\n iconName: string;\n icon: [number, number, unknown[], string, string];\n}\n\nconst moduleCache = new Map<string, Record<string, FaIconEntry> | null>();\n\nfunction loadStyleModule(style: string): Record<string, FaIconEntry> | null {\n if (moduleCache.has(style)) return moduleCache.get(style) ?? null;\n const pkg = STYLE_TO_PACKAGE[style];\n if (!pkg) {\n moduleCache.set(style, null);\n return null;\n }\n try {\n const mod = require(pkg) as Record<string, FaIconEntry>;\n moduleCache.set(style, mod);\n return mod;\n } catch {\n moduleCache.set(style, null);\n return null;\n }\n}\n\n/** Convert kebab-case glyph name → FA's PascalCase export name (`faChevronRight`). */\nfunction exportNameFor(name: string): string {\n return 'fa' + name.split('-').map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1)).join('');\n}\n\n/**\n * Inverse of `exportNameFor`: `faChevronRight` → `chevron-right`.\n * Used by `listGlyphs` to walk `Object.keys(module)` and emit canonical names.\n */\nfunction kebabFromExportName(exportName: string): string {\n // Strip the leading `fa` prefix.\n const body = exportName.slice(2);\n if (body.length === 0) return '';\n // Split on each uppercase letter and join with `-`, lowercasing everything.\n let out = body.charAt(0).toLowerCase();\n for (let i = 1; i < body.length; i++) {\n const ch = body.charAt(i);\n if (ch >= 'A' && ch <= 'Z') {\n out += '-' + ch.toLowerCase();\n } else {\n out += ch;\n }\n }\n return out;\n}\n\nfunction webfontsDir(): string | null {\n try {\n const pkgJson = require.resolve('@fortawesome/fontawesome-free/package.json');\n return join(dirname(pkgJson), 'webfonts');\n } catch {\n return null;\n }\n}\n\nconst adapter: IconAdapter = {\n styles: ['solid', 'regular', 'brands'],\n\n getGlyph(style: string, name: string): GlyphData | null {\n const mod = loadStyleModule(style);\n if (!mod) return null;\n const entry = mod[exportNameFor(name)];\n if (!entry || !Array.isArray(entry.icon)) return null;\n const [w, h, , unicodeHex, path] = entry.icon;\n const codepoint = parseInt(unicodeHex, 16);\n if (!Number.isFinite(codepoint)) return null;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${w} ${h}\" fill=\"__COLOR__\"><path d=\"${path}\"/></svg>`;\n return { codepoint, svg };\n },\n\n getFontPath(style: string): string | null {\n const filename = STYLE_TO_TTF[style];\n if (!filename) return null;\n const dir = webfontsDir();\n if (!dir) return null;\n return join(dir, filename);\n },\n\n listGlyphs(style: string): string[] {\n const mod = loadStyleModule(style);\n if (!mod) return [];\n const out: string[] = [];\n for (const [key, entry] of Object.entries(mod)) {\n // The FA modules also export `prefix` ('fas' / 'far' / 'fab') and a\n // single-letter alias matching the prefix. Filter to real icon\n // entries — objects with a numeric icon[0] and a string icon[4].\n if (!key.startsWith('fa') || key.length < 3) continue;\n const ch = key.charAt(2);\n if (ch < 'A' || ch > 'Z') continue; // skip `fas`, `far`, `fab`\n if (!entry || typeof entry !== 'object' || !Array.isArray((entry as FaIconEntry).icon)) continue;\n out.push(kebabFromExportName(key));\n }\n return out;\n },\n};\n\nexport default adapter;\n"],"mappings":";;;AAIA,IAAM,IAAU,EAAc,OAAO,KAAK,IAAI,EAExC,IAA2C;CAC7C,OAAO;CACP,SAAS;CACT,QAAQ;CACX,EAEK,IAAuC;CACzC,OAAO;CACP,SAAS;CACT,QAAQ;CACX,EAQK,oBAAc,IAAI,KAAiD;AAEzE,SAAS,EAAgB,GAAmD;CACxE,IAAI,EAAY,IAAI,EAAM,EAAE,OAAO,EAAY,IAAI,EAAM,IAAI;CAC7D,IAAM,IAAM,EAAiB;CAC7B,IAAI,CAAC,GAED,OADA,EAAY,IAAI,GAAO,KAAK,EACrB;CAEX,IAAI;EACA,IAAM,IAAM,EAAQ,EAAI;EAExB,OADA,EAAY,IAAI,GAAO,EAAI,EACpB;SACH;EAEJ,OADA,EAAY,IAAI,GAAO,KAAK,EACrB;;;AAKf,SAAS,EAAc,GAAsB;CACzC,OAAO,OAAO,EAAK,MAAM,IAAI,CAAC,KAAK,MAAQ,EAAI,OAAO,EAAE,CAAC,aAAa,GAAG,EAAI,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;;AAOnG,SAAS,EAAoB,GAA4B;CAErD,IAAM,IAAO,EAAW,MAAM,EAAE;CAChC,IAAI,EAAK,WAAW,GAAG,OAAO;CAE9B,IAAI,IAAM,EAAK,OAAO,EAAE,CAAC,aAAa;CACtC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EAClC,IAAM,IAAK,EAAK,OAAO,EAAE;EACzB,AAAI,KAAM,OAAO,KAAM,MACnB,KAAO,MAAM,EAAG,aAAa,GAE7B,KAAO;;CAGf,OAAO;;AAGX,SAAS,IAA6B;CAClC,IAAI;EAEA,OAAO,EAAK,EADI,EAAQ,QAAQ,6CACZ,CAAQ,EAAE,WAAW;SACrC;EACJ,OAAO;;;AAIf,IAAM,IAAuB;CACzB,QAAQ;EAAC;EAAS;EAAW;EAAS;CAEtC,SAAS,GAAe,GAAgC;EACpD,IAAM,IAAM,EAAgB,EAAM;EAClC,IAAI,CAAC,GAAK,OAAO;EACjB,IAAM,IAAQ,EAAI,EAAc,EAAK;EACrC,IAAI,CAAC,KAAS,CAAC,MAAM,QAAQ,EAAM,KAAK,EAAE,OAAO;EACjD,IAAM,CAAC,GAAG,KAAK,GAAY,KAAQ,EAAM,MACnC,IAAY,SAAS,GAAY,GAAG;EAG1C,OAFK,OAAO,SAAS,EAAU,GAExB;GAAE;GAAW,KAAA,wDADgD,EAAE,GAAG,EAAE,8BAA8B,EAAK;GACrF,GAFe;;CAK5C,YAAY,GAA8B;EACtC,IAAM,IAAW,EAAa;EAC9B,IAAI,CAAC,GAAU,OAAO;EACtB,IAAM,IAAM,GAAa;EAEzB,OADK,IACE,EAAK,GAAK,EAAS,GADT;;CAIrB,WAAW,GAAyB;EAChC,IAAM,IAAM,EAAgB,EAAM;EAClC,IAAI,CAAC,GAAK,OAAO,EAAE;EACnB,IAAM,IAAgB,EAAE;EACxB,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,EAAI,EAAE;GAI5C,IAAI,CAAC,EAAI,WAAW,KAAK,IAAI,EAAI,SAAS,GAAG;GAC7C,IAAM,IAAK,EAAI,OAAO,EAAE;GACpB,IAAK,OAAO,IAAK,OACjB,CAAC,KAAS,OAAO,KAAU,YAAY,CAAC,MAAM,QAAS,EAAsB,KAAK,IACtF,EAAI,KAAK,EAAoB,EAAI,CAAC;;EAEtC,OAAO;;CAEd"}