{"version":3,"file":"diff-B1c8BBVB.cjs","sources":["../src/commands/validate.ts","../src/commands/generate-types.ts","../src/commands/test-examples.ts","../src/commands/diff.ts"],"sourcesContent":["/**\n * Validate command - validates component registry against JSON Schema\n */\n\nimport { readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport Ajv from 'ajv'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { ComponentRegistrySchema, type ComponentRegistry } from '@seed-ship/mcp-ui-spec'\n\n// Load JSON Schema from @seed-ship/mcp-ui-spec package\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\ninterface ValidateOptions {\n  strict?: boolean\n  verbose?: boolean\n}\n\nexport async function validateCommand(file: string, options: ValidateOptions) {\n  const spinner = ora('Loading registry...').start()\n\n  try {\n    // Read registry file\n    const registryPath = resolve(process.cwd(), file)\n    const registryContent = readFileSync(registryPath, 'utf-8')\n    const registry = JSON.parse(registryContent)\n\n    spinner.text = 'Validating with Zod schema...'\n\n    // First validate with Zod (runtime validation)\n    const zodResult = ComponentRegistrySchema.safeParse(registry)\n\n    if (!zodResult.success) {\n      spinner.fail('Zod validation failed')\n      console.error(chalk.red('\\nValidation Errors:'))\n      zodResult.error.errors.forEach((err) => {\n        console.error(chalk.red(`  • ${err.path.join('.')}: ${err.message}`))\n      })\n      process.exit(1)\n    }\n\n    spinner.text = 'Validating with JSON Schema...'\n\n    // Load JSON Schema for secondary validation\n    const schemaPath = join(\n      __dirname,\n      '../../node_modules/@seed-ship/mcp-ui-spec/schemas/component-registry-v1.json'\n    )\n    let jsonSchemaContent: string\n\n    try {\n      jsonSchemaContent = readFileSync(schemaPath, 'utf-8')\n    } catch {\n      // Fallback to local schema if node_modules path fails\n      const localSchemaPath = join(\n        __dirname,\n        '../../../mcp-ui-spec/schemas/component-registry-v1.json'\n      )\n      jsonSchemaContent = readFileSync(localSchemaPath, 'utf-8')\n    }\n\n    const jsonSchema = JSON.parse(jsonSchemaContent)\n\n    // Validate with JSON Schema using Ajv\n    const ajv = new Ajv({\n      allErrors: options.strict,\n      verbose: options.verbose,\n      strict: options.strict,\n    })\n\n    const validate = ajv.compile(jsonSchema)\n    const jsonValid = validate(registry)\n\n    if (!jsonValid && validate.errors) {\n      spinner.fail('JSON Schema validation failed')\n      console.error(chalk.red('\\nValidation Errors:'))\n      validate.errors.forEach((err) => {\n        const path = err.instancePath || 'root'\n        console.error(chalk.red(`  • ${path}: ${err.message}`))\n        if (options.verbose && err.params) {\n          console.error(chalk.gray(`    Params: ${JSON.stringify(err.params)}`))\n        }\n      })\n      process.exit(1)\n    }\n\n    spinner.succeed(chalk.green('Registry is valid!'))\n\n    // Summary\n    if (options.verbose) {\n      console.log(chalk.gray('\\nRegistry Summary:'))\n      console.log(chalk.gray(`  Version: ${registry.version}`))\n      console.log(chalk.gray(`  Components: ${registry.components.length}`))\n\n      if (registry.metadata?.name) {\n        console.log(chalk.gray(`  Name: ${registry.metadata.name}`))\n      }\n\n      console.log(chalk.gray('\\nComponents:'))\n      const validRegistry = registry as ComponentRegistry\n      validRegistry.components.forEach((comp) => {\n        console.log(chalk.gray(`  • ${comp.id} (${comp.type}): ${comp.examples.length} example(s)`))\n      })\n    }\n\n    process.exit(0)\n  } catch (error) {\n    spinner.fail('Validation failed')\n\n    if (error instanceof Error) {\n      if (error.message.includes('ENOENT')) {\n        console.error(chalk.red(`\\nFile not found: ${file}`))\n      } else if (error instanceof SyntaxError) {\n        console.error(chalk.red('\\nInvalid JSON syntax'))\n        console.error(chalk.gray(error.message))\n      } else {\n        console.error(chalk.red('\\nUnexpected error:'))\n        console.error(chalk.gray(error.message))\n      }\n    }\n\n    process.exit(1)\n  }\n}\n","/**\n * Generate Types command - generates TypeScript types from registry\n */\n\nimport { readFileSync, writeFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { compile } from 'json-schema-to-typescript'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { Component, ComponentRegistry } from '@seed-ship/mcp-ui-spec'\n\ninterface GenerateTypesOptions {\n  namespace?: string\n  exportAll?: boolean\n}\n\nexport async function generateTypesCommand(\n  input: string,\n  output: string | undefined,\n  options: GenerateTypesOptions\n) {\n  const spinner = ora('Loading registry...').start()\n\n  try {\n    // Read registry file\n    const registryPath = resolve(process.cwd(), input)\n    const registryContent = readFileSync(registryPath, 'utf-8')\n    const registry: ComponentRegistry = JSON.parse(registryContent)\n\n    spinner.text = 'Generating TypeScript types...'\n\n    // Generate types for each component\n    const typeDefinitions: string[] = []\n\n    // Add header comment\n    typeDefinitions.push('/**')\n    typeDefinitions.push(' * Auto-generated TypeScript types from component registry')\n    typeDefinitions.push(' * Generated by @seed-ship/mcp-ui-cli')\n    typeDefinitions.push(' */')\n    typeDefinitions.push('')\n\n    if (options.namespace) {\n      typeDefinitions.push(`export namespace ${options.namespace} {`)\n    }\n\n    // Generate types for each component\n    for (const component of registry.components as Component[]) {\n      spinner.text = `Generating types for ${component.id}...`\n\n      // Generate interface name from component ID\n      const typeName = componentIdToTypeName(component.id)\n\n      try {\n        const ts = await compile(component.schema as any, typeName, {\n          bannerComment: `/* ${component.name} - ${component.description || 'No description'} */`,\n          style: {\n            semi: false,\n            singleQuote: true,\n          },\n        })\n\n        // Add the generated type\n        if (options.namespace) {\n          // Indent for namespace\n          const indented = ts\n            .split('\\n')\n            .map((line) => (line ? `  ${line}` : line))\n            .join('\\n')\n          typeDefinitions.push(indented)\n        } else {\n          typeDefinitions.push(ts)\n        }\n\n        typeDefinitions.push('')\n      } catch (error) {\n        spinner.warn(`Skipping ${component.id}: type generation failed`)\n        if (error instanceof Error) {\n          console.error(chalk.yellow(`  ${error.message}`))\n        }\n      }\n    }\n\n    if (options.namespace) {\n      typeDefinitions.push('}')\n    }\n\n    const generatedCode = typeDefinitions.join('\\n')\n\n    spinner.succeed('Type generation complete')\n\n    // Write to file or stdout\n    if (output) {\n      const outputPath = resolve(process.cwd(), output)\n      writeFileSync(outputPath, generatedCode, 'utf-8')\n      console.log(chalk.green(`✓ Types written to ${output}`))\n    } else {\n      console.log('\\n' + generatedCode)\n    }\n\n    process.exit(0)\n  } catch (error) {\n    spinner.fail('Type generation failed')\n\n    if (error instanceof Error) {\n      if (error.message.includes('ENOENT')) {\n        console.error(chalk.red(`\\nFile not found: ${input}`))\n      } else {\n        console.error(chalk.red('\\nUnexpected error:'))\n        console.error(chalk.gray(error.message))\n      }\n    }\n\n    process.exit(1)\n  }\n}\n\n/**\n * Convert component ID to TypeScript type name\n * Examples:\n *   quickchart-bar -> QuickchartBar\n *   metric-card -> MetricCard\n *   data-table -> DataTable\n */\nfunction componentIdToTypeName(id: string): string {\n  return id\n    .split('-')\n    .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n    .join('')\n}\n","/**\n * Test Examples command - validates all component examples\n */\n\nimport { readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport Ajv from 'ajv'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { ComponentRegistry } from '@seed-ship/mcp-ui-spec'\n\ninterface TestExamplesOptions {\n  component?: string\n  verbose?: boolean\n}\n\ninterface TestResult {\n  componentId: string\n  exampleName: string\n  passed: boolean\n  errors?: string[]\n}\n\nexport async function testExamplesCommand(file: string, options: TestExamplesOptions) {\n  const spinner = ora('Loading registry...').start()\n\n  try {\n    // Read registry file\n    const registryPath = resolve(process.cwd(), file)\n    const registryContent = readFileSync(registryPath, 'utf-8')\n    const registry: ComponentRegistry = JSON.parse(registryContent)\n\n    // Filter components if specific component requested\n    const componentsToTest = options.component\n      ? registry.components.filter((c) => c.id === options.component)\n      : registry.components\n\n    if (componentsToTest.length === 0) {\n      spinner.fail(`Component not found: ${options.component}`)\n      process.exit(1)\n    }\n\n    spinner.text = 'Running example tests...'\n\n    const results: TestResult[] = []\n    let totalExamples = 0\n    let passedExamples = 0\n\n    // Test each component's examples\n    for (const component of componentsToTest) {\n      spinner.text = `Testing examples for ${component.id}...`\n\n      // Create Ajv validator for this component's schema\n      const ajv = new Ajv({ allErrors: true, verbose: options.verbose })\n      const validate = ajv.compile(component.schema as any)\n\n      // Test each example\n      for (const example of component.examples) {\n        totalExamples++\n\n        const valid = validate(example.params)\n        const result: TestResult = {\n          componentId: component.id,\n          exampleName: example.name,\n          passed: valid,\n        }\n\n        if (!valid && validate.errors) {\n          result.errors = validate.errors.map((err) => {\n            const path = err.instancePath || 'root'\n            return `${path}: ${err.message}`\n          })\n        }\n\n        if (valid) {\n          passedExamples++\n        }\n\n        results.push(result)\n      }\n    }\n\n    spinner.stop()\n\n    // Display results\n    console.log(chalk.bold('\\nTest Results:\\n'))\n\n    let hasFailures = false\n\n    for (const result of results) {\n      const status = result.passed ? chalk.green('✓') : chalk.red('✗')\n      const componentLabel = chalk.cyan(result.componentId)\n      const exampleLabel = chalk.gray(result.exampleName)\n\n      console.log(`${status} ${componentLabel} › ${exampleLabel}`)\n\n      if (!result.passed && result.errors) {\n        hasFailures = true\n        result.errors.forEach((error) => {\n          console.log(chalk.red(`    ${error}`))\n        })\n      }\n    }\n\n    // Summary\n    console.log('')\n    console.log(chalk.bold('Summary:'))\n    console.log(`  ${chalk.green(`${passedExamples} passed`)} / ${totalExamples} total`)\n\n    if (hasFailures) {\n      console.log(chalk.red(`  ${totalExamples - passedExamples} failed`))\n      process.exit(1)\n    }\n\n    console.log(chalk.green('\\n✓ All examples are valid!'))\n    process.exit(0)\n  } catch (error) {\n    spinner.fail('Example testing failed')\n\n    if (error instanceof Error) {\n      if (error.message.includes('ENOENT')) {\n        console.error(chalk.red(`\\nFile not found: ${file}`))\n      } else if (error instanceof SyntaxError) {\n        console.error(chalk.red('\\nInvalid JSON syntax'))\n        console.error(chalk.gray(error.message))\n      } else {\n        console.error(chalk.red('\\nUnexpected error:'))\n        console.error(chalk.gray(error.message))\n      }\n    }\n\n    process.exit(1)\n  }\n}\n","/**\n * Diff command - compares two registry versions for breaking changes\n */\n\nimport { readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { ComponentRegistry } from '@seed-ship/mcp-ui-spec'\n\ninterface DiffOptions {\n  json?: boolean\n  failOnBreaking?: boolean\n}\n\ninterface ChangeType {\n  type: 'added' | 'removed' | 'modified' | 'deprecated'\n  breaking: boolean\n  componentId: string\n  field?: string\n  oldValue?: unknown\n  newValue?: unknown\n  message: string\n}\n\nexport async function diffCommand(oldFile: string, newFile: string, options: DiffOptions) {\n  const spinner = ora('Loading registries...').start()\n\n  try {\n    // Read both registry files\n    const oldPath = resolve(process.cwd(), oldFile)\n    const newPath = resolve(process.cwd(), newFile)\n\n    const oldRegistry: ComponentRegistry = JSON.parse(readFileSync(oldPath, 'utf-8'))\n    const newRegistry: ComponentRegistry = JSON.parse(readFileSync(newPath, 'utf-8'))\n\n    spinner.text = 'Comparing registries...'\n\n    const changes: ChangeType[] = []\n\n    // Create maps for easier lookup\n    const oldComponents = new Map(oldRegistry.components.map((c) => [c.id, c]))\n    const newComponents = new Map(newRegistry.components.map((c) => [c.id, c]))\n\n    // Check for removed components (breaking)\n    for (const [id] of oldComponents) {\n      if (!newComponents.has(id)) {\n        changes.push({\n          type: 'removed',\n          breaking: true,\n          componentId: id,\n          message: `Component '${id}' was removed`,\n        })\n      }\n    }\n\n    // Check for added components (non-breaking)\n    for (const [id] of newComponents) {\n      if (!oldComponents.has(id)) {\n        changes.push({\n          type: 'added',\n          breaking: false,\n          componentId: id,\n          message: `Component '${id}' was added`,\n        })\n      }\n    }\n\n    // Check for modified components\n    for (const [id, newComponent] of newComponents) {\n      const oldComponent = oldComponents.get(id)\n      if (!oldComponent) continue\n\n      // Check deprecation\n      if (!oldComponent.deprecated && newComponent.deprecated) {\n        changes.push({\n          type: 'deprecated',\n          breaking: false,\n          componentId: id,\n          message: `Component '${id}' was deprecated${\n            newComponent.deprecationMessage ? `: ${newComponent.deprecationMessage}` : ''\n          }`,\n        })\n      }\n\n      // Check type change (breaking)\n      if (oldComponent.type !== newComponent.type) {\n        changes.push({\n          type: 'modified',\n          breaking: true,\n          componentId: id,\n          field: 'type',\n          oldValue: oldComponent.type,\n          newValue: newComponent.type,\n          message: `Component '${id}' type changed from '${oldComponent.type}' to '${newComponent.type}'`,\n        })\n      }\n\n      // Check required fields change (breaking)\n      const oldRequired = new Set(oldComponent.schema.required || [])\n      const newRequired = new Set(newComponent.schema.required || [])\n\n      for (const field of newRequired) {\n        if (!oldRequired.has(field)) {\n          changes.push({\n            type: 'modified',\n            breaking: true,\n            componentId: id,\n            field: `schema.required`,\n            message: `Component '${id}' now requires field '${field}'`,\n          })\n        }\n      }\n\n      for (const field of oldRequired) {\n        if (!newRequired.has(field)) {\n          changes.push({\n            type: 'modified',\n            breaking: false,\n            componentId: id,\n            field: `schema.required`,\n            message: `Component '${id}' no longer requires field '${field}'`,\n          })\n        }\n      }\n\n      // Check version change\n      if (oldComponent.version !== newComponent.version) {\n        const oldVersion = oldComponent.version || '0.0.0'\n        const newVersion = newComponent.version || '0.0.0'\n\n        const breaking = isMajorVersionChange(oldVersion, newVersion)\n\n        changes.push({\n          type: 'modified',\n          breaking,\n          componentId: id,\n          field: 'version',\n          oldValue: oldVersion,\n          newValue: newVersion,\n          message: `Component '${id}' version changed from ${oldVersion} to ${newVersion}`,\n        })\n      }\n    }\n\n    spinner.stop()\n\n    // Output results\n    if (options.json) {\n      console.log(JSON.stringify({ changes }, null, 2))\n    } else {\n      displayHumanReadableDiff(changes)\n    }\n\n    // Check if we should fail on breaking changes\n    const hasBreakingChanges = changes.some((c) => c.breaking)\n    if (options.failOnBreaking && hasBreakingChanges) {\n      console.error(chalk.red('\\n✗ Breaking changes detected!'))\n      process.exit(1)\n    }\n\n    process.exit(0)\n  } catch (error) {\n    spinner.fail('Diff failed')\n\n    if (error instanceof Error) {\n      if (error.message.includes('ENOENT')) {\n        console.error(chalk.red(`\\nFile not found`))\n      } else {\n        console.error(chalk.red('\\nUnexpected error:'))\n        console.error(chalk.gray(error.message))\n      }\n    }\n\n    process.exit(1)\n  }\n}\n\nfunction displayHumanReadableDiff(changes: ChangeType[]) {\n  console.log(chalk.bold('\\nRegistry Changes:\\n'))\n\n  if (changes.length === 0) {\n    console.log(chalk.gray('No changes detected'))\n    return\n  }\n\n  const breakingChanges = changes.filter((c) => c.breaking)\n  const nonBreakingChanges = changes.filter((c) => !c.breaking)\n\n  if (breakingChanges.length > 0) {\n    console.log(chalk.red.bold('Breaking Changes:'))\n    for (const change of breakingChanges) {\n      const icon = getChangeIcon(change.type)\n      console.log(chalk.red(`  ${icon} ${change.message}`))\n    }\n    console.log('')\n  }\n\n  if (nonBreakingChanges.length > 0) {\n    console.log(chalk.yellow.bold('Non-Breaking Changes:'))\n    for (const change of nonBreakingChanges) {\n      const icon = getChangeIcon(change.type)\n      console.log(chalk.yellow(`  ${icon} ${change.message}`))\n    }\n    console.log('')\n  }\n\n  // Summary\n  console.log(chalk.bold('Summary:'))\n  console.log(`  Total changes: ${changes.length}`)\n  console.log(\n    `  Breaking: ${breakingChanges.length > 0 ? chalk.red(breakingChanges.length) : chalk.green('0')}`\n  )\n  console.log(`  Non-breaking: ${nonBreakingChanges.length}`)\n}\n\nfunction getChangeIcon(type: ChangeType['type']): string {\n  switch (type) {\n    case 'added':\n      return '+'\n    case 'removed':\n      return '-'\n    case 'modified':\n      return '~'\n    case 'deprecated':\n      return '⚠'\n    default:\n      return '•'\n  }\n}\n\nfunction isMajorVersionChange(oldVersion: string, newVersion: string): boolean {\n  const oldMajor = parseInt(oldVersion.split('.')[0], 10)\n  const newMajor = parseInt(newVersion.split('.')[0], 10)\n  return newMajor > oldMajor\n}\n"],"names":["__filename","fileURLToPath","__dirname","dirname","resolve","readFileSync","ComponentRegistrySchema","join","path","compile","writeFileSync"],"mappings":";;;;;;;;;;AAeA,MAAMA,eAAaC,IAAAA,wQAA6B;AAChD,MAAMC,cAAYC,KAAAA,QAAQH,YAAU;AAOpC,eAAsB,gBAAgB,MAAc,SAA0B;;AAC5E,QAAM,UAAU,IAAI,qBAAqB,EAAE,MAAA;AAE3C,MAAI;AAEF,UAAM,eAAeI,KAAAA,QAAQ,QAAQ,IAAA,GAAO,IAAI;AAChD,UAAM,kBAAkBC,GAAAA,aAAa,cAAc,OAAO;AAC1D,UAAM,WAAW,KAAK,MAAM,eAAe;AAE3C,YAAQ,OAAO;AAGf,UAAM,YAAYC,UAAAA,wBAAwB,UAAU,QAAQ;AAE5D,QAAI,CAAC,UAAU,SAAS;AACtB,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAM,MAAM,IAAI,sBAAsB,CAAC;AAC/C,gBAAU,MAAM,OAAO,QAAQ,CAAC,QAAQ;AACtC,gBAAQ,MAAM,MAAM,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,MACtE,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,OAAO;AAGf,UAAM,aAAaC,KAAAA;AAAAA,MACjBL;AAAAA,MACA;AAAA,IAAA;AAEF,QAAI;AAEJ,QAAI;AACF,0BAAoBG,GAAAA,aAAa,YAAY,OAAO;AAAA,IACtD,QAAQ;AAEN,YAAM,kBAAkBE,KAAAA;AAAAA,QACtBL;AAAAA,QACA;AAAA,MAAA;AAEF,0BAAoBG,GAAAA,aAAa,iBAAiB,OAAO;AAAA,IAC3D;AAEA,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAG/C,UAAM,MAAM,IAAI,IAAI;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AAED,UAAM,WAAW,IAAI,QAAQ,UAAU;AACvC,UAAM,YAAY,SAAS,QAAQ;AAEnC,QAAI,CAAC,aAAa,SAAS,QAAQ;AACjC,cAAQ,KAAK,+BAA+B;AAC5C,cAAQ,MAAM,MAAM,IAAI,sBAAsB,CAAC;AAC/C,eAAS,OAAO,QAAQ,CAAC,QAAQ;AAC/B,cAAMG,QAAO,IAAI,gBAAgB;AACjC,gBAAQ,MAAM,MAAM,IAAI,OAAOA,KAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AACtD,YAAI,QAAQ,WAAW,IAAI,QAAQ;AACjC,kBAAQ,MAAM,MAAM,KAAK,eAAe,KAAK,UAAU,IAAI,MAAM,CAAC,EAAE,CAAC;AAAA,QACvE;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,QAAQ,MAAM,MAAM,oBAAoB,CAAC;AAGjD,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,MAAM,KAAK,qBAAqB,CAAC;AAC7C,cAAQ,IAAI,MAAM,KAAK,cAAc,SAAS,OAAO,EAAE,CAAC;AACxD,cAAQ,IAAI,MAAM,KAAK,iBAAiB,SAAS,WAAW,MAAM,EAAE,CAAC;AAErE,WAAI,cAAS,aAAT,mBAAmB,MAAM;AAC3B,gBAAQ,IAAI,MAAM,KAAK,WAAW,SAAS,SAAS,IAAI,EAAE,CAAC;AAAA,MAC7D;AAEA,cAAQ,IAAI,MAAM,KAAK,eAAe,CAAC;AACvC,YAAM,gBAAgB;AACtB,oBAAc,WAAW,QAAQ,CAAC,SAAS;AACzC,gBAAQ,IAAI,MAAM,KAAK,OAAO,KAAK,EAAE,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,MAAM,aAAa,CAAC;AAAA,MAC7F,CAAC;AAAA,IACH;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,mBAAmB;AAEhC,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACpC,gBAAQ,MAAM,MAAM,IAAI;AAAA,kBAAqB,IAAI,EAAE,CAAC;AAAA,MACtD,WAAW,iBAAiB,aAAa;AACvC,gBAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC,OAAO;AACL,gBAAQ,MAAM,MAAM,IAAI,qBAAqB,CAAC;AAC9C,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AChHA,eAAsB,qBACpB,OACA,QACA,SACA;AACA,QAAM,UAAU,IAAI,qBAAqB,EAAE,MAAA;AAE3C,MAAI;AAEF,UAAM,eAAeJ,KAAAA,QAAQ,QAAQ,IAAA,GAAO,KAAK;AACjD,UAAM,kBAAkBC,GAAAA,aAAa,cAAc,OAAO;AAC1D,UAAM,WAA8B,KAAK,MAAM,eAAe;AAE9D,YAAQ,OAAO;AAGf,UAAM,kBAA4B,CAAA;AAGlC,oBAAgB,KAAK,KAAK;AAC1B,oBAAgB,KAAK,4DAA4D;AACjF,oBAAgB,KAAK,uCAAuC;AAC5D,oBAAgB,KAAK,KAAK;AAC1B,oBAAgB,KAAK,EAAE;AAEvB,QAAI,QAAQ,WAAW;AACrB,sBAAgB,KAAK,oBAAoB,QAAQ,SAAS,IAAI;AAAA,IAChE;AAGA,eAAW,aAAa,SAAS,YAA2B;AAC1D,cAAQ,OAAO,wBAAwB,UAAU,EAAE;AAGnD,YAAM,WAAW,sBAAsB,UAAU,EAAE;AAEnD,UAAI;AACF,cAAM,KAAK,MAAMI,uBAAAA,QAAQ,UAAU,QAAe,UAAU;AAAA,UAC1D,eAAe,MAAM,UAAU,IAAI,MAAM,UAAU,eAAe,gBAAgB;AAAA,UAClF,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UAAA;AAAA,QACf,CACD;AAGD,YAAI,QAAQ,WAAW;AAErB,gBAAM,WAAW,GACd,MAAM,IAAI,EACV,IAAI,CAAC,SAAU,OAAO,KAAK,IAAI,KAAK,IAAK,EACzC,KAAK,IAAI;AACZ,0BAAgB,KAAK,QAAQ;AAAA,QAC/B,OAAO;AACL,0BAAgB,KAAK,EAAE;AAAA,QACzB;AAEA,wBAAgB,KAAK,EAAE;AAAA,MACzB,SAAS,OAAO;AACd,gBAAQ,KAAK,YAAY,UAAU,EAAE,0BAA0B;AAC/D,YAAI,iBAAiB,OAAO;AAC1B,kBAAQ,MAAM,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,CAAC;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW;AACrB,sBAAgB,KAAK,GAAG;AAAA,IAC1B;AAEA,UAAM,gBAAgB,gBAAgB,KAAK,IAAI;AAE/C,YAAQ,QAAQ,0BAA0B;AAG1C,QAAI,QAAQ;AACV,YAAM,aAAaL,KAAAA,QAAQ,QAAQ,IAAA,GAAO,MAAM;AAChDM,uBAAc,YAAY,eAAe,OAAO;AAChD,cAAQ,IAAI,MAAM,MAAM,sBAAsB,MAAM,EAAE,CAAC;AAAA,IACzD,OAAO;AACL,cAAQ,IAAI,OAAO,aAAa;AAAA,IAClC;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AAErC,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACpC,gBAAQ,MAAM,MAAM,IAAI;AAAA,kBAAqB,KAAK,EAAE,CAAC;AAAA,MACvD,OAAO;AACL,gBAAQ,MAAM,MAAM,IAAI,qBAAqB,CAAC;AAC9C,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AASA,SAAS,sBAAsB,IAAoB;AACjD,SAAO,GACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACZ;ACzGA,eAAsB,oBAAoB,MAAc,SAA8B;AACpF,QAAM,UAAU,IAAI,qBAAqB,EAAE,MAAA;AAE3C,MAAI;AAEF,UAAM,eAAeN,KAAAA,QAAQ,QAAQ,IAAA,GAAO,IAAI;AAChD,UAAM,kBAAkBC,GAAAA,aAAa,cAAc,OAAO;AAC1D,UAAM,WAA8B,KAAK,MAAM,eAAe;AAG9D,UAAM,mBAAmB,QAAQ,YAC7B,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,OAAO,QAAQ,SAAS,IAC5D,SAAS;AAEb,QAAI,iBAAiB,WAAW,GAAG;AACjC,cAAQ,KAAK,wBAAwB,QAAQ,SAAS,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,OAAO;AAEf,UAAM,UAAwB,CAAA;AAC9B,QAAI,gBAAgB;AACpB,QAAI,iBAAiB;AAGrB,eAAW,aAAa,kBAAkB;AACxC,cAAQ,OAAO,wBAAwB,UAAU,EAAE;AAGnD,YAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,SAAS,QAAQ,SAAS;AACjE,YAAM,WAAW,IAAI,QAAQ,UAAU,MAAa;AAGpD,iBAAW,WAAW,UAAU,UAAU;AACxC;AAEA,cAAM,QAAQ,SAAS,QAAQ,MAAM;AACrC,cAAM,SAAqB;AAAA,UACzB,aAAa,UAAU;AAAA,UACvB,aAAa,QAAQ;AAAA,UACrB,QAAQ;AAAA,QAAA;AAGV,YAAI,CAAC,SAAS,SAAS,QAAQ;AAC7B,iBAAO,SAAS,SAAS,OAAO,IAAI,CAAC,QAAQ;AAC3C,kBAAMG,QAAO,IAAI,gBAAgB;AACjC,mBAAO,GAAGA,KAAI,KAAK,IAAI,OAAO;AAAA,UAChC,CAAC;AAAA,QACH;AAEA,YAAI,OAAO;AACT;AAAA,QACF;AAEA,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF;AAEA,YAAQ,KAAA;AAGR,YAAQ,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAE3C,QAAI,cAAc;AAElB,eAAW,UAAU,SAAS;AAC5B,YAAM,SAAS,OAAO,SAAS,MAAM,MAAM,GAAG,IAAI,MAAM,IAAI,GAAG;AAC/D,YAAM,iBAAiB,MAAM,KAAK,OAAO,WAAW;AACpD,YAAM,eAAe,MAAM,KAAK,OAAO,WAAW;AAElD,cAAQ,IAAI,GAAG,MAAM,IAAI,cAAc,MAAM,YAAY,EAAE;AAE3D,UAAI,CAAC,OAAO,UAAU,OAAO,QAAQ;AACnC,sBAAc;AACd,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,kBAAQ,IAAI,MAAM,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,UAAU,CAAC;AAClC,YAAQ,IAAI,KAAK,MAAM,MAAM,GAAG,cAAc,SAAS,CAAC,MAAM,aAAa,QAAQ;AAEnF,QAAI,aAAa;AACf,cAAQ,IAAI,MAAM,IAAI,KAAK,gBAAgB,cAAc,SAAS,CAAC;AACnE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI,MAAM,MAAM,6BAA6B,CAAC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AAErC,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACpC,gBAAQ,MAAM,MAAM,IAAI;AAAA,kBAAqB,IAAI,EAAE,CAAC;AAAA,MACtD,WAAW,iBAAiB,aAAa;AACvC,gBAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC,OAAO;AACL,gBAAQ,MAAM,MAAM,IAAI,qBAAqB,CAAC;AAC9C,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AC5GA,eAAsB,YAAY,SAAiB,SAAiB,SAAsB;AACxF,QAAM,UAAU,IAAI,uBAAuB,EAAE,MAAA;AAE7C,MAAI;AAEF,UAAM,UAAUJ,KAAAA,QAAQ,QAAQ,IAAA,GAAO,OAAO;AAC9C,UAAM,UAAUA,KAAAA,QAAQ,QAAQ,IAAA,GAAO,OAAO;AAE9C,UAAM,cAAiC,KAAK,MAAMC,GAAAA,aAAa,SAAS,OAAO,CAAC;AAChF,UAAM,cAAiC,KAAK,MAAMA,GAAAA,aAAa,SAAS,OAAO,CAAC;AAEhF,YAAQ,OAAO;AAEf,UAAM,UAAwB,CAAA;AAG9B,UAAM,gBAAgB,IAAI,IAAI,YAAY,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1E,UAAM,gBAAgB,IAAI,IAAI,YAAY,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAG1E,eAAW,CAAC,EAAE,KAAK,eAAe;AAChC,UAAI,CAAC,cAAc,IAAI,EAAE,GAAG;AAC1B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,SAAS,cAAc,EAAE;AAAA,QAAA,CAC1B;AAAA,MACH;AAAA,IACF;AAGA,eAAW,CAAC,EAAE,KAAK,eAAe;AAChC,UAAI,CAAC,cAAc,IAAI,EAAE,GAAG;AAC1B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,SAAS,cAAc,EAAE;AAAA,QAAA,CAC1B;AAAA,MACH;AAAA,IACF;AAGA,eAAW,CAAC,IAAI,YAAY,KAAK,eAAe;AAC9C,YAAM,eAAe,cAAc,IAAI,EAAE;AACzC,UAAI,CAAC,aAAc;AAGnB,UAAI,CAAC,aAAa,cAAc,aAAa,YAAY;AACvD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,SAAS,cAAc,EAAE,mBACvB,aAAa,qBAAqB,KAAK,aAAa,kBAAkB,KAAK,EAC7E;AAAA,QAAA,CACD;AAAA,MACH;AAGA,UAAI,aAAa,SAAS,aAAa,MAAM;AAC3C,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,OAAO;AAAA,UACP,UAAU,aAAa;AAAA,UACvB,UAAU,aAAa;AAAA,UACvB,SAAS,cAAc,EAAE,wBAAwB,aAAa,IAAI,SAAS,aAAa,IAAI;AAAA,QAAA,CAC7F;AAAA,MACH;AAGA,YAAM,cAAc,IAAI,IAAI,aAAa,OAAO,YAAY,EAAE;AAC9D,YAAM,cAAc,IAAI,IAAI,aAAa,OAAO,YAAY,EAAE;AAE9D,iBAAW,SAAS,aAAa;AAC/B,YAAI,CAAC,YAAY,IAAI,KAAK,GAAG;AAC3B,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,UAAU;AAAA,YACV,aAAa;AAAA,YACb,OAAO;AAAA,YACP,SAAS,cAAc,EAAE,yBAAyB,KAAK;AAAA,UAAA,CACxD;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,SAAS,aAAa;AAC/B,YAAI,CAAC,YAAY,IAAI,KAAK,GAAG;AAC3B,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,UAAU;AAAA,YACV,aAAa;AAAA,YACb,OAAO;AAAA,YACP,SAAS,cAAc,EAAE,+BAA+B,KAAK;AAAA,UAAA,CAC9D;AAAA,QACH;AAAA,MACF;AAGA,UAAI,aAAa,YAAY,aAAa,SAAS;AACjD,cAAM,aAAa,aAAa,WAAW;AAC3C,cAAM,aAAa,aAAa,WAAW;AAE3C,cAAM,WAAW,qBAAqB,YAAY,UAAU;AAE5D,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,aAAa;AAAA,UACb,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS,cAAc,EAAE,0BAA0B,UAAU,OAAO,UAAU;AAAA,QAAA,CAC/E;AAAA,MACH;AAAA,IACF;AAEA,YAAQ,KAAA;AAGR,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,WAAW,MAAM,CAAC,CAAC;AAAA,IAClD,OAAO;AACL,+BAAyB,OAAO;AAAA,IAClC;AAGA,UAAM,qBAAqB,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ;AACzD,QAAI,QAAQ,kBAAkB,oBAAoB;AAChD,cAAQ,MAAM,MAAM,IAAI,gCAAgC,CAAC;AACzD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,aAAa;AAE1B,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACpC,gBAAQ,MAAM,MAAM,IAAI;AAAA,eAAkB,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,MAAM,MAAM,IAAI,qBAAqB,CAAC;AAC9C,gBAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,yBAAyB,SAAuB;AACvD,UAAQ,IAAI,MAAM,KAAK,uBAAuB,CAAC;AAE/C,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,MAAM,KAAK,qBAAqB,CAAC;AAC7C;AAAA,EACF;AAEA,QAAM,kBAAkB,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ;AACxD,QAAM,qBAAqB,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAE5D,MAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAQ,IAAI,MAAM,IAAI,KAAK,mBAAmB,CAAC;AAC/C,eAAW,UAAU,iBAAiB;AACpC,YAAM,OAAO,cAAc,OAAO,IAAI;AACtC,cAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,IACtD;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI,mBAAmB,SAAS,GAAG;AACjC,YAAQ,IAAI,MAAM,OAAO,KAAK,uBAAuB,CAAC;AACtD,eAAW,UAAU,oBAAoB;AACvC,YAAM,OAAO,cAAc,OAAO,IAAI;AACtC,cAAQ,IAAI,MAAM,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,IACzD;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,UAAQ,IAAI,MAAM,KAAK,UAAU,CAAC;AAClC,UAAQ,IAAI,oBAAoB,QAAQ,MAAM,EAAE;AAChD,UAAQ;AAAA,IACN,eAAe,gBAAgB,SAAS,IAAI,MAAM,IAAI,gBAAgB,MAAM,IAAI,MAAM,MAAM,GAAG,CAAC;AAAA,EAAA;AAElG,UAAQ,IAAI,mBAAmB,mBAAmB,MAAM,EAAE;AAC5D;AAEA,SAAS,cAAc,MAAkC;AACvD,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,qBAAqB,YAAoB,YAA6B;AAC7E,QAAM,WAAW,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACtD,QAAM,WAAW,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACtD,SAAO,WAAW;AACpB;;;;;"}