@fastkit/plugboy 0.2.7 → 1.0.0-next.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 (62) hide show
  1. package/README.md +355 -0
  2. package/dist/cli.d.mts +5 -0
  3. package/dist/cli.mjs +33 -128
  4. package/dist/cli.mjs.map +1 -1
  5. package/dist/combine-rules-CWp-M491.mjs +66 -0
  6. package/dist/combine-rules-CWp-M491.mjs.map +1 -0
  7. package/dist/dependencies/bundle-require.d.mts +1 -0
  8. package/dist/dependencies/bundle-require.mjs +3 -3
  9. package/dist/dependencies/cac.d.mts +1 -0
  10. package/dist/dependencies/cac.mjs +3 -3
  11. package/dist/dependencies/glob.d.mts +1 -0
  12. package/dist/dependencies/glob.mjs +3 -3
  13. package/dist/dependencies/inquirer.d.mts +1 -0
  14. package/dist/dependencies/inquirer.mjs +3 -3
  15. package/dist/dependencies/pkg-types.d.mts +1 -0
  16. package/dist/dependencies/pkg-types.mjs +3 -3
  17. package/dist/dependencies/sort-package-json.d.mts +2 -0
  18. package/dist/dependencies/sort-package-json.mjs +5 -4
  19. package/dist/dependencies/sort-package-json.mjs.map +1 -1
  20. package/dist/dependencies/tsdown.d.mts +1 -0
  21. package/dist/dependencies/tsdown.mjs +3 -0
  22. package/dist/optimize-layer-CK8NR_VC.mjs +58 -0
  23. package/dist/optimize-layer-CK8NR_VC.mjs.map +1 -0
  24. package/dist/optimize-media-Bxy27Cj7.mjs +86 -0
  25. package/dist/optimize-media-Bxy27Cj7.mjs.map +1 -0
  26. package/dist/plugboy.d.mts +6284 -0
  27. package/dist/plugboy.mjs +3 -103
  28. package/dist/runtime-utils.d.mts +28 -0
  29. package/dist/runtime-utils.mjs +94 -0
  30. package/dist/runtime-utils.mjs.map +1 -0
  31. package/dist/workspace-BqcryYAT.mjs +1391 -0
  32. package/dist/workspace-BqcryYAT.mjs.map +1 -0
  33. package/env.d.ts +0 -18
  34. package/package.json +21 -17
  35. package/dist/chunk-MN572VU2.mjs +0 -1616
  36. package/dist/chunk-MN572VU2.mjs.map +0 -1
  37. package/dist/cli.d.ts +0 -3
  38. package/dist/combine-rules-2CRG6D4B.mjs +0 -69
  39. package/dist/combine-rules-2CRG6D4B.mjs.map +0 -1
  40. package/dist/dependencies/bundle-require.d.ts +0 -7
  41. package/dist/dependencies/bundle-require.mjs.map +0 -1
  42. package/dist/dependencies/cac.d.ts +0 -1
  43. package/dist/dependencies/cac.mjs.map +0 -1
  44. package/dist/dependencies/esbuild.d.ts +0 -1
  45. package/dist/dependencies/esbuild.mjs +0 -3
  46. package/dist/dependencies/esbuild.mjs.map +0 -1
  47. package/dist/dependencies/glob.d.ts +0 -1
  48. package/dist/dependencies/glob.mjs.map +0 -1
  49. package/dist/dependencies/inquirer.d.ts +0 -1
  50. package/dist/dependencies/inquirer.mjs.map +0 -1
  51. package/dist/dependencies/pkg-types.d.ts +0 -1
  52. package/dist/dependencies/pkg-types.mjs.map +0 -1
  53. package/dist/dependencies/sort-package-json.d.ts +0 -2
  54. package/dist/dependencies/tsup.d.ts +0 -1
  55. package/dist/dependencies/tsup.mjs +0 -3
  56. package/dist/dependencies/tsup.mjs.map +0 -1
  57. package/dist/optimize-layer-Q35C25P4.mjs +0 -61
  58. package/dist/optimize-layer-Q35C25P4.mjs.map +0 -1
  59. package/dist/optimize-media-ZZWDHLLV.mjs +0 -99
  60. package/dist/optimize-media-ZZWDHLLV.mjs.map +0 -1
  61. package/dist/plugboy.d.ts +0 -777
  62. package/dist/plugboy.mjs.map +0 -1
@@ -1,3 +1,3 @@
1
- // src/dependencies/pkg-types.ts
2
- export * from "pkg-types";
3
- //# sourceMappingURL=pkg-types.mjs.map
1
+ export * from "pkg-types"
2
+
3
+ export { };
@@ -0,0 +1,2 @@
1
+ import sortPackageJson from "sort-package-json";
2
+ export { sortPackageJson as default };
@@ -1,7 +1,8 @@
1
- // src/dependencies/sort-package-json.ts
2
1
  import sortPackageJson from "sort-package-json";
2
+
3
+ //#region src/dependencies/sort-package-json.ts
3
4
  var sort_package_json_default = sortPackageJson;
4
- export {
5
- sort_package_json_default as default
6
- };
5
+
6
+ //#endregion
7
+ export { sort_package_json_default as default };
7
8
  //# sourceMappingURL=sort-package-json.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/dependencies/sort-package-json.ts"],"sourcesContent":["import sortPackageJson from 'sort-package-json';\n\nexport default sortPackageJson;\n"],"mappings":";AAAA,OAAO,qBAAqB;AAE5B,IAAO,4BAAQ;","names":[]}
1
+ {"version":3,"file":"sort-package-json.mjs","names":[],"sources":["../../src/dependencies/sort-package-json.ts"],"sourcesContent":["import sortPackageJson from 'sort-package-json';\n\nexport default sortPackageJson;\n"],"mappings":";;;AAEA,gCAAe"}
@@ -0,0 +1 @@
1
+ export * from "tsdown";
@@ -0,0 +1,3 @@
1
+ export * from "tsdown"
2
+
3
+ export { };
@@ -0,0 +1,58 @@
1
+ import postcss, { Root } from "postcss";
2
+
3
+ //#region src/postcss/plugins/optimize-layer.ts
4
+ function resolveFilter(spec, defaults) {
5
+ if (!spec) return () => defaults;
6
+ if (typeof spec === "function") return spec;
7
+ const conditions = Array.isArray(spec) ? spec : [spec];
8
+ return (layerName) => conditions.some((condition) => typeof condition === "string" ? layerName.includes(condition) : condition.test(layerName));
9
+ }
10
+ function optimizeLayer(css, opts = {}) {
11
+ const root = css instanceof Root ? css : postcss.parse(css);
12
+ const layers = [];
13
+ const include = resolveFilter(opts.include, true);
14
+ const exclude = resolveFilter(opts.exclude, false);
15
+ const getLayer = (layerRule) => {
16
+ const name = layerRule.params;
17
+ const layer = layers.find((_layer) => _layer.name === name);
18
+ if (layer) return {
19
+ layer,
20
+ atFirst: false
21
+ };
22
+ const created = {
23
+ name,
24
+ rule: layerRule
25
+ };
26
+ layers.push(created);
27
+ return {
28
+ layer: created,
29
+ atFirst: true
30
+ };
31
+ };
32
+ root.walkAtRules("layer", (layerRule) => {
33
+ if (layerRule.parent?.type !== "root") return;
34
+ const { params, nodes } = layerRule;
35
+ if (!nodes || !include(params, layerRule) || exclude(params, layerRule)) return;
36
+ const { layer, atFirst } = getLayer(layerRule);
37
+ if (atFirst) return;
38
+ layerRule.nodes?.forEach((node) => {
39
+ layer.rule.append(node.clone());
40
+ });
41
+ layerRule.remove();
42
+ });
43
+ return root;
44
+ }
45
+ const PLUGIN_NAME = "optimize-layer";
46
+ function OptimizeLayer(opts) {
47
+ return {
48
+ postcssPlugin: PLUGIN_NAME,
49
+ Once(root) {
50
+ optimizeLayer(root, opts);
51
+ }
52
+ };
53
+ }
54
+ OptimizeLayer.postcss = true;
55
+
56
+ //#endregion
57
+ export { OptimizeLayer };
58
+ //# sourceMappingURL=optimize-layer-CK8NR_VC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize-layer-CK8NR_VC.mjs","names":[],"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ninterface Layer {\n name: string;\n rule: AtRule;\n}\n\nexport function optimizeLayer(\n css: string | { toString(): string } | Root,\n opts: OptimizeLayerOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const layers: Layer[] = [];\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const getLayer = (\n layerRule: AtRule,\n ): {\n layer: Layer;\n atFirst: boolean;\n } => {\n const name = layerRule.params;\n const layer = layers.find((_layer) => _layer.name === name);\n if (layer)\n return {\n layer,\n atFirst: false,\n };\n\n const created: Layer = { name, rule: layerRule };\n layers.push(created);\n return {\n layer: created,\n atFirst: true,\n };\n };\n\n root.walkAtRules('layer', (layerRule) => {\n if (layerRule.parent?.type !== 'root') return;\n const { params, nodes } = layerRule;\n if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n return;\n\n const { layer, atFirst } = getLayer(layerRule);\n\n if (atFirst) return;\n\n layerRule.nodes?.forEach((node) => {\n layer.rule.append(node.clone());\n });\n\n layerRule.remove();\n });\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeLayer(root, opts);\n },\n };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";;;AAWA,SAAS,cACP,MACA,UACQ;AACR,KAAI,CAAC,KAAM,cAAa;AACxB,KAAI,OAAO,SAAS,WAAY,QAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAK;AACtD,SAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,UAAU,GAC7B,UAAU,KAAK,UAAU,CAC9B;;AAQL,SAAgB,cACd,KACA,OAA6B,EAAE,EACzB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,IAAI;CAC3D,MAAM,SAAkB,EAAE;CAC1B,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CACjD,MAAM,UAAU,cAAc,KAAK,SAAS,MAAM;CAElD,MAAM,YACJ,cAIG;EACH,MAAM,OAAO,UAAU;EACvB,MAAM,QAAQ,OAAO,MAAM,WAAW,OAAO,SAAS,KAAK;AAC3D,MAAI,MACF,QAAO;GACL;GACA,SAAS;GACV;EAEH,MAAM,UAAiB;GAAE;GAAM,MAAM;GAAW;AAChD,SAAO,KAAK,QAAQ;AACpB,SAAO;GACL,OAAO;GACP,SAAS;GACV;;AAGH,MAAK,YAAY,UAAU,cAAc;AACvC,MAAI,UAAU,QAAQ,SAAS,OAAQ;EACvC,MAAM,EAAE,QAAQ,UAAU;AAC1B,MAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,UAAU,CACrE;EAEF,MAAM,EAAE,OAAO,YAAY,SAAS,UAAU;AAE9C,MAAI,QAAS;AAEb,YAAU,OAAO,SAAS,SAAS;AACjC,SAAM,KAAK,OAAO,KAAK,OAAO,CAAC;IAC/B;AAEF,YAAU,QAAQ;GAClB;AAEF,QAAO;;AAGT,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;AACjE,QAAO;EACL,eAAe;EACf,KAAK,MAAM;AACT,iBAAc,MAAM,KAAK;;EAE5B;;AAGH,cAAc,UAAU"}
@@ -0,0 +1,86 @@
1
+ import postcss, { AtRule, Root } from "postcss";
2
+
3
+ //#region src/postcss/plugins/optimize-media.ts
4
+ function resolveFilter(spec, defaults) {
5
+ if (!spec) return () => defaults;
6
+ if (typeof spec === "function") return spec;
7
+ const conditions = Array.isArray(spec) ? spec : [spec];
8
+ return (layerName) => conditions.some((condition) => typeof condition === "string" ? layerName.includes(condition) : condition.test(layerName));
9
+ }
10
+ function parseMedia(mediaRule) {
11
+ const { params, parent } = mediaRule;
12
+ if (!parent) throw mediaRule.error("@media rules require a parent container.");
13
+ return {
14
+ query: params,
15
+ rule: mediaRule,
16
+ container: parent
17
+ };
18
+ }
19
+ function isSourceMapAnnotation(node) {
20
+ if (!node) return false;
21
+ if (node.type !== "comment") return false;
22
+ return node.text.toLowerCase().startsWith("# sourcemappingurl=");
23
+ }
24
+ function getSourceMapAnnotation(container) {
25
+ const maybeAnnotation = container.last;
26
+ if (isSourceMapAnnotation(maybeAnnotation)) return maybeAnnotation;
27
+ }
28
+ function optimizeMedia(css, opts = {}) {
29
+ const root = css instanceof Root ? css : postcss.parse(css);
30
+ const include = resolveFilter(opts.include, true);
31
+ const exclude = resolveFilter(opts.exclude, false);
32
+ const sourceMap = getSourceMapAnnotation(root);
33
+ const containerMap = /* @__PURE__ */ new Map();
34
+ root.walkAtRules("media", (mediaRule) => {
35
+ const media = parseMedia(mediaRule);
36
+ if (!mediaRule.nodes || !include(media.query, media) || exclude(media.query, media)) return;
37
+ let bucket = containerMap.get(media.container);
38
+ if (!bucket) {
39
+ bucket = [];
40
+ containerMap.set(media.container, bucket);
41
+ }
42
+ bucket.push(media);
43
+ });
44
+ containerMap.forEach((bucket, container) => {
45
+ if (opts.sort) bucket.sort(opts.sort);
46
+ const combinedRules = [];
47
+ bucket.forEach((media) => {
48
+ let rule = combinedRules.find((r) => r.query === media.query);
49
+ if (!rule) {
50
+ rule = {
51
+ query: media.query,
52
+ medias: []
53
+ };
54
+ combinedRules.push(rule);
55
+ }
56
+ rule.medias.push(media);
57
+ });
58
+ combinedRules.forEach((rule) => {
59
+ const nodes = rule.medias.map((media) => (media.rule.nodes || []).map((node) => node.clone())).flat();
60
+ const newAtRule = new AtRule({
61
+ name: "media",
62
+ params: rule.query,
63
+ nodes
64
+ });
65
+ rule.medias.forEach((media) => media.rule.remove());
66
+ container.append(newAtRule);
67
+ });
68
+ });
69
+ containerMap.clear();
70
+ if (sourceMap) root.append(sourceMap);
71
+ return root;
72
+ }
73
+ const PLUGIN_NAME = "optimize-media";
74
+ function OptimizeMedia(opts) {
75
+ return {
76
+ postcssPlugin: PLUGIN_NAME,
77
+ Once(root) {
78
+ optimizeMedia(root, opts);
79
+ }
80
+ };
81
+ }
82
+ OptimizeMedia.postcss = true;
83
+
84
+ //#endregion
85
+ export { OptimizeMedia };
86
+ //# sourceMappingURL=optimize-media-Bxy27Cj7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize-media-Bxy27Cj7.mjs","names":[],"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n AtRule,\n Plugin,\n Root,\n Container,\n ChildNode,\n Comment,\n} from 'postcss';\n\ninterface Media {\n query: string;\n rule: AtRule;\n container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n sort?: SortMedia;\n}\n\nfunction parseMedia(mediaRule: AtRule): Media {\n const { params, parent } = mediaRule;\n if (!parent) {\n throw mediaRule.error('@media rules require a parent container.');\n }\n return {\n query: params,\n rule: mediaRule,\n container: parent,\n };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n if (!node) return false;\n if (node.type !== 'comment') return false;\n return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n const maybeAnnotation = container.last;\n if (isSourceMapAnnotation(maybeAnnotation)) {\n return maybeAnnotation;\n }\n}\n\nexport function optimizeMedia(\n css: string | { toString(): string } | Root,\n opts: OptimizeMediaOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const sourceMap = getSourceMapAnnotation(root);\n\n const containerMap = new Map<Container, Media[]>();\n\n root.walkAtRules('media', (mediaRule) => {\n const media = parseMedia(mediaRule);\n if (\n !mediaRule.nodes ||\n !include(media.query, media) ||\n exclude(media.query, media)\n )\n return;\n\n let bucket = containerMap.get(media.container);\n if (!bucket) {\n bucket = [];\n containerMap.set(media.container, bucket);\n }\n bucket.push(media);\n });\n\n containerMap.forEach((bucket, container) => {\n if (opts.sort) {\n bucket.sort(opts.sort);\n }\n\n const combinedRules: {\n query: string;\n medias: Media[];\n }[] = [];\n\n bucket.forEach((media) => {\n let rule = combinedRules.find((r) => r.query === media.query);\n if (!rule) {\n rule = { query: media.query, medias: [] };\n combinedRules.push(rule);\n }\n rule.medias.push(media);\n });\n\n combinedRules.forEach((rule) => {\n const nodes = rule.medias\n .map((media) => (media.rule.nodes || []).map((node) => node.clone()))\n .flat();\n const newAtRule = new AtRule({\n name: 'media',\n params: rule.query,\n nodes,\n });\n rule.medias.forEach((media) => media.rule.remove());\n container.append(newAtRule);\n });\n });\n\n containerMap.clear();\n\n if (sourceMap) {\n root.append(sourceMap);\n }\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeMedia(root, opts);\n },\n };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":";;;AAmBA,SAAS,cACP,MACA,UACQ;AACR,KAAI,CAAC,KAAM,cAAa;AACxB,KAAI,OAAO,SAAS,WAAY,QAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAK;AACtD,SAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,UAAU,GAC7B,UAAU,KAAK,UAAU,CAC9B;;AAWL,SAAS,WAAW,WAA0B;CAC5C,MAAM,EAAE,QAAQ,WAAW;AAC3B,KAAI,CAAC,OACH,OAAM,UAAU,MAAM,2CAA2C;AAEnE,QAAO;EACL,OAAO;EACP,MAAM;EACN,WAAW;EACZ;;AAGH,SAAS,sBAAsB,MAA8C;AAC3E,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,KAAK,SAAS,UAAW,QAAO;AACpC,QAAO,KAAK,KAAK,aAAa,CAAC,WAAW,sBAAsB;;AAGlE,SAAS,uBAAuB,WAA6C;CAC3E,MAAM,kBAAkB,UAAU;AAClC,KAAI,sBAAsB,gBAAgB,CACxC,QAAO;;AAIX,SAAgB,cACd,KACA,OAA6B,EAAE,EACzB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,IAAI;CAC3D,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CACjD,MAAM,UAAU,cAAc,KAAK,SAAS,MAAM;CAElD,MAAM,YAAY,uBAAuB,KAAK;CAE9C,MAAM,+BAAe,IAAI,KAAyB;AAElD,MAAK,YAAY,UAAU,cAAc;EACvC,MAAM,QAAQ,WAAW,UAAU;AACnC,MACE,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,OAAO,MAAM,IAC5B,QAAQ,MAAM,OAAO,MAAM,CAE3B;EAEF,IAAI,SAAS,aAAa,IAAI,MAAM,UAAU;AAC9C,MAAI,CAAC,QAAQ;AACX,YAAS,EAAE;AACX,gBAAa,IAAI,MAAM,WAAW,OAAO;;AAE3C,SAAO,KAAK,MAAM;GAClB;AAEF,cAAa,SAAS,QAAQ,cAAc;AAC1C,MAAI,KAAK,KACP,QAAO,KAAK,KAAK,KAAK;EAGxB,MAAM,gBAGA,EAAE;AAER,SAAO,SAAS,UAAU;GACxB,IAAI,OAAO,cAAc,MAAM,MAAM,EAAE,UAAU,MAAM,MAAM;AAC7D,OAAI,CAAC,MAAM;AACT,WAAO;KAAE,OAAO,MAAM;KAAO,QAAQ,EAAE;KAAE;AACzC,kBAAc,KAAK,KAAK;;AAE1B,QAAK,OAAO,KAAK,MAAM;IACvB;AAEF,gBAAc,SAAS,SAAS;GAC9B,MAAM,QAAQ,KAAK,OAChB,KAAK,WAAW,MAAM,KAAK,SAAS,EAAE,EAAE,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CACpE,MAAM;GACT,MAAM,YAAY,IAAI,OAAO;IAC3B,MAAM;IACN,QAAQ,KAAK;IACb;IACD,CAAC;AACF,QAAK,OAAO,SAAS,UAAU,MAAM,KAAK,QAAQ,CAAC;AACnD,aAAU,OAAO,UAAU;IAC3B;GACF;AAEF,cAAa,OAAO;AAEpB,KAAI,UACF,MAAK,OAAO,UAAU;AAGxB,QAAO;;AAGT,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;AACjE,QAAO;EACL,eAAe;EACf,KAAK,MAAM;AACT,iBAAc,MAAM,KAAK;;EAE5B;;AAGH,cAAc,UAAU"}