sunpeak 0.9.2 → 0.9.6
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 +2 -2
- package/dist/chatgpt/conversation.d.ts +5 -2
- package/dist/chatgpt/iframe-resource.d.ts +69 -0
- package/dist/chatgpt/index.cjs +2 -1
- package/dist/chatgpt/index.cjs.map +1 -1
- package/dist/chatgpt/index.d.ts +1 -0
- package/dist/chatgpt/index.js +2 -1
- package/dist/discovery-a4WId9PC.cjs +125 -0
- package/dist/discovery-a4WId9PC.cjs.map +1 -0
- package/dist/discovery-ft3cd2dW.js +126 -0
- package/dist/discovery-ft3cd2dW.js.map +1 -0
- package/dist/index.cjs +13 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +30 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/discovery.d.ts +110 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/mcp/entry.cjs +2 -10
- package/dist/mcp/entry.cjs.map +1 -1
- package/dist/mcp/entry.js +1 -9
- package/dist/mcp/entry.js.map +1 -1
- package/dist/{simulator-url-CexnaL-e.js → simulator-url-BOSS60NS.js} +592 -4
- package/dist/simulator-url-BOSS60NS.js.map +1 -0
- package/dist/{simulator-url-CG8lAAC3.cjs → simulator-url-BStCoFTv.cjs} +593 -5
- package/dist/simulator-url-BStCoFTv.cjs.map +1 -0
- package/dist/types/simulation.d.ts +4 -1
- package/package.json +1 -1
- package/template/.sunpeak/dev.tsx +6 -91
- package/template/README.md +2 -2
- package/template/dist/albums.json +1 -1
- package/template/dist/carousel.json +1 -1
- package/template/dist/map.json +1 -1
- package/template/dist/review.json +1 -1
- package/template/node_modules/.vite/deps/@openai_apps-sdk-ui_components_SegmentedControl.js +4 -4
- package/template/node_modules/.vite/deps/@openai_apps-sdk-ui_components_Select.js +6 -6
- package/template/node_modules/.vite/deps/_metadata.json +25 -25
- package/template/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/template/src/resources/index.ts +3 -25
- package/template/src/simulations/index.ts +3 -10
- package/dist/simulator-url-CG8lAAC3.cjs.map +0 -1
- package/dist/simulator-url-CexnaL-e.js.map +0 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Simulation } from '../types/simulation.js';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a kebab-case string to PascalCase
|
|
4
|
+
* @example toPascalCase('review') // 'Review'
|
|
5
|
+
* @example toPascalCase('album-art') // 'AlbumArt'
|
|
6
|
+
*/
|
|
7
|
+
export declare function toPascalCase(str: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Extract the resource key from a resource file path
|
|
10
|
+
* @example extractResourceKey('./review-resource.tsx') // 'review'
|
|
11
|
+
* @example extractResourceKey('../src/resources/albums-resource.json') // 'albums'
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractResourceKey(path: string): string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Extract the simulation key from a simulation file path
|
|
16
|
+
* @example extractSimulationKey('./albums-show-simulation.json') // 'albums-show'
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractSimulationKey(path: string): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Find the best matching resource key for a simulation key.
|
|
21
|
+
* Matches the longest resource name that is a prefix of the simulation key.
|
|
22
|
+
* @example findResourceKey('albums-show', ['albums', 'album']) // 'albums'
|
|
23
|
+
* @example findResourceKey('review-diff', ['review', 'carousel']) // 'review'
|
|
24
|
+
*/
|
|
25
|
+
export declare function findResourceKey(simulationKey: string, resourceKeys: string[]): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Get the expected component export name for a resource
|
|
28
|
+
* @example getComponentName('review') // 'ReviewResource'
|
|
29
|
+
* @example getComponentName('album-art') // 'AlbumArtResource'
|
|
30
|
+
*/
|
|
31
|
+
export declare function getComponentName(resourceKey: string): string;
|
|
32
|
+
type GlobModules = Record<string, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Process resource component modules from import.meta.glob() result.
|
|
35
|
+
* Extracts components and exports them with PascalCase names.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const modules = import.meta.glob('./*-resource.tsx', { eager: true });
|
|
39
|
+
* export default createResourceExports(modules);
|
|
40
|
+
*/
|
|
41
|
+
export declare function createResourceExports(modules: GlobModules): Record<string, React.ComponentType>;
|
|
42
|
+
/**
|
|
43
|
+
* Process simulation modules from import.meta.glob() result.
|
|
44
|
+
* Builds a map of simulation key -> simulation data.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* const modules = import.meta.glob('./*-simulation.json', { eager: true });
|
|
48
|
+
* export const SIMULATIONS = createSimulationIndex(modules);
|
|
49
|
+
*/
|
|
50
|
+
export declare function createSimulationIndex(modules: GlobModules): Record<string, unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* Build a resource metadata map from import.meta.glob() result.
|
|
53
|
+
* Used for connecting simulations to their resource definitions.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* const modules = import.meta.glob('../src/resources/*-resource.json', { eager: true });
|
|
57
|
+
* const resourcesMap = buildResourceMap(modules);
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildResourceMap<T>(modules: GlobModules): Map<string, T>;
|
|
60
|
+
/**
|
|
61
|
+
* Options for building simulations from discovered modules
|
|
62
|
+
*/
|
|
63
|
+
export interface BuildSimulationsOptions<TResource, TSimulation> {
|
|
64
|
+
/** Glob result of simulation JSON files */
|
|
65
|
+
simulationModules: GlobModules;
|
|
66
|
+
/** Map of resource key -> resource metadata */
|
|
67
|
+
resourcesMap: Map<string, TResource>;
|
|
68
|
+
/** Map of component name -> React component */
|
|
69
|
+
resourceComponents: Record<string, React.ComponentType>;
|
|
70
|
+
/** Create the final simulation object */
|
|
71
|
+
createSimulation: (simulationKey: string, simulationData: unknown, resource: TResource, resourceComponent: React.ComponentType) => TSimulation;
|
|
72
|
+
/** Optional warning handler for missing resources */
|
|
73
|
+
onMissingResource?: (simulationKey: string, expectedPrefix: string) => void;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build simulations by connecting simulation data with resources and components.
|
|
77
|
+
* This is the main orchestration function for dev server bootstrap.
|
|
78
|
+
*/
|
|
79
|
+
export declare function buildSimulations<TResource, TSimulation>(options: BuildSimulationsOptions<TResource, TSimulation>): Record<string, TSimulation>;
|
|
80
|
+
/**
|
|
81
|
+
* Resource metadata from *-resource.json files
|
|
82
|
+
*/
|
|
83
|
+
export interface ResourceMetadata {
|
|
84
|
+
name: string;
|
|
85
|
+
[key: string]: unknown;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Options for building dev simulations
|
|
89
|
+
*/
|
|
90
|
+
export interface BuildDevSimulationsOptions {
|
|
91
|
+
/** Glob result of simulation JSON files: import.meta.glob('*-simulation.json', { eager: true }) */
|
|
92
|
+
simulationModules: GlobModules;
|
|
93
|
+
/** Glob result of resource JSON files: import.meta.glob('*-resource.json', { eager: true }) */
|
|
94
|
+
resourceModules: GlobModules;
|
|
95
|
+
/** Resource components map from src/resources/index.ts */
|
|
96
|
+
resourceComponents: Record<string, React.ComponentType>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build simulations for the dev server from glob results.
|
|
100
|
+
* This is the main entry point for dev.tsx bootstrap.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* const simulations = buildDevSimulations({
|
|
104
|
+
* simulationModules: import.meta.glob('../src/simulations/*-simulation.json', { eager: true }),
|
|
105
|
+
* resourceModules: import.meta.glob('../src/resources/*-resource.json', { eager: true }),
|
|
106
|
+
* resourceComponents: resourceComponents,
|
|
107
|
+
* });
|
|
108
|
+
*/
|
|
109
|
+
export declare function buildDevSimulations(options: BuildDevSimulationsOptions): Record<string, Simulation>;
|
|
110
|
+
export {};
|
package/dist/lib/index.d.ts
CHANGED
package/dist/mcp/entry.cjs
CHANGED
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
const server = require("../server-CSybLAYo.cjs");
|
|
4
|
+
const discovery = require("../discovery-a4WId9PC.cjs");
|
|
4
5
|
const path = require("path");
|
|
5
6
|
const fs = require("fs");
|
|
6
7
|
const projectRoot = process.cwd();
|
|
7
|
-
function findResourceKey(simulationKey, resourceKeys) {
|
|
8
|
-
const sorted = [...resourceKeys].sort((a, b) => b.length - a.length);
|
|
9
|
-
for (const resourceKey of sorted) {
|
|
10
|
-
if (simulationKey === resourceKey || simulationKey.startsWith(resourceKey + "-")) {
|
|
11
|
-
return resourceKey;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
8
|
async function startServer() {
|
|
17
9
|
const pkgPath = path.join(projectRoot, "package.json");
|
|
18
10
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
@@ -33,7 +25,7 @@ async function startServer() {
|
|
|
33
25
|
const simulationKey = filename.replace(/-simulation\.json$/, "");
|
|
34
26
|
const simulationPath = path.join(simulationsDir, filename);
|
|
35
27
|
const simulation = JSON.parse(fs.readFileSync(simulationPath, "utf-8"));
|
|
36
|
-
const resourceKey = findResourceKey(simulationKey, resourceKeys);
|
|
28
|
+
const resourceKey = discovery.findResourceKey(simulationKey, resourceKeys);
|
|
37
29
|
if (!resourceKey) {
|
|
38
30
|
console.warn(
|
|
39
31
|
`No matching resource found for simulation "${simulationKey}". Expected a resource file like src/resources/${simulationKey.split("-")[0]}-resource.json`
|
package/dist/mcp/entry.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.cjs","sources":["../../src/mcp/entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Internal MCP server entry point\n * This is run by nodemon or directly to start the MCP server\n *\n * Auto-discovers simulations and resources by file naming convention:\n * - simulations/{resource}-{tool}-simulation.json (e.g., albums-show-simulation.json)\n * - resources/{resource}-resource.json\n */\nimport { runMCPServer, type SimulationWithDist } from './index.js';\nimport path from 'path';\nimport { readFileSync, readdirSync } from 'fs';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\n\n// Determine project root (where this is being run from)\nconst projectRoot = process.cwd();\n\
|
|
1
|
+
{"version":3,"file":"entry.cjs","sources":["../../src/mcp/entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Internal MCP server entry point\n * This is run by nodemon or directly to start the MCP server\n *\n * Auto-discovers simulations and resources by file naming convention:\n * - simulations/{resource}-{tool}-simulation.json (e.g., albums-show-simulation.json)\n * - resources/{resource}-resource.json\n */\nimport { runMCPServer, type SimulationWithDist } from './index.js';\nimport { findResourceKey } from '../lib/discovery.js';\nimport path from 'path';\nimport { readFileSync, readdirSync } from 'fs';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\n\n// Determine project root (where this is being run from)\nconst projectRoot = process.cwd();\n\nasync function startServer() {\n // Read package.json for app metadata\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n\n // Auto-discover resource files first (to build lookup map)\n const resourcesDir = path.join(projectRoot, 'src/resources');\n const resourceFiles = readdirSync(resourcesDir).filter((f) => f.endsWith('-resource.json'));\n\n const resourcesMap = new Map<string, Resource>();\n for (const filename of resourceFiles) {\n // Extract key from filename: 'review-resource.json' -> 'review'\n const key = filename.replace(/-resource\\.json$/, '');\n const resourcePath = path.join(resourcesDir, filename);\n const resource = JSON.parse(readFileSync(resourcePath, 'utf-8')) as Resource;\n resourcesMap.set(key, resource);\n }\n\n const resourceKeys = Array.from(resourcesMap.keys());\n\n // Auto-discover simulation files\n const simulationsDir = path.join(projectRoot, 'src/simulations');\n const simulationFiles = readdirSync(simulationsDir).filter((f) => f.endsWith('-simulation.json'));\n\n // Build simulations array from discovered files\n const simulations: SimulationWithDist[] = [];\n\n for (const filename of simulationFiles) {\n // Extract simulation key from filename: 'albums-show-simulation.json' -> 'albums-show'\n const simulationKey = filename.replace(/-simulation\\.json$/, '');\n\n // Load simulation data\n const simulationPath = path.join(simulationsDir, filename);\n const simulation = JSON.parse(readFileSync(simulationPath, 'utf-8'));\n\n // Find matching resource by best prefix match\n const resourceKey = findResourceKey(simulationKey, resourceKeys);\n if (!resourceKey) {\n console.warn(\n `No matching resource found for simulation \"${simulationKey}\". ` +\n `Expected a resource file like src/resources/${simulationKey.split('-')[0]}-resource.json`\n );\n continue;\n }\n\n const resource = resourcesMap.get(resourceKey)!;\n\n simulations.push({\n ...simulation,\n name: simulationKey,\n distPath: path.join(projectRoot, `dist/${resourceKey}.js`),\n resource,\n });\n }\n\n runMCPServer({\n name: pkg.name || 'Sunpeak',\n version: pkg.version || '0.1.0',\n simulations,\n port: 6766,\n });\n}\n\nstartServer().catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n});\n"],"names":["readFileSync","readdirSync","findResourceKey","runMCPServer"],"mappings":";;;;;;AAgBA,MAAM,cAAc,QAAQ,IAAA;AAE5B,eAAe,cAAc;AAE3B,QAAM,UAAU,KAAK,KAAK,aAAa,cAAc;AACrD,QAAM,MAAM,KAAK,MAAMA,GAAAA,aAAa,SAAS,OAAO,CAAC;AAGrD,QAAM,eAAe,KAAK,KAAK,aAAa,eAAe;AAC3D,QAAM,gBAAgBC,eAAY,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC;AAE1F,QAAM,mCAAmB,IAAA;AACzB,aAAW,YAAY,eAAe;AAEpC,UAAM,MAAM,SAAS,QAAQ,oBAAoB,EAAE;AACnD,UAAM,eAAe,KAAK,KAAK,cAAc,QAAQ;AACrD,UAAM,WAAW,KAAK,MAAMD,GAAAA,aAAa,cAAc,OAAO,CAAC;AAC/D,iBAAa,IAAI,KAAK,QAAQ;AAAA,EAChC;AAEA,QAAM,eAAe,MAAM,KAAK,aAAa,MAAM;AAGnD,QAAM,iBAAiB,KAAK,KAAK,aAAa,iBAAiB;AAC/D,QAAM,kBAAkBC,eAAY,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,kBAAkB,CAAC;AAGhG,QAAM,cAAoC,CAAA;AAE1C,aAAW,YAAY,iBAAiB;AAEtC,UAAM,gBAAgB,SAAS,QAAQ,sBAAsB,EAAE;AAG/D,UAAM,iBAAiB,KAAK,KAAK,gBAAgB,QAAQ;AACzD,UAAM,aAAa,KAAK,MAAMD,GAAAA,aAAa,gBAAgB,OAAO,CAAC;AAGnE,UAAM,cAAcE,UAAAA,gBAAgB,eAAe,YAAY;AAC/D,QAAI,CAAC,aAAa;AAChB,cAAQ;AAAA,QACN,8CAA8C,aAAa,kDACV,cAAc,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MAAA;AAE9E;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,IAAI,WAAW;AAE7C,gBAAY,KAAK;AAAA,MACf,GAAG;AAAA,MACH,MAAM;AAAA,MACN,UAAU,KAAK,KAAK,aAAa,QAAQ,WAAW,KAAK;AAAA,MACzD;AAAA,IAAA,CACD;AAAA,EACH;AAEAC,sBAAa;AAAA,IACX,MAAM,IAAI,QAAQ;AAAA,IAClB,SAAS,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,EAAA,CACP;AACH;AAEA,cAAc,MAAM,CAAC,UAAU;AAC7B,UAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;"}
|
package/dist/mcp/entry.js
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { r as runMCPServer } from "../server-310A1k9o.js";
|
|
3
|
+
import { f as findResourceKey } from "../discovery-ft3cd2dW.js";
|
|
3
4
|
import path from "path";
|
|
4
5
|
import { readFileSync, readdirSync } from "fs";
|
|
5
6
|
const projectRoot = process.cwd();
|
|
6
|
-
function findResourceKey(simulationKey, resourceKeys) {
|
|
7
|
-
const sorted = [...resourceKeys].sort((a, b) => b.length - a.length);
|
|
8
|
-
for (const resourceKey of sorted) {
|
|
9
|
-
if (simulationKey === resourceKey || simulationKey.startsWith(resourceKey + "-")) {
|
|
10
|
-
return resourceKey;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return void 0;
|
|
14
|
-
}
|
|
15
7
|
async function startServer() {
|
|
16
8
|
const pkgPath = path.join(projectRoot, "package.json");
|
|
17
9
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
package/dist/mcp/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sources":["../../src/mcp/entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Internal MCP server entry point\n * This is run by nodemon or directly to start the MCP server\n *\n * Auto-discovers simulations and resources by file naming convention:\n * - simulations/{resource}-{tool}-simulation.json (e.g., albums-show-simulation.json)\n * - resources/{resource}-resource.json\n */\nimport { runMCPServer, type SimulationWithDist } from './index.js';\nimport path from 'path';\nimport { readFileSync, readdirSync } from 'fs';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\n\n// Determine project root (where this is being run from)\nconst projectRoot = process.cwd();\n\
|
|
1
|
+
{"version":3,"file":"entry.js","sources":["../../src/mcp/entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Internal MCP server entry point\n * This is run by nodemon or directly to start the MCP server\n *\n * Auto-discovers simulations and resources by file naming convention:\n * - simulations/{resource}-{tool}-simulation.json (e.g., albums-show-simulation.json)\n * - resources/{resource}-resource.json\n */\nimport { runMCPServer, type SimulationWithDist } from './index.js';\nimport { findResourceKey } from '../lib/discovery.js';\nimport path from 'path';\nimport { readFileSync, readdirSync } from 'fs';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\n\n// Determine project root (where this is being run from)\nconst projectRoot = process.cwd();\n\nasync function startServer() {\n // Read package.json for app metadata\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n\n // Auto-discover resource files first (to build lookup map)\n const resourcesDir = path.join(projectRoot, 'src/resources');\n const resourceFiles = readdirSync(resourcesDir).filter((f) => f.endsWith('-resource.json'));\n\n const resourcesMap = new Map<string, Resource>();\n for (const filename of resourceFiles) {\n // Extract key from filename: 'review-resource.json' -> 'review'\n const key = filename.replace(/-resource\\.json$/, '');\n const resourcePath = path.join(resourcesDir, filename);\n const resource = JSON.parse(readFileSync(resourcePath, 'utf-8')) as Resource;\n resourcesMap.set(key, resource);\n }\n\n const resourceKeys = Array.from(resourcesMap.keys());\n\n // Auto-discover simulation files\n const simulationsDir = path.join(projectRoot, 'src/simulations');\n const simulationFiles = readdirSync(simulationsDir).filter((f) => f.endsWith('-simulation.json'));\n\n // Build simulations array from discovered files\n const simulations: SimulationWithDist[] = [];\n\n for (const filename of simulationFiles) {\n // Extract simulation key from filename: 'albums-show-simulation.json' -> 'albums-show'\n const simulationKey = filename.replace(/-simulation\\.json$/, '');\n\n // Load simulation data\n const simulationPath = path.join(simulationsDir, filename);\n const simulation = JSON.parse(readFileSync(simulationPath, 'utf-8'));\n\n // Find matching resource by best prefix match\n const resourceKey = findResourceKey(simulationKey, resourceKeys);\n if (!resourceKey) {\n console.warn(\n `No matching resource found for simulation \"${simulationKey}\". ` +\n `Expected a resource file like src/resources/${simulationKey.split('-')[0]}-resource.json`\n );\n continue;\n }\n\n const resource = resourcesMap.get(resourceKey)!;\n\n simulations.push({\n ...simulation,\n name: simulationKey,\n distPath: path.join(projectRoot, `dist/${resourceKey}.js`),\n resource,\n });\n }\n\n runMCPServer({\n name: pkg.name || 'Sunpeak',\n version: pkg.version || '0.1.0',\n simulations,\n port: 6766,\n });\n}\n\nstartServer().catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;;;AAgBA,MAAM,cAAc,QAAQ,IAAA;AAE5B,eAAe,cAAc;AAE3B,QAAM,UAAU,KAAK,KAAK,aAAa,cAAc;AACrD,QAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AAGrD,QAAM,eAAe,KAAK,KAAK,aAAa,eAAe;AAC3D,QAAM,gBAAgB,YAAY,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC;AAE1F,QAAM,mCAAmB,IAAA;AACzB,aAAW,YAAY,eAAe;AAEpC,UAAM,MAAM,SAAS,QAAQ,oBAAoB,EAAE;AACnD,UAAM,eAAe,KAAK,KAAK,cAAc,QAAQ;AACrD,UAAM,WAAW,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAC/D,iBAAa,IAAI,KAAK,QAAQ;AAAA,EAChC;AAEA,QAAM,eAAe,MAAM,KAAK,aAAa,MAAM;AAGnD,QAAM,iBAAiB,KAAK,KAAK,aAAa,iBAAiB;AAC/D,QAAM,kBAAkB,YAAY,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,kBAAkB,CAAC;AAGhG,QAAM,cAAoC,CAAA;AAE1C,aAAW,YAAY,iBAAiB;AAEtC,UAAM,gBAAgB,SAAS,QAAQ,sBAAsB,EAAE;AAG/D,UAAM,iBAAiB,KAAK,KAAK,gBAAgB,QAAQ;AACzD,UAAM,aAAa,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC;AAGnE,UAAM,cAAc,gBAAgB,eAAe,YAAY;AAC/D,QAAI,CAAC,aAAa;AAChB,cAAQ;AAAA,QACN,8CAA8C,aAAa,kDACV,cAAc,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MAAA;AAE9E;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,IAAI,WAAW;AAE7C,gBAAY,KAAK;AAAA,MACf,GAAG;AAAA,MACH,MAAM;AAAA,MACN,UAAU,KAAK,KAAK,aAAa,QAAQ,WAAW,KAAK;AAAA,MACzD;AAAA,IAAA,CACD;AAAA,EACH;AAEA,eAAa;AAAA,IACX,MAAM,IAAI,QAAQ;AAAA,IAClB,SAAS,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,EAAA,CACP;AACH;AAEA,cAAc,MAAM,CAAC,UAAU;AAC7B,UAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;"}
|