@jaypie/mcp 0.1.9 → 0.2.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.
- package/dist/datadog.d.ts +212 -0
- package/dist/index.js +1461 -6
- package/dist/index.js.map +1 -1
- package/package.json +10 -7
- package/prompts/Development_Process.md +57 -35
- package/prompts/Jaypie_CDK_Constructs_and_Patterns.md +143 -19
- package/prompts/Jaypie_Express_Package.md +408 -0
- package/prompts/Jaypie_Init_Express_on_Lambda.md +66 -38
- package/prompts/Jaypie_Init_Lambda_Package.md +202 -83
- package/prompts/Jaypie_Init_Project_Subpackage.md +21 -26
- package/prompts/Jaypie_Legacy_Patterns.md +4 -0
- package/prompts/Templates_CDK_Subpackage.md +113 -0
- package/prompts/Templates_Express_Subpackage.md +183 -0
- package/prompts/Templates_Project_Monorepo.md +326 -0
- package/prompts/Templates_Project_Subpackage.md +93 -0
- package/LICENSE.txt +0 -21
- package/prompts/Jaypie_Mongoose_Models_Package.md +0 -231
- package/prompts/Jaypie_Mongoose_with_Express_CRUD.md +0 -1000
- package/prompts/templates/cdk-subpackage/bin/cdk.ts +0 -11
- package/prompts/templates/cdk-subpackage/cdk.json +0 -19
- package/prompts/templates/cdk-subpackage/lib/cdk-app.ts +0 -41
- package/prompts/templates/cdk-subpackage/lib/cdk-infrastructure.ts +0 -15
- package/prompts/templates/express-subpackage/index.ts +0 -8
- package/prompts/templates/express-subpackage/src/app.ts +0 -18
- package/prompts/templates/express-subpackage/src/handler.config.ts +0 -44
- package/prompts/templates/express-subpackage/src/routes/resource/__tests__/resourceGet.route.spec.ts +0 -29
- package/prompts/templates/express-subpackage/src/routes/resource/resourceGet.route.ts +0 -22
- package/prompts/templates/express-subpackage/src/routes/resource.router.ts +0 -11
- package/prompts/templates/express-subpackage/src/types/express.ts +0 -9
- package/prompts/templates/project-monorepo/.vscode/settings.json +0 -72
- package/prompts/templates/project-monorepo/eslint.config.mjs +0 -1
- package/prompts/templates/project-monorepo/gitignore +0 -11
- package/prompts/templates/project-monorepo/package.json +0 -20
- package/prompts/templates/project-monorepo/tsconfig.base.json +0 -18
- package/prompts/templates/project-monorepo/tsconfig.json +0 -6
- package/prompts/templates/project-monorepo/vitest.workspace.js +0 -3
- package/prompts/templates/project-subpackage/package.json +0 -16
- package/prompts/templates/project-subpackage/tsconfig.json +0 -11
- package/prompts/templates/project-subpackage/vite.config.ts +0 -21
- package/prompts/templates/project-subpackage/vitest.config.ts +0 -7
- package/prompts/templates/project-subpackage/vitest.setup.ts +0 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/createMcpServer.ts","../src/mcpExpressHandler.ts","../src/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst PROMPTS_PATH = path.join(__dirname, \"..\", \"prompts\");\n\nexport interface CreateMcpServerOptions {\n version?: string;\n verbose?: boolean;\n}\n\n// Logger utility\nfunction createLogger(verbose: boolean) {\n return {\n info: (message: string, ...args: unknown[]) => {\n if (verbose) {\n console.error(`[jaypie-mcp] ${message}`, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[jaypie-mcp ERROR] ${message}`, ...args);\n },\n };\n}\n\ninterface FrontMatter {\n description?: string;\n include?: string;\n globs?: string;\n}\n\nasync function parseMarkdownFile(filePath: string): Promise<{\n filename: string;\n description?: string;\n include?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath);\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as FrontMatter;\n return {\n filename,\n description: frontMatter.description,\n include: frontMatter.include || frontMatter.globs,\n };\n }\n\n return { filename };\n } catch {\n return { filename: path.basename(filePath) };\n }\n}\n\nfunction formatPromptListItem(prompt: {\n filename: string;\n description?: string;\n include?: string;\n}): string {\n const { filename, description, include } = prompt;\n\n if (description && include) {\n return `* ${filename}: ${description} - Required for ${include}`;\n } else if (description) {\n return `* ${filename}: ${description}`;\n } else if (include) {\n return `* ${filename} - Required for ${include}`;\n } else {\n return `* ${filename}`;\n }\n}\n\n/**\n * Creates and configures an MCP server instance with Jaypie tools\n * @param options - Configuration options (or legacy version string)\n * @returns Configured MCP server instance\n */\nexport function createMcpServer(\n options: CreateMcpServerOptions | string = {},\n): McpServer {\n // Support legacy signature: createMcpServer(version: string)\n const config: CreateMcpServerOptions =\n typeof options === \"string\" ? { version: options } : options;\n\n const { version = \"0.0.0\", verbose = false } = config;\n\n const log = createLogger(verbose);\n\n log.info(\"Creating MCP server instance\");\n log.info(`Prompts directory: ${PROMPTS_PATH}`);\n\n const server = new McpServer(\n {\n name: \"jaypie\",\n version,\n },\n {\n capabilities: {},\n },\n );\n\n log.info(\"Registering tools...\");\n\n server.tool(\n \"list_prompts\",\n \"Returns a bulleted list of all .md files in the prompts directory with their descriptions and requirements\",\n {},\n async () => {\n log.info(\"Tool called: list_prompts\");\n log.info(`Reading directory: ${PROMPTS_PATH}`);\n\n try {\n const files = await fs.readdir(PROMPTS_PATH);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n log.info(`Found ${mdFiles.length} .md files`);\n\n const prompts = await Promise.all(\n mdFiles.map((file) =>\n parseMarkdownFile(path.join(PROMPTS_PATH, file)),\n ),\n );\n\n const formattedList = prompts.map(formatPromptListItem).join(\"\\n\");\n\n log.info(\"Successfully listed prompts\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n formattedList || \"No .md files found in the prompts directory.\",\n },\n ],\n };\n } catch (error) {\n log.error(\"Error listing prompts:\", error);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error listing prompts: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n },\n );\n\n log.info(\"Registered tool: list_prompts\");\n\n server.tool(\n \"read_prompt\",\n \"Returns the contents of a specified prompt file\",\n {\n filename: z\n .string()\n .describe(\n \"The name of the prompt file to read (e.g., example_prompt.md)\",\n ),\n },\n async ({ filename }) => {\n log.info(`Tool called: read_prompt (filename: ${filename})`);\n\n try {\n const filePath = path.join(PROMPTS_PATH, filename);\n\n log.info(`Reading file: ${filePath}`);\n\n const content = await fs.readFile(filePath, \"utf-8\");\n\n log.info(`Successfully read ${filename} (${content.length} bytes)`);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: content,\n },\n ],\n };\n } catch (error) {\n if ((error as { code?: string }).code === \"ENOENT\") {\n log.error(`File not found: ${filename}`);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: Prompt file \"${filename}\" not found in prompts directory`,\n },\n ],\n };\n }\n\n log.error(\"Error reading prompt file:\", error);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error reading prompt file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n },\n );\n\n log.info(\"Registered tool: read_prompt\");\n log.info(\"MCP server configuration complete\");\n\n return server;\n}\n","import { Request, Response } from \"express\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst DEFAULT_VERSION = \"0.0.0\";\n\n/**\n * Options for configuring the MCP Express handler\n */\nexport interface McpExpressHandlerOptions {\n /**\n * Version string for the MCP server\n */\n version?: string;\n /**\n * Whether to enable session management (stateful mode)\n * Default: true\n */\n enableSessions?: boolean;\n /**\n * Custom session ID generator function\n */\n sessionIdGenerator?: () => string;\n /**\n * Enable JSON responses instead of SSE streaming\n * Default: false\n */\n enableJsonResponse?: boolean;\n}\n\n/**\n * Creates an Express handler for the Jaypie MCP server using HTTP transport\n *\n * @param options - Configuration options for the handler\n * @returns Promise that resolves to an Express middleware function\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { mcpExpressHandler } from '@jaypie/mcp';\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Note: mcpExpressHandler is now async\n * app.use('/mcp', await mcpExpressHandler({\n * version: '1.0.0',\n * enableSessions: true\n * }));\n *\n * app.listen(3000, () => {\n * console.log('MCP server running on http://localhost:3000/mcp');\n * });\n * ```\n */\nexport async function mcpExpressHandler(\n options: McpExpressHandlerOptions = {},\n): Promise<(req: Request, res: Response) => Promise<void>> {\n const {\n version = DEFAULT_VERSION,\n enableSessions = true,\n sessionIdGenerator = () => randomUUID(),\n enableJsonResponse = false,\n } = options;\n\n const server = createMcpServer(version);\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: enableSessions ? sessionIdGenerator : undefined,\n enableJsonResponse,\n });\n\n await server.connect(transport);\n\n return async (req: Request, res: Response): Promise<void> => {\n try {\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n error: \"Internal server error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst version = \"0.0.0\";\n\n// Parse command-line arguments\nconst args = process.argv.slice(2);\nconst verbose = args.includes(\"--verbose\") || args.includes(\"-v\");\n\n// Logger for verbose mode (uses stderr to not interfere with JSON-RPC on stdout)\nconst log = {\n info: (message: string, ...args: unknown[]) => {\n if (verbose) {\n console.error(`[jaypie-mcp] ${message}`, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[jaypie-mcp ERROR] ${message}`, ...args);\n },\n};\n\nlet server: McpServer | null = null;\nlet isShuttingDown = false;\n\nasync function gracefulShutdown(exitCode = 0) {\n if (isShuttingDown) {\n return;\n }\n isShuttingDown = true;\n\n log.info(\"Shutting down gracefully...\");\n\n try {\n if (server) {\n await server.close();\n log.info(\"Server closed successfully\");\n }\n } catch (error) {\n log.error(\"Error during shutdown:\", error);\n } finally {\n process.exit(exitCode);\n }\n}\n\nasync function main() {\n log.info(\"Starting Jaypie MCP server...\");\n log.info(`Version: ${version}`);\n log.info(`Node version: ${process.version}`);\n log.info(`Verbose mode: ${verbose ? \"enabled\" : \"disabled\"}`);\n\n server = createMcpServer({ version, verbose });\n\n log.info(\"MCP server created successfully\");\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n log.info(\"Connected to stdio transport\");\n log.info(\"Server is ready to accept requests\");\n\n // Handle process termination signals\n process.on(\"SIGINT\", () => {\n log.info(\"Received SIGINT signal\");\n gracefulShutdown(0);\n });\n process.on(\"SIGTERM\", () => {\n log.info(\"Received SIGTERM signal\");\n gracefulShutdown(0);\n });\n\n // Handle stdio stream errors (but let transport handle normal stdin end/close)\n process.stdin.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\") || error.message?.includes(\"EOF\")) {\n log.info(\"stdin closed\");\n gracefulShutdown(0);\n }\n });\n\n process.stdout.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\")) {\n log.info(\"stdout pipe broken\");\n gracefulShutdown(0);\n }\n });\n\n // Server is running on stdio\n}\n\n// Only run main() if this module is executed directly (not imported)\n// This handles npx and symlinks in node_modules/.bin correctly\nif (process.argv[1]) {\n const realPath = realpathSync(process.argv[1]);\n const realPathAsUrl = pathToFileURL(realPath).href;\n if (import.meta.url === realPathAsUrl) {\n main().catch((error) => {\n log.error(\"Fatal error:\", error);\n process.exit(1);\n });\n }\n}\n\nexport { createMcpServer } from \"./createMcpServer.js\";\nexport type { CreateMcpServerOptions } from \"./createMcpServer.js\";\nexport {\n mcpExpressHandler,\n type McpExpressHandlerOptions,\n} from \"./mcpExpressHandler.js\";\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/datadog.ts","../src/createMcpServer.ts","../src/mcpExpressHandler.ts","../src/index.ts"],"sourcesContent":["/**\n * Datadog API integration module\n */\nimport * as https from \"node:https\";\n\nexport interface DatadogCredentials {\n apiKey: string;\n appKey: string;\n}\n\nexport interface DatadogSearchOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogAnalyticsOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n groupBy: string[];\n compute?: Array<{\n aggregation: \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\" | \"cardinality\";\n metric?: string;\n }>;\n}\n\n// Monitors types\nexport interface DatadogMonitorsOptions {\n tags?: string[];\n monitorTags?: string[];\n name?: string;\n status?: (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[];\n}\n\nexport interface DatadogMonitor {\n id: number;\n name: string;\n type: string;\n status: string;\n message?: string;\n tags: string[];\n priority?: number;\n query?: string;\n overallState?: string;\n}\n\nexport interface DatadogMonitorsResult {\n success: boolean;\n monitors: DatadogMonitor[];\n error?: string;\n}\n\n// Synthetics types\nexport interface DatadogSyntheticsOptions {\n tags?: string[];\n type?: \"api\" | \"browser\";\n}\n\nexport interface DatadogSyntheticTest {\n publicId: string;\n name: string;\n type: string;\n status: string;\n tags: string[];\n locations: string[];\n message?: string;\n}\n\nexport interface DatadogSyntheticResult {\n publicId: string;\n resultId: string;\n status: number;\n checkTime: number;\n passed: boolean;\n location?: string;\n}\n\nexport interface DatadogSyntheticsResult {\n success: boolean;\n tests: DatadogSyntheticTest[];\n error?: string;\n}\n\nexport interface DatadogSyntheticResultsResult {\n success: boolean;\n publicId: string;\n results: DatadogSyntheticResult[];\n error?: string;\n}\n\n// Metrics types\nexport interface DatadogMetricsOptions {\n query: string;\n from: number;\n to: number;\n}\n\nexport interface DatadogMetricSeries {\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: string;\n}\n\nexport interface DatadogMetricsResult {\n success: boolean;\n query: string;\n timeRange: { from: number; to: number };\n series: DatadogMetricSeries[];\n error?: string;\n}\n\n// RUM types\nexport interface DatadogRumOptions {\n query?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogRumEvent {\n id: string;\n type: string;\n timestamp?: string;\n sessionId?: string;\n viewUrl?: string;\n viewName?: string;\n errorMessage?: string;\n errorType?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogRumResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n events: DatadogRumEvent[];\n error?: string;\n}\n\nexport interface DatadogLogEntry {\n id: string;\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogSearchResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n logs: DatadogLogEntry[];\n error?: string;\n}\n\nexport interface DatadogAnalyticsBucket {\n by: Record<string, string>;\n computes: Record<string, number>;\n}\n\nexport interface DatadogAnalyticsResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n groupBy: string[];\n buckets: DatadogAnalyticsBucket[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nconst nullLogger: Logger = {\n info: () => {},\n error: () => {},\n};\n\n/**\n * Get Datadog credentials from environment variables\n */\nexport function getDatadogCredentials(): DatadogCredentials | null {\n const apiKey = process.env.DATADOG_API_KEY || process.env.DD_API_KEY;\n const appKey =\n process.env.DATADOG_APP_KEY ||\n process.env.DATADOG_APPLICATION_KEY ||\n process.env.DD_APP_KEY ||\n process.env.DD_APPLICATION_KEY;\n\n if (!apiKey || !appKey) {\n return null;\n }\n\n return { apiKey, appKey };\n}\n\n/**\n * Validate Datadog API credentials\n */\nexport async function validateDatadogCredentials(\n credentials: DatadogCredentials,\n): Promise<{ valid: boolean; error?: string }> {\n return new Promise((resolve) => {\n const options = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/validate\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n if (res.statusCode === 200) {\n resolve({ valid: true });\n } else {\n resolve({\n valid: false,\n error: `Datadog API returned status ${res.statusCode}: ${data}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n resolve({ valid: false, error: error.message });\n });\n\n req.end();\n });\n}\n\n/**\n * Build query string from environment variables and options\n */\nexport function buildDatadogQuery(options: DatadogSearchOptions): string {\n const ddEnv = process.env.DD_ENV;\n const ddService = process.env.DD_SERVICE;\n const ddSource = process.env.DD_SOURCE;\n const ddQuery = process.env.DD_QUERY;\n\n const queryParts: string[] = [];\n\n // Add source (parameter > env var > default 'lambda')\n const effectiveSource = options.source || ddSource || \"lambda\";\n queryParts.push(`source:${effectiveSource}`);\n\n // Add env (parameter > env var)\n const effectiveEnv = options.env || ddEnv;\n if (effectiveEnv) {\n queryParts.push(`env:${effectiveEnv}`);\n }\n\n // Add service (parameter > env var)\n const effectiveService = options.service || ddService;\n if (effectiveService) {\n queryParts.push(`service:${effectiveService}`);\n }\n\n // Add base query from DD_QUERY if available\n if (ddQuery) {\n queryParts.push(ddQuery);\n }\n\n // Add user-provided query terms\n if (options.query) {\n queryParts.push(options.query);\n }\n\n return queryParts.join(\" \");\n}\n\n/**\n * Search Datadog logs\n */\nexport async function searchDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogSearchOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSearchResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`Effective query: ${effectiveQuery}`);\n logger.info(\n `Search params: from=${effectiveFrom}, to=${effectiveTo}, limit=${effectiveLimit}, sort=${effectiveSort}`,\n );\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query syntax. Check your query: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n attributes?: {\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n };\n }>;\n };\n\n const logs = (response.data || []).map((log) => {\n const attrs = log.attributes || {};\n return {\n id: log.id,\n timestamp: attrs.timestamp,\n status: attrs.status,\n service: attrs.service,\n message: attrs.message,\n attributes: attrs.attributes,\n };\n });\n\n logger.info(`Retrieved ${logs.length} log entries`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * Aggregate Datadog logs using the Analytics API\n * Groups logs by specified fields and computes aggregations\n */\nexport async function aggregateDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogAnalyticsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogAnalyticsResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const groupBy = options.groupBy;\n const compute = options.compute || [{ aggregation: \"count\" as const }];\n\n logger.info(`Analytics query: ${effectiveQuery}`);\n logger.info(`Group by: ${groupBy.join(\", \")}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n // Build compute array - each item needs aggregation and type\n const computeItems = compute.map((c) => {\n const item: {\n aggregation: string;\n type: string;\n metric?: string;\n } = {\n aggregation: c.aggregation,\n type: \"total\",\n };\n if (c.metric) {\n item.metric = c.metric;\n }\n return item;\n });\n\n // Build group_by with proper sort configuration\n const groupByItems = groupBy.map((field) => {\n const item: {\n facet: string;\n limit: number;\n sort: {\n type: string;\n order: string;\n aggregation?: string;\n };\n } = {\n facet: field,\n limit: 100,\n sort: {\n type: \"measure\",\n order: \"desc\",\n aggregation: compute[0]?.aggregation || \"count\",\n },\n };\n return item;\n });\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n group_by: groupByItems,\n compute: computeItems,\n page: {\n limit: 100,\n },\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/analytics/aggregate\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Analytics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query or groupBy fields. Verify facet names exist: ${groupBy.join(\", \")}. Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: {\n buckets?: Array<{\n by?: Record<string, string>;\n computes?: Record<string, number>;\n }>;\n };\n };\n\n const buckets = (response.data?.buckets || []).map((bucket) => ({\n by: bucket.by || {},\n computes: bucket.computes || {},\n }));\n\n logger.info(`Retrieved ${buckets.length} aggregation buckets`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog analytics response:\",\n parseError,\n );\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * List Datadog monitors with optional filtering\n */\nexport async function listDatadogMonitors(\n credentials: DatadogCredentials,\n options: DatadogMonitorsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogMonitorsResult> {\n logger.info(\"Fetching Datadog monitors\");\n\n const queryParams = new URLSearchParams();\n\n if (options.tags && options.tags.length > 0) {\n queryParams.set(\"tags\", options.tags.join(\",\"));\n }\n if (options.monitorTags && options.monitorTags.length > 0) {\n queryParams.set(\"monitor_tags\", options.monitorTags.join(\",\"));\n }\n if (options.name) {\n queryParams.set(\"name\", options.name);\n }\n\n const queryString = queryParams.toString();\n const path = `/api/v1/monitor${queryString ? `?${queryString}` : \"\"}`;\n\n logger.info(`Request path: ${path}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Monitors API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have monitors_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n monitors: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as Array<{\n id: number;\n name: string;\n type: string;\n overall_state?: string;\n message?: string;\n tags?: string[];\n priority?: number;\n query?: string;\n }>;\n\n let monitors = response.map((monitor) => ({\n id: monitor.id,\n name: monitor.name,\n type: monitor.type,\n status: monitor.overall_state || \"Unknown\",\n message: monitor.message,\n tags: monitor.tags || [],\n priority: monitor.priority,\n query: monitor.query,\n overallState: monitor.overall_state,\n }));\n\n // Filter by status if specified\n if (options.status && options.status.length > 0) {\n monitors = monitors.filter((m) =>\n options.status!.includes(\n m.status as \"Alert\" | \"Warn\" | \"No Data\" | \"OK\",\n ),\n );\n }\n\n logger.info(`Retrieved ${monitors.length} monitors`);\n\n resolve({\n success: true,\n monitors,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog monitors response:\",\n parseError,\n );\n resolve({\n success: false,\n monitors: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n monitors: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * List Datadog Synthetic tests\n */\nexport async function listDatadogSynthetics(\n credentials: DatadogCredentials,\n options: DatadogSyntheticsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticsResult> {\n logger.info(\"Fetching Datadog Synthetic tests\");\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/synthetics/tests\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Synthetics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n tests: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n tests?: Array<{\n public_id: string;\n name: string;\n type: string;\n status: string;\n tags?: string[];\n locations?: string[];\n message?: string;\n }>;\n };\n\n let tests = (response.tests || []).map((test) => ({\n publicId: test.public_id,\n name: test.name,\n type: test.type,\n status: test.status,\n tags: test.tags || [],\n locations: test.locations || [],\n message: test.message,\n }));\n\n // Filter by type if specified\n if (options.type) {\n tests = tests.filter((t) => t.type === options.type);\n }\n\n // Filter by tags if specified\n if (options.tags && options.tags.length > 0) {\n tests = tests.filter((t) =>\n options.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n logger.info(`Retrieved ${tests.length} synthetic tests`);\n\n resolve({\n success: true,\n tests,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetics response:\",\n parseError,\n );\n resolve({\n success: false,\n tests: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n tests: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Get recent results for a specific Synthetic test\n */\nexport async function getDatadogSyntheticResults(\n credentials: DatadogCredentials,\n publicId: string,\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticResultsResult> {\n logger.info(`Fetching results for Synthetic test: ${publicId}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/synthetics/tests/${publicId}/results`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(\n `Datadog Synthetics Results API error: ${res.statusCode}`,\n );\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 404) {\n errorMessage = `Synthetic test '${publicId}' not found. Use datadog_synthetics (without testId) to list available tests.`;\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n publicId,\n results: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n results?: Array<{\n result_id: string;\n status: number;\n check_time: number;\n dc_id?: number;\n result?: {\n passed?: boolean;\n };\n }>;\n };\n\n const results = (response.results || []).map((result) => ({\n publicId,\n resultId: result.result_id,\n status: result.status,\n checkTime: result.check_time,\n passed: result.result?.passed ?? result.status === 0,\n location: result.dc_id?.toString(),\n }));\n\n logger.info(`Retrieved ${results.length} synthetic results`);\n\n resolve({\n success: true,\n publicId,\n results,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetic results:\",\n parseError,\n );\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Query Datadog metrics\n */\nexport async function queryDatadogMetrics(\n credentials: DatadogCredentials,\n options: DatadogMetricsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogMetricsResult> {\n logger.info(`Querying metrics: ${options.query}`);\n logger.info(`Time range: ${options.from} to ${options.to}`);\n\n const queryParams = new URLSearchParams({\n query: options.query,\n from: options.from.toString(),\n to: options.to.toString(),\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/query?${queryParams.toString()}`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Metrics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid metric query. Check format: 'aggregation:metric.name{tags}'. Query: \"${options.query}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have metrics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your time range.\";\n }\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n series?: Array<{\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: Array<{ name?: string }>;\n }>;\n };\n\n const series = (response.series || []).map((s) => ({\n metric: s.metric,\n scope: s.scope,\n pointlist: s.pointlist,\n unit: s.unit?.[0]?.name,\n }));\n\n logger.info(`Retrieved ${series.length} metric series`);\n\n resolve({\n success: true,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog metrics response:\", parseError);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Search Datadog RUM events\n */\nexport async function searchDatadogRum(\n credentials: DatadogCredentials,\n options: DatadogRumOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogRumResult> {\n const effectiveQuery = options.query || \"*\";\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`RUM query: ${effectiveQuery}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/rum/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog RUM API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n // Check for specific \"No valid indexes\" error which means no RUM app is configured\n if (data.includes(\"No valid indexes\")) {\n errorMessage =\n \"No RUM application found. Ensure you have a RUM application configured in Datadog and it has collected data. \" +\n \"You can create a RUM application at https://app.datadoghq.com/rum/list\";\n } else if (res.statusCode === 400) {\n errorMessage = `Invalid RUM query. Check syntax: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have rum_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n type: string;\n attributes?: {\n timestamp?: string;\n attributes?: {\n session?: { id?: string };\n view?: { url?: string; name?: string };\n error?: { message?: string; type?: string };\n [key: string]: unknown;\n };\n };\n }>;\n };\n\n const events = (response.data || []).map((event) => {\n const attrs = event.attributes?.attributes || {};\n return {\n id: event.id,\n type: event.type,\n timestamp: event.attributes?.timestamp,\n sessionId: attrs.session?.id,\n viewUrl: attrs.view?.url,\n viewName: attrs.view?.name,\n errorMessage: attrs.error?.message,\n errorType: attrs.error?.type,\n attributes: attrs,\n };\n });\n\n logger.info(`Retrieved ${events.length} RUM events`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog RUM response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\n\nimport {\n aggregateDatadogLogs,\n getDatadogCredentials,\n getDatadogSyntheticResults,\n listDatadogMonitors,\n listDatadogSynthetics,\n queryDatadogMetrics,\n searchDatadogLogs,\n searchDatadogRum,\n} from \"./datadog.js\";\n\n// Build-time constants injected by rollup\ndeclare const __BUILD_VERSION_STRING__: string;\nconst BUILD_VERSION_STRING =\n typeof __BUILD_VERSION_STRING__ !== \"undefined\"\n ? __BUILD_VERSION_STRING__\n : \"@jaypie/mcp@0.0.0\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst PROMPTS_PATH = path.join(__dirname, \"..\", \"prompts\");\n\nexport interface CreateMcpServerOptions {\n version?: string;\n verbose?: boolean;\n}\n\n// Logger utility\nfunction createLogger(verbose: boolean) {\n return {\n info: (message: string, ...args: unknown[]) => {\n if (verbose) {\n console.error(`[jaypie-mcp] ${message}`, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[jaypie-mcp ERROR] ${message}`, ...args);\n },\n };\n}\n\ninterface FrontMatter {\n description?: string;\n include?: string;\n globs?: string;\n}\n\nasync function parseMarkdownFile(filePath: string): Promise<{\n filename: string;\n description?: string;\n include?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath);\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as FrontMatter;\n return {\n filename,\n description: frontMatter.description,\n include: frontMatter.include || frontMatter.globs,\n };\n }\n\n return { filename };\n } catch {\n return { filename: path.basename(filePath) };\n }\n}\n\nfunction formatPromptListItem(prompt: {\n filename: string;\n description?: string;\n include?: string;\n}): string {\n const { filename, description, include } = prompt;\n\n if (description && include) {\n return `* ${filename}: ${description} - Required for ${include}`;\n } else if (description) {\n return `* ${filename}: ${description}`;\n } else if (include) {\n return `* ${filename} - Required for ${include}`;\n } else {\n return `* ${filename}`;\n }\n}\n\n/**\n * Creates and configures an MCP server instance with Jaypie tools\n * @param options - Configuration options (or legacy version string)\n * @returns Configured MCP server instance\n */\nexport function createMcpServer(\n options: CreateMcpServerOptions | string = {},\n): McpServer {\n // Support legacy signature: createMcpServer(version: string)\n const config: CreateMcpServerOptions =\n typeof options === \"string\" ? { version: options } : options;\n\n const { version = \"0.0.0\", verbose = false } = config;\n\n const log = createLogger(verbose);\n\n log.info(\"Creating MCP server instance\");\n log.info(`Prompts directory: ${PROMPTS_PATH}`);\n\n const server = new McpServer(\n {\n name: \"jaypie\",\n version,\n },\n {\n capabilities: {},\n },\n );\n\n log.info(\"Registering tools...\");\n\n server.tool(\n \"list_prompts\",\n \"List available Jaypie development prompts and guides. Use this FIRST when starting work on a Jaypie project to discover relevant documentation. Returns filenames, descriptions, and which file patterns each prompt applies to (e.g., 'Required for packages/express/**').\",\n {},\n async () => {\n log.info(\"Tool called: list_prompts\");\n log.info(`Reading directory: ${PROMPTS_PATH}`);\n\n try {\n const files = await fs.readdir(PROMPTS_PATH);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n log.info(`Found ${mdFiles.length} .md files`);\n\n const prompts = await Promise.all(\n mdFiles.map((file) =>\n parseMarkdownFile(path.join(PROMPTS_PATH, file)),\n ),\n );\n\n const formattedList = prompts.map(formatPromptListItem).join(\"\\n\");\n\n log.info(\"Successfully listed prompts\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n formattedList || \"No .md files found in the prompts directory.\",\n },\n ],\n };\n } catch (error) {\n log.error(\"Error listing prompts:\", error);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error listing prompts: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n },\n );\n\n log.info(\"Registered tool: list_prompts\");\n\n server.tool(\n \"read_prompt\",\n \"Read a Jaypie prompt/guide by filename. Call list_prompts first to see available prompts. These contain best practices, templates, code patterns, and step-by-step guides for Jaypie development tasks.\",\n {\n filename: z\n .string()\n .describe(\n \"The prompt filename from list_prompts (e.g., 'Jaypie_Express_Package.md', 'Development_Process.md')\",\n ),\n },\n async ({ filename }) => {\n log.info(`Tool called: read_prompt (filename: ${filename})`);\n\n try {\n const filePath = path.join(PROMPTS_PATH, filename);\n\n log.info(`Reading file: ${filePath}`);\n\n const content = await fs.readFile(filePath, \"utf-8\");\n\n log.info(`Successfully read ${filename} (${content.length} bytes)`);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: content,\n },\n ],\n };\n } catch (error) {\n if ((error as { code?: string }).code === \"ENOENT\") {\n log.error(`File not found: ${filename}`);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: Prompt file \"${filename}\" not found in prompts directory`,\n },\n ],\n };\n }\n\n log.error(\"Error reading prompt file:\", error);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error reading prompt file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n },\n );\n\n log.info(\"Registered tool: read_prompt\");\n\n server.tool(\n \"version\",\n `Prints the current version and hash, \\`${BUILD_VERSION_STRING}\\``,\n {},\n async () => {\n log.info(\"Tool called: version\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: BUILD_VERSION_STRING,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: version\");\n\n // Datadog Logs Tool\n server.tool(\n \"datadog_logs\",\n \"Search and retrieve individual Datadog log entries. Use this to view actual log messages and details. For aggregated counts/statistics (e.g., 'how many errors by service?'), use datadog_log_analytics instead. Requires DATADOG_API_KEY and DATADOG_APP_KEY environment variables.\",\n {\n query: z\n .string()\n .optional()\n .describe(\n \"Search query to filter logs. Examples: 'status:error', '@http.status_code:500', '*timeout*', '@requestId:abc123'. Combined with DD_ENV, DD_SERVICE, DD_SOURCE env vars if set.\",\n ),\n source: z\n .string()\n .optional()\n .describe(\n \"Override the log source (e.g., 'lambda', 'auth0', 'nginx'). If not provided, uses DD_SOURCE env var or defaults to 'lambda'.\",\n ),\n env: z\n .string()\n .optional()\n .describe(\n \"Override the environment (e.g., 'sandbox', 'kitchen', 'lab', 'studio', 'production'). If not provided, uses DD_ENV env var.\",\n ),\n service: z\n .string()\n .optional()\n .describe(\n \"Override the service name. If not provided, uses DD_SERVICE env var.\",\n ),\n from: z\n .string()\n .optional()\n .describe(\n \"Start time. Formats: relative ('now-15m', 'now-1h', 'now-1d'), ISO 8601 ('2024-01-15T10:00:00Z'). Defaults to 'now-15m'.\",\n ),\n to: z\n .string()\n .optional()\n .describe(\n \"End time. Formats: 'now', relative ('now-5m'), or ISO 8601. Defaults to 'now'.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Max logs to return (1-1000). Defaults to 50.\"),\n sort: z\n .enum([\"timestamp\", \"-timestamp\"])\n .optional()\n .describe(\n \"Sort order: 'timestamp' (oldest first) or '-timestamp' (newest first, default).\",\n ),\n },\n async ({ query, source, env, service, from, to, limit, sort }) => {\n log.info(\"Tool called: datadog_logs\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n const missingApiKey =\n !process.env.DATADOG_API_KEY && !process.env.DD_API_KEY;\n const missingAppKey =\n !process.env.DATADOG_APP_KEY &&\n !process.env.DATADOG_APPLICATION_KEY &&\n !process.env.DD_APP_KEY &&\n !process.env.DD_APPLICATION_KEY;\n\n if (missingApiKey) {\n log.error(\"No Datadog API key found in environment\");\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: No Datadog API key found. Please set DATADOG_API_KEY or DD_API_KEY environment variable.\",\n },\n ],\n };\n }\n if (missingAppKey) {\n log.error(\"No Datadog Application key found in environment\");\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: No Datadog Application key found. Please set DATADOG_APP_KEY or DD_APP_KEY environment variable. The Logs Search API requires both an API key and an Application key.\",\n },\n ],\n };\n }\n }\n\n // credentials is guaranteed to be non-null here\n const result = await searchDatadogLogs(\n credentials!,\n {\n query,\n source,\n env,\n service,\n from,\n to,\n limit,\n sort,\n },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.logs.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No logs found for query: ${result.query}\\nTime range: ${result.timeRange.from} to ${result.timeRange.to}`,\n },\n ],\n };\n }\n\n const resultText = [\n `Query: ${result.query}`,\n `Time range: ${result.timeRange.from} to ${result.timeRange.to}`,\n `Found ${result.logs.length} log entries:`,\n \"\",\n JSON.stringify(result.logs, null, 2),\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_logs\");\n\n // Datadog Log Analytics Tool\n server.tool(\n \"datadog_log_analytics\",\n \"Aggregate and analyze Datadog logs by grouping them by fields. Use this for statistics and counts (e.g., 'errors by service', 'requests by status code'). For viewing individual log entries, use datadog_logs instead.\",\n {\n groupBy: z\n .array(z.string())\n .describe(\n \"Fields to group by. Examples: ['source'], ['service', 'status'], ['@http.status_code']. Common facets: source, service, status, host, @http.status_code, @env.\",\n ),\n query: z\n .string()\n .optional()\n .describe(\n \"Filter query. Examples: 'status:error', '*timeout*', '@http.method:POST'. Use '*' for all logs.\",\n ),\n source: z\n .string()\n .optional()\n .describe(\n \"Override the log source filter. Use '*' to include all sources. If not provided, uses DD_SOURCE env var or defaults to 'lambda'.\",\n ),\n env: z\n .string()\n .optional()\n .describe(\n \"Override the environment filter. If not provided, uses DD_ENV env var.\",\n ),\n service: z\n .string()\n .optional()\n .describe(\n \"Override the service name filter. If not provided, uses DD_SERVICE env var.\",\n ),\n from: z\n .string()\n .optional()\n .describe(\n \"Start time. Formats: relative ('now-15m', 'now-1h', 'now-1d'), ISO 8601 ('2024-01-15T10:00:00Z'). Defaults to 'now-15m'.\",\n ),\n to: z\n .string()\n .optional()\n .describe(\n \"End time. Formats: 'now', relative ('now-5m'), or ISO 8601. Defaults to 'now'.\",\n ),\n aggregation: z\n .enum([\"count\", \"avg\", \"sum\", \"min\", \"max\", \"cardinality\"])\n .optional()\n .describe(\n \"Aggregation type. 'count' counts logs, others require a metric field. Defaults to 'count'.\",\n ),\n metric: z\n .string()\n .optional()\n .describe(\n \"Metric field to aggregate when using avg, sum, min, max, or cardinality. E.g., '@duration', '@http.response_time'.\",\n ),\n },\n async ({\n groupBy,\n query,\n source,\n env,\n service,\n from,\n to,\n aggregation,\n metric,\n }) => {\n log.info(\"Tool called: datadog_log_analytics\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n const missingApiKey =\n !process.env.DATADOG_API_KEY && !process.env.DD_API_KEY;\n const missingAppKey =\n !process.env.DATADOG_APP_KEY &&\n !process.env.DATADOG_APPLICATION_KEY &&\n !process.env.DD_APP_KEY &&\n !process.env.DD_APPLICATION_KEY;\n\n if (missingApiKey) {\n log.error(\"No Datadog API key found in environment\");\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: No Datadog API key found. Please set DATADOG_API_KEY or DD_API_KEY environment variable.\",\n },\n ],\n };\n }\n if (missingAppKey) {\n log.error(\"No Datadog Application key found in environment\");\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: No Datadog Application key found. Please set DATADOG_APP_KEY or DD_APP_KEY environment variable.\",\n },\n ],\n };\n }\n }\n\n const compute = aggregation\n ? [{ aggregation, metric }]\n : [{ aggregation: \"count\" as const }];\n\n const result = await aggregateDatadogLogs(\n credentials!,\n {\n query,\n source,\n env,\n service,\n from,\n to,\n groupBy,\n compute,\n },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog Analytics API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.buckets.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No data found for query: ${result.query}\\nTime range: ${result.timeRange.from} to ${result.timeRange.to}\\nGrouped by: ${result.groupBy.join(\", \")}`,\n },\n ],\n };\n }\n\n // Format buckets as a readable table\n const formattedBuckets = result.buckets.map((bucket) => {\n const byParts = Object.entries(bucket.by)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\", \");\n const computeParts = Object.entries(bucket.computes)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\", \");\n return ` ${byParts} => ${computeParts}`;\n });\n\n const resultText = [\n `Query: ${result.query}`,\n `Time range: ${result.timeRange.from} to ${result.timeRange.to}`,\n `Grouped by: ${result.groupBy.join(\", \")}`,\n `Found ${result.buckets.length} groups:`,\n \"\",\n ...formattedBuckets,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_log_analytics\");\n\n // Datadog Monitors Tool\n server.tool(\n \"datadog_monitors\",\n \"List and check Datadog monitors. Shows monitor status (Alert, Warn, No Data, OK), name, type, and tags. Useful for quickly checking if any monitors are alerting.\",\n {\n status: z\n .array(z.enum([\"Alert\", \"Warn\", \"No Data\", \"OK\"]))\n .optional()\n .describe(\n \"Filter monitors by status. E.g., ['Alert', 'Warn'] to see only alerting monitors.\",\n ),\n tags: z\n .array(z.string())\n .optional()\n .describe(\n \"Filter monitors by resource tags (tags on the monitored resources).\",\n ),\n monitorTags: z\n .array(z.string())\n .optional()\n .describe(\n \"Filter monitors by monitor tags (tags on the monitor itself).\",\n ),\n name: z\n .string()\n .optional()\n .describe(\"Filter monitors by name (partial match supported).\"),\n },\n async ({ status, tags, monitorTags, name }) => {\n log.info(\"Tool called: datadog_monitors\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: Datadog credentials not found. Please set DATADOG_API_KEY and DATADOG_APP_KEY environment variables.\",\n },\n ],\n };\n }\n\n const result = await listDatadogMonitors(\n credentials,\n { status, tags, monitorTags, name },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog Monitors API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.monitors.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No monitors found matching the specified criteria.\",\n },\n ],\n };\n }\n\n // Group monitors by status for better readability\n const byStatus: Record<string, typeof result.monitors> = {};\n for (const monitor of result.monitors) {\n const status = monitor.status;\n if (!byStatus[status]) {\n byStatus[status] = [];\n }\n byStatus[status].push(monitor);\n }\n\n const statusOrder = [\"Alert\", \"Warn\", \"No Data\", \"OK\", \"Unknown\"];\n const formattedMonitors: string[] = [];\n\n for (const status of statusOrder) {\n const monitors = byStatus[status];\n if (monitors && monitors.length > 0) {\n formattedMonitors.push(`\\n## ${status} (${monitors.length})`);\n for (const m of monitors) {\n formattedMonitors.push(` - [${m.id}] ${m.name} (${m.type})`);\n }\n }\n }\n\n const resultText = [\n `Found ${result.monitors.length} monitors:`,\n ...formattedMonitors,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_monitors\");\n\n // Datadog Synthetics Tool\n server.tool(\n \"datadog_synthetics\",\n \"List Datadog Synthetic tests and optionally get recent results for a specific test. Shows test status, type (api/browser), and locations.\",\n {\n type: z\n .enum([\"api\", \"browser\"])\n .optional()\n .describe(\"Filter tests by type: 'api' or 'browser'.\"),\n tags: z.array(z.string()).optional().describe(\"Filter tests by tags.\"),\n testId: z\n .string()\n .optional()\n .describe(\n \"If provided, fetches recent results for this specific test (public_id). Otherwise lists all tests.\",\n ),\n },\n async ({ type, tags, testId }) => {\n log.info(\"Tool called: datadog_synthetics\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: Datadog credentials not found. Please set DATADOG_API_KEY and DATADOG_APP_KEY environment variables.\",\n },\n ],\n };\n }\n\n // If testId is provided, get results for that specific test\n if (testId) {\n const result = await getDatadogSyntheticResults(\n credentials,\n testId,\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog Synthetics API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.results.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No recent results found for test: ${testId}`,\n },\n ],\n };\n }\n\n const passedCount = result.results.filter((r) => r.passed).length;\n const failedCount = result.results.length - passedCount;\n\n const formattedResults = result.results.slice(0, 10).map((r) => {\n const date = new Date(r.checkTime * 1000).toISOString();\n const status = r.passed ? \"✓ PASSED\" : \"✗ FAILED\";\n return ` ${date} - ${status}`;\n });\n\n const resultText = [\n `Results for test: ${testId}`,\n `Recent: ${passedCount} passed, ${failedCount} failed (showing last ${Math.min(10, result.results.length)})`,\n \"\",\n ...formattedResults,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n }\n\n // Otherwise list all tests\n const result = await listDatadogSynthetics(\n credentials,\n { type, tags },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog Synthetics API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.tests.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No synthetic tests found matching the specified criteria.\",\n },\n ],\n };\n }\n\n // Group by status\n const byStatus: Record<string, typeof result.tests> = {};\n for (const test of result.tests) {\n const status = test.status;\n if (!byStatus[status]) {\n byStatus[status] = [];\n }\n byStatus[status].push(test);\n }\n\n const formattedTests: string[] = [];\n for (const [status, tests] of Object.entries(byStatus)) {\n formattedTests.push(`\\n## ${status} (${tests.length})`);\n for (const t of tests) {\n formattedTests.push(` - [${t.publicId}] ${t.name} (${t.type})`);\n }\n }\n\n const resultText = [\n `Found ${result.tests.length} synthetic tests:`,\n ...formattedTests,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_synthetics\");\n\n // Datadog Metrics Tool\n server.tool(\n \"datadog_metrics\",\n \"Query Datadog metrics. Returns timeseries data for the specified metric query. Useful for checking specific metric values.\",\n {\n query: z\n .string()\n .describe(\n \"Metric query. Format: 'aggregation:metric.name{tags}'. Examples: 'avg:system.cpu.user{*}', 'sum:aws.lambda.invocations{function:my-func}.as_count()', 'max:aws.lambda.duration{env:production}'.\",\n ),\n from: z\n .string()\n .optional()\n .describe(\n \"Start time. Formats: relative ('1h', '30m', '1d'), or Unix timestamp. Defaults to '1h'.\",\n ),\n to: z\n .string()\n .optional()\n .describe(\n \"End time. Formats: 'now' or Unix timestamp. Defaults to 'now'.\",\n ),\n },\n async ({ query, from, to }) => {\n log.info(\"Tool called: datadog_metrics\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: Datadog credentials not found. Please set DATADOG_API_KEY and DATADOG_APP_KEY environment variables.\",\n },\n ],\n };\n }\n\n // Parse time parameters\n const now = Math.floor(Date.now() / 1000);\n let fromTs: number;\n let toTs: number;\n\n // Parse 'from' parameter\n const fromStr = from || \"1h\";\n if (fromStr.match(/^\\d+$/)) {\n fromTs = parseInt(fromStr, 10);\n } else if (fromStr.match(/^(\\d+)h$/)) {\n const hours = parseInt(fromStr.match(/^(\\d+)h$/)![1], 10);\n fromTs = now - hours * 3600;\n } else if (fromStr.match(/^(\\d+)m$/)) {\n const minutes = parseInt(fromStr.match(/^(\\d+)m$/)![1], 10);\n fromTs = now - minutes * 60;\n } else if (fromStr.match(/^(\\d+)d$/)) {\n const days = parseInt(fromStr.match(/^(\\d+)d$/)![1], 10);\n fromTs = now - days * 86400;\n } else {\n fromTs = now - 3600; // Default 1 hour\n }\n\n // Parse 'to' parameter\n const toStr = to || \"now\";\n if (toStr === \"now\") {\n toTs = now;\n } else if (toStr.match(/^\\d+$/)) {\n toTs = parseInt(toStr, 10);\n } else {\n toTs = now;\n }\n\n const result = await queryDatadogMetrics(\n credentials,\n { query, from: fromTs, to: toTs },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog Metrics API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.series.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No data found for query: ${query}\\nTime range: ${new Date(fromTs * 1000).toISOString()} to ${new Date(toTs * 1000).toISOString()}`,\n },\n ],\n };\n }\n\n const formattedSeries = result.series.map((s) => {\n const points = s.pointlist.slice(-5); // Last 5 points\n const formattedPoints = points\n .map(([ts, val]) => {\n const date = new Date(ts).toISOString();\n return ` ${date}: ${val !== null ? val.toFixed(4) : \"null\"}`;\n })\n .join(\"\\n\");\n return `\\n ${s.metric} (${s.scope})${s.unit ? ` [${s.unit}]` : \"\"}:\\n${formattedPoints}`;\n });\n\n const resultText = [\n `Query: ${query}`,\n `Time range: ${new Date(fromTs * 1000).toISOString()} to ${new Date(toTs * 1000).toISOString()}`,\n `Found ${result.series.length} series (showing last 5 points each):`,\n ...formattedSeries,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_metrics\");\n\n // Datadog RUM Tool\n server.tool(\n \"datadog_rum\",\n \"Search Datadog RUM (Real User Monitoring) events. Find user sessions, page views, errors, and actions. Useful for debugging frontend issues and understanding user behavior.\",\n {\n query: z\n .string()\n .optional()\n .describe(\n \"RUM search query. E.g., '@type:error', '@session.id:abc123', '@view.url:*checkout*'. Defaults to '*' (all events).\",\n ),\n from: z\n .string()\n .optional()\n .describe(\n \"Start time. Formats: relative ('now-15m', 'now-1h', 'now-1d'), ISO 8601 ('2024-01-15T10:00:00Z'). Defaults to 'now-15m'.\",\n ),\n to: z\n .string()\n .optional()\n .describe(\n \"End time. Formats: 'now', relative ('now-5m'), or ISO 8601. Defaults to 'now'.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Max events to return (1-1000). Defaults to 50.\"),\n },\n async ({ query, from, to, limit }) => {\n log.info(\"Tool called: datadog_rum\");\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: Datadog credentials not found. Please set DATADOG_API_KEY and DATADOG_APP_KEY environment variables.\",\n },\n ],\n };\n }\n\n const result = await searchDatadogRum(\n credentials,\n { query, from, to, limit },\n log,\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error from Datadog RUM API: ${result.error}`,\n },\n ],\n };\n }\n\n if (result.events.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No RUM events found for query: ${result.query}\\nTime range: ${result.timeRange.from} to ${result.timeRange.to}`,\n },\n ],\n };\n }\n\n // Group events by type for better readability\n const byType: Record<string, typeof result.events> = {};\n for (const event of result.events) {\n const type = event.type;\n if (!byType[type]) {\n byType[type] = [];\n }\n byType[type].push(event);\n }\n\n const formattedEvents: string[] = [];\n for (const [type, events] of Object.entries(byType)) {\n formattedEvents.push(`\\n## ${type} (${events.length})`);\n for (const e of events.slice(0, 10)) {\n // Limit per type\n const parts = [e.timestamp];\n if (e.viewName || e.viewUrl) {\n parts.push(e.viewName || e.viewUrl || \"\");\n }\n if (e.errorMessage) {\n parts.push(`Error: ${e.errorMessage}`);\n }\n if (e.sessionId) {\n parts.push(`Session: ${e.sessionId.substring(0, 8)}...`);\n }\n formattedEvents.push(` - ${parts.join(\" | \")}`);\n }\n }\n\n const resultText = [\n `Query: ${result.query}`,\n `Time range: ${result.timeRange.from} to ${result.timeRange.to}`,\n `Found ${result.events.length} RUM events:`,\n ...formattedEvents,\n ].join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: resultText,\n },\n ],\n };\n },\n );\n\n log.info(\"Registered tool: datadog_rum\");\n\n log.info(\"MCP server configuration complete\");\n\n return server;\n}\n","import { Request, Response } from \"express\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst DEFAULT_VERSION = \"0.0.0\";\n\n/**\n * Options for configuring the MCP Express handler\n */\nexport interface McpExpressHandlerOptions {\n /**\n * Version string for the MCP server\n */\n version?: string;\n /**\n * Whether to enable session management (stateful mode)\n * Default: true\n */\n enableSessions?: boolean;\n /**\n * Custom session ID generator function\n */\n sessionIdGenerator?: () => string;\n /**\n * Enable JSON responses instead of SSE streaming\n * Default: false\n */\n enableJsonResponse?: boolean;\n}\n\n/**\n * Creates an Express handler for the Jaypie MCP server using HTTP transport\n *\n * @param options - Configuration options for the handler\n * @returns Promise that resolves to an Express middleware function\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { mcpExpressHandler } from '@jaypie/mcp';\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Note: mcpExpressHandler is now async\n * app.use('/mcp', await mcpExpressHandler({\n * version: '1.0.0',\n * enableSessions: true\n * }));\n *\n * app.listen(3000, () => {\n * console.log('MCP server running on http://localhost:3000/mcp');\n * });\n * ```\n */\nexport async function mcpExpressHandler(\n options: McpExpressHandlerOptions = {},\n): Promise<(req: Request, res: Response) => Promise<void>> {\n const {\n version = DEFAULT_VERSION,\n enableSessions = true,\n sessionIdGenerator = () => randomUUID(),\n enableJsonResponse = false,\n } = options;\n\n const server = createMcpServer(version);\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: enableSessions ? sessionIdGenerator : undefined,\n enableJsonResponse,\n });\n\n await server.connect(transport);\n\n return async (req: Request, res: Response): Promise<void> => {\n try {\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n error: \"Internal server error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst version = \"0.0.0\";\n\n// Parse command-line arguments\nconst args = process.argv.slice(2);\nconst verbose = args.includes(\"--verbose\") || args.includes(\"-v\");\n\n// Logger for verbose mode (uses stderr to not interfere with JSON-RPC on stdout)\nconst log = {\n info: (message: string, ...args: unknown[]) => {\n if (verbose) {\n console.error(`[jaypie-mcp] ${message}`, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[jaypie-mcp ERROR] ${message}`, ...args);\n },\n};\n\nlet server: McpServer | null = null;\nlet isShuttingDown = false;\n\nasync function gracefulShutdown(exitCode = 0) {\n if (isShuttingDown) {\n return;\n }\n isShuttingDown = true;\n\n log.info(\"Shutting down gracefully...\");\n\n try {\n if (server) {\n await server.close();\n log.info(\"Server closed successfully\");\n }\n } catch (error) {\n log.error(\"Error during shutdown:\", error);\n } finally {\n process.exit(exitCode);\n }\n}\n\nasync function main() {\n log.info(\"Starting Jaypie MCP server...\");\n log.info(`Version: ${version}`);\n log.info(`Node version: ${process.version}`);\n log.info(`Verbose mode: ${verbose ? \"enabled\" : \"disabled\"}`);\n\n server = createMcpServer({ version, verbose });\n\n log.info(\"MCP server created successfully\");\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n log.info(\"Connected to stdio transport\");\n log.info(\"Server is ready to accept requests\");\n\n // Handle process termination signals\n process.on(\"SIGINT\", () => {\n log.info(\"Received SIGINT signal\");\n gracefulShutdown(0);\n });\n process.on(\"SIGTERM\", () => {\n log.info(\"Received SIGTERM signal\");\n gracefulShutdown(0);\n });\n\n // Handle stdio stream errors (but let transport handle normal stdin end/close)\n process.stdin.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\") || error.message?.includes(\"EOF\")) {\n log.info(\"stdin closed\");\n gracefulShutdown(0);\n }\n });\n\n process.stdout.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\")) {\n log.info(\"stdout pipe broken\");\n gracefulShutdown(0);\n }\n });\n\n // Server is running on stdio\n}\n\n// Only run main() if this module is executed directly (not imported)\n// This handles npx and symlinks in node_modules/.bin correctly\nif (process.argv[1]) {\n const realPath = realpathSync(process.argv[1]);\n const realPathAsUrl = pathToFileURL(realPath).href;\n if (import.meta.url === realPathAsUrl) {\n main().catch((error) => {\n log.error(\"Fatal error:\", error);\n process.exit(1);\n });\n }\n}\n\nexport { createMcpServer } from \"./createMcpServer.js\";\nexport type { CreateMcpServerOptions } from \"./createMcpServer.js\";\nexport {\n mcpExpressHandler,\n type McpExpressHandlerOptions,\n} from \"./mcpExpressHandler.js\";\n"],"names":["__filename","__dirname"],"mappings":";;;;;;;;;;;;;AAAA;;AAEG;AAwLH,MAAM,UAAU,GAAW;AACzB,IAAA,IAAI,EAAE,MAAK,EAAE,CAAC;AACd,IAAA,KAAK,EAAE,MAAK,EAAE,CAAC;CAChB;AAED;;AAEG;SACa,qBAAqB,GAAA;AACnC,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU;AACpE,IAAA,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,UAAU;AACtB,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB;AAEhC,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;AACtB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AAC3B;AA+CA;;AAEG;AACG,SAAU,iBAAiB,CAAC,OAA6B,EAAA;AAC7D,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM;AAChC,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU;AACxC,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS;AACtC,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ;IAEpC,MAAM,UAAU,GAAa,EAAE;;IAG/B,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ;AAC9D,IAAA,UAAU,CAAC,IAAI,CAAC,UAAU,eAAe,CAAA,CAAE,CAAC;;AAG5C,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,KAAK;IACzC,IAAI,YAAY,EAAE;AAChB,QAAA,UAAU,CAAC,IAAI,CAAC,OAAO,YAAY,CAAA,CAAE,CAAC;IACxC;;AAGA,IAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS;IACrD,IAAI,gBAAgB,EAAE;AACpB,QAAA,UAAU,CAAC,IAAI,CAAC,WAAW,gBAAgB,CAAA,CAAE,CAAC;IAChD;;IAGA,IAAI,OAAO,EAAE;AACX,QAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1B;;AAGA,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7B;AAEA;;AAEG;AACI,eAAe,iBAAiB,CACrC,WAA+B,EAC/B,OAAA,GAAgC,EAAE,EAClC,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC;AACjD,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS;AAC/C,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK;AACvC,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC;AAC1D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY;AAElD,IAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,CAAA,CAAE,CAAC;AACjD,IAAA,MAAM,CAAC,IAAI,CACT,CAAA,oBAAA,EAAuB,aAAa,CAAA,KAAA,EAAQ,WAAW,CAAA,QAAA,EAAW,cAAc,CAAA,OAAA,EAAU,aAAa,CAAA,CAAE,CAC1G;AAED,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;AACjC,QAAA,MAAM,EAAE;AACN,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,KAAK,EAAE,cAAc;AACtB,SAAA;AACD,QAAA,IAAI,EAAE,aAAa;AACpB,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,4BAA4B;AAClC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACxC,gBAAA,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBACpD,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;AAC1B,wBAAA,YAAY,GAAG,CAAA,yCAAA,EAA4C,cAAc,CAAA,kBAAA,EAAqB,IAAI,EAAE;oBACtG;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,gFAAgF;oBACpF;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,mFAAmF;oBACvF;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAW/B;AAED,oBAAA,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,KAAI;AAC7C,wBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;wBAClC,OAAO;4BACL,EAAE,EAAE,GAAG,CAAC,EAAE;4BACV,SAAS,EAAE,KAAK,CAAC,SAAS;4BAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,UAAU,EAAE,KAAK,CAAC,UAAU;yBAC7B;AACH,oBAAA,CAAC,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,MAAM,CAAA,YAAA,CAAc,CAAC;AAEnD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;AACb,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;wBACnD,IAAI;AACL,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,UAAU,CAAC;AAC7D,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACtB,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;;AAGG;AACI,eAAe,oBAAoB,CACxC,WAA+B,EAC/B,OAAgC,EAChC,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC;AACjD,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS;AAC/C,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK;AACvC,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;AAC/B,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,OAAgB,EAAE,CAAC;AAEtE,IAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,CAAA,CAAE,CAAC;AACjD,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,aAAa,CAAA,IAAA,EAAO,WAAW,CAAA,CAAE,CAAC;;IAG7D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACrC,QAAA,MAAM,IAAI,GAIN;YACF,WAAW,EAAE,CAAC,CAAC,WAAW;AAC1B,YAAA,IAAI,EAAE,OAAO;SACd;AACD,QAAA,IAAI,CAAC,CAAC,MAAM,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QACxB;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;;IAGF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACzC,QAAA,MAAM,IAAI,GAQN;AACF,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,OAAO;AAChD,aAAA;SACF;AACD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;AACjC,QAAA,MAAM,EAAE;AACN,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACD,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,OAAO,EAAE,YAAY;AACrB,QAAA,IAAI,EAAE;AACJ,YAAA,KAAK,EAAE,GAAG;AACX,SAAA;AACF,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,kCAAkC;AACxC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACxC,gBAAA,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBAC9D,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBAC1B,YAAY,GAAG,CAAA,2DAAA,EAA8D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE;oBAC3H;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,gFAAgF;oBACpF;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,mFAAmF;oBACvF;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;wBACnD,OAAO;AACP,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAO/B;AAED,oBAAA,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,MAAM;AAC9D,wBAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;AACnB,wBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;AAChC,qBAAA,CAAC,CAAC;oBAEH,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,OAAO,CAAC,MAAM,CAAA,oBAAA,CAAsB,CAAC;AAE9D,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;AACb,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;wBACnD,OAAO;wBACP,OAAO;AACR,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CACV,6CAA6C,EAC7C,UAAU,CACX;AACD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;wBACnD,OAAO;AACP,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;gBACnD,OAAO;AACP,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACtB,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,mBAAmB,CACvC,WAA+B,EAC/B,OAAA,GAAkC,EAAE,EACpC,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;AAExC,IAAA,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE;AAEzC,IAAA,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,QAAA,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD;AACA,IAAA,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACzD,QAAA,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE;AACA,IAAA,IAAI,OAAO,CAAC,IAAI,EAAE;QAChB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;IACvC;AAEA,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE;AAC1C,IAAA,MAAM,IAAI,GAAG,CAAA,eAAA,EAAkB,WAAW,GAAG,CAAA,CAAA,EAAI,WAAW,EAAE,GAAG,EAAE,EAAE;AAErE,IAAA,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAA,CAAE,CAAC;AAEpC,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;YACT,IAAI;AACJ,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE;gBACP,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACzC,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBAC7D,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBAC1B,YAAY;AACV,4BAAA,oFAAoF;oBACxF;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,uDAAuD;oBAC3D;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,EAAE;AACZ,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAS9B;oBAEF,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;wBACxC,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,wBAAA,MAAM,EAAE,OAAO,CAAC,aAAa,IAAI,SAAS;wBAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,wBAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;wBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,YAAY,EAAE,OAAO,CAAC,aAAa;AACpC,qBAAA,CAAC,CAAC;;AAGH,oBAAA,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC/C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAC3B,OAAO,CAAC,MAAO,CAAC,QAAQ,CACtB,CAAC,CAAC,MAA6C,CAChD,CACF;oBACH;oBAEA,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,QAAQ,CAAC,MAAM,CAAA,SAAA,CAAW,CAAC;AAEpD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;wBACb,QAAQ;AACT,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CACV,4CAA4C,EAC5C,UAAU,CACX;AACD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,EAAE;AACZ,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,qBAAqB,CACzC,WAA+B,EAC/B,OAAA,GAAoC,EAAE,EACtC,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC;AAE/C,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,0BAA0B;AAChC,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE;gBACP,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACzC,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBAC/D,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBAC1B,YAAY;AACV,4BAAA,sFAAsF;oBAC1F;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,uDAAuD;oBAC3D;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,EAAE;AACT,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAU/B;AAED,oBAAA,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM;wBAChD,QAAQ,EAAE,IAAI,CAAC,SAAS;wBACxB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACrB,wBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,qBAAA,CAAC,CAAC;;AAGH,oBAAA,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;oBACtD;;AAGA,oBAAA,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAClD;oBACH;oBAEA,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,KAAK,CAAC,MAAM,CAAA,gBAAA,CAAkB,CAAC;AAExD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;wBACb,KAAK;AACN,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CACV,8CAA8C,EAC9C,UAAU,CACX;AACD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,EAAE;AACT,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,EAAE;AACT,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,0BAA0B,CAC9C,WAA+B,EAC/B,QAAgB,EAChB,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,CAAC,IAAI,CAAC,wCAAwC,QAAQ,CAAA,CAAE,CAAC;AAE/D,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,CAAA,yBAAA,EAA4B,QAAQ,CAAA,QAAA,CAAU;AACpD,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE;gBACP,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACzC,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CACV,CAAA,sCAAA,EAAyC,GAAG,CAAC,UAAU,CAAA,CAAE,CAC1D;oBACD,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBAC1B,YAAY;AACV,4BAAA,sFAAsF;oBAC1F;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;AACjC,wBAAA,YAAY,GAAG,CAAA,gBAAA,EAAmB,QAAQ,CAAA,6EAAA,CAA+E;oBAC3H;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,uDAAuD;oBAC3D;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;wBACd,QAAQ;AACR,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAU/B;AAED,oBAAA,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,MAAM;wBACxD,QAAQ;wBACR,QAAQ,EAAE,MAAM,CAAC,SAAS;wBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,SAAS,EAAE,MAAM,CAAC,UAAU;wBAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AACpD,wBAAA,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE;AACnC,qBAAA,CAAC,CAAC;oBAEH,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,OAAO,CAAC,MAAM,CAAA,kBAAA,CAAoB,CAAC;AAE5D,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;wBACb,QAAQ;wBACR,OAAO;AACR,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CACV,4CAA4C,EAC5C,UAAU,CACX;AACD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;wBACd,QAAQ;AACR,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;gBACd,QAAQ;AACR,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,mBAAmB,CACvC,WAA+B,EAC/B,OAA8B,EAC9B,MAAA,GAAiB,UAAU,EAAA;IAE3B,MAAM,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,OAAO,CAAC,KAAK,CAAA,CAAE,CAAC;AACjD,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,OAAO,CAAC,IAAI,CAAA,IAAA,EAAO,OAAO,CAAC,EAAE,CAAA,CAAE,CAAC;AAE3D,IAAA,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,QAAA,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE;AAC1B,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,CAAA,cAAA,EAAiB,WAAW,CAAC,QAAQ,EAAE,CAAA,CAAE;AAC/C,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE;gBACP,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACzC,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBAC5D,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAC3E,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBAC1B,YAAY,GAAG,gFAAgF,OAAO,CAAC,KAAK,CAAA,kBAAA,EAAqB,IAAI,EAAE;oBACzI;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,mFAAmF;oBACvF;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,kFAAkF;oBACtF;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,wBAAA,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;AACjD,wBAAA,MAAM,EAAE,EAAE;AACV,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAO/B;AAED,oBAAA,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;wBACjD,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI;AACxB,qBAAA,CAAC,CAAC;oBAEH,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,MAAM,CAAC,MAAM,CAAA,cAAA,CAAgB,CAAC;AAEvD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,wBAAA,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;wBACjD,MAAM;AACP,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,UAAU,CAAC;AACrE,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,wBAAA,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;AACjD,wBAAA,MAAM,EAAE,EAAE;AACV,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,gBAAA,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;AACjD,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,gBAAgB,CACpC,WAA+B,EAC/B,OAAA,GAA6B,EAAE,EAC/B,MAAA,GAAiB,UAAU,EAAA;AAE3B,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG;AAC3C,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS;AAC/C,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK;AACvC,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC;AAC1D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY;AAElD,IAAA,MAAM,CAAC,IAAI,CAAC,cAAc,cAAc,CAAA,CAAE,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,aAAa,CAAA,IAAA,EAAO,WAAW,CAAA,CAAE,CAAC;AAE7D,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;AACjC,QAAA,MAAM,EAAE;AACN,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,KAAK,EAAE,cAAc;AACtB,SAAA;AACD,QAAA,IAAI,EAAE,aAAa;AACpB,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,2BAA2B;AACjC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,WAAW,CAAC,MAAM;gBAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM;AACxC,gBAAA,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,aAAA;SACF;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,KAAI;YAChD,IAAI,IAAI,GAAG,EAAE;YAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,KAAI;AAC/B,gBAAA,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;gBACjB,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;AAEjD,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAA,uBAAA,EAA0B,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;oBACxD,IAAI,YAAY,GAAG,CAAA,4BAAA,EAA+B,GAAG,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;;AAE3E,oBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;wBACrC,YAAY;4BACV,+GAA+G;AAC/G,gCAAA,wEAAwE;oBAC5E;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;AACjC,wBAAA,YAAY,GAAG,CAAA,kCAAA,EAAqC,cAAc,CAAA,kBAAA,EAAqB,IAAI,EAAE;oBAC/F;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,+EAA+E;oBACnF;AAAO,yBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE;wBACjC,YAAY;AACV,4BAAA,mFAAmF;oBACvF;AACA,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,wBAAA,MAAM,EAAE,EAAE;AACV,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAc/B;AAED,oBAAA,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,KAAI;wBACjD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE;wBAChD,OAAO;4BACL,EAAE,EAAE,KAAK,CAAC,EAAE;4BACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,4BAAA,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS;AACtC,4BAAA,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE;AAC5B,4BAAA,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG;AACxB,4BAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI;AAC1B,4BAAA,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO;AAClC,4BAAA,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;AAC5B,4BAAA,UAAU,EAAE,KAAK;yBAClB;AACH,oBAAA,CAAC,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,MAAM,CAAC,MAAM,CAAA,WAAA,CAAa,CAAC;AAEpD,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,IAAI;AACb,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;wBACnD,MAAM;AACP,qBAAA,CAAC;gBACJ;gBAAE,OAAO,UAAU,EAAE;AACnB,oBAAA,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,UAAU,CAAC;AACjE,oBAAA,OAAO,CAAC;AACN,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,wBAAA,MAAM,EAAE,EAAE;AACV,wBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AACzG,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,CAAC;AACN,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE;AACnD,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,KAAK,EAAE,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAA,CAAE;AAC5C,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACtB,GAAG,CAAC,GAAG,EAAE;AACX,IAAA,CAAC,CAAC;AACJ;;AC9rCA,MAAM,oBAAoB,GAEpB;IACmB;AAEzB,MAAMA,YAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACjD,MAAMC,WAAS,GAAG,IAAI,CAAC,OAAO,CAACD,YAAU,CAAC;AAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAACC,WAAS,EAAE,IAAI,EAAE,SAAS,CAAC;AAO1D;AACA,SAAS,YAAY,CAAC,OAAgB,EAAA;IACpC,OAAO;AACL,QAAA,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,KAAI;YAC5C,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,KAAK,CAAC,CAAA,aAAA,EAAgB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;YACnD;QACF,CAAC;AACD,QAAA,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,KAAI;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;QACzD,CAAC;KACF;AACH;AAQA,eAAe,iBAAiB,CAAC,QAAgB,EAAA;AAK/C,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AAC9B,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAmB;YAC9C,OAAO;gBACL,QAAQ;gBACR,WAAW,EAAE,WAAW,CAAC,WAAW;AACpC,gBAAA,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,KAAK;aAClD;QACH;QAEA,OAAO,EAAE,QAAQ,EAAE;IACrB;AAAE,IAAA,MAAM;QACN,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC9C;AACF;AAEA,SAAS,oBAAoB,CAAC,MAI7B,EAAA;IACC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM;AAEjD,IAAA,IAAI,WAAW,IAAI,OAAO,EAAE;AAC1B,QAAA,OAAO,KAAK,QAAQ,CAAA,EAAA,EAAK,WAAW,CAAA,gBAAA,EAAmB,OAAO,EAAE;IAClE;SAAO,IAAI,WAAW,EAAE;AACtB,QAAA,OAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,WAAW,EAAE;IACxC;SAAO,IAAI,OAAO,EAAE;AAClB,QAAA,OAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,gBAAA,EAAmB,OAAO,EAAE;IAClD;SAAO;QACL,OAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE;IACxB;AACF;AAEA;;;;AAIG;AACG,SAAU,eAAe,CAC7B,OAAA,GAA2C,EAAE,EAAA;;AAG7C,IAAA,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,QAAQ,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO;IAE9D,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,MAAM;AAErD,IAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC;AAEjC,IAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC;AACxC,IAAA,GAAG,CAAC,IAAI,CAAC,sBAAsB,YAAY,CAAA,CAAE,CAAC;AAE9C,IAAA,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;AACE,QAAA,IAAI,EAAE,QAAQ;QACd,OAAO;KACR,EACD;AACE,QAAA,YAAY,EAAE,EAAE;AACjB,KAAA,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;IAEhC,MAAM,CAAC,IAAI,CACT,cAAc,EACd,6QAA6Q,EAC7Q,EAAE,EACF,YAAW;AACT,QAAA,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC;AACrC,QAAA,GAAG,CAAC,IAAI,CAAC,sBAAsB,YAAY,CAAA,CAAE,CAAC;AAE9C,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;AAC5C,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE5D,GAAG,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,OAAO,CAAC,MAAM,CAAA,UAAA,CAAY,CAAC;AAE7C,YAAA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KACf,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CACjD,CACF;AAED,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAElE,YAAA,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC;YAEvC,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;wBACrB,IAAI,EACF,aAAa,IAAI,8CAA8C;AAClE,qBAAA;AACF,iBAAA;aACF;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;YAE1C,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,uBAAA,EAA0B,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AAC3F,qBAAA;AACF,iBAAA;aACF;QACH;AACF,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC;AAEzC,IAAA,MAAM,CAAC,IAAI,CACT,aAAa,EACb,yMAAyM,EACzM;AACE,QAAA,QAAQ,EAAE;AACP,aAAA,MAAM;aACN,QAAQ,CACP,qGAAqG,CACtG;AACJ,KAAA,EACD,OAAO,EAAE,QAAQ,EAAE,KAAI;AACrB,QAAA,GAAG,CAAC,IAAI,CAAC,uCAAuC,QAAQ,CAAA,CAAA,CAAG,CAAC;AAE5D,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;AAElD,YAAA,GAAG,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAA,CAAE,CAAC;YAErC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;YAEpD,GAAG,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAC,MAAM,CAAA,OAAA,CAAS,CAAC;YAEnE,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,OAAO;AACd,qBAAA;AACF,iBAAA;aACF;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAK,KAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE;AAClD,gBAAA,GAAG,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAA,CAAE,CAAC;gBAExC,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,CAAA,oBAAA,EAAuB,QAAQ,CAAA,gCAAA,CAAkC;AACxE,yBAAA;AACF,qBAAA;iBACF;YACH;AAEA,YAAA,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;YAE9C,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,2BAAA,EAA8B,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAA,CAAE;AAC/F,qBAAA;AACF,iBAAA;aACF;QACH;AACF,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAExC,IAAA,MAAM,CAAC,IAAI,CACT,SAAS,EACT,CAAA,uCAAA,EAA0C,oBAAoB,CAAA,EAAA,CAAI,EAClE,EAAE,EACF,YAAW;AACT,QAAA,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAEhC,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,oBAAoB;AAC3B,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC;;AAGpC,IAAA,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sRAAsR,EACtR;AACE,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,gLAAgL,CACjL;AACH,QAAA,MAAM,EAAE;AACL,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,8HAA8H,CAC/H;AACH,QAAA,GAAG,EAAE;AACF,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,6HAA6H,CAC9H;AACH,QAAA,OAAO,EAAE;AACN,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,sEAAsE,CACvE;AACH,QAAA,IAAI,EAAE;AACH,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,0HAA0H,CAC3H;AACH,QAAA,EAAE,EAAE;AACD,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,gFAAgF,CACjF;AACH,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CAAC,8CAA8C,CAAC;AAC3D,QAAA,IAAI,EAAE;AACH,aAAA,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC;AAChC,aAAA,QAAQ;aACR,QAAQ,CACP,iFAAiF,CAClF;KACJ,EACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;AAC/D,QAAA,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC;AAErC,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;AACzD,YAAA,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe;AAC5B,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB;AACpC,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;AACvB,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAEjC,IAAI,aAAa,EAAE;AACjB,gBAAA,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC;gBACpD,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;AACrB,4BAAA,IAAI,EAAE,iGAAiG;AACxG,yBAAA;AACF,qBAAA;iBACF;YACH;YACA,IAAI,aAAa,EAAE;AACjB,gBAAA,GAAG,CAAC,KAAK,CAAC,iDAAiD,CAAC;gBAC5D,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;AACrB,4BAAA,IAAI,EAAE,8KAA8K;AACrL,yBAAA;AACF,qBAAA;iBACF;YACH;QACF;;AAGA,QAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,WAAY,EACZ;YACE,KAAK;YACL,MAAM;YACN,GAAG;YACH,OAAO;YACP,IAAI;YACJ,EAAE;YACF,KAAK;YACL,IAAI;SACL,EACD,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,wBAAA,EAA2B,MAAM,CAAC,KAAK,CAAA,CAAE;AAChD,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,yBAAA,EAA4B,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,CAAE;AACjH,qBAAA;AACF,iBAAA;aACF;QACH;AAEA,QAAA,MAAM,UAAU,GAAG;YACjB,CAAA,OAAA,EAAU,MAAM,CAAC,KAAK,CAAA,CAAE;YACxB,CAAA,YAAA,EAAe,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,CAAE;AAChE,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAA,aAAA,CAAe;YAC1C,EAAE;YACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACrC,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC;;AAGzC,IAAA,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,yNAAyN,EACzN;AACE,QAAA,OAAO,EAAE;AACN,aAAA,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;aAChB,QAAQ,CACP,gKAAgK,CACjK;AACH,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,iGAAiG,CAClG;AACH,QAAA,MAAM,EAAE;AACL,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,kIAAkI,CACnI;AACH,QAAA,GAAG,EAAE;AACF,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,wEAAwE,CACzE;AACH,QAAA,OAAO,EAAE;AACN,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,6EAA6E,CAC9E;AACH,QAAA,IAAI,EAAE;AACH,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,0HAA0H,CAC3H;AACH,QAAA,EAAE,EAAE;AACD,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,gFAAgF,CACjF;AACH,QAAA,WAAW,EAAE;AACV,aAAA,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC;AACzD,aAAA,QAAQ;aACR,QAAQ,CACP,4FAA4F,CAC7F;AACH,QAAA,MAAM,EAAE;AACL,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,oHAAoH,CACrH;KACJ,EACD,OAAO,EACL,OAAO,EACP,KAAK,EACL,MAAM,EACN,GAAG,EACH,OAAO,EACP,IAAI,EACJ,EAAE,EACF,WAAW,EACX,MAAM,GACP,KAAI;AACH,QAAA,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC;AAE9C,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;AACzD,YAAA,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe;AAC5B,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB;AACpC,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;AACvB,gBAAA,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAEjC,IAAI,aAAa,EAAE;AACjB,gBAAA,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC;gBACpD,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;AACrB,4BAAA,IAAI,EAAE,iGAAiG;AACxG,yBAAA;AACF,qBAAA;iBACF;YACH;YACA,IAAI,aAAa,EAAE;AACjB,gBAAA,GAAG,CAAC,KAAK,CAAC,iDAAiD,CAAC;gBAC5D,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;AACrB,4BAAA,IAAI,EAAE,yGAAyG;AAChH,yBAAA;AACF,qBAAA;iBACF;YACH;QACF;QAEA,MAAM,OAAO,GAAG;AACd,cAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE;cACxB,CAAC,EAAE,WAAW,EAAE,OAAgB,EAAE,CAAC;AAEvC,QAAA,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,WAAY,EACZ;YACE,KAAK;YACL,MAAM;YACN,GAAG;YACH,OAAO;YACP,IAAI;YACJ,EAAE;YACF,OAAO;YACP,OAAO;SACR,EACD,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,kCAAA,EAAqC,MAAM,CAAC,KAAK,CAAA,CAAE;AAC1D,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,CAAA,yBAAA,EAA4B,MAAM,CAAC,KAAK,CAAA,cAAA,EAAiB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,cAAA,EAAiB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AAC3J,qBAAA;AACF,iBAAA;aACF;QACH;;QAGA,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;YACrD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACrC,iBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,EAAE;iBACxC,IAAI,CAAC,IAAI,CAAC;YACb,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;AAChD,iBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,EAAE;iBACxC,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,IAAA,EAAO,YAAY,EAAE;AAC1C,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,UAAU,GAAG;YACjB,CAAA,OAAA,EAAU,MAAM,CAAC,KAAK,CAAA,CAAE;YACxB,CAAA,YAAA,EAAe,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,CAAE;YAChE,CAAA,YAAA,EAAe,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AAC1C,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,OAAO,CAAC,MAAM,CAAA,QAAA,CAAU;YACxC,EAAE;AACF,YAAA,GAAG,gBAAgB;AACpB,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC;;AAGlD,IAAA,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mKAAmK,EACnK;AACE,QAAA,MAAM,EAAE;AACL,aAAA,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAChD,aAAA,QAAQ;aACR,QAAQ,CACP,mFAAmF,CACpF;AACH,QAAA,IAAI,EAAE;AACH,aAAA,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;AAChB,aAAA,QAAQ;aACR,QAAQ,CACP,qEAAqE,CACtE;AACH,QAAA,WAAW,EAAE;AACV,aAAA,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;AAChB,aAAA,QAAQ;aACR,QAAQ,CACP,+DAA+D,CAChE;AACH,QAAA,IAAI,EAAE;AACH,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CAAC,oDAAoD,CAAC;AAClE,KAAA,EACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAI;AAC5C,QAAA,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC;AAEzC,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,6GAA6G;AACpH,qBAAA;AACF,iBAAA;aACF;QACH;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,WAAW,EACX,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EACnC,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,iCAAA,EAAoC,MAAM,CAAC,KAAK,CAAA,CAAE;AACzD,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,oDAAoD;AAC3D,qBAAA;AACF,iBAAA;aACF;QACH;;QAGA,MAAM,QAAQ,GAA2C,EAAE;AAC3D,QAAA,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE;AACrC,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACrB,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE;YACvB;YACA,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC;AAEA,QAAA,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;QACjE,MAAM,iBAAiB,GAAa,EAAE;AAEtC,QAAA,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE;AAChC,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YACjC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,iBAAiB,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AAC7D,gBAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;AACxB,oBAAA,iBAAiB,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAC,EAAE,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;gBAC/D;YACF;QACF;AAEA,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA,UAAA,CAAY;AAC3C,YAAA,GAAG,iBAAiB;AACrB,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC;;AAG7C,IAAA,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,2IAA2I,EAC3I;AACE,QAAA,IAAI,EAAE;AACH,aAAA,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC;AACvB,aAAA,QAAQ;aACR,QAAQ,CAAC,2CAA2C,CAAC;AACxD,QAAA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACtE,QAAA,MAAM,EAAE;AACL,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,oGAAoG,CACrG;KACJ,EACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAI;AAC/B,QAAA,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC;AAE3C,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,6GAA6G;AACpH,qBAAA;AACF,iBAAA;aACF;QACH;;QAGA,IAAI,MAAM,EAAE;YACV,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,WAAW,EACX,MAAM,EACN,GAAG,CACJ;AAED,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACnB,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;AACrB,4BAAA,IAAI,EAAE,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAA,CAAE;AAC3D,yBAAA;AACF,qBAAA;iBACF;YACH;YAEA,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC/B,OAAO;AACL,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAE;AACpD,yBAAA;AACF,qBAAA;iBACF;YACH;AAEA,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;YACjE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW;AAEvD,YAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC7D,gBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;AACvD,gBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,UAAU,GAAG,UAAU;AACjD,gBAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,EAAM,MAAM,EAAE;AAChC,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,UAAU,GAAG;AACjB,gBAAA,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE;AAC7B,gBAAA,CAAA,QAAA,EAAW,WAAW,CAAA,SAAA,EAAY,WAAW,CAAA,sBAAA,EAAyB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG;gBAC5G,EAAE;AACF,gBAAA,GAAG,gBAAgB;AACpB,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;YAEZ,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,UAAU;AACjB,qBAAA;AACF,iBAAA;aACF;QACH;;AAGA,QAAA,MAAM,MAAM,GAAG,MAAM,qBAAqB,CACxC,WAAW,EACX,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAA,CAAE;AAC3D,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,2DAA2D;AAClE,qBAAA;AACF,iBAAA;aACF;QACH;;QAGA,MAAM,QAAQ,GAAwC,EAAE;AACxD,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;AAC/B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACrB,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE;YACvB;YACA,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B;QAEA,MAAM,cAAc,GAAa,EAAE;AACnC,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACtD,cAAc,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AACvD,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,gBAAA,cAAc,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAC,QAAQ,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;YAClE;QACF;AAEA,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA,iBAAA,CAAmB;AAC/C,YAAA,GAAG,cAAc;AAClB,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC;;AAG/C,IAAA,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4HAA4H,EAC5H;AACE,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;aACN,QAAQ,CACP,kMAAkM,CACnM;AACH,QAAA,IAAI,EAAE;AACH,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,yFAAyF,CAC1F;AACH,QAAA,EAAE,EAAE;AACD,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,gEAAgE,CACjE;KACJ,EACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAI;AAC5B,QAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAExC,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,6GAA6G;AACpH,qBAAA;AACF,iBAAA;aACF;QACH;;AAGA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,QAAA,IAAI,MAAc;AAClB,QAAA,IAAI,IAAY;;AAGhB,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,IAAI;AAC5B,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;AAC1B,YAAA,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAChC;AAAO,aAAA,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACpC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACzD,YAAA,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI;QAC7B;AAAO,aAAA,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACpC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3D,YAAA,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,EAAE;QAC7B;AAAO,aAAA,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxD,YAAA,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK;QAC7B;aAAO;AACL,YAAA,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;QACtB;;AAGA,QAAA,MAAM,KAAK,GAAG,EAAE,IAAI,KAAK;AACzB,QAAA,IAAI,KAAK,KAAK,KAAK,EAAE;YACnB,IAAI,GAAG,GAAG;QACZ;AAAO,aAAA,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;AAC/B,YAAA,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B;aAAO;YACL,IAAI,GAAG,GAAG;QACZ;QAEA,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,WAAW,EACX,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EACjC,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,gCAAA,EAAmC,MAAM,CAAC,KAAK,CAAA,CAAE;AACxD,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,CAAA,yBAAA,EAA4B,KAAK,CAAA,cAAA,EAAiB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA,IAAA,EAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA,CAAE;AAC1I,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC9C,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,eAAe,GAAG;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,KAAI;gBACjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;gBACvC,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;AACjE,YAAA,CAAC;iBACA,IAAI,CAAC,IAAI,CAAC;YACb,OAAO,CAAA,IAAA,EAAO,CAAC,CAAC,MAAM,CAAA,EAAA,EAAK,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE,CAAA,GAAA,EAAM,eAAe,CAAA,CAAE;AAC3F,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE;YACjB,CAAA,YAAA,EAAe,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA,CAAE;AAChG,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA,qCAAA,CAAuC;AACpE,YAAA,GAAG,eAAe;AACnB,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC;;AAG5C,IAAA,MAAM,CAAC,IAAI,CACT,aAAa,EACb,8KAA8K,EAC9K;AACE,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,oHAAoH,CACrH;AACH,QAAA,IAAI,EAAE;AACH,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,0HAA0H,CAC3H;AACH,QAAA,EAAE,EAAE;AACD,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CACP,gFAAgF,CACjF;AACH,QAAA,KAAK,EAAE;AACJ,aAAA,MAAM;AACN,aAAA,QAAQ;aACR,QAAQ,CAAC,gDAAgD,CAAC;AAC9D,KAAA,EACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAI;AACnC,QAAA,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC;AAEpC,QAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;QAC3C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,6GAA6G;AACpH,qBAAA;AACF,iBAAA;aACF;QACH;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,WAAW,EACX,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAC1B,GAAG,CACJ;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,4BAAA,EAA+B,MAAM,CAAC,KAAK,CAAA,CAAE;AACpD,qBAAA;AACF,iBAAA;aACF;QACH;QAEA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,CAAA,+BAAA,EAAkC,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,CAAE;AACvH,qBAAA;AACF,iBAAA;aACF;QACH;;QAGA,MAAM,MAAM,GAAyC,EAAE;AACvD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AACjB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACnB;YACA,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B;QAEA,MAAM,eAAe,GAAa,EAAE;AACpC,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACnD,eAAe,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,MAAM,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AACvD,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;;AAEnC,gBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3B,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE;AAC3B,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC3C;AACA,gBAAA,IAAI,CAAC,CAAC,YAAY,EAAE;oBAClB,KAAK,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,CAAC,CAAC,YAAY,CAAA,CAAE,CAAC;gBACxC;AACA,gBAAA,IAAI,CAAC,CAAC,SAAS,EAAE;AACf,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,GAAA,CAAK,CAAC;gBAC1D;AACA,gBAAA,eAAe,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC;YAClD;QACF;AAEA,QAAA,MAAM,UAAU,GAAG;YACjB,CAAA,OAAA,EAAU,MAAM,CAAC,KAAK,CAAA,CAAE;YACxB,CAAA,YAAA,EAAe,MAAM,CAAC,SAAS,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA,CAAE;AAChE,YAAA,CAAA,MAAA,EAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA,YAAA,CAAc;AAC3C,YAAA,GAAG,eAAe;AACnB,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEZ,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;AACrB,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AAED,IAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAExC,IAAA,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC;AAE7C,IAAA,OAAO,MAAM;AACf;;AC1kCA;AACA,MAAM,eAAe,GAAG,OAAO;AA0B/B;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACI,eAAe,iBAAiB,CACrC,UAAoC,EAAE,EAAA;IAEtC,MAAM,EACJ,OAAO,GAAG,eAAe,EACzB,cAAc,GAAG,IAAI,EACrB,kBAAkB,GAAG,MAAM,UAAU,EAAE,EACvC,kBAAkB,GAAG,KAAK,GAC3B,GAAG,OAAO;AAEX,IAAA,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;AAEvC,IAAA,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,cAAc,GAAG,kBAAkB,GAAG,SAAS;QACnE,kBAAkB;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAE/B,IAAA,OAAO,OAAO,GAAY,EAAE,GAAa,KAAmB;AAC1D,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;QACnD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;AACpB,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACnB,oBAAA,KAAK,EAAE,uBAAuB;AAC9B,oBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;AAClE,iBAAA,CAAC;YACJ;QACF;AACF,IAAA,CAAC;AACH;;ACjFA;AACA,MAAM,OAAO,GAAG,OAAO;AAEvB;AACA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEjE;AACA,MAAM,GAAG,GAAG;AACV,IAAA,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,KAAI;QAC5C,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,CAAA,aAAA,EAAgB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;QACnD;IACF,CAAC;AACD,IAAA,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,KAAI;QAC7C,OAAO,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACzD,CAAC;CACF;AAED,IAAI,MAAM,GAAqB,IAAI;AACnC,IAAI,cAAc,GAAG,KAAK;AAE1B,eAAe,gBAAgB,CAAC,QAAQ,GAAG,CAAC,EAAA;IAC1C,IAAI,cAAc,EAAE;QAClB;IACF;IACA,cAAc,GAAG,IAAI;AAErB,IAAA,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC;AAEvC,IAAA,IAAI;QACF,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,MAAM,CAAC,KAAK,EAAE;AACpB,YAAA,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC;QACxC;IACF;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;IAC5C;YAAU;AACR,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxB;AACF;AAEA,eAAe,IAAI,GAAA;AACjB,IAAA,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC;AACzC,IAAA,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAA,CAAE,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,OAAO,CAAC,OAAO,CAAA,CAAE,CAAC;AAC5C,IAAA,GAAG,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,OAAO,GAAG,SAAS,GAAG,UAAU,CAAA,CAAE,CAAC;IAE7D,MAAM,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAE9C,IAAA,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC;AAE3C,IAAA,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE;AAC5C,IAAA,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAE/B,IAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC;AACxC,IAAA,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC;;AAG9C,IAAA,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAK;AACxB,QAAA,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAClC,gBAAgB,CAAC,CAAC,CAAC;AACrB,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAK;AACzB,QAAA,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACnC,gBAAgB,CAAC,CAAC,CAAC;AACrB,IAAA,CAAC,CAAC;;IAGF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AAClC,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;AACtE,YAAA,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;YACxB,gBAAgB,CAAC,CAAC,CAAC;QACrB;AACF,IAAA,CAAC,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;QACnC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;AACpC,YAAA,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC;YAC9B,gBAAgB,CAAC,CAAC,CAAC;QACrB;AACF,IAAA,CAAC,CAAC;;AAGJ;AAEA;AACA;AACA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI;IAClD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,EAAE;AACrC,QAAA,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACrB,YAAA,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC;AAChC,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,QAAA,CAAC,CAAC;IACJ;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jaypie/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Jaypie MCP",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"type": "module",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"main": "dist/index.js",
|
|
@@ -37,14 +37,17 @@
|
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
38
38
|
"commander": "^14.0.0",
|
|
39
39
|
"gray-matter": "^4.0.3",
|
|
40
|
-
"zod": "^
|
|
40
|
+
"zod": "^4.1.13"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
+
"@rollup/plugin-replace": "^6.0.3",
|
|
44
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
43
45
|
"@types/express": "^5.0.3",
|
|
44
|
-
"express": "^5.1.0"
|
|
46
|
+
"express": "^5.1.0",
|
|
47
|
+
"rollup": "^4.53.3",
|
|
48
|
+
"typescript": "^5.9.3"
|
|
45
49
|
},
|
|
46
50
|
"publishConfig": {
|
|
47
51
|
"access": "public"
|
|
48
|
-
}
|
|
49
|
-
"gitHead": "65cd25e8b34237ab6ae4d494a3e429d20352b43e"
|
|
52
|
+
}
|
|
50
53
|
}
|
|
@@ -6,62 +6,84 @@ description: Development workflow, required reading for coding tasks (always rea
|
|
|
6
6
|
|
|
7
7
|
## Baseline Conditions
|
|
8
8
|
|
|
9
|
-
Check package.json scripts for build, format, lint, test, and typecheck
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
Check package.json scripts for available commands: build, format, lint, test, and typecheck.
|
|
10
|
+
Run each available script to establish baseline state.
|
|
11
|
+
Document all errors and warnings from the baseline run.
|
|
12
|
+
Do not fix baseline errors or warnings.
|
|
13
|
+
Use this baseline to identify new issues introduced by development work.
|
|
12
14
|
|
|
13
15
|
## Development
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Follow conventional commits.
|
|
17
|
+
Implement the requested feature or fix.
|
|
18
|
+
Write tests to validate the work whenever possible.
|
|
19
|
+
Run tests to verify functionality (do not run lint or typecheck yet).
|
|
20
|
+
When development is complete, commit changes using conventional commit format.
|
|
21
|
+
Conventional commit format: `type: scope: description` (examples: `feat: api: add user endpoint`, `fix: auth: handle expired tokens`, `chore: config: update dependencies`).
|
|
21
22
|
|
|
22
23
|
## Validation
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
Check package.json for available scripts before running validation steps.
|
|
25
26
|
Skip any step that does not have a corresponding npm script.
|
|
26
|
-
If
|
|
27
|
-
Include any build, lint, test, and type warnings to disregard.
|
|
28
|
-
Skip any step that cannot be passed.
|
|
29
|
-
Commit after each step to
|
|
27
|
+
If a npm script produces errors or warnings, note them for context in subsequent steps.
|
|
28
|
+
Include any pre-existing build, lint, test, and type warnings in instructions to disregard when fixing new issues.
|
|
29
|
+
Skip any step that cannot be passed due to pre-existing failures.
|
|
30
|
+
Commit after each successful validation step to create restore points.
|
|
30
31
|
|
|
31
32
|
### Scrub
|
|
32
33
|
|
|
33
|
-
Follow prompts/Jaypie_Scrub.md.
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
Follow code style rules in packages/mcp/prompts/Jaypie_Scrub.md.
|
|
35
|
+
Repository-specific style guides (CLAUDE.md, .cursorrules) override Jaypie_Scrub.md when they conflict.
|
|
36
|
+
Applying scrub rules can prevent errors in subsequent validation steps, especially testing.
|
|
37
|
+
If no errors are found, no commit is needed for this step.
|
|
36
38
|
|
|
37
39
|
### Test
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
Run `npm run test` to execute the test suite.
|
|
42
|
+
Compare results to baseline: only fix failures introduced by your changes.
|
|
43
|
+
Determine root cause of each new failure:
|
|
44
|
+
- Unchanged test failing: implementation likely broke existing functionality
|
|
45
|
+
- Test covering intentionally modified behavior: test needs updating
|
|
46
|
+
- New test failing: fix the test or implementation as appropriate
|
|
47
|
+
Fix identified issues and re-run tests until only baseline failures remain.
|
|
48
|
+
Commit fixes with message describing what was corrected.
|
|
45
49
|
|
|
46
50
|
### Type Check
|
|
47
51
|
|
|
48
|
-
Run `npm run typecheck
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
Run `npm run typecheck` (runs typecheck across all workspace packages).
|
|
53
|
+
Note: Some packages output `[TODO] Convert @jaypie/package to TypeScript` - this is expected and should be ignored.
|
|
54
|
+
Compare results to baseline: only fix type errors introduced by your changes.
|
|
55
|
+
Fix new type errors and re-run typecheck until only baseline errors remain.
|
|
56
|
+
Commit fixes with message describing type corrections.
|
|
51
57
|
|
|
52
|
-
### Format and
|
|
58
|
+
### Format and Lint
|
|
53
59
|
|
|
54
|
-
Run
|
|
55
|
-
Check status to see if format updated any files.
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
Run `npm run format` (runs package.json sorting and auto-fixes linting issues).
|
|
61
|
+
Check git status to see if format updated any files.
|
|
62
|
+
If files were modified by format, review changes and commit them.
|
|
63
|
+
Run `npm run lint` to check for remaining lint errors.
|
|
64
|
+
Fix any new lint errors introduced by your changes (compare to baseline).
|
|
65
|
+
Commit lint fixes with appropriate message.
|
|
58
66
|
|
|
59
67
|
### Build
|
|
60
68
|
|
|
61
|
-
Run `npm run build
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
Run `npm run build` (uses Lerna to build all packages in dependency order).
|
|
70
|
+
Compare results to baseline: only fix build errors introduced by your changes.
|
|
71
|
+
Fix new build errors and re-run build until only baseline errors remain.
|
|
72
|
+
Commit build fixes with appropriate message.
|
|
73
|
+
Verify dist/ directories were created/updated for modified packages.
|
|
64
74
|
|
|
65
75
|
## Documentation
|
|
66
76
|
|
|
67
|
-
|
|
77
|
+
Check if README.md updates are needed:
|
|
78
|
+
- Public API changes (function signatures, exports, parameters)
|
|
79
|
+
- New features that users need to know about
|
|
80
|
+
- Breaking changes to existing functionality
|
|
81
|
+
- Changes to installation or setup procedures
|
|
82
|
+
|
|
83
|
+
Do NOT update README.md for:
|
|
84
|
+
- Internal refactoring
|
|
85
|
+
- Test updates
|
|
86
|
+
- Bug fixes that don't change behavior
|
|
87
|
+
- Dependency updates
|
|
88
|
+
|
|
89
|
+
If updates are needed, modify README.md to reflect changes and commit with message `docs: update README`.
|