heraspec 0.1.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/LICENSE +22 -0
- package/README.md +57 -0
- package/bin/heraspec.js +3803 -0
- package/bin/heraspec.js.map +7 -0
- package/dist/core/templates/skills/CHANGELOG.md +117 -0
- package/dist/core/templates/skills/README-template.md +58 -0
- package/dist/core/templates/skills/README.md +36 -0
- package/dist/core/templates/skills/content-optimization-skill.md +104 -0
- package/dist/core/templates/skills/data/charts.csv +26 -0
- package/dist/core/templates/skills/data/colors.csv +97 -0
- package/dist/core/templates/skills/data/landing.csv +31 -0
- package/dist/core/templates/skills/data/pages-proposed.csv +22 -0
- package/dist/core/templates/skills/data/pages.csv +10 -0
- package/dist/core/templates/skills/data/products.csv +97 -0
- package/dist/core/templates/skills/data/prompts.csv +24 -0
- package/dist/core/templates/skills/data/stacks/flutter.csv +53 -0
- package/dist/core/templates/skills/data/stacks/html-tailwind.csv +56 -0
- package/dist/core/templates/skills/data/stacks/nextjs.csv +53 -0
- package/dist/core/templates/skills/data/stacks/react-native.csv +52 -0
- package/dist/core/templates/skills/data/stacks/react.csv +54 -0
- package/dist/core/templates/skills/data/stacks/svelte.csv +54 -0
- package/dist/core/templates/skills/data/stacks/swiftui.csv +51 -0
- package/dist/core/templates/skills/data/stacks/vue.csv +50 -0
- package/dist/core/templates/skills/data/styles.csv +59 -0
- package/dist/core/templates/skills/data/typography.csv +58 -0
- package/dist/core/templates/skills/data/ux-guidelines.csv +100 -0
- package/dist/core/templates/skills/documents-skill.md +114 -0
- package/dist/core/templates/skills/e2e-test-skill.md +119 -0
- package/dist/core/templates/skills/integration-test-skill.md +118 -0
- package/dist/core/templates/skills/module-codebase-skill.md +110 -0
- package/dist/core/templates/skills/scripts/CODE_EXPLANATION.md +394 -0
- package/dist/core/templates/skills/scripts/SEARCH_ALGORITHMS_COMPARISON.md +421 -0
- package/dist/core/templates/skills/scripts/SEARCH_MODES_GUIDE.md +238 -0
- package/dist/core/templates/skills/scripts/core.py +385 -0
- package/dist/core/templates/skills/scripts/search.py +73 -0
- package/dist/core/templates/skills/suggestion-skill.md +118 -0
- package/dist/core/templates/skills/templates/accessibility-checklist.md +40 -0
- package/dist/core/templates/skills/templates/example-prompt-full-theme.md +333 -0
- package/dist/core/templates/skills/templates/page-types-guide.md +338 -0
- package/dist/core/templates/skills/templates/pages-proposed-summary.md +273 -0
- package/dist/core/templates/skills/templates/pre-delivery-checklist.md +42 -0
- package/dist/core/templates/skills/templates/prompt-template-full-theme.md +313 -0
- package/dist/core/templates/skills/templates/responsive-design.md +40 -0
- package/dist/core/templates/skills/ui-ux-skill.md +584 -0
- package/dist/core/templates/skills/unit-test-skill.md +111 -0
- package/dist/index.js +1736 -0
- package/package.json +71 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/index.ts", "../src/core/init.ts", "../src/utils/file-system.ts", "../src/core/templates/index.ts", "../src/core/config.ts", "../src/core/list.ts", "../src/core/archive.ts", "../src/core/parsers/markdown-parser.ts", "../src/core/restore.ts", "../src/commands/show.ts", "../src/utils/task-parser.ts", "../src/core/skills/skill-parser.ts", "../src/core/skills/skill-manager.ts", "../src/commands/validate.ts", "../src/core/validation/validator.ts", "../src/core/schemas/base.schema.ts", "../src/core/schemas/spec.schema.ts", "../src/core/schemas/change.schema.ts", "../src/commands/skill.ts", "../src/core/templates/skills-template-map.ts", "../src/commands/helper.ts", "../src/commands/make-docs.ts", "../src/commands/make-test.ts", "../src/commands/make-code.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * HeraSpec CLI Entry Point\n */\nimport { Command } from 'commander';\nimport { createRequire } from 'module';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { InitCommand } from '../core/init.js';\nimport { ListCommand } from '../core/list.js';\nimport { ArchiveCommand } from '../core/archive.js';\nimport { RestoreCommand } from '../core/restore.js';\nimport { ShowCommand } from '../commands/show.js';\nimport { ValidateCommand } from '../commands/validate.js';\nimport { SkillCommand } from '../commands/skill.js';\nimport { HelperCommand } from '../commands/helper.js';\nimport { MakeDocsCommand } from '../commands/make-docs.js';\nimport { MakeTestCommand } from '../commands/make-test.js';\nimport { MakeCodeCommand } from '../commands/make-code.js';\n\nconst require = createRequire(import.meta.url);\n\n// Get package.json path relative to the built file location\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJsonPath = join(__dirname, '..', 'package.json');\nconst { version } = require(packageJsonPath);\n\nconst program = new Command();\n\nprogram\n .name('heraspec')\n .description('Universal spec-first development framework + CLI')\n .version(version);\n\nprogram\n .command('init [path]')\n .description('Initialize HeraSpec in your project')\n .action(async (targetPath = '.') => {\n try {\n const initCommand = new InitCommand();\n await initCommand.execute(targetPath);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('list')\n .description('List items (changes by default). Use --specs to list specs.')\n .option('--specs', 'List specs instead of changes')\n .option('--changes', 'List changes explicitly (default)')\n .action(async (options?: { specs?: boolean; changes?: boolean }) => {\n try {\n const listCommand = new ListCommand();\n const mode: 'changes' | 'specs' = options?.specs ? 'specs' : 'changes';\n await listCommand.execute('.', mode);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('show [item-name]')\n .description('Show a change or spec')\n .action(async (itemName?: string) => {\n try {\n const showCommand = new ShowCommand();\n await showCommand.execute(itemName);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('validate [item-name]')\n .description('Validate a change or spec')\n .option('--strict', 'Enable strict validation mode')\n .action(async (itemName?: string, options?: { strict?: boolean }) => {\n try {\n const validateCommand = new ValidateCommand();\n await validateCommand.execute(itemName, options);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('archive [change-name]')\n .description('Archive a completed change and update main specs')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (changeName?: string, options?: { yes?: boolean }) => {\n try {\n const archiveCommand = new ArchiveCommand();\n await archiveCommand.execute(changeName, options);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('restore [archive-name]')\n .description('Restore an archived change back to active changes')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (archiveName?: string, options?: { yes?: boolean }) => {\n try {\n const restoreCommand = new RestoreCommand();\n await restoreCommand.execute(archiveName, options);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('view')\n .description('Display an interactive dashboard of specs and changes')\n .action(async () => {\n try {\n const listCommand = new ListCommand();\n console.log('\\n\uD83D\uDCCA HeraSpec Dashboard\\n');\n console.log('\u2550'.repeat(60));\n await listCommand.execute('.', 'changes');\n await listCommand.execute('.', 'specs');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('helper')\n .description('Show usage guide, example prompts, and workflow instructions')\n .action(async () => {\n try {\n const helperCommand = new HelperCommand();\n await helperCommand.execute();\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n// Make commands\nconst makeCmd = program\n .command('make')\n .description('Generate project artifacts');\n\nmakeCmd\n .command('docs')\n .description('Generate project documentation from specs')\n .option('--agent <agent>', 'Specify AI agent for documentation (default: chatgpt)', 'chatgpt')\n .action(async (options?: { agent?: string }) => {\n try {\n const makeDocsCommand = new MakeDocsCommand();\n await makeDocsCommand.execute('.', options?.agent || 'chatgpt');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nmakeCmd\n .command('test')\n .description('Generate test cases from specs')\n .option('--type <type>', 'Test type: unit, integration, e2e (default: unit)', 'unit')\n .action(async (options?: { type?: string }) => {\n try {\n const makeTestCommand = new MakeTestCommand();\n await makeTestCommand.execute('.', options?.type || 'unit');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nmakeCmd\n .command('code')\n .description('Generate code skeletons from specs')\n .argument('[spec-name]', 'Specific spec to generate code for (optional)')\n .action(async (specName?: string) => {\n try {\n const makeCodeCommand = new MakeCodeCommand();\n await makeCodeCommand.execute('.', specName);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('suggest')\n .description('Analyze project and suggest new features')\n .action(async () => {\n try {\n const suggestCommand = new SuggestCommand();\n await suggestCommand.execute('.');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n// Skill commands\nconst skillCmd = program\n .command('skill')\n .description('Manage and view skills');\n\nskillCmd\n .command('list')\n .description('List all available skills')\n .action(async () => {\n try {\n const skillCommand = new SkillCommand();\n await skillCommand.list('.');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nskillCmd\n .command('show <skill-name>')\n .description('Show detailed information about a skill')\n .option('--project-type <type>', 'Specify project type for project-specific skills')\n .action(async (skillName: string, options?: { projectType?: string }) => {\n try {\n const skillCommand = new SkillCommand();\n await skillCommand.show(skillName, options?.projectType, '.');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nskillCmd\n .command('repair')\n .description('Repair skills structure to match HeraSpec standards')\n .action(async () => {\n try {\n const skillCommand = new SkillCommand();\n await skillCommand.repair('.');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nskillCmd\n .command('add <skill-name>')\n .description('Add a default skill to the project from HeraSpec templates')\n .option('--project-type <type>', 'Specify project type for project-specific skills')\n .action(async (skillName: string, options?: { projectType?: string }) => {\n try {\n const skillCommand = new SkillCommand();\n await skillCommand.add(skillName, options?.projectType, '.');\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram.parse();\n\n", "/**\n * HeraSpec Init Command\n * Initializes HeraSpec in a project\n */\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { TemplateManager } from './templates/index.js';\nimport {\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n CHANGES_DIR_NAME,\n ARCHIVES_DIR_NAME,\n SKILLS_DIR_NAME,\n HERASPEC_MARKERS,\n} from './config.js';\n\nexport class InitCommand {\n async execute(targetPath: string = '.'): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n const heraspecPath = path.join(resolvedPath, HERASPEC_DIR_NAME);\n\n // Check if already initialized\n const alreadyInitialized = await FileSystemUtils.fileExists(\n path.join(heraspecPath, HERASPEC_MARKERS.PROJECT_MD)\n );\n\n const spinner = ora({\n text: alreadyInitialized ? 'Updating HeraSpec...' : 'Initializing HeraSpec...',\n color: 'blue',\n }).start();\n\n try {\n // Create directory structure\n await FileSystemUtils.createDirectory(heraspecPath);\n await FileSystemUtils.createDirectory(path.join(heraspecPath, SPECS_DIR_NAME));\n await FileSystemUtils.createDirectory(path.join(heraspecPath, CHANGES_DIR_NAME));\n await FileSystemUtils.createDirectory(path.join(heraspecPath, ARCHIVES_DIR_NAME));\n await FileSystemUtils.createDirectory(path.join(heraspecPath, SKILLS_DIR_NAME));\n\n // Create skills README\n const skillsReadmePath = path.join(heraspecPath, SKILLS_DIR_NAME, 'README.md');\n if (!(await FileSystemUtils.fileExists(skillsReadmePath))) {\n const skillsReadme = await this.getSkillsReadmeTemplate();\n await FileSystemUtils.writeFile(skillsReadmePath, skillsReadme);\n }\n\n // Create UI/UX skill quick reference guide\n const uiuxGuidePath = path.join(heraspecPath, SKILLS_DIR_NAME, 'UI_UX_SKILL_QUICK_REFERENCE.md');\n if (!(await FileSystemUtils.fileExists(uiuxGuidePath))) {\n const uiuxGuide = await this.getUIUXQuickReference();\n await FileSystemUtils.writeFile(uiuxGuidePath, uiuxGuide);\n }\n\n // Create template files\n await this.createTemplateFiles(heraspecPath, alreadyInitialized);\n\n // Create or update root AGENTS.heraspec.md (merge Skills section if exists)\n const agentsPath = path.join(resolvedPath, HERASPEC_MARKERS.AGENTS_MD);\n await this.updateAgentsFile(agentsPath, alreadyInitialized);\n\n // Update related markdown files (README.md, etc.)\n await this.updateRelatedMarkdownFiles(resolvedPath);\n\n spinner.succeed(\n chalk.green(\n alreadyInitialized\n ? 'HeraSpec updated successfully'\n : 'HeraSpec initialized successfully'\n )\n );\n\n console.log();\n console.log(chalk.cyan('Next steps:'));\n console.log(\n chalk.gray('1. Review and update heraspec/project.md with your project details')\n );\n console.log(\n chalk.gray('2. Create your first change: \"Create a HeraSpec change to...\"')\n );\n console.log(\n chalk.gray('3. List changes: heraspec list')\n );\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${(error as Error).message}`));\n throw error;\n }\n }\n\n private async createTemplateFiles(\n heraspecPath: string,\n skipExisting: boolean\n ): Promise<void> {\n const projectMdPath = path.join(heraspecPath, HERASPEC_MARKERS.PROJECT_MD);\n const configYamlPath = path.join(heraspecPath, HERASPEC_MARKERS.CONFIG_YAML);\n\n // Create project.md\n if (!(await FileSystemUtils.fileExists(projectMdPath)) || !skipExisting) {\n await FileSystemUtils.writeFile(\n projectMdPath,\n TemplateManager.getProjectTemplate()\n );\n }\n\n // Create config.yaml\n if (!(await FileSystemUtils.fileExists(configYamlPath)) || !skipExisting) {\n await FileSystemUtils.writeFile(\n configYamlPath,\n TemplateManager.getConfigTemplate()\n );\n }\n }\n\n private async updateAgentsFile(agentsPath: string, alreadyInitialized: boolean): Promise<void> {\n const skillsSectionMarker = '## Skills System';\n const skillsSectionEndMarker = '**Key rule**: Switch skill.md when switching task groups!';\n\n if (!alreadyInitialized) {\n // New project: create full template\n await FileSystemUtils.writeFile(\n agentsPath,\n TemplateManager.getAgentsTemplate()\n );\n return;\n }\n\n // Existing project: merge Skills section\n let existingContent = '';\n if (await FileSystemUtils.fileExists(agentsPath)) {\n existingContent = await FileSystemUtils.readFile(agentsPath);\n }\n\n // Check if Skills section already exists\n if (existingContent.includes(skillsSectionMarker)) {\n // Update existing Skills section\n const skillsSection = await this.getSkillsSection();\n const updatedContent = this.replaceSkillsSection(existingContent, skillsSection);\n await FileSystemUtils.writeFile(agentsPath, updatedContent);\n } else {\n // Append Skills section before \"## Rules\" or at the end\n const skillsSection = await this.getSkillsSection();\n const updatedContent = this.appendSkillsSection(existingContent, skillsSection);\n await FileSystemUtils.writeFile(agentsPath, updatedContent);\n }\n }\n\n private replaceSkillsSection(existingContent: string, newSkillsSection: string): string {\n const startMarker = '## Skills System';\n \n const startIndex = existingContent.indexOf(startMarker);\n if (startIndex === -1) {\n return this.appendSkillsSection(existingContent, newSkillsSection);\n }\n\n // Find the end of Skills section (before next ## section or end of file)\n // Look for next ## that is not part of Skills section\n let endIndex = existingContent.indexOf('\\n## ', startIndex + startMarker.length);\n if (endIndex === -1) {\n // No next section, replace to end of file\n endIndex = existingContent.length;\n }\n\n // Replace the section\n const before = existingContent.substring(0, startIndex).trimEnd();\n const after = existingContent.substring(endIndex);\n return before + '\\n\\n' + newSkillsSection + (after.trimStart().startsWith('\\n') ? '' : '\\n\\n') + after;\n }\n\n private appendSkillsSection(existingContent: string, skillsSection: string): string {\n // Try to insert before \"## Rules\" section\n const rulesMarker = '\\n## Rules\\n';\n const rulesIndex = existingContent.indexOf(rulesMarker);\n \n if (rulesIndex !== -1) {\n const before = existingContent.substring(0, rulesIndex).trimEnd();\n const after = existingContent.substring(rulesIndex);\n return before + '\\n\\n' + skillsSection + '\\n\\n' + after;\n }\n\n // If no Rules section, try before any \"## Rules\" (without newline)\n const rulesMarker2 = '## Rules';\n const rulesIndex2 = existingContent.indexOf(rulesMarker2);\n if (rulesIndex2 !== -1 && rulesIndex2 > 0) {\n const before = existingContent.substring(0, rulesIndex2).trimEnd();\n const after = existingContent.substring(rulesIndex2);\n return before + '\\n\\n' + skillsSection + '\\n\\n' + after;\n }\n\n // If no Rules section, append at the end\n return existingContent.trimEnd() + '\\n\\n' + skillsSection;\n }\n\n\n private async getSkillsSection(): Promise<string> {\n return TemplateManager.getSkillsSection();\n }\n\n private async getSkillsReadmeTemplate(): Promise<string> {\n return `# Skills Directory\n\nThis directory contains reusable skills for HeraSpec projects.\n\n## What Are Skills?\n\nSkills are reusable patterns and workflows that help AI agents implement tasks consistently. Each skill contains:\n\n- **skill.md**: Complete guide on how to use the skill\n- **templates/**: Reusable templates\n- **scripts/**: Automation scripts\n- **examples/**: Good and bad examples\n\n## How Agents Use Skills\n\nWhen a task has a skill tag:\n\\`\\`\\`markdown\n## 1. Feature (projectType: perfex-module, skill: module-codebase)\n- [ ] Task 1.1\n\\`\\`\\`\n\nThe agent will:\n1. Find skill folder: \\`heraspec/skills/perfex-module/module-codebase/\\`\n2. Read \\`skill.md\\` to understand process\n3. Use templates and scripts from skill folder\n4. Follow guidelines in skill.md\n\n## Available Skills\n\nRun \\`heraspec skill list\\` to see all available skills.\n\n## UI/UX Skill - Creating Full Theme Packages\n\nThe **UI/UX skill** is particularly useful for creating complete website themes with multiple pages.\n\n### Quick Start\n\nWhen you need to create a full website package, use prompts like:\n\n\\`\\`\\`\nT\u1EA1o g\u00F3i website \u0111\u1EA7y \u0111\u1EE7 cho [PRODUCT_TYPE] v\u1EDBi style [STYLE_KEYWORDS].\nS\u1EED d\u1EE5ng skill ui-ux v\u1EDBi hybrid mode \u0111\u1EC3 search design intelligence.\nT\u1EA1o c\u00E1c trang: home, about, [other pages].\nStack: [html-tailwind/react/nextjs].\n\u0110\u1EA3m b\u1EA3o responsive, accessible, consistent design system.\n\\`\\`\\`\n\n### Prompt Templates\n\nFor detailed prompt examples and templates, see:\n- **Example Prompts**: \\`heraspec/skills/ui-ux/templates/example-prompt-full-theme.md\\`\n- **Prompt Templates**: \\`heraspec/skills/ui-ux/templates/prompt-template-full-theme.md\\`\n\nThese templates include:\n- Ready-to-use prompts for different website types (E-commerce, SaaS, Service, Blog, Portfolio)\n- Step-by-step instructions\n- Search command examples\n- Best practices\n\n### Search Modes\n\nUI/UX skill supports 3 search modes:\n- **BM25 (default)**: Fast keyword-based search, zero dependencies\n- **Vector**: Semantic search, ~15-20% better results (requires: \\`pip install sentence-transformers scikit-learn\\`)\n- **Hybrid**: Best of both, ~25% better results (requires: \\`pip install sentence-transformers scikit-learn\\`)\n\n**Usage:**\n\\`\\`\\`bash\n# BM25 (default)\npython3 heraspec/skills/ui-ux/scripts/search.py \"minimalism\" --domain style\n\n# Vector (semantic)\npython3 heraspec/skills/ui-ux/scripts/search.py \"elegant dark theme\" --domain style --mode vector\n\n# Hybrid (best)\npython3 heraspec/skills/ui-ux/scripts/search.py \"modern minimal design\" --domain style --mode hybrid\n\\`\\`\\`\n\n### Multi-Page Support\n\nDefault page set includes:\n1. Home\n2. About\n3. Post Details\n4. Category\n5. Pricing\n6. FAQ\n7. Contact\n8. Product Category (e-commerce)\n9. Product Details (e-commerce)\n\nSearch page types:\n\\`\\`\\`bash\npython3 heraspec/skills/ui-ux/scripts/search.py \"home homepage\" --domain pages\npython3 heraspec/skills/ui-ux/scripts/search.py \"pricing plans\" --domain pages\n\\`\\`\\`\n\n### Adding UI/UX Skill to Your Project\n\n1. Copy skill from HeraSpec core:\n \\`\\`\\`bash\n # Copy UI/UX skill\n cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/\n \\`\\`\\`\n\n2. Or use \\`heraspec skill add ui-ux\\` (if available)\n\n3. Read \\`heraspec/skills/ui-ux/ui-ux-skill.md\\` for complete documentation\n\n## Creating New Skills\n\n1. Create skill folder structure\n2. Write \\`skill.md\\` following the template\n3. Add templates, scripts, examples as needed\n\nSee \\`docs/SKILLS_STRUCTURE_PROPOSAL.md\\` for detailed structure.\n`;\n }\n\n private async getUIUXQuickReference(): Promise<string> {\n return `# UI/UX Skill - Quick Reference Guide\n\nQuick guide for creating prompts to build full theme packages with multiple pages using the ui-ux skill.\n\n## \uD83D\uDCCB Basic Prompt Template\n\n\\`\\`\\`\nCreate a complete website package for [PRODUCT_TYPE] with the following requirements:\n\n**Project Information:**\n- Product type: [SaaS / E-commerce / Service / Portfolio / etc.]\n- Style: [minimal / elegant / modern / bold / etc.]\n- Industry: [Healthcare / Fintech / Beauty / etc.]\n- Stack: [html-tailwind / react / nextjs / etc.]\n- Pages to create: home, about, [add other pages if needed]\n\n**Process:**\n1. Use skill ui-ux to search design intelligence with hybrid mode\n2. Create shared components first (Header, Footer, Button, Card)\n3. Implement pages in order\n4. Ensure consistency in colors, typography, spacing\n5. Verify with pre-delivery checklist\n\n**Quality Requirements:**\n- \u2705 Consistent design system\n- \u2705 Responsive (320px, 768px, 1024px, 1440px)\n- \u2705 Accessible (WCAG AA minimum)\n- \u2705 Performance optimized\n\\`\\`\\`\n\n## \uD83C\uDFAF Specific Prompt Examples\n\n### E-Commerce\n\\`\\`\\`\nCreate a complete website package for an online fashion store.\n\nProduct type: E-commerce Luxury\nStyle: elegant, premium, sophisticated\nStack: Next.js with Tailwind CSS\nPages: home, about, product category, product details, cart, checkout, thank you, faq, contact\n\nUse skill ui-ux with hybrid mode. Focus on conversion optimization.\n\\`\\`\\`\n\n### SaaS\n\\`\\`\\`\nCreate a complete website package for a project management SaaS platform.\n\nProduct type: SaaS (General)\nStyle: modern, clean, professional\nStack: React with Tailwind CSS\nPages: home, about, pricing, features, faq, contact, login, register, dashboard\n\nUse skill ui-ux with hybrid mode. Ensure professional and trustworthy.\n\\`\\`\\`\n\n### Service Business\n\\`\\`\\`\nCreate a complete website package for a healthcare service.\n\nProduct type: Beauty & Wellness Service\nStyle: elegant, minimal, soft, professional\nStack: html-tailwind\nPages: home, about, services, blog listing, post details, category, pricing, faq, contact\n\nUse skill ui-ux with hybrid mode. Focus on trust and credibility.\n\\`\\`\\`\n\n## \uD83D\uDD0D Search Modes\n\n### BM25 (Default)\n\\`\\`\\`bash\npython3 heraspec/skills/ui-ux/scripts/search.py \"minimalism\" --domain style\n\\`\\`\\`\n- \u2705 Fast, zero dependencies\n- \u2705 Best for exact keyword matches\n\n### Vector (Semantic)\n\\`\\`\\`bash\npython3 heraspec/skills/ui-ux/scripts/search.py \"elegant dark theme\" --domain style --mode vector\n\\`\\`\\`\n- \u2705 Understands meaning and synonyms\n- \u2705 ~15-20% better results\n- \u26A0\uFE0F Requires: \\`pip install sentence-transformers scikit-learn\\`\n\n### Hybrid (Best)\n\\`\\`\\`bash\npython3 heraspec/skills/ui-ux/scripts/search.py \"modern minimal design\" --domain style --mode hybrid\n\\`\\`\\`\n- \u2705 Combines BM25 + Vector\n- \u2705 ~25% better results\n- \u26A0\uFE0F Requires: \\`pip install sentence-transformers scikit-learn\\`\n\n## \uD83D\uDCC4 Default Page Set\n\nWhen creating a \"complete website package\", the default set includes 9 pages:\n\n1. **Home** - Main homepage\n2. **About** - Company/story page\n3. **Post Details** - Blog/article detail\n4. **Category** - Blog/category listing\n5. **Pricing** - Pricing plans\n6. **FAQ** - Frequently asked questions\n7. **Contact** - Contact form\n8. **Product Category** - E-commerce category (if applicable)\n9. **Product Details** - E-commerce product detail (if applicable)\n\n## \uD83D\uDD27 Search Page Types\n\n\\`\\`\\`bash\n# Home page\npython3 heraspec/skills/ui-ux/scripts/search.py \"home homepage\" --domain pages\n\n# About page\npython3 heraspec/skills/ui-ux/scripts/search.py \"about company story\" --domain pages\n\n# Pricing page\npython3 heraspec/skills/ui-ux/scripts/search.py \"pricing plans tiers\" --domain pages\n\n# E-commerce pages\npython3 heraspec/skills/ui-ux/scripts/search.py \"product-category shop catalog\" --domain pages\npython3 heraspec/skills/ui-ux/scripts/search.py \"product-detail single-product\" --domain pages\n\\`\\`\\`\n\n## \uD83D\uDCDA Detailed Documentation\n\nAfter copying UI/UX skill to your project, see:\n- \\`heraspec/skills/ui-ux/ui-ux-skill.md\\` - Complete skill documentation\n- \\`heraspec/skills/ui-ux/templates/example-prompt-full-theme.md\\` - Detailed prompt examples\n- \\`heraspec/skills/ui-ux/templates/prompt-template-full-theme.md\\` - Copy-paste templates\n\n## \uD83D\uDCA1 Tips\n\n1. **Always mention \"skill ui-ux\"** - Agent will know to use this skill\n2. **Encourage using hybrid mode** - Best results\n3. **List all pages clearly** - Agent knows exact scope\n4. **Require consistency** - Ensures unified design system\n5. **Mention pre-delivery checklist** - Agent will verify before delivering\n\n## \uD83D\uDE80 Quick Start\n\n1. Copy UI/UX skill to project:\n \\`\\`\\`bash\n cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/\n cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/\n \\`\\`\\`\n\n2. Use prompt template from above\n\n3. Agent will automatically:\n - Search design intelligence with skill ui-ux\n - Create shared components\n - Implement each page\n - Verify with checklist\n`;\n }\n\n /**\n * Update related markdown files in the project (README.md, etc.)\n */\n private async updateRelatedMarkdownFiles(projectPath: string): Promise<void> {\n // Update README.md if exists\n const readmePath = path.join(projectPath, 'README.md');\n if (await FileSystemUtils.fileExists(readmePath)) {\n await this.updateReadmeFile(readmePath);\n }\n }\n\n /**\n * Update README.md with HeraSpec information\n */\n private async updateReadmeFile(readmePath: string): Promise<void> {\n const existingContent = await FileSystemUtils.readFile(readmePath);\n const heraspecSection = this.getHeraSpecReadmeSection();\n\n // Check if HeraSpec section already exists\n const sectionMarkers = [\n '## HeraSpec',\n '## HeraSpec Development',\n '### HeraSpec',\n '### HeraSpec Development',\n '<!-- HeraSpec Section -->',\n ];\n\n let hasHeraSpecSection = false;\n let sectionStartIndex = -1;\n let sectionEndIndex = -1;\n\n for (const marker of sectionMarkers) {\n const index = existingContent.indexOf(marker);\n if (index !== -1) {\n hasHeraSpecSection = true;\n sectionStartIndex = index;\n // Find the end of the section (next ## or end of file)\n sectionEndIndex = existingContent.indexOf('\\n## ', index + marker.length);\n if (sectionEndIndex === -1) {\n sectionEndIndex = existingContent.indexOf('\\n### ', index + marker.length);\n }\n if (sectionEndIndex === -1) {\n sectionEndIndex = existingContent.length;\n }\n break;\n }\n }\n\n if (hasHeraSpecSection && sectionStartIndex !== -1) {\n // Update existing section\n const before = existingContent.substring(0, sectionStartIndex).trimEnd();\n const after = existingContent.substring(sectionEndIndex);\n const updatedContent = before + '\\n\\n' + heraspecSection + (after.trimStart().startsWith('\\n') ? '' : '\\n\\n') + after;\n await FileSystemUtils.writeFile(readmePath, updatedContent);\n } else {\n // Add new section\n // Try to insert before common sections like \"## Development\", \"## Setup\", \"## Contributing\"\n const insertBeforeMarkers = [\n '\\n## Development',\n '\\n## Setup',\n '\\n## Contributing',\n '\\n## Installation',\n '\\n## Getting Started',\n ];\n\n let inserted = false;\n for (const marker of insertBeforeMarkers) {\n const index = existingContent.indexOf(marker);\n if (index !== -1) {\n const before = existingContent.substring(0, index).trimEnd();\n const after = existingContent.substring(index);\n const updatedContent = before + '\\n\\n' + heraspecSection + '\\n\\n' + after;\n await FileSystemUtils.writeFile(readmePath, updatedContent);\n inserted = true;\n break;\n }\n }\n\n if (!inserted) {\n // Append at the end\n const updatedContent = existingContent.trimEnd() + '\\n\\n' + heraspecSection;\n await FileSystemUtils.writeFile(readmePath, updatedContent);\n }\n }\n }\n\n /**\n * Get HeraSpec section content for README.md\n */\n private getHeraSpecReadmeSection(): string {\n return `<!-- HeraSpec Section -->\n## HeraSpec Development\n\nThis project uses [HeraSpec](https://github.com/your-org/heraspec) for spec-driven development.\n\n### Quick Start\n\n\\`\\`\\`bash\n# Initialize HeraSpec (if not already done)\nheraspec init\n\n# List active changes\nheraspec list\n\n# View a change\nheraspec show <change-name>\n\n# Validate changes\nheraspec validate <change-name>\n\\`\\`\\`\n\n### Project Structure\n\n- \\`heraspec/project.md\\` - Project overview and configuration\n- \\`heraspec/specs/\\` - Source of truth specifications\n- \\`heraspec/changes/\\` - Active changes in progress\n- \\`heraspec/skills/\\` - Reusable skills for AI agents\n- \\`AGENTS.heraspec.md\\` - AI agent instructions\n\n### Working with Changes\n\n1. **Create a change**: Ask AI to create a HeraSpec change, or create manually\n2. **Refine specs**: Review and update delta specs in \\`heraspec/specs/<change-name>/\\`\n3. **Implement**: Follow tasks in \\`heraspec/changes/<change-name>/tasks.md\\`\n4. **Archive**: Run \\`heraspec archive <change-name> --yes\\` when complete\n\n### Skills\n\nAdd skills to your project:\n\n\\`\\`\\`bash\n# List available skills\nheraspec skill list\n\n# Add a skill\nheraspec skill add ui-ux\nheraspec skill add unit-test\n\n# View skill details\nheraspec skill show ui-ux\n\\`\\`\\`\n\nFor more information, see the [HeraSpec documentation](https://github.com/your-org/heraspec/docs).\n\n---\n\n*This section is automatically updated by \\`heraspec init\\`. Last updated: ${new Date().toISOString().split('T')[0]}*`;\n }\n}\n\n", "/**\n * File system utilities for HeraSpec\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\n\nexport class FileSystemUtils {\n static async createDirectory(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n }\n\n static async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n static async readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n }\n\n static async writeFile(filePath: string, content: string): Promise<void> {\n await fs.writeFile(filePath, content, 'utf-8');\n }\n\n static async readDirectory(dirPath: string): Promise<string[]> {\n return await fs.readdir(dirPath);\n }\n\n static async stat(filePath: string) {\n return await fs.stat(filePath);\n }\n\n static async copyFile(src: string, dest: string): Promise<void> {\n await fs.copyFile(src, dest);\n }\n\n static async copyDirectory(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await this.copyDirectory(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n }\n\n static async removeFile(filePath: string): Promise<void> {\n await fs.unlink(filePath);\n }\n\n static async removeDirectory(dirPath: string, recursive = true): Promise<void> {\n // Use fs.rm for Node.js 14.14.0+ (fs.rmdir with recursive is deprecated)\n // Fallback to fs.rmdir for older versions\n if (typeof (fs as any).rm === 'function') {\n await (fs as any).rm(dirPath, { recursive, force: true });\n } else {\n await fs.rmdir(dirPath, { recursive });\n }\n }\n\n static async moveFile(src: string, dest: string): Promise<void> {\n await fs.rename(src, dest);\n }\n\n static joinPath(...segments: string[]): string {\n return path.join(...segments);\n }\n\n static resolvePath(...segments: string[]): string {\n return path.resolve(...segments);\n }\n\n static getDirectoryName(filePath: string): string {\n return path.dirname(filePath);\n }\n\n static getBaseName(filePath: string): string {\n return path.basename(filePath);\n }\n}\n", "/**\n * HeraSpec Templates\n */\n\nexport const PROJECT_TEMPLATE = `# HeraSpec Project\n\n## Overview\nDescribe your project here.\n\n## Project Types\n- wordpress-plugin\n- wordpress-theme\n- perfex-module\n- laravel-package\n- node-service\n- generic-webapp\n- backend-api\n- frontend-app\n- multi-stack\n\n## Tech Stack\nList your technologies here (e.g., PHP 8.1, WordPress 6.0, Laravel 10, etc.)\n\n## Conventions\nDefine coding standards, architectural patterns, and conventions to follow.\n\n`;\n\nexport const AGENTS_TEMPLATE = `# HeraSpec \u2014 AI Agent Instructions\n\nThis document defines the workflow for AI agents working with HeraSpec.\n\n## Core Workflow\n\n### Step 1 \u2014 Create a Change\n\n**When creating changes, ALWAYS read heraspec/project.md first to understand:**\n- Project types being used\n- Tech stack and conventions\n- Existing architecture patterns\n- Coding standards\n\n**Then scaffold:**\n- \\`heraspec/changes/<slug>/\\` - Create proposal.md, tasks.md, design.md (optional)\n- \\`heraspec/specs/<slug>/\\` - Create delta specs here (NOT inside changes folder)\n\n**If user asks to create changes based on project.md:**\n1. Read \\`heraspec/project.md\\` thoroughly\n2. Identify all features/capabilities mentioned\n3. Create separate changes for each major feature\n4. Ensure each change follows project.md conventions\n5. Use correct project types and skills from project.md\n\n### Step 2 \u2014 Refine Specs\n- Update delta specs in \\`heraspec/specs/<slug>/\\`\n- Never modify source-of-truth specs directly\n\n### Step 3 \u2014 Approval\n- Wait for user: \"Specs approved.\"\n\n### Step 4 \u2014 Implementation\n\n**CRITICAL: When implementing tasks, ALWAYS use Skills system:**\n\n1. **Read task line** to identify skill:\n \\`\\`\\`markdown\n ## 1. Perfex module \u2013 Category Management (projectType: perfex-module, skill: module-codebase)\n - [ ] 1.1 Create module structure\n \\`\\`\\`\n\n2. **Find skill folder**:\n - Project-specific: \\`heraspec/skills/<project-type>/<skill-name>/\\`\n - Cross-cutting: \\`heraspec/skills/<skill-name>/\\`\n\n3. **Read skill.md**:\n - Understand purpose, steps, inputs, outputs\n - Follow tone, rules, and limitations\n - Check available templates and scripts\n\n4. **Use skill resources**:\n - Run scripts from \\`scripts/\\` folder if needed\n - Use templates from \\`templates/\\` folder\n - Reference examples from \\`examples/\\` folder\n\n5. **Implement following skill.md guidance**:\n - Follow step-by-step process\n - Use correct naming conventions\n - Apply code style rules\n - Respect limitations\n\n**Example workflow:**\n- Task: \\`(projectType: perfex-module, skill: module-codebase)\\`\n- Agent reads: \\`heraspec/skills/perfex-module/module-codebase/skill.md\\`\n- Agent follows: Steps, uses templates, runs scripts\n- Agent implements: According to skill.md guidelines\n\n**Special case - UI/UX skill:**\n- Task: \\`(skill: ui-ux)\\`\n- Agent reads: \\`heraspec/skills/ui-ux/skill.md\\`\n- Agent MUST use search scripts before implementing:\n \\`\\`\\`bash\n # Search for design intelligence\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --domain <domain>\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --stack <stack>\n \\`\\`\\`\n- Agent synthesizes search results\n- Agent implements with proper colors, fonts, styles from search results\n- Agent verifies with pre-delivery checklist\n\n- Follow tasks.md\n- Mark tasks completed: \\`- [x]\\`\n\n### Step 5 \u2014 Archive\n- Run: \\`heraspec archive <slug> --yes\\`\n- This merges delta specs into source specs\n- Moves change folder to archives\n\n## Spec Format\n\nSpecs must include:\n- \\`## Meta\\` section with project type, domain, stack\n- \\`## Purpose\\`\n- \\`## Requirements\\` with scenarios\n\n## Delta Spec Format\n\nDelta specs use:\n- \\`## ADDED Requirements\\`\n- \\`## MODIFIED Requirements\\`\n- \\`## REMOVED Requirements\\`\n\n## Tasks Format\n\nTasks grouped by project type and skill:\n\\`\\`\\`\n## 1. WordPress plugin \u2013 admin settings page (projectType: wordpress-plugin, skill: admin-settings-page)\n- [ ] Task description\n\\`\\`\\`\n\n## Skills System\n\n**CRITICAL: Always use Skills when implementing tasks!**\n\n### How Skills Work\n\n1. **Tasks reference skills**: \\`(projectType: perfex-module, skill: module-codebase)\\`\n2. **Find skill folder**: \n - Project-specific: \\`heraspec/skills/<project-type>/<skill-name>/\\`\n - Cross-cutting: \\`heraspec/skills/<skill-name>/\\`\n3. **Read skill.md**: Understand purpose, steps, inputs, outputs, rules\n4. **Use skill resources**: Scripts, templates, examples\n5. **Implement following skill.md**: Follow step-by-step process\n\n### Skill Discovery\n\n- List all skills: Check \\`heraspec/skills/\\` directory\n- Project-specific skills: \\`heraspec/skills/<project-type>/\\`\n- Cross-cutting skills: \\`heraspec/skills/<skill-name>/\\` (root level)\n\n### When Change Has Multiple Skills\n\n**Important**: Each task group uses ONE skill. When working on a task group, agent MUST use that skill's skill.md.\n\nExample with multiple skills in one change:\n\\`\\`\\`\n## 1. Perfex module \u2013 Feature (projectType: perfex-module, skill: module-codebase)\n- [ ] Task 1.1 Create module structure\n- [ ] Task 1.2 Configure registration\n\n## 2. UI/UX \u2013 Admin Interface (skill: ui-ux)\n- [ ] Task 2.1 Design color palette\n- [ ] Task 2.2 Create component styles\n\n## 3. Documents \u2013 User Guide (skill: documents)\n- [ ] Task 3.1 Write technical docs\n\\`\\`\\`\n\n**Agent workflow:**\n1. **For task group 1** (module-codebase):\n - Read: \\`heraspec/skills/perfex-module/module-codebase/skill.md\\`\n - Follow: Module codebase process\n - Use: Module codebase templates/scripts\n - Implement: Tasks 1.1, 1.2\n\n2. **For task group 2** (ui-ux):\n - Read: \\`heraspec/skills/ui-ux/skill.md\\`\n - Follow: UI/UX process\n - Use: UI/UX templates/scripts\n - Implement: Tasks 2.1, 2.2\n\n3. **For task group 3** (documents):\n - Read: \\`heraspec/skills/documents/skill.md\\`\n - Follow: Documents process\n - Use: Documents templates/scripts\n - Implement: Task 3.1\n\n**Key rule**: Switch skill.md when switching task groups!\n\n## Rules\n\n1. **Specs first, tasks second, implementation last.**\n2. **Always use Skills**: When task has skill tag, MUST read and follow skill.md\n3. Never modify source-of-truth specs directly.\n4. Delta specs go in \\`heraspec/specs/<slug>/\\` (NOT in changes folder).\n5. Always wait for approval before implementation.\n6. **One skill per task group**: Each task group should use one skill consistently.\n\n`;\n\nexport const SKILLS_SECTION_TEMPLATE = `## Skills System\n\n**CRITICAL: When implementing tasks, ALWAYS use Skills system:**\n\n1. **Read task line** to identify skill:\n \\`\\`\\`markdown\n ## 1. Perfex module \u2013 Category Management (projectType: perfex-module, skill: module-codebase)\n - [ ] 1.1 Create module structure\n \\`\\`\\`\n\n2. **Find skill folder**:\n - Project-specific: \\`heraspec/skills/<project-type>/<skill-name>/\\`\n - Cross-cutting: \\`heraspec/skills/<skill-name>/\\`\n\n3. **Read skill.md**:\n - Understand purpose, steps, inputs, outputs\n - Follow tone, rules, and limitations\n - Check available templates and scripts\n\n4. **Use skill resources**:\n - Run scripts from \\`scripts/\\` folder if needed\n - Use templates from \\`templates/\\` folder\n - Reference examples from \\`examples/\\` folder\n\n5. **Implement following skill.md guidance**:\n - Follow step-by-step process\n - Use correct naming conventions\n - Apply code style rules\n - Respect limitations\n\n**Example workflow:**\n- Task: \\`(projectType: perfex-module, skill: module-codebase)\\`\n- Agent reads: \\`heraspec/skills/perfex-module/module-codebase/skill.md\\`\n- Agent follows: Steps, uses templates, runs scripts\n- Agent implements: According to skill.md guidelines\n\n**Special case - UI/UX skill:**\n- Task: \\`(skill: ui-ux)\\`\n- Agent reads: \\`heraspec/skills/ui-ux/skill.md\\`\n- Agent MUST use search scripts before implementing:\n \\`\\`\\`bash\n # Search for design intelligence (BM25 - default, fast)\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --domain <domain>\n \n # For better semantic results, use Vector or Hybrid mode:\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --domain <domain> --mode vector\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --domain <domain> --mode hybrid\n \n # Stack-specific search\n python3 heraspec/skills/ui-ux/scripts/search.py \"<keyword>\" --stack <stack>\n \\`\\`\\`\n- **Search Modes:**\n - **BM25 (default)**: Fast keyword-based search, zero dependencies\n - **Vector**: Semantic search, ~15-20% better results (requires: pip install sentence-transformers scikit-learn)\n - **Hybrid**: Best of both, ~25% better results (requires: pip install sentence-transformers scikit-learn)\n- Agent synthesizes search results\n- Agent implements with proper colors, fonts, styles from search results\n- Agent verifies with pre-delivery checklist\n\n### Skill Discovery\n\n- List all skills: Check \\`heraspec/skills/\\` directory\n- Project-specific skills: \\`heraspec/skills/<project-type>/\\`\n- Cross-cutting skills: \\`heraspec/skills/<skill-name>/\\` (root level)\n\n### When Change Has Multiple Skills\n\n**Important**: Each task group uses ONE skill. When working on a task group, agent MUST use that skill's skill.md.\n\nExample with multiple skills in one change:\n\\`\\`\\`\n## 1. Perfex module \u2013 Feature (projectType: perfex-module, skill: module-codebase)\n- [ ] Task 1.1 Create module structure\n- [ ] Task 1.2 Configure registration\n\n## 2. UI/UX \u2013 Admin Interface (skill: ui-ux)\n- [ ] Task 2.1 Design color palette\n- [ ] Task 2.2 Create component styles\n\n## 3. Documents \u2013 User Guide (skill: documents)\n- [ ] Task 3.1 Write technical docs\n\\`\\`\\`\n\n**Agent workflow:**\n1. **For task group 1** (module-codebase):\n - Read: \\`heraspec/skills/perfex-module/module-codebase/skill.md\\`\n - Follow: Module codebase process\n - Use: Module codebase templates/scripts\n - Implement: Tasks 1.1, 1.2\n\n2. **For task group 2** (ui-ux):\n - Read: \\`heraspec/skills/ui-ux/skill.md\\`\n - Follow: UI/UX process\n - Use: UI/UX templates/scripts\n - Implement: Tasks 2.1, 2.2\n\n3. **For task group 3** (documents):\n - Read: \\`heraspec/skills/documents/skill.md\\`\n - Follow: Documents process\n - Use: Documents templates/scripts\n - Implement: Task 3.1\n\n**Key rule**: Switch skill.md when switching task groups!\n`;\n\nexport const CONFIG_TEMPLATE = `# HeraSpec Configuration\n\nprojectTypes:\n - wordpress-plugin\n # Add other project types as needed\n\ndefaultDomain: global\n\n`;\n\n\nexport function getSkillsSection(): string {\n return SKILLS_SECTION_TEMPLATE;\n}\n\nexport const PROPOSAL_TEMPLATE = `# Change Proposal: <slug>\n\n## Purpose\nDescribe why this change is needed.\n\n## Scope\nWhat will be changed?\n\n## Project Types\n- wordpress-plugin\n- perfex-module\n\n## Impact\nWhat parts of the system will be affected?\n\n`;\n\nexport const TASKS_TEMPLATE = `# Tasks\n\n## 1. WordPress plugin \u2013 feature name (projectType: wordpress-plugin, skill: admin-settings-page)\n- [ ] Task 1.1\n- [ ] Task 1.2\n\n## 2. Perfex module \u2013 feature name (projectType: perfex-module, skill: module-registration)\n- [ ] Task 2.1\n\n`;\n\nexport class TemplateManager {\n static getProjectTemplate(): string {\n return PROJECT_TEMPLATE;\n }\n\n static getAgentsTemplate(): string {\n return AGENTS_TEMPLATE;\n }\n\n static getConfigTemplate(): string {\n return CONFIG_TEMPLATE;\n }\n\n static getProposalTemplate(slug: string): string {\n return PROPOSAL_TEMPLATE.replace('<slug>', slug);\n }\n\n static getTasksTemplate(): string {\n return TASKS_TEMPLATE;\n }\n\n static getSkillsSection(): string {\n return SKILLS_SECTION_TEMPLATE;\n }\n}\n\n", "/**\n * HeraSpec Core Configuration\n */\n\nexport const HERASPEC_DIR_NAME = 'heraspec';\nexport const SPECS_DIR_NAME = 'specs';\nexport const CHANGES_DIR_NAME = 'changes';\nexport const ARCHIVES_DIR_NAME = 'archives';\nexport const SKILLS_DIR_NAME = 'skills';\n\nexport const PROJECT_TYPES = [\n 'wordpress-plugin',\n 'wordpress-theme',\n 'perfex-module',\n 'laravel-package',\n 'node-service',\n 'generic-webapp',\n 'backend-api',\n 'frontend-app',\n 'multi-stack',\n] as const;\n\nexport type ProjectType = (typeof PROJECT_TYPES)[number];\n\nexport const SKILLS: Record<ProjectType, string[]> = {\n 'wordpress-plugin': [\n 'admin-settings-page',\n 'custom-post-type',\n 'shortcode',\n 'rest-endpoint',\n 'ajax-handler',\n 'activation-hook',\n 'deactivation-hook',\n 'admin-menu-item',\n 'meta-box',\n 'taxonomy',\n ],\n 'wordpress-theme': [\n 'theme-setup',\n 'custom-post-type',\n 'template-part',\n 'widget-area',\n 'customizer-setting',\n 'theme-option',\n ],\n 'perfex-module': [\n 'module-codebase',\n 'module-registration',\n 'permission-group',\n 'admin-menu-item',\n 'login-hook',\n 'database-table',\n 'api-endpoint',\n ],\n 'laravel-package': [\n 'service-provider',\n 'config-file',\n 'artisan-command',\n 'migration',\n 'model',\n 'controller',\n 'middleware',\n 'route',\n ],\n 'node-service': [\n 'express-route',\n 'middleware',\n 'database-model',\n 'service-layer',\n 'api-endpoint',\n 'background-job',\n ],\n 'generic-webapp': [\n 'page',\n 'component',\n 'api-endpoint',\n 'database-table',\n 'authentication',\n 'authorization',\n ],\n 'backend-api': [\n 'endpoint',\n 'middleware',\n 'authentication',\n 'authorization',\n 'database-model',\n 'validation',\n ],\n 'frontend-app': [\n 'page',\n 'component',\n 'route',\n 'store',\n 'service',\n 'hook',\n ],\n 'multi-stack': [\n 'cross-platform-feature',\n 'api-contract',\n 'shared-type',\n 'integration-point',\n ],\n} as const;\n\nexport type Skill = typeof SKILLS[ProjectType][number];\n\nexport interface HeraSpecConfig {\n projectType?: ProjectType | ProjectType[];\n domains?: string[];\n stack?: string[];\n}\n\nexport interface SpecMeta {\n projectType?: ProjectType | ProjectType[];\n domain?: string;\n stack?: string | string[];\n}\n\nexport const HERASPEC_MARKERS = {\n PROJECT_MD: 'project.md',\n AGENTS_MD: 'AGENTS.heraspec.md',\n CONFIG_YAML: 'config.yaml',\n PROPOSAL_MD: 'proposal.md',\n TASKS_MD: 'tasks.md',\n DESIGN_MD: 'design.md',\n} as const;\n\n", "/**\n * HeraSpec List Command\n * Lists changes or specs\n */\nimport path from 'path';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { HERASPEC_DIR_NAME, CHANGES_DIR_NAME, SPECS_DIR_NAME, ARCHIVES_DIR_NAME } from './config.js';\n\nexport class ListCommand {\n async execute(\n targetPath: string = '.',\n mode: 'changes' | 'specs' = 'changes'\n ): Promise<void> {\n const heraspecPath = path.join(targetPath, HERASPEC_DIR_NAME);\n\n if (mode === 'changes') {\n await this.listChanges(heraspecPath);\n } else {\n await this.listSpecs(heraspecPath);\n }\n }\n\n private async listChanges(heraspecPath: string): Promise<void> {\n const changesDir = path.join(heraspecPath, CHANGES_DIR_NAME);\n\n try {\n await FileSystemUtils.stat(changesDir);\n } catch {\n console.log('No HeraSpec changes directory found. Run \"heraspec init\" first.');\n return;\n }\n\n const entries = await FileSystemUtils.readDirectory(changesDir);\n const changeDirs: string[] = [];\n\n for (const entry of entries) {\n const entryPath = path.join(changesDir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n if (stats.isDirectory() && entry !== ARCHIVES_DIR_NAME) {\n changeDirs.push(entry);\n }\n }\n\n if (changeDirs.length === 0) {\n console.log('No active changes found.');\n return;\n }\n\n changeDirs.sort();\n\n console.log('\\nActive changes:');\n console.log('\u2500'.repeat(50));\n for (const change of changeDirs) {\n console.log(` \u2022 ${change}`);\n }\n console.log();\n }\n\n private async listSpecs(heraspecPath: string): Promise<void> {\n const specsDir = path.join(heraspecPath, SPECS_DIR_NAME);\n\n try {\n await FileSystemUtils.stat(specsDir);\n } catch {\n console.log('No HeraSpec specs directory found. Run \"heraspec init\" first.');\n return;\n }\n\n const specs = await this.findSpecFiles(specsDir, '');\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n specs.sort();\n\n console.log('\\nSpecs:');\n console.log('\u2500'.repeat(50));\n for (const spec of specs) {\n console.log(` \u2022 ${spec}`);\n }\n console.log();\n }\n\n private async findSpecFiles(dir: string, prefix: string): Promise<string[]> {\n const specs: string[] = [];\n const entries = await FileSystemUtils.readDirectory(dir);\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n const subSpecs = await this.findSpecFiles(\n entryPath,\n prefix ? `${prefix}/${entry}` : entry\n );\n specs.push(...subSpecs);\n } else if (entry === 'spec.md') {\n specs.push(prefix || 'global');\n }\n }\n\n return specs;\n }\n}\n\n", "/**\n * HeraSpec Archive Command\n * Archives a change and merges delta specs into source specs\n */\nimport path from 'path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport {\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n ARCHIVES_DIR_NAME,\n SPECS_DIR_NAME,\n} from './config.js';\nimport { MarkdownParser } from './parsers/markdown-parser.js';\n\nexport class ArchiveCommand {\n async execute(changeName?: string, options?: { yes?: boolean }): Promise<void> {\n if (!changeName) {\n console.error('Error: Please specify a change name');\n console.log('Usage: heraspec archive <change-name> [--yes]');\n process.exitCode = 1;\n return;\n }\n\n const changePath = path.join('.', HERASPEC_DIR_NAME, CHANGES_DIR_NAME, changeName);\n\n if (!(await FileSystemUtils.fileExists(changePath))) {\n console.error(`Error: Change \"${changeName}\" not found`);\n process.exitCode = 1;\n return;\n }\n\n // Confirm if not --yes\n if (!options?.yes) {\n console.log(`\\nThis will archive \"${changeName}\" and merge delta specs into source specs.`);\n console.log('This action cannot be undone.\\n');\n // In a real implementation, you'd prompt here\n // For now, we'll require --yes flag\n console.error('Error: Please use --yes flag to confirm');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora({\n text: `Archiving change \"${changeName}\"...`,\n color: 'blue',\n }).start();\n\n try {\n // 1. Merge delta specs into source specs\n await this.mergeDeltaSpecs(changePath, changeName);\n\n // 2. Remove specs directory after merge (specs are now in source specs)\n const specsDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n changeName\n );\n if (await FileSystemUtils.fileExists(specsDir)) {\n await FileSystemUtils.removeDirectory(specsDir, true);\n }\n\n // 3. Create archive directory with date prefix\n const archiveDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n ARCHIVES_DIR_NAME\n );\n await FileSystemUtils.createDirectory(archiveDir);\n\n const datePrefix = new Date().toISOString().split('T')[0];\n const archivePath = path.join(archiveDir, `${datePrefix}-${changeName}`);\n\n // 4. Move change to archive\n await FileSystemUtils.createDirectory(archivePath);\n await this.moveChangeToArchive(changePath, archivePath);\n\n // 5. Remove original change directory\n await FileSystemUtils.removeDirectory(changePath, true);\n\n spinner.succeed(chalk.green(`Change \"${changeName}\" archived successfully`));\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${(error as Error).message}`));\n throw error;\n }\n }\n\n private async mergeDeltaSpecs(changePath: string, changeName: string): Promise<void> {\n // Specs are now in heraspec/specs/<changeName>/ instead of heraspec/changes/<changeName>/specs/\n const deltaSpecsDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n changeName\n );\n \n if (!(await FileSystemUtils.fileExists(deltaSpecsDir))) {\n return; // No delta specs to merge\n }\n\n const deltaSpecs = await this.findDeltaSpecFiles(deltaSpecsDir);\n\n for (const deltaSpec of deltaSpecs) {\n // Calculate relative path from specs/<changeName>/\n const relativePath = path.relative(deltaSpecsDir, deltaSpec.path);\n // Target is in specs/ (source of truth), maintaining the same relative path structure\n const targetSpecPath = path.join(\n '.',\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n relativePath\n );\n\n // Read delta spec\n const deltaContent = await FileSystemUtils.readFile(deltaSpec.path);\n const parser = new MarkdownParser(deltaContent);\n const delta = parser.parseDeltaSpec(deltaContent);\n\n // Read or create target spec\n let targetContent = '';\n if (await FileSystemUtils.fileExists(targetSpecPath)) {\n targetContent = await FileSystemUtils.readFile(targetSpecPath);\n }\n\n // Merge delta into target\n const mergedContent = this.mergeDeltaIntoSpec(targetContent, delta, deltaSpec.name);\n\n // Ensure directory exists\n await FileSystemUtils.createDirectory(path.dirname(targetSpecPath));\n\n // Write merged spec\n await FileSystemUtils.writeFile(targetSpecPath, mergedContent);\n }\n }\n\n private mergeDeltaIntoSpec(\n existingContent: string,\n delta: { added: any[]; modified: any[]; removed: any[] },\n specName: string\n ): string {\n // Simple merge implementation\n // In a real implementation, this would be more sophisticated\n \n let merged = existingContent || `# Spec: ${specName}\\n\\n## Purpose\\n\\n## Requirements\\n\\n`;\n\n // Add new requirements\n if (delta.added.length > 0) {\n merged += '\\n## ADDED Requirements\\n\\n';\n for (const req of delta.added) {\n merged += `### Requirement: ${req.name}\\n${req.description}\\n\\n`;\n }\n }\n\n // Note: Full merge logic would require more sophisticated parsing\n // For now, this is a basic implementation\n \n return merged;\n }\n\n private async moveChangeToArchive(sourcePath: string, archivePath: string): Promise<void> {\n const entries = await FileSystemUtils.readDirectory(sourcePath);\n\n for (const entry of entries) {\n const sourceEntry = path.join(sourcePath, entry);\n const archiveEntry = path.join(archivePath, entry);\n const stats = await FileSystemUtils.stat(sourceEntry);\n\n if (stats.isDirectory()) {\n await FileSystemUtils.createDirectory(archiveEntry);\n await this.moveChangeToArchive(sourceEntry, archiveEntry);\n } else {\n await FileSystemUtils.moveFile(sourceEntry, archiveEntry);\n }\n }\n }\n\n private async findDeltaSpecFiles(\n dir: string,\n prefix = ''\n ): Promise<Array<{ name: string; path: string }>> {\n const specs: Array<{ name: string; path: string }> = [];\n const entries = await FileSystemUtils.readDirectory(dir);\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n const subSpecs = await this.findDeltaSpecFiles(\n entryPath,\n prefix ? `${prefix}/${entry}` : entry\n );\n specs.push(...subSpecs);\n } else if (entry.endsWith('.md')) {\n specs.push({\n name: prefix || path.basename(entry, '.md'),\n path: entryPath,\n });\n }\n }\n\n return specs;\n }\n}\n\n", "/**\n * Markdown Parser for HeraSpec\n * Handles parsing of specs with Meta section, project types, and delta specs\n */\nimport { z } from 'zod';\nimport { Spec, RequirementSchema } from '../schemas/index.js';\nimport { SpecMeta } from '../config.js';\n\ninterface Section {\n level: number;\n title: string;\n content: string[];\n}\n\nexport class MarkdownParser {\n private lines: string[];\n\n constructor(content: string) {\n this.lines = MarkdownParser.normalizeContent(content).split('\\n');\n }\n\n protected static normalizeContent(content: string): string {\n return content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n parseSpec(name: string): Spec {\n const sections = this.parseSections();\n const meta = this.parseMeta(sections);\n const purpose = this.findSection(sections, 'Purpose')?.content.join('\\n').trim() || '';\n const requirementsSection = this.findSection(sections, 'Requirements');\n\n if (!purpose) {\n throw new Error('Spec must have a Purpose section');\n }\n\n if (!requirementsSection) {\n throw new Error('Spec must have a Requirements section');\n }\n\n const requirements = this.parseRequirements(requirementsSection);\n\n return {\n name,\n meta,\n overview: purpose.trim(),\n requirements,\n metadata: {\n version: '1.0.0',\n format: 'heraspec',\n },\n };\n }\n\n parseDeltaSpec(content: string): {\n added: any[];\n modified: any[];\n removed: any[];\n } {\n const sections = this.parseSections();\n const added = this.findSection(sections, 'ADDED Requirements');\n const modified = this.findSection(sections, 'MODIFIED Requirements');\n const removed = this.findSection(sections, 'REMOVED Requirements');\n\n return {\n added: added ? this.parseDeltaRequirements(added) : [],\n modified: modified ? this.parseDeltaRequirements(modified) : [],\n removed: removed ? this.parseDeltaRequirements(removed) : [],\n };\n }\n\n private parseMeta(sections: Section[]): SpecMeta | undefined {\n const metaSection = this.findSection(sections, 'Meta');\n if (!metaSection) {\n return undefined;\n }\n\n const meta: SpecMeta = {};\n const content = metaSection.content.join('\\n');\n\n // Parse project type\n const projectTypeMatch = content.match(/project type:\\s*(.+)/i);\n if (projectTypeMatch) {\n const types = projectTypeMatch[1].split('|').map(t => t.trim());\n meta.projectType = types.length === 1 ? types[0] : types;\n }\n\n // Parse domain\n const domainMatch = content.match(/domain:\\s*(.+)/i);\n if (domainMatch) {\n meta.domain = domainMatch[1].trim();\n }\n\n // Parse stack\n const stackMatch = content.match(/stack:\\s*(.+)/i);\n if (stackMatch) {\n const stacks = stackMatch[1].split('|').map(s => s.trim());\n meta.stack = stacks.length === 1 ? stacks[0] : stacks;\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n }\n\n private parseSections(): Section[] {\n const sections: Section[] = [];\n let currentSection: Section | null = null;\n\n for (const line of this.lines) {\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headerMatch) {\n if (currentSection) {\n sections.push(currentSection);\n }\n currentSection = {\n level: headerMatch[1].length,\n title: headerMatch[2].trim(),\n content: [],\n };\n } else if (currentSection) {\n currentSection.content.push(line);\n }\n }\n\n if (currentSection) {\n sections.push(currentSection);\n }\n\n return sections;\n }\n\n private findSection(sections: Section[], title: string): Section | undefined {\n return sections.find(s => \n s.title.toLowerCase() === title.toLowerCase() ||\n s.title.toLowerCase().includes(title.toLowerCase())\n );\n }\n\n private parseRequirements(section: Section): z.infer<typeof RequirementSchema>[] {\n const requirements: z.infer<typeof RequirementSchema>[] = [];\n const lines = section.content;\n\n let currentRequirement: {\n name: string;\n description: string;\n scenarios: any[];\n constraints?: string[];\n } | null = null;\n\n let inRequirement = false;\n let inScenario = false;\n let currentScenario: { name: string; steps: string[] } | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Check for requirement header\n const reqMatch = line.match(/^###\\s+Requirement:\\s*(.+)$/i);\n if (reqMatch) {\n if (currentRequirement) {\n requirements.push(currentRequirement as any);\n }\n currentRequirement = {\n name: reqMatch[1].trim(),\n description: '',\n scenarios: [],\n };\n inRequirement = true;\n continue;\n }\n\n // Check for scenario header\n const scenarioMatch = line.match(/^####\\s+Scenario:\\s*(.+)$/i);\n if (scenarioMatch && currentRequirement) {\n if (currentScenario) {\n currentRequirement.scenarios.push(currentScenario);\n }\n currentScenario = {\n name: scenarioMatch[1].trim(),\n steps: [],\n };\n inScenario = true;\n continue;\n }\n\n // Check for GIVEN/WHEN/THEN steps\n if (currentScenario && (line.match(/^-\\s*(GIVEN|WHEN|THEN|AND|BUT)\\s+/i))) {\n const step = line.replace(/^-\\s*/, '').trim();\n currentScenario.steps.push(step);\n continue;\n }\n\n // Regular content line\n if (currentRequirement && !inScenario) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n currentRequirement.description += (currentRequirement.description ? '\\n' : '') + trimmed;\n }\n }\n }\n\n // Add final requirement and scenario\n if (currentScenario && currentRequirement) {\n currentRequirement.scenarios.push(currentScenario);\n }\n if (currentRequirement) {\n requirements.push(currentRequirement as any);\n }\n\n return requirements;\n }\n\n private parseDeltaRequirements(section: Section): any[] {\n // Similar to parseRequirements but expects ADDED/MODIFIED/REMOVED markers\n return this.parseRequirements(section);\n }\n}\n\n", "/**\n * HeraSpec Restore Command\n * Restores an archived change back to active changes\n */\nimport path from 'path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport {\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n ARCHIVES_DIR_NAME,\n} from './config.js';\n\nexport class RestoreCommand {\n async execute(archiveName?: string, options?: { yes?: boolean }): Promise<void> {\n const archivesDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n ARCHIVES_DIR_NAME\n );\n\n // Check if archives directory exists\n if (!(await FileSystemUtils.fileExists(archivesDir))) {\n console.error('Error: No archives directory found. No archives to restore.');\n process.exitCode = 1;\n return;\n }\n\n // List available archives if name not provided\n if (!archiveName) {\n const archives = await this.listArchives(archivesDir);\n if (archives.length === 0) {\n console.log('No archived changes found.');\n return;\n }\n\n console.log('\\nAvailable archives:');\n console.log('\u2500'.repeat(60));\n archives.forEach((archive, index) => {\n console.log(`${index + 1}. ${archive}`);\n });\n console.log();\n console.error('Error: Please specify archive name to restore');\n console.log(`Usage: heraspec restore <archive-name>`);\n console.log(`Example: heraspec restore 2025-01-15-add-two-factor-auth`);\n process.exitCode = 1;\n return;\n }\n\n const archivePath = path.join(archivesDir, archiveName);\n\n // Check if archive exists\n if (!(await FileSystemUtils.fileExists(archivePath))) {\n console.error(`Error: Archive \"${archiveName}\" not found`);\n console.log('\\nAvailable archives:');\n const archives = await this.listArchives(archivesDir);\n archives.forEach((archive) => {\n console.log(` - ${archive}`);\n });\n process.exitCode = 1;\n return;\n }\n\n // Extract change name (remove date prefix)\n const changeName = this.extractChangeName(archiveName);\n const changePath = path.join(\n '.',\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n changeName\n );\n\n // Check if change already exists\n if (await FileSystemUtils.fileExists(changePath)) {\n console.error(`Error: Change \"${changeName}\" already exists in active changes.`);\n console.log('Please remove or rename the existing change first.');\n process.exitCode = 1;\n return;\n }\n\n // Confirm if not --yes\n if (!options?.yes) {\n console.log(`\\nThis will restore archive \"${archiveName}\" to active change \"${changeName}\".`);\n console.log('Note: This will not revert spec changes that were merged during archive.\\n');\n console.error('Error: Please use --yes flag to confirm');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora({\n text: `Restoring archive \"${archiveName}\"...`,\n color: 'blue',\n }).start();\n\n try {\n // Ensure changes directory exists\n const changesDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME\n );\n await FileSystemUtils.createDirectory(changesDir);\n \n // Create destination directory first\n await FileSystemUtils.createDirectory(changePath);\n \n // Move archive back to changes directory\n await this.moveArchiveToChanges(archivePath, changePath);\n\n // Remove archive directory\n await FileSystemUtils.removeDirectory(archivePath, true);\n\n spinner.succeed(\n chalk.green(`Archive \"${archiveName}\" restored successfully to \"${changeName}\"`)\n );\n console.log();\n console.log(chalk.cyan('Note:'));\n console.log(\n chalk.gray(\n 'Spec changes that were merged during archive are still in source specs.'\n )\n );\n console.log(\n chalk.gray(\n 'You may need to manually review and revert spec changes if needed.'\n )\n );\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${(error as Error).message}`));\n throw error;\n }\n }\n\n private async listArchives(archivesDir: string): Promise<string[]> {\n const archives: string[] = [];\n const entries = await FileSystemUtils.readDirectory(archivesDir);\n\n for (const entry of entries) {\n const entryPath = path.join(archivesDir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n if (stats.isDirectory()) {\n archives.push(entry);\n }\n }\n\n return archives.sort();\n }\n\n private extractChangeName(archiveName: string): string {\n // Remove date prefix (YYYY-MM-DD-)\n // Example: \"2025-01-15-add-two-factor-auth\" -> \"add-two-factor-auth\"\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}-/;\n return archiveName.replace(datePattern, '');\n }\n\n private async moveArchiveToChanges(sourcePath: string, destPath: string): Promise<void> {\n const entries = await FileSystemUtils.readDirectory(sourcePath);\n\n for (const entry of entries) {\n const sourceEntry = path.join(sourcePath, entry);\n const destEntry = path.join(destPath, entry);\n const stats = await FileSystemUtils.stat(sourceEntry);\n\n if (stats.isDirectory()) {\n await FileSystemUtils.createDirectory(destEntry);\n await this.moveArchiveToChanges(sourceEntry, destEntry);\n } else {\n await FileSystemUtils.moveFile(sourceEntry, destEntry);\n }\n }\n }\n}\n\n", "/**\n * HeraSpec Show Command\n * Shows a change or spec in readable format\n */\nimport path from 'path';\nimport { readFileSync } from 'fs';\nimport chalk from 'chalk';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { TaskParser } from '../utils/task-parser.js';\nimport {\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n SPECS_DIR_NAME,\n HERASPEC_MARKERS,\n} from '../core/config.js';\n\nexport class ShowCommand {\n async execute(itemName?: string): Promise<void> {\n if (!itemName) {\n console.error('Error: Please specify a change or spec name');\n console.log('Usage: heraspec show <change-name>');\n process.exitCode = 1;\n return;\n }\n\n // Try to find as change first\n const changePath = path.join(\n '.',\n HERASPEC_DIR_NAME,\n CHANGES_DIR_NAME,\n itemName\n );\n\n if (await FileSystemUtils.fileExists(changePath)) {\n await this.showChange(itemName, changePath);\n return;\n }\n\n // Try to find as spec\n const specPath = this.findSpecPath(itemName);\n if (specPath && (await FileSystemUtils.fileExists(specPath))) {\n await this.showSpec(specPath);\n return;\n }\n\n console.error(`Error: Change or spec \"${itemName}\" not found`);\n process.exitCode = 1;\n }\n\n private async showChange(changeName: string, changePath: string): Promise<void> {\n console.log(`\\n\uD83D\uDCCB Change: ${changeName}\\n`);\n console.log('\u2550'.repeat(60));\n\n // Show proposal\n const proposalPath = path.join(changePath, HERASPEC_MARKERS.PROPOSAL_MD);\n if (await FileSystemUtils.fileExists(proposalPath)) {\n console.log('\\n## Proposal\\n');\n const proposal = await FileSystemUtils.readFile(proposalPath);\n console.log(proposal);\n }\n\n // Show tasks\n const tasksPath = path.join(changePath, HERASPEC_MARKERS.TASKS_MD);\n if (await FileSystemUtils.fileExists(tasksPath)) {\n console.log('\\n## Tasks\\n');\n const tasks = await FileSystemUtils.readFile(tasksPath);\n console.log(tasks);\n\n // Show skills used in tasks\n try {\n const parsedTasks = TaskParser.parseTasks(tasksPath);\n if (parsedTasks.skillsUsed.length > 0) {\n console.log('\\n## Skills Used in This Change\\n');\n for (const skillInfo of parsedTasks.skillsUsed) {\n if (skillInfo.skill) {\n const skillLabel = skillInfo.projectType \n ? `${skillInfo.projectType}/${skillInfo.skill}`\n : skillInfo.skill;\n console.log(chalk.cyan(` \u2022 ${skillLabel}`));\n console.log(chalk.gray(` Location: heraspec/skills/${skillInfo.projectType ? skillInfo.projectType + '/' : ''}${skillInfo.skill}/`));\n }\n }\n console.log();\n console.log(chalk.yellow('\uD83D\uDCA1 Tip: Read skill.md files to understand how to implement tasks.'));\n console.log();\n }\n } catch (error) {\n // Ignore parsing errors\n }\n }\n\n // Show design if exists\n const designPath = path.join(changePath, HERASPEC_MARKERS.DESIGN_MD);\n if (await FileSystemUtils.fileExists(designPath)) {\n console.log('\\n## Design\\n');\n const design = await FileSystemUtils.readFile(designPath);\n console.log(design);\n }\n\n // Show delta specs (now in heraspec/specs/<changeName>/ instead of heraspec/changes/<changeName>/specs/)\n const specsPath = path.join(\n '.',\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n changeName\n );\n if (await FileSystemUtils.fileExists(specsPath)) {\n const deltaSpecs = await this.findDeltaSpecs(specsPath);\n if (deltaSpecs.length > 0) {\n console.log('\\n## Delta Specs\\n');\n for (const spec of deltaSpecs) {\n console.log(`\\n### ${spec.name}\\n`);\n const content = await FileSystemUtils.readFile(spec.path);\n console.log(content);\n }\n }\n }\n\n console.log('\\n' + '\u2550'.repeat(60) + '\\n');\n }\n\n private async showSpec(specPath: string): Promise<void> {\n console.log('\\n\uD83D\uDCC4 Spec\\n');\n console.log('\u2550'.repeat(60));\n const content = await FileSystemUtils.readFile(specPath);\n console.log(content);\n console.log('\u2550'.repeat(60) + '\\n');\n }\n\n private findSpecPath(specName: string): string | null {\n // Try various path formats\n const basePath = path.join('.', HERASPEC_DIR_NAME, SPECS_DIR_NAME);\n const paths = [\n path.join(basePath, `${specName}.md`),\n path.join(basePath, specName, 'spec.md'),\n path.join(basePath, ...specName.split('/'), 'spec.md'),\n ];\n\n // Return first potential path (caller will check existence)\n return paths[0];\n }\n\n private async findDeltaSpecs(dir: string, prefix = ''): Promise<Array<{ name: string; path: string }>> {\n const specs: Array<{ name: string; path: string }> = [];\n const entries = await FileSystemUtils.readDirectory(dir);\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n const subSpecs = await this.findDeltaSpecs(\n entryPath,\n prefix ? `${prefix}/${entry}` : entry\n );\n specs.push(...subSpecs);\n } else if (entry === 'spec.md' || entry.endsWith('.md')) {\n specs.push({\n name: prefix || 'global',\n path: entryPath,\n });\n }\n }\n\n return specs;\n }\n}\n\n", "/**\n * Task Parser\n * Parses tasks.md to extract skill information\n */\nimport { readFileSync } from 'fs';\nimport { SkillManager } from '../core/skills/index.js';\n\nexport interface TaskGroup {\n title: string;\n projectType?: string;\n skill?: string;\n tasks: Array<{\n id: string;\n description: string;\n completed: boolean;\n }>;\n}\n\nexport interface ParsedTasks {\n groups: TaskGroup[];\n skillsUsed: Array<{ projectType?: string; skill: string }>;\n}\n\nexport class TaskParser {\n static parseTasks(filePath: string): ParsedTasks {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n const groups: TaskGroup[] = [];\n const skillsUsed = new Set<string>();\n let currentGroup: TaskGroup | null = null;\n\n for (const line of lines) {\n // Match task group header: ## 1. Title (projectType: xxx, skill: yyy)\n const groupMatch = line.match(/^##+\\s+\\d+\\.\\s+(.+?)\\s*\\((.+)\\)/);\n \n if (groupMatch) {\n // Save previous group\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n const title = groupMatch[1].trim();\n const params = groupMatch[2];\n \n // Extract projectType and skill\n const skillInfo = SkillManager.extractSkillFromTask(`(${params})`);\n \n currentGroup = {\n title,\n projectType: skillInfo?.projectType,\n skill: skillInfo?.skill,\n tasks: [],\n };\n\n if (skillInfo?.skill) {\n const skillKey = skillInfo.projectType \n ? `${skillInfo.projectType}:${skillInfo.skill}`\n : skillInfo.skill;\n skillsUsed.add(skillKey);\n }\n continue;\n }\n\n // Match task: - [ ] or - [x]\n const taskMatch = line.match(/^-\\s+\\[([ x])\\]\\s+(.+)/);\n if (taskMatch && currentGroup) {\n const completed = taskMatch[1] === 'x';\n const description = taskMatch[2].trim();\n \n // Extract task ID if present (e.g., \"1.1 Task description\")\n const idMatch = description.match(/^(\\d+\\.\\d+)\\s+/);\n const id = idMatch ? idMatch[1] : `${currentGroup.tasks.length + 1}`;\n const taskDesc = idMatch ? description.replace(/^\\d+\\.\\d+\\s+/, '') : description;\n\n currentGroup.tasks.push({\n id,\n description: taskDesc,\n completed,\n });\n }\n }\n\n // Save last group\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n // Convert skillsUsed set to array\n const skillsArray = Array.from(skillsUsed).map(skillKey => {\n const [projectType, skill] = skillKey.includes(':') \n ? skillKey.split(':')\n : [undefined, skillKey];\n return { projectType, skill };\n });\n\n return {\n groups,\n skillsUsed: skillsArray,\n };\n }\n\n static async getSkillsForTasks(filePath: string): Promise<Array<{ projectType?: string; skill: string; path: string }>> {\n const parsed = this.parseTasks(filePath);\n const skills: Array<{ projectType?: string; skill: string; path: string }> = [];\n\n for (const skillInfo of parsed.skillsUsed) {\n if (skillInfo.skill) {\n const skillPath = await SkillManager.findSkillPath(\n skillInfo.projectType || '',\n skillInfo.skill,\n '.'\n );\n \n if (skillPath) {\n skills.push({\n projectType: skillInfo.projectType,\n skill: skillInfo.skill,\n path: skillPath,\n });\n }\n }\n }\n\n return skills;\n }\n}\n\n", "/**\n * Skill Parser\n * Parses skill.md files to extract skill information\n */\nimport { readFileSync } from 'fs';\nimport path from 'path';\n\nexport interface SkillInfo {\n name: string;\n purpose: string;\n whenToUse: string[];\n steps: string[];\n inputs: string[];\n outputs: string[];\n toneAndRules: {\n codeStyle?: string;\n namingConventions?: string;\n limitations?: string[];\n };\n templates: string[];\n scripts: string[];\n examples: string[];\n relatedSkills: string[];\n skillPath: string;\n}\n\nexport class SkillParser {\n static parseSkill(skillPath: string, skillName: string): SkillInfo {\n const skillMdPath = path.join(skillPath, 'skill.md');\n \n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n return this.parseSkillContent(content, skillName, skillPath);\n } catch (error) {\n throw new Error(`Failed to parse skill \"${skillName}\": ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n private static parseSkillContent(content: string, skillName: string, skillPath: string): SkillInfo {\n const lines = content.split('\\n');\n \n const skill: Partial<SkillInfo> = {\n name: skillName,\n skillPath,\n purpose: '',\n whenToUse: [],\n steps: [],\n inputs: [],\n outputs: [],\n toneAndRules: {},\n templates: [],\n scripts: [],\n examples: [],\n relatedSkills: [],\n };\n\n let currentSection = '';\n let currentList: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Detect section headers\n if (line.match(/^##+\\s+/)) {\n // Save previous list\n this.saveList(currentSection, currentList, skill);\n currentList = [];\n \n const sectionName = line.replace(/^##+\\s+/, '').toLowerCase();\n currentSection = sectionName;\n \n // Extract purpose\n if (sectionName.includes('m\u1EE5c \u0111\u00EDch') || sectionName.includes('purpose')) {\n // Purpose is usually the next line or paragraph\n if (i + 1 < lines.length && lines[i + 1].trim()) {\n skill.purpose = lines[i + 1].trim();\n }\n }\n continue;\n }\n\n // Collect list items\n if (line.startsWith('- ') || line.startsWith('* ')) {\n const item = line.replace(/^[-*]\\s+/, '').trim();\n if (item) {\n currentList.push(item);\n }\n continue;\n }\n\n // Collect numbered steps\n if (line.match(/^\\d+\\.\\s+/)) {\n const step = line.replace(/^\\d+\\.\\s+/, '').trim();\n if (step) {\n skill.steps = skill.steps || [];\n skill.steps.push(step);\n }\n continue;\n }\n\n // Extract specific fields\n if (currentSection.includes('input')) {\n if (line.startsWith('- ')) {\n skill.inputs = skill.inputs || [];\n skill.inputs.push(line.replace(/^-\\s+/, ''));\n }\n }\n\n if (currentSection.includes('output')) {\n if (line.startsWith('- ')) {\n skill.outputs = skill.outputs || [];\n skill.outputs.push(line.replace(/^-\\s+/, ''));\n }\n }\n\n if (currentSection.includes('template')) {\n if (line.includes('.php') || line.includes('.md') || line.includes('.scss') || line.includes('.js') || line.includes('.sh')) {\n skill.templates = skill.templates || [];\n const templateName = line.match(/`([^`]+)`/) || line.match(/\\*\\*([^*]+)\\*\\*/);\n if (templateName) {\n skill.templates.push(templateName[1]);\n }\n }\n }\n\n if (currentSection.includes('script')) {\n if (line.includes('.sh') || line.includes('.py') || line.includes('.js')) {\n skill.scripts = skill.scripts || [];\n const scriptName = line.match(/`([^`]+)`/) || line.match(/\\*\\*([^*]+)\\*\\*/);\n if (scriptName) {\n skill.scripts.push(scriptName[1]);\n }\n }\n }\n }\n\n // Save final list\n this.saveList(currentSection, currentList, skill);\n\n // Ensure all arrays exist\n return {\n name: skill.name || skillName,\n skillPath: skill.skillPath || skillPath,\n purpose: skill.purpose || 'No description available',\n whenToUse: skill.whenToUse || [],\n steps: skill.steps || [],\n inputs: skill.inputs || [],\n outputs: skill.outputs || [],\n toneAndRules: skill.toneAndRules || {},\n templates: skill.templates || [],\n scripts: skill.scripts || [],\n examples: skill.examples || [],\n relatedSkills: skill.relatedSkills || [],\n };\n }\n\n private static saveList(section: string, list: string[], skill: Partial<SkillInfo>): void {\n if (list.length === 0) return;\n\n if (section.includes('khi n\u00E0o') || section.includes('when')) {\n skill.whenToUse = list;\n } else if (section.includes('input')) {\n skill.inputs = list;\n } else if (section.includes('output')) {\n skill.outputs = list;\n } else if (section.includes('h\u1EA1n ch\u1EBF') || section.includes('limitation')) {\n skill.toneAndRules = skill.toneAndRules || {};\n skill.toneAndRules.limitations = list;\n } else if (section.includes('li\u00EAn k\u1EBFt') || section.includes('related')) {\n skill.relatedSkills = list;\n }\n }\n}\n\n", "/**\n * Skill Manager\n * Manages and discovers skills in a project\n */\nimport path from 'path';\nimport { FileSystemUtils } from '../../utils/file-system.js';\nimport { SkillParser, SkillInfo } from './skill-parser.js';\nimport { HERASPEC_DIR_NAME, SKILLS_DIR_NAME, PROJECT_TYPES, SKILLS } from '../config.js';\n\nexport class SkillManager {\n /**\n * Find skill path for a given project type and skill name\n */\n static async findSkillPath(\n projectType: string,\n skillName: string,\n projectPath: string = '.'\n ): Promise<string | null> {\n // Try project-specific skill first\n const projectSkillPath = path.join(\n projectPath,\n HERASPEC_DIR_NAME,\n SKILLS_DIR_NAME,\n projectType,\n skillName\n );\n\n if (await FileSystemUtils.fileExists(path.join(projectSkillPath, 'skill.md'))) {\n return projectSkillPath;\n }\n\n // Try cross-cutting skill\n const crossCuttingPath = path.join(\n projectPath,\n HERASPEC_DIR_NAME,\n SKILLS_DIR_NAME,\n skillName\n );\n\n if (await FileSystemUtils.fileExists(path.join(crossCuttingPath, 'skill.md'))) {\n return crossCuttingPath;\n }\n\n return null;\n }\n\n /**\n * Load skill information\n */\n static async loadSkill(\n projectType: string,\n skillName: string,\n projectPath: string = '.'\n ): Promise<SkillInfo | null> {\n const skillPath = await this.findSkillPath(projectType, skillName, projectPath);\n \n if (!skillPath) {\n return null;\n }\n\n try {\n return SkillParser.parseSkill(skillPath, skillName);\n } catch (error) {\n console.error(`Failed to load skill \"${skillName}\": ${error instanceof Error ? error.message : 'Unknown error'}`);\n return null;\n }\n }\n\n /**\n * List all available skills\n */\n static async listSkills(projectPath: string = '.'): Promise<Array<{ projectType?: string; skillName: string; path: string }>> {\n const skillsDir = path.join(projectPath, HERASPEC_DIR_NAME, SKILLS_DIR_NAME);\n \n if (!(await FileSystemUtils.fileExists(skillsDir))) {\n return [];\n }\n\n const skills: Array<{ projectType?: string; skillName: string; path: string }> = [];\n const entries = await FileSystemUtils.readDirectory(skillsDir);\n\n for (const entry of entries) {\n const entryPath = path.join(skillsDir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n // Check if it's a project type folder or cross-cutting skill\n const isProjectType = PROJECT_TYPES.includes(entry as any);\n \n if (isProjectType) {\n // It's a project type folder, list skills inside\n const projectSkills = await this.listSkillsInDirectory(entryPath, entry);\n skills.push(...projectSkills);\n } else {\n // It's a cross-cutting skill\n const skillMdPath = path.join(entryPath, 'skill.md');\n if (await FileSystemUtils.fileExists(skillMdPath)) {\n skills.push({\n skillName: entry,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return skills;\n }\n\n /**\n * Extract skill from task line\n */\n static extractSkillFromTask(taskLine: string): { projectType?: string; skill?: string } | null {\n // Match: (projectType: xxx, skill: yyy)\n const match = taskLine.match(/\\(projectType:\\s*([^,)]+)(?:,\\s*skill:\\s*([^)]+))?\\)/i);\n \n if (match) {\n return {\n projectType: match[1]?.trim(),\n skill: match[2]?.trim(),\n };\n }\n\n // Match: (skill: yyy)\n const skillOnlyMatch = taskLine.match(/\\(skill:\\s*([^)]+)\\)/i);\n if (skillOnlyMatch) {\n return {\n skill: skillOnlyMatch[1]?.trim(),\n };\n }\n\n return null;\n }\n\n private static async listSkillsInDirectory(\n dir: string,\n projectType: string\n ): Promise<Array<{ projectType: string; skillName: string; path: string }>> {\n const skills: Array<{ projectType: string; skillName: string; path: string }> = [];\n const entries = await FileSystemUtils.readDirectory(dir);\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n const skillMdPath = path.join(entryPath, 'skill.md');\n if (await FileSystemUtils.fileExists(skillMdPath)) {\n skills.push({\n projectType,\n skillName: entry,\n path: entryPath,\n });\n }\n }\n }\n\n return skills;\n }\n}\n\n", "/**\n * HeraSpec Validate Command\n */\nimport path from 'path';\nimport chalk from 'chalk';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { Validator } from '../core/validation/validator.js';\nimport { HERASPEC_DIR_NAME, CHANGES_DIR_NAME, SPECS_DIR_NAME } from '../core/config.js';\n\nexport class ValidateCommand {\n async execute(itemName?: string, options?: { strict?: boolean }): Promise<void> {\n const validator = new Validator(options?.strict || false);\n\n if (!itemName) {\n console.error('Error: Please specify a change or spec name');\n console.log('Usage: heraspec validate <change-name>');\n process.exitCode = 1;\n return;\n }\n\n // Try change first\n const changePath = path.join('.', HERASPEC_DIR_NAME, CHANGES_DIR_NAME, itemName);\n if (await FileSystemUtils.fileExists(changePath)) {\n const report = await validator.validateChange(changePath);\n this.printReport(itemName, report);\n if (!report.valid) {\n process.exitCode = 1;\n }\n return;\n }\n\n // Try spec\n const specPath = this.findSpecPath(itemName);\n if (specPath && (await FileSystemUtils.fileExists(specPath))) {\n const report = await validator.validateSpec(specPath);\n this.printReport(itemName, report);\n if (!report.valid) {\n process.exitCode = 1;\n }\n return;\n }\n\n console.error(`Error: Change or spec \"${itemName}\" not found`);\n process.exitCode = 1;\n }\n\n private findSpecPath(specName: string): string | null {\n const basePath = path.join('.', HERASPEC_DIR_NAME, SPECS_DIR_NAME);\n return path.join(basePath, `${specName}.md`);\n }\n\n private printReport(itemName: string, report: any): void {\n console.log(`\\nValidation Report: ${itemName}\\n`);\n console.log('\u2500'.repeat(60));\n\n if (report.valid) {\n console.log(chalk.green('\u2713 Valid'));\n } else {\n console.log(chalk.red('\u2717 Invalid'));\n }\n\n if (report.errors && report.errors.length > 0) {\n console.log(chalk.red('\\nErrors:'));\n report.errors.forEach((err: any) => {\n console.log(chalk.red(` \u2022 ${err.message || err}`));\n if (err.suggestion) {\n console.log(chalk.gray(` \uD83D\uDCA1 Suggestion: ${err.suggestion}`));\n }\n if (err.path) {\n console.log(chalk.gray(` \uD83D\uDCCD Path: ${err.path}`));\n }\n });\n }\n\n if (report.warnings && report.warnings.length > 0) {\n console.log(chalk.yellow('\\nWarnings:'));\n report.warnings.forEach((warn: any) => {\n console.log(chalk.yellow(` \u2022 ${warn.message || warn}`));\n if (warn.suggestion) {\n console.log(chalk.gray(` \uD83D\uDCA1 Suggestion: ${warn.suggestion}`));\n }\n if (warn.path) {\n console.log(chalk.gray(` \uD83D\uDCCD Path: ${warn.path}`));\n }\n });\n }\n\n if (report.suggestions && report.suggestions.length > 0) {\n console.log(chalk.cyan('\\n\uD83D\uDCA1 Quick Fixes:'));\n report.suggestions.forEach((suggestion: string) => {\n console.log(chalk.cyan(` \u2022 ${suggestion}`));\n });\n }\n\n // Provide next steps if invalid\n if (!report.valid && report.errors && report.errors.length > 0) {\n console.log(chalk.gray('\\n\uD83D\uDCDD Next Steps:'));\n console.log(chalk.gray(' 1. Review errors above'));\n console.log(chalk.gray(' 2. Apply suggested fixes'));\n console.log(chalk.gray(' 3. Run validation again: heraspec validate ' + itemName));\n }\n\n console.log('\\n' + '\u2500'.repeat(60) + '\\n');\n }\n}\n\n", "/**\n * HeraSpec Validator\n * Validates specs and changes\n */\nimport { readFileSync } from 'fs';\nimport path from 'path';\nimport { SpecSchema, ChangeSchema } from '../schemas/index.js';\nimport { MarkdownParser } from '../parsers/markdown-parser.js';\nimport { FileSystemUtils } from '../../utils/file-system.js';\nimport { HERASPEC_DIR_NAME, SPECS_DIR_NAME } from '../config.js';\n\nexport interface ValidationIssue {\n message: string;\n path?: string;\n line?: number;\n suggestion?: string;\n autoFixable?: boolean;\n}\n\nexport interface ValidationReport {\n valid: boolean;\n errors: ValidationIssue[];\n warnings: ValidationIssue[];\n suggestions?: string[];\n}\n\nexport class Validator {\n private strictMode: boolean;\n\n constructor(strictMode: boolean = false) {\n this.strictMode = strictMode;\n }\n\n async validateSpec(filePath: string): Promise<ValidationReport> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parser = new MarkdownParser(content);\n const specName = this.extractNameFromPath(filePath);\n const spec = parser.parseSpec(specName);\n\n // Validate against schema\n const result = SpecSchema.safeParse(spec);\n\n if (!result.success) {\n result.error.errors.forEach((err) => {\n errors.push(`${err.path.join('.')}: ${err.message}`);\n });\n }\n\n // Additional validation rules\n if (spec.requirements.length === 0) {\n errors.push('Spec must have at least one requirement');\n }\n\n for (const req of spec.requirements) {\n if (!req.description || req.description.trim().length === 0) {\n errors.push(`Requirement \"${req.name}\" must have a description`);\n }\n\n if (!req.scenarios || req.scenarios.length === 0) {\n warnings.push(`Requirement \"${req.name}\" has no scenarios`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n warnings: [],\n };\n }\n }\n\n async validateChange(changePath: string): Promise<ValidationReport> {\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const suggestions: string[] = [];\n\n // Check for proposal.md\n const proposalPath = path.join(changePath, 'proposal.md');\n if (!(await FileSystemUtils.fileExists(proposalPath))) {\n errors.push({\n message: 'Change must have a proposal.md file',\n path: proposalPath,\n suggestion: `Create proposal.md in ${changePath} with: # Change Proposal: [name]\\n\\n## Purpose\\n[Description]\\n\\n## Scope\\n[What will change]`,\n autoFixable: false,\n });\n suggestions.push(`Create proposal.md file at ${proposalPath}`);\n }\n\n // Check for tasks.md\n const tasksPath = path.join(changePath, 'tasks.md');\n if (!(await FileSystemUtils.fileExists(tasksPath))) {\n warnings.push({\n message: 'Change has no tasks.md file',\n path: tasksPath,\n suggestion: `Create tasks.md with implementation tasks grouped by project type and skill`,\n autoFixable: false,\n });\n }\n\n // Validate delta specs if they exist\n // Specs are now in heraspec/specs/<changeName>/ instead of heraspec/changes/<changeName>/specs/\n const changeName = path.basename(changePath);\n const specsDir = path.join(\n '.',\n HERASPEC_DIR_NAME,\n SPECS_DIR_NAME,\n changeName\n );\n if (await FileSystemUtils.fileExists(specsDir)) {\n const deltaSpecs = await this.findDeltaSpecs(specsDir);\n for (const specPath of deltaSpecs) {\n const report = await this.validateDeltaSpec(specPath);\n errors.push(...report.errors);\n warnings.push(...report.warnings);\n if (report.suggestions) {\n suggestions.push(...report.suggestions);\n }\n }\n } else {\n warnings.push({\n message: 'No delta specs found for this change',\n suggestion: `Create delta specs in ${specsDir}/spec.md using ADDED/MODIFIED/REMOVED sections`,\n autoFixable: false,\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n suggestions: suggestions.length > 0 ? suggestions : undefined,\n };\n }\n\n private async validateDeltaSpec(filePath: string): Promise<ValidationReport> {\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const suggestions: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parser = new MarkdownParser(content);\n const delta = parser.parseDeltaSpec(content);\n\n // Check that delta has at least one section\n if (delta.added.length === 0 && delta.modified.length === 0 && delta.removed.length === 0) {\n warnings.push({\n message: 'Delta spec has no changes',\n suggestion: 'Add at least one section: ## ADDED Requirements, ## MODIFIED Requirements, or ## REMOVED Requirements',\n autoFixable: false,\n });\n }\n\n // Check for proper delta format\n if (!content.includes('## ADDED') && !content.includes('## MODIFIED') && !content.includes('## REMOVED')) {\n warnings.push({\n message: 'Delta spec may not follow proper format',\n suggestion: 'Use sections: ## ADDED Requirements, ## MODIFIED Requirements, ## REMOVED Requirements',\n autoFixable: false,\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n suggestions: suggestions.length > 0 ? suggestions : undefined,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n const suggestion = this.getParseErrorSuggestion(errorMessage);\n \n return {\n valid: false,\n errors: [{\n message: errorMessage,\n suggestion,\n autoFixable: false,\n }],\n warnings: [],\n suggestions: suggestion ? [suggestion] : undefined,\n };\n }\n }\n\n private extractNameFromPath(filePath: string): string {\n const baseName = path.basename(filePath, '.md');\n return baseName === 'spec' ? path.basename(path.dirname(filePath)) : baseName;\n }\n\n private async findDeltaSpecs(dir: string): Promise<string[]> {\n const specs: string[] = [];\n const entries = await FileSystemUtils.readDirectory(dir);\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry);\n const stats = await FileSystemUtils.stat(entryPath);\n\n if (stats.isDirectory()) {\n const subSpecs = await this.findDeltaSpecs(entryPath);\n specs.push(...subSpecs);\n } else if (entry.endsWith('.md')) {\n specs.push(entryPath);\n }\n }\n\n return specs;\n }\n}\n\n", "/**\n * Base schemas for HeraSpec\n */\nimport { z } from 'zod';\n\nexport const ProjectTypeSchema = z.enum([\n 'wordpress-plugin',\n 'wordpress-theme',\n 'perfex-module',\n 'laravel-package',\n 'node-service',\n 'generic-webapp',\n 'backend-api',\n 'frontend-app',\n 'multi-stack',\n]);\n\nexport const SpecMetaSchema = z.object({\n projectType: z.union([\n ProjectTypeSchema,\n z.array(ProjectTypeSchema),\n ]).optional(),\n domain: z.string().optional(),\n stack: z.union([\n z.string(),\n z.array(z.string()),\n ]).optional(),\n}).optional();\n\nexport const ScenarioSchema = z.object({\n name: z.string(),\n steps: z.array(z.string()).min(1),\n});\n\nexport const RequirementSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n description: z.string(),\n scenarios: z.array(ScenarioSchema).optional(),\n constraints: z.array(z.string()).optional(),\n});\n\n", "/**\n * HeraSpec Specification Schema\n */\nimport { z } from 'zod';\nimport { RequirementSchema, SpecMetaSchema } from './base.schema.js';\n\nexport const SpecSchema = z.object({\n name: z.string().min(1),\n meta: SpecMetaSchema,\n overview: z.string().min(1),\n requirements: z.array(RequirementSchema).min(1),\n metadata: z.object({\n version: z.string().default('1.0.0'),\n format: z.literal('heraspec'),\n sourcePath: z.string().optional(),\n }).optional(),\n});\n\nexport type Spec = z.infer<typeof SpecSchema>;\n\n", "/**\n * HeraSpec Change Schema\n */\nimport { z } from 'zod';\n\nexport const DeltaTypeSchema = z.enum(['ADDED', 'MODIFIED', 'REMOVED']);\n\nexport const DeltaRequirementSchema = z.object({\n type: DeltaTypeSchema,\n requirement: z.object({\n id: z.string().optional(),\n name: z.string(),\n description: z.string(),\n scenarios: z.array(z.object({\n name: z.string(),\n steps: z.array(z.string()),\n })).optional(),\n constraints: z.array(z.string()).optional(),\n }),\n});\n\nexport const ChangeSchema = z.object({\n name: z.string(),\n proposal: z.string().min(1),\n tasks: z.array(z.string()).optional(),\n design: z.string().optional(),\n});\n\nexport type Change = z.infer<typeof ChangeSchema>;\nexport type DeltaRequirement = z.infer<typeof DeltaRequirementSchema>;\n\n", "/**\n * HeraSpec Skill Command\n * Shows skill information, lists available skills, repairs, and adds skills\n */\nimport path from 'path';\nimport { readFileSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { SkillManager, SkillParser } from '../core/skills/index.js';\nimport { HERASPEC_DIR_NAME, SKILLS_DIR_NAME, PROJECT_TYPES } from '../core/config.js';\nimport { getSkillTemplateInfo, getAllSkillTemplates } from '../core/templates/skills-template-map.js';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Get HeraSpec core templates directory\n// Try multiple paths to handle both source and built versions, and installed packages\nasync function getCoreTemplatesDir(): Promise<string | null> {\n const possiblePaths: string[] = [];\n \n // Strategy 1: Resolve package.json from current file location (works when bundled)\n // When running from bin/heraspec.js, this resolves to the package root\n try {\n const packageJsonPath = require.resolve('../package.json');\n const packageDir = path.dirname(packageJsonPath);\n \n possiblePaths.push(\n join(packageDir, 'src', 'core', 'templates', 'skills'), // Source (when linked, this is the actual source)\n join(packageDir, 'dist', 'core', 'templates', 'skills'), // Built (templates copied during build)\n );\n } catch {\n // Could not resolve, continue\n }\n \n // Strategy 2: Try require.resolve('heraspec/package.json') for npm installed packages\n try {\n const packageJsonPath = require.resolve('heraspec/package.json');\n const packageDir = path.dirname(packageJsonPath);\n \n possiblePaths.push(\n join(packageDir, 'dist', 'core', 'templates', 'skills'), // Built\n join(packageDir, 'src', 'core', 'templates', 'skills'), // Source (if available)\n );\n } catch {\n // Package not found, continue\n }\n \n // Strategy 3: Relative paths from current file location (when running from source)\n possiblePaths.push(\n // Source version (for development) - when running from source: src/commands/skill.ts\n join(__dirname, '..', '..', 'src', 'core', 'templates', 'skills'),\n // Built version - when running from built: dist/commands/skill.js\n join(__dirname, '..', 'core', 'templates', 'skills'),\n // Alternative: from project root (when running from HeraSpec source)\n join(process.cwd(), 'src', 'core', 'templates', 'skills'),\n );\n\n for (const possiblePath of possiblePaths) {\n if (await FileSystemUtils.fileExists(possiblePath)) {\n return possiblePath;\n }\n }\n\n return null;\n}\n\nexport class SkillCommand {\n async list(projectPath: string = '.'): Promise<void> {\n const skills = await SkillManager.listSkills(projectPath);\n\n if (skills.length === 0) {\n console.log('No skills found. Skills will be created as needed.');\n console.log('See docs/SKILLS_STRUCTURE_PROPOSAL.md for skill structure.');\n return;\n }\n\n console.log('\\nAvailable Skills:\\n');\n console.log('\u2550'.repeat(60));\n\n // Group by project type\n const byProjectType: Record<string, Array<{ skillName: string; path: string }>> = {};\n const crossCutting: Array<{ skillName: string; path: string }> = [];\n\n for (const skill of skills) {\n if (skill.projectType) {\n if (!byProjectType[skill.projectType]) {\n byProjectType[skill.projectType] = [];\n }\n byProjectType[skill.projectType].push({\n skillName: skill.skillName,\n path: skill.path,\n });\n } else {\n crossCutting.push({\n skillName: skill.skillName,\n path: skill.path,\n });\n }\n }\n\n // Display project-specific skills\n for (const [projectType, projectSkills] of Object.entries(byProjectType)) {\n console.log(`\\n\uD83D\uDCE6 ${projectType}:`);\n for (const skill of projectSkills) {\n console.log(` \u2022 ${skill.skillName}`);\n }\n }\n\n // Display cross-cutting skills\n if (crossCutting.length > 0) {\n console.log(`\\n\uD83D\uDD27 Cross-cutting skills:`);\n for (const skill of crossCutting) {\n console.log(` \u2022 ${skill.skillName}`);\n }\n }\n\n console.log('\\n' + '\u2550'.repeat(60) + '\\n');\n }\n\n async show(skillName: string, projectType?: string, projectPath: string = '.'): Promise<void> {\n if (!skillName) {\n console.error('Error: Please specify a skill name');\n console.log('Usage: heraspec skill show <skill-name> [--project-type <type>]');\n process.exitCode = 1;\n return;\n }\n\n // Try to find skill\n let skillInfo = null;\n \n if (projectType) {\n skillInfo = await SkillManager.loadSkill(projectType, skillName, projectPath);\n } else {\n // Try to find in any project type\n const skills = await SkillManager.listSkills(projectPath);\n const found = skills.find(s => s.skillName === skillName);\n \n if (found) {\n try {\n skillInfo = SkillParser.parseSkill(found.path, skillName);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exitCode = 1;\n return;\n }\n }\n }\n\n if (!skillInfo) {\n console.error(`Error: Skill \"${skillName}\" not found`);\n if (projectType) {\n console.log(`Searched in: heraspec/skills/${projectType}/${skillName}/`);\n } else {\n console.log('Searched in: heraspec/skills/');\n }\n process.exitCode = 1;\n return;\n }\n\n // Display skill information\n console.log(`\\n\uD83D\uDCDA Skill: ${skillInfo.name}\\n`);\n console.log('\u2550'.repeat(60));\n\n console.log(`\\n\uD83D\uDCCD Path: ${skillInfo.skillPath}\\n`);\n\n if (skillInfo.purpose) {\n console.log('## Purpose');\n console.log(skillInfo.purpose);\n console.log();\n }\n\n if (skillInfo.whenToUse.length > 0) {\n console.log('## When to Use');\n skillInfo.whenToUse.forEach(item => {\n console.log(`- ${item}`);\n });\n console.log();\n }\n\n if (skillInfo.steps.length > 0) {\n console.log('## Steps');\n skillInfo.steps.forEach((step, index) => {\n console.log(`${index + 1}. ${step}`);\n });\n console.log();\n }\n\n if (skillInfo.inputs.length > 0) {\n console.log('## Inputs');\n skillInfo.inputs.forEach(input => {\n console.log(`- ${input}`);\n });\n console.log();\n }\n\n if (skillInfo.outputs.length > 0) {\n console.log('## Outputs');\n skillInfo.outputs.forEach(output => {\n console.log(`- ${output}`);\n });\n console.log();\n }\n\n if (skillInfo.templates.length > 0) {\n console.log('## Available Templates');\n skillInfo.templates.forEach(template => {\n console.log(`- ${template}`);\n });\n console.log();\n }\n\n if (skillInfo.scripts.length > 0) {\n console.log('## Available Scripts');\n skillInfo.scripts.forEach(script => {\n console.log(`- ${script}`);\n });\n console.log();\n }\n\n if (skillInfo.toneAndRules.limitations && skillInfo.toneAndRules.limitations.length > 0) {\n console.log('## Limitations');\n skillInfo.toneAndRules.limitations.forEach(limitation => {\n console.log(`- ${limitation}`);\n });\n console.log();\n }\n\n // Show full skill.md content\n const skillMdPath = path.join(skillInfo.skillPath, 'skill.md');\n if (await FileSystemUtils.fileExists(skillMdPath)) {\n console.log('\u2550'.repeat(60));\n console.log('\\n## Full skill.md Content\\n');\n const content = await FileSystemUtils.readFile(skillMdPath);\n console.log(content);\n }\n\n console.log('\\n' + '\u2550'.repeat(60) + '\\n');\n }\n\n async repair(projectPath: string = '.'): Promise<void> {\n const spinner = ora('Repairing skills structure...').start();\n\n try {\n const skillsDir = path.join(projectPath, HERASPEC_DIR_NAME, SKILLS_DIR_NAME);\n \n if (!(await FileSystemUtils.fileExists(skillsDir))) {\n spinner.fail('Skills directory does not exist. Run \"heraspec init\" first.');\n process.exitCode = 1;\n return;\n }\n\n const skills = await SkillManager.listSkills(projectPath);\n let fixed = 0;\n let errors = 0;\n\n for (const skill of skills) {\n const skillPath = skill.path;\n const skillMdPath = path.join(skillPath, 'skill.md');\n\n // Ensure skill.md exists\n if (!(await FileSystemUtils.fileExists(skillMdPath))) {\n spinner.warn(`Missing skill.md in ${skillPath}`);\n errors++;\n continue;\n }\n\n // Ensure standard directories exist\n const standardDirs = ['templates', 'scripts', 'examples'];\n for (const dir of standardDirs) {\n const dirPath = path.join(skillPath, dir);\n if (!(await FileSystemUtils.fileExists(dirPath))) {\n await FileSystemUtils.createDirectory(dirPath);\n fixed++;\n }\n }\n\n // Validate skill.md structure (basic check)\n try {\n const content = await FileSystemUtils.readFile(skillMdPath);\n if (!content.includes('## Purpose') && !content.includes('# Skill:')) {\n spinner.warn(`Invalid skill.md structure in ${skillPath}`);\n }\n } catch (error) {\n spinner.warn(`Cannot read skill.md in ${skillPath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n errors++;\n }\n }\n\n if (errors === 0 && fixed === 0) {\n spinner.succeed('All skills are properly structured');\n } else {\n spinner.succeed(`Repaired ${fixed} issues, found ${errors} errors`);\n }\n } catch (error) {\n spinner.fail(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exitCode = 1;\n }\n }\n\n async add(skillName: string, projectType?: string, projectPath: string = '.'): Promise<void> {\n if (!skillName) {\n console.error('Error: Please specify a skill name');\n console.log('Usage: heraspec skills add <skill-name> [--project-type <type>]');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora(`Adding skill \"${skillName}\"...`).start();\n\n try {\n // Get template info\n const templateInfo = getSkillTemplateInfo(skillName, projectType);\n \n if (!templateInfo) {\n spinner.fail(`Skill template \"${skillName}\" not found`);\n console.log('\\nAvailable skills:');\n const allTemplates = getAllSkillTemplates();\n for (const { skillName: name, projectType: pt } of allTemplates) {\n if (pt) {\n console.log(` - ${name} (projectType: ${pt})`);\n } else {\n console.log(` - ${name} (cross-cutting)`);\n }\n }\n process.exitCode = 1;\n return;\n }\n\n // Determine destination path\n const skillsDir = path.join(projectPath, HERASPEC_DIR_NAME, SKILLS_DIR_NAME);\n \n let destPath: string;\n if (templateInfo.isCrossCutting) {\n destPath = path.join(skillsDir, skillName);\n } else {\n if (!templateInfo.projectType) {\n spinner.fail('Project type is required for this skill');\n process.exitCode = 1;\n return;\n }\n destPath = path.join(skillsDir, templateInfo.projectType, skillName);\n }\n\n // Check if already exists - remove old skill before adding new one\n const isUpdate = await FileSystemUtils.fileExists(destPath);\n if (isUpdate) {\n spinner.info(`Skill \"${skillName}\" already exists at ${destPath}`);\n spinner.start(`Removing old version to update with latest...`);\n try {\n await FileSystemUtils.removeDirectory(destPath, true);\n spinner.succeed(`Removed old skill \"${skillName}\"`);\n } catch (error) {\n spinner.fail(`Failed to remove old skill: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exitCode = 1;\n return;\n }\n spinner.start(`Adding updated skill \"${skillName}\"...`);\n }\n\n // Ensure directories exist\n await FileSystemUtils.createDirectory(destPath);\n\n // Get core templates directory\n const coreTemplatesDir = await getCoreTemplatesDir();\n if (!coreTemplatesDir) {\n spinner.fail('Cannot find HeraSpec templates directory. Make sure you are running from HeraSpec project or have templates installed.');\n process.exitCode = 1;\n return;\n }\n\n const templateFile = path.join(coreTemplatesDir, templateInfo.templateFileName);\n\n // Check if template file exists\n if (!(await FileSystemUtils.fileExists(templateFile))) {\n spinner.fail(`Template file not found: ${templateFile}`);\n process.exitCode = 1;\n return;\n }\n\n await FileSystemUtils.copyFile(templateFile, path.join(destPath, 'skill.md'));\n\n // Copy resource directories if specified\n if (templateInfo.resourceDirs) {\n for (const resourceDir of templateInfo.resourceDirs) {\n const srcResourceDir = path.join(coreTemplatesDir, resourceDir);\n const destResourceDir = path.join(destPath, resourceDir);\n \n if (await FileSystemUtils.fileExists(srcResourceDir)) {\n await FileSystemUtils.copyDirectory(srcResourceDir, destResourceDir);\n }\n }\n }\n\n // Create standard directories\n await FileSystemUtils.createDirectory(path.join(destPath, 'templates'));\n await FileSystemUtils.createDirectory(path.join(destPath, 'scripts'));\n await FileSystemUtils.createDirectory(path.join(destPath, 'examples'));\n\n const successMessage = isUpdate \n ? `Skill \"${skillName}\" updated successfully`\n : `Skill \"${skillName}\" added successfully`;\n \n spinner.succeed(successMessage);\n console.log(`\\n\uD83D\uDCCD Location: ${destPath}`);\n if (isUpdate) {\n console.log(`\\n\u2728 Skill has been updated with latest features and improvements.`);\n }\n console.log(`\\n\uD83D\uDCA1 Run \"heraspec skill show ${skillName}${projectType ? ` --project-type ${projectType}` : ''}\" to view details\\n`);\n } catch (error) {\n spinner.fail(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exitCode = 1;\n }\n }\n}\n", "/**\n * Skills Template Mapping\n * Maps skill names to their template files and resources\n */\nexport interface SkillTemplateInfo {\n templateFileName: string; // Just the filename, path resolved at runtime\n isCrossCutting: boolean;\n projectType?: string;\n resourceDirs?: string[]; // Additional directories to copy (e.g., scripts, templates, data)\n}\n\n/**\n * Mapping of skill names to their template information\n * Key format: \"projectType:skillName\" for project-specific, or \"skillName\" for cross-cutting\n */\nexport const SKILL_TEMPLATE_MAP: Record<string, SkillTemplateInfo> = {\n // Cross-cutting skills\n 'ui-ux': {\n templateFileName: 'ui-ux-skill.md',\n isCrossCutting: true,\n resourceDirs: ['scripts', 'templates', 'data'],\n },\n 'documents': {\n templateFileName: 'documents-skill.md',\n isCrossCutting: true,\n },\n 'content-optimization': {\n templateFileName: 'content-optimization-skill.md',\n isCrossCutting: true,\n },\n 'unit-test': {\n templateFileName: 'unit-test-skill.md',\n isCrossCutting: true,\n },\n 'integration-test': {\n templateFileName: 'integration-test-skill.md',\n isCrossCutting: true,\n },\n 'e2e-test': {\n templateFileName: 'e2e-test-skill.md',\n isCrossCutting: true,\n },\n 'suggestion': {\n templateFileName: 'suggestion-skill.md',\n isCrossCutting: true,\n },\n \n // Perfex module skills\n 'perfex-module:module-codebase': {\n templateFileName: 'module-codebase-skill.md',\n isCrossCutting: false,\n projectType: 'perfex-module',\n },\n};\n\n/**\n * Get template info for a skill\n */\nexport function getSkillTemplateInfo(skillName: string, projectType?: string): SkillTemplateInfo | null {\n // Try project-specific first\n if (projectType) {\n const key = `${projectType}:${skillName}`;\n if (SKILL_TEMPLATE_MAP[key]) {\n return SKILL_TEMPLATE_MAP[key];\n }\n }\n \n // Try cross-cutting\n if (SKILL_TEMPLATE_MAP[skillName]) {\n return SKILL_TEMPLATE_MAP[skillName];\n }\n \n return null;\n}\n\n/**\n * Get all available skill templates\n */\nexport function getAllSkillTemplates(): Array<{ skillName: string; projectType?: string; info: SkillTemplateInfo }> {\n const result: Array<{ skillName: string; projectType?: string; info: SkillTemplateInfo }> = [];\n \n for (const [key, info] of Object.entries(SKILL_TEMPLATE_MAP)) {\n if (info.isCrossCutting) {\n result.push({ skillName: key, info });\n } else {\n const [projectType, skillName] = key.split(':');\n result.push({ skillName, projectType, info });\n }\n }\n \n return result;\n}\n\n", "/**\n * HeraSpec Helper Command\n * Displays usage guides, example prompts, and workflow instructions\n */\n\nimport chalk from 'chalk';\n\nexport class HelperCommand {\n async execute(): Promise<void> {\n console.log(chalk.cyan.bold('\\n\uD83D\uDCDA HeraSpec Helper - Usage Guide\\n'));\n console.log('\u2550'.repeat(70) + '\\n');\n\n this.showQuickStart();\n this.showCommands();\n this.showExamplePrompts();\n this.showWorkflow();\n this.showTips();\n\n console.log('\\n' + '\u2550'.repeat(70));\n console.log(chalk.gray('\\n\uD83D\uDCA1 Tip: See details at docs/README.md (available in multiple languages)\\n'));\n }\n\n private showQuickStart(): void {\n console.log(chalk.yellow.bold('\uD83D\uDE80 Quick Start\\n'));\n console.log(chalk.white('1. Initialize a new project:'));\n console.log(chalk.gray(' cd my-project'));\n console.log(chalk.cyan(' heraspec init\\n'));\n\n console.log(chalk.white('2. Configure project.md:'));\n console.log(chalk.gray(' Edit heraspec/project.md with your project information\\n'));\n\n console.log(chalk.white('3. Create your first change (using AI):'));\n console.log(chalk.cyan(' \"Create a HeraSpec change to add feature X\"\\n'));\n\n console.log(chalk.white('4. View list:'));\n console.log(chalk.cyan(' heraspec list\\n'));\n\n console.log('\u2500'.repeat(70) + '\\n');\n }\n\n private showCommands(): void {\n console.log(chalk.yellow.bold('\u26A1 Main CLI Commands\\n'));\n \n const commands = [\n { cmd: 'heraspec init [path]', desc: 'Initialize HeraSpec in project' },\n { cmd: 'heraspec list', desc: 'List changes (default)' },\n { cmd: 'heraspec list --specs', desc: 'List specs' },\n { cmd: 'heraspec show [name]', desc: 'Show change or spec details' },\n { cmd: 'heraspec validate [name]', desc: 'Validate change or spec' },\n { cmd: 'heraspec archive [name]', desc: 'Archive completed change' },\n { cmd: 'heraspec restore [name]', desc: 'Restore change from archive' },\n { cmd: 'heraspec skill list', desc: 'List available skills' },\n { cmd: 'heraspec skill show <name>', desc: 'Show skill details' },\n { cmd: 'heraspec make docs', desc: 'Generate product documentation' },\n { cmd: 'heraspec make docs --agent <name>', desc: 'Generate docs with AI agent' },\n { cmd: 'heraspec make test', desc: 'Generate test cases from specs' },\n { cmd: 'heraspec make test --type <type>', desc: 'Generate tests (unit/integration/e2e)' },\n { cmd: 'heraspec suggest', desc: 'Suggest new features for project' },\n { cmd: 'heraspec view', desc: 'View dashboard overview' },\n { cmd: 'heraspec helper', desc: 'Show this guide' },\n ];\n\n commands.forEach(({ cmd, desc }) => {\n console.log(chalk.cyan(` ${cmd.padEnd(35)}`) + chalk.white(desc));\n });\n\n console.log('\\n' + '\u2500'.repeat(70) + '\\n');\n }\n\n private showExamplePrompts(): void {\n console.log(chalk.yellow.bold('\uD83D\uDCAC Example Prompts for AI\\n'));\n\n console.log(chalk.white.bold('1. Simple Change Creation:\\n'));\n console.log(chalk.gray(' \"Create a HeraSpec change to add 2FA authentication feature\"\\n'));\n console.log(chalk.gray(' \"Create HeraSpec change for order management module\"\\n'));\n\n console.log(chalk.white.bold('2. Create Change Based on project.md:\\n'));\n console.log(chalk.gray(' \"Read heraspec/project.md and create HeraSpec changes for all\\n'));\n console.log(chalk.gray(' features mentioned in it\"\\n'));\n console.log(chalk.gray(' \"Based on project.md, create changes to implement by phase\"\\n'));\n\n console.log(chalk.white.bold('3. Detailed Change Creation:\\n'));\n console.log(chalk.gray(' \"Create HeraSpec change with the following steps:\\n'));\n console.log(chalk.gray(' 1. Read and analyze heraspec/project.md\\n'));\n console.log(chalk.gray(' 2. Identify features to build\\n'));\n console.log(chalk.gray(' 3. For each feature, create a separate change\\n'));\n console.log(chalk.gray(' 4. Each change needs proposal.md, tasks.md, specs/\\n'));\n console.log(chalk.gray(' 5. Follow conventions in project.md\"\\n'));\n\n console.log(chalk.white.bold('4. Prompt With Project Type and Skill:\\n'));\n console.log(chalk.gray(' \"Create change for WordPress plugin with skill admin-settings-page\"\\n'));\n console.log(chalk.gray(' \"Create change for Perfex module with skill module-codebase\"\\n'));\n console.log(chalk.gray(' \"Create UI/UX change with skill ui-ux for admin interface\"\\n'));\n\n console.log(chalk.white.bold('5. View and Validate:\\n'));\n console.log(chalk.gray(' \"View change add-user-auth\"\\n'));\n console.log(chalk.gray(' \"Validate change add-user-auth --strict\"\\n'));\n console.log(chalk.gray(' \"List all changes\"\\n'));\n\n console.log(chalk.white.bold('6. Implementation:\\n'));\n console.log(chalk.gray(' \"Specs approved, start implementing change add-user-auth\"\\n'));\n console.log(chalk.gray(' \"Execute tasks in change add-user-auth\"\\n'));\n\n console.log(chalk.white.bold('7. Generate Documentation:\\n'));\n console.log(chalk.gray(' \"Generate product documentation from specs\"\\n'));\n console.log(chalk.gray(' heraspec make docs\\n'));\n console.log(chalk.gray(' \"Generate docs with specific AI agent\"\\n'));\n console.log(chalk.gray(' heraspec make docs --agent chatgpt\\n'));\n console.log(chalk.gray(' heraspec make docs --agent claude\\n'));\n\n console.log('\u2500'.repeat(70) + '\\n');\n }\n\n private showWorkflow(): void {\n console.log(chalk.yellow.bold('\uD83D\uDD04 Workflow\\n'));\n\n const steps = [\n {\n step: '1. Create Change',\n actions: [\n 'AI or you create change directory',\n 'Write proposal.md describing purpose',\n 'Create tasks.md with task list',\n 'Write delta specs in specs/',\n ],\n prompt: '\"Create HeraSpec change to...\"',\n },\n {\n step: '2. Refine Specs',\n actions: [\n 'Review: heraspec show <name>',\n 'Ask AI to edit if needed',\n 'Validate: heraspec validate <name>',\n ],\n prompt: '\"Edit specs in change...\"',\n },\n {\n step: '3. Approval',\n actions: ['Wait for user: \"Specs approved.\"'],\n prompt: 'You confirm: \"Specs approved.\"',\n },\n {\n step: '4. Implementation',\n actions: [\n 'AI reads tasks.md and skill.md',\n 'Execute each task',\n 'Mark completed: - [x]',\n ],\n prompt: '\"Specs approved, implement change...\"',\n },\n {\n step: '5. Archive',\n actions: [\n 'Review: heraspec show <name>',\n 'Archive: heraspec archive <name> --yes',\n 'Specs merged into source specs',\n ],\n prompt: 'heraspec archive <name> --yes',\n },\n {\n step: '6. Generate Documentation',\n actions: [\n 'Generate product docs: heraspec make docs',\n 'With specific agent: heraspec make docs --agent <name>',\n 'Output: documentation/product-documentation.txt',\n ],\n prompt: 'heraspec make docs --agent chatgpt',\n },\n ];\n\n steps.forEach(({ step, actions, prompt }) => {\n console.log(chalk.cyan.bold(` ${step}`));\n actions.forEach((action) => {\n console.log(chalk.white(` \u2022 ${action}`));\n });\n console.log(chalk.gray(` \uD83D\uDCAC ${prompt}\\n`));\n });\n\n console.log('\u2500'.repeat(70) + '\\n');\n }\n\n private showTips(): void {\n console.log(chalk.yellow.bold('\uD83D\uDCA1 Tips & Best Practices\\n'));\n\n const tips = [\n 'Always read heraspec/project.md before creating change',\n 'Use Skills system when implementing (each task has skill tag)',\n 'Validate specs before requesting approval',\n 'One change should focus on one specific feature',\n 'Name change: kebab-case, verb-led (add-, create-, implement-)',\n 'Delta specs only change in change folder',\n 'Do not edit source-of-truth specs directly',\n 'Archive change after completion to merge specs',\n 'Use heraspec skill list to view available skills',\n 'UI/UX tasks: Use search scripts in skill ui-ux',\n 'Generate product docs: heraspec make docs (default agent: chatgpt)',\n 'Specify AI agent: heraspec make docs --agent <name> (chatgpt, claude, etc.)',\n 'Generate tests: heraspec make test (default: unit)',\n 'Test types: unit (individual functions), integration (components), e2e (user flows)',\n 'Generate code: heraspec make code (generates code skeletons from specs)',\n 'Validate with suggestions: heraspec validate <name> (includes fix suggestions)',\n 'Get feature suggestions: heraspec suggest (analyzes project and suggests enhancements)',\n 'Use test skills: unit-test, integration-test, e2e-test for test implementation',\n ];\n\n tips.forEach((tip) => {\n console.log(chalk.white(` \u2022 ${tip}`));\n });\n\n console.log('');\n }\n}\n", "/**\n * HeraSpec Make Docs Command\n * Generates user-friendly product documentation from specs\n */\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { HERASPEC_DIR_NAME, SPECS_DIR_NAME, HERASPEC_MARKERS } from '../core/config.js';\n\nexport class MakeDocsCommand {\n async execute(projectPath: string = '.', agent: string = 'chatgpt'): Promise<void> {\n const spinner = ora(`Generating product documentation (Agent: ${agent})...`).start();\n\n try {\n const resolvedPath = path.resolve(projectPath);\n const specsDir = path.join(resolvedPath, HERASPEC_DIR_NAME, SPECS_DIR_NAME);\n const docsDir = path.join(resolvedPath, 'documentation');\n const projectMdPath = path.join(resolvedPath, HERASPEC_DIR_NAME, HERASPEC_MARKERS.PROJECT_MD);\n\n // Check if specs directory exists\n if (!(await FileSystemUtils.fileExists(specsDir))) {\n spinner.fail('Specs directory not found. Run \"heraspec init\" first.');\n process.exitCode = 1;\n return;\n }\n\n // Ensure documentation directory exists\n await FileSystemUtils.createDirectory(docsDir);\n\n // Read project.md if exists (for context)\n let projectInfo: { name?: string; description?: string } = {};\n if (await FileSystemUtils.fileExists(projectMdPath)) {\n const projectContent = await FileSystemUtils.readFile(projectMdPath);\n projectInfo = this.extractProjectInfo(projectContent);\n }\n\n // Find all spec files\n const specFiles = await this.findSpecFiles(specsDir);\n\n if (specFiles.length === 0) {\n spinner.warn('No specs found. Create specs first using \"heraspec list --specs\".');\n return;\n }\n\n // Read and parse all specs\n const specs = await this.readSpecs(specFiles);\n\n // Generate user-friendly documentation\n const docContent = this.generateProductDocumentation(specs, projectInfo, agent);\n\n // Write documentation file\n const docFilePath = path.join(docsDir, 'product-documentation.txt');\n await FileSystemUtils.writeFile(docFilePath, docContent);\n\n spinner.succeed(`Product documentation generated: ${docFilePath}`);\n console.log(chalk.gray(`\\nFound ${specFiles.length} feature(s)`));\n } catch (error) {\n spinner.fail(`Error: ${(error as Error).message}`);\n process.exitCode = 1;\n throw error;\n }\n }\n\n /**\n * Extract project information from project.md\n */\n private extractProjectInfo(projectContent: string): { name?: string; description?: string } {\n const info: { name?: string; description?: string } = {};\n \n // Extract project name (usually first heading or after # Project Name)\n const nameMatch = projectContent.match(/^#\\s+(.+)$/m);\n if (nameMatch) {\n info.name = nameMatch[1].trim();\n }\n\n // Extract description (first paragraph after title)\n const lines = projectContent.split('\\n');\n let descriptionStart = false;\n const descriptionLines: string[] = [];\n \n for (const line of lines) {\n if (line.startsWith('#') && !descriptionStart) {\n descriptionStart = true;\n continue;\n }\n if (descriptionStart && line.trim() && !line.startsWith('#')) {\n descriptionLines.push(line.trim());\n if (descriptionLines.length >= 3) break; // Get first few lines\n }\n }\n \n if (descriptionLines.length > 0) {\n info.description = descriptionLines.join(' ');\n }\n\n return info;\n }\n\n /**\n * Find all spec files recursively\n */\n private async findSpecFiles(specsDir: string): Promise<string[]> {\n const specFiles: string[] = [];\n await this.findSpecFilesRecursive(specsDir, specFiles);\n return specFiles.sort();\n }\n\n /**\n * Recursively find spec files\n */\n private async findSpecFilesRecursive(dir: string, files: string[]): Promise<void> {\n const fs = await import('fs/promises');\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await this.findSpecFilesRecursive(entryPath, files);\n } else if (entry.name.endsWith('.md')) {\n files.push(entryPath);\n }\n }\n }\n\n /**\n * Read all spec files\n */\n private async readSpecs(specFiles: string[]): Promise<Array<{ path: string; content: string; name: string }>> {\n const specs = [];\n\n for (const specFile of specFiles) {\n const content = await FileSystemUtils.readFile(specFile);\n const name = this.extractFeatureName(specFile, content);\n\n specs.push({\n path: specFile,\n content,\n name,\n });\n }\n\n return specs;\n }\n\n /**\n * Extract feature name from spec file\n */\n private extractFeatureName(filePath: string, content: string): string {\n // Try to get from first heading\n const headingMatch = content.match(/^#+\\s+(.+)$/m);\n if (headingMatch) {\n return headingMatch[1].trim();\n }\n \n // Fallback to filename\n return path.basename(filePath, '.md')\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n\n /**\n * Generate product documentation from specs\n */\n private generateProductDocumentation(\n specs: Array<{ path: string; content: string; name: string }>,\n projectInfo: { name?: string; description?: string },\n agent: string = 'chatgpt'\n ): string {\n const lines: string[] = [];\n\n // Title\n const productName = projectInfo.name || 'Product';\n lines.push(`# ${productName}`);\n lines.push('');\n\n // Description\n if (projectInfo.description) {\n lines.push(projectInfo.description);\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n\n // Overview\n lines.push('## Overview');\n lines.push('');\n lines.push(`This product includes ${specs.length} main feature${specs.length > 1 ? 's' : ''}:`);\n lines.push('');\n specs.forEach((spec, index) => {\n lines.push(`${index + 1}. ${spec.name}`);\n });\n lines.push('');\n lines.push('---');\n lines.push('');\n\n // Features (user-friendly descriptions)\n lines.push('## Features');\n lines.push('');\n\n specs.forEach((spec, index) => {\n const featureInfo = this.extractFeatureInfo(spec.content);\n \n lines.push(`### ${index + 1}. ${spec.name}`);\n lines.push('');\n\n // Purpose/Description\n if (featureInfo.description) {\n lines.push(featureInfo.description);\n lines.push('');\n }\n\n // Key Capabilities\n if (featureInfo.capabilities.length > 0) {\n lines.push('**Key Capabilities:**');\n lines.push('');\n featureInfo.capabilities.forEach(cap => {\n lines.push(`- ${cap}`);\n });\n lines.push('');\n }\n\n // Use Cases (if any scenarios)\n if (featureInfo.useCases.length > 0) {\n lines.push('**Use Cases:**');\n lines.push('');\n featureInfo.useCases.forEach(useCase => {\n lines.push(`- ${useCase}`);\n });\n lines.push('');\n }\n\n if (index < specs.length - 1) {\n lines.push('---');\n lines.push('');\n }\n });\n\n // Footer\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push(`*This documentation is auto-generated from product specifications using ${agent}.*`);\n lines.push('');\n\n return lines.join('\\n');\n }\n\n /**\n * Extract user-friendly information from spec content\n */\n private extractFeatureInfo(content: string): {\n description: string;\n capabilities: string[];\n useCases: string[];\n } {\n const info: { description: string; capabilities: string[]; useCases: string[] } = {\n description: '',\n capabilities: [],\n useCases: [],\n };\n\n const lines = content.split('\\n');\n let inPurpose = false;\n let inRequirements = false;\n let inScenarios = false;\n let currentSection = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Detect sections\n if (trimmed.match(/^##+\\s+Purpose/i)) {\n inPurpose = true;\n inRequirements = false;\n inScenarios = false;\n continue;\n } else if (trimmed.match(/^##+\\s+Requirements?/i)) {\n inPurpose = false;\n inRequirements = true;\n inScenarios = false;\n continue;\n } else if (trimmed.match(/^##+\\s+Scenarios?/i)) {\n inPurpose = false;\n inRequirements = false;\n inScenarios = true;\n continue;\n } else if (trimmed.match(/^##+/)) {\n // New section, stop current\n inPurpose = false;\n inRequirements = false;\n inScenarios = false;\n continue;\n }\n\n // Extract Purpose as description\n if (inPurpose && trimmed && !trimmed.startsWith('#')) {\n if (!info.description) {\n info.description = trimmed;\n } else if (info.description.length < 300) {\n info.description += ' ' + trimmed;\n }\n }\n\n // Extract Requirements as capabilities\n if (inRequirements && trimmed.startsWith('-')) {\n const requirement = trimmed.replace(/^-\\s*/, '').trim();\n if (requirement) {\n // Clean up technical terms, make user-friendly\n const userFriendly = this.makeUserFriendly(requirement);\n info.capabilities.push(userFriendly);\n }\n }\n\n // Extract Scenarios as use cases\n if (inScenarios && trimmed.match(/^[*-]\\s*.+:/)) {\n const scenario = trimmed.replace(/^[*-]\\s*/, '').split(':')[0].trim();\n if (scenario) {\n const userFriendly = this.makeUserFriendly(scenario);\n info.useCases.push(userFriendly);\n }\n }\n }\n\n // If no description found, use first paragraph\n if (!info.description) {\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && trimmed.length > 20) {\n info.description = trimmed;\n break;\n }\n }\n }\n\n return info;\n }\n\n /**\n * Make technical text more user-friendly\n */\n private makeUserFriendly(text: string): string {\n // Remove technical markers\n let result = text\n .replace(/\\([^)]*\\)/g, '') // Remove parentheses\n .replace(/\\[([^\\]]+)\\]/g, '$1') // Convert [text] to text\n .replace(/\\{([^}]+)\\}/g, '$1') // Convert {text} to text\n .replace(/\\b(GET|POST|PUT|DELETE|API|REST|HTTP)\\b/gi, '') // Remove API terms\n .replace(/\\b(endpoint|route|method|parameter|query|body)\\b/gi, '') // Remove technical terms\n .trim();\n\n // Capitalize first letter\n if (result) {\n result = result.charAt(0).toUpperCase() + result.slice(1);\n }\n\n // Clean up multiple spaces\n result = result.replace(/\\s+/g, ' ');\n\n return result;\n }\n}\n", "/**\n * HeraSpec Make Test Command\n * Generates test cases for project features\n */\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { HERASPEC_DIR_NAME, SPECS_DIR_NAME, HERASPEC_MARKERS } from '../core/config.js';\n\nexport class MakeTestCommand {\n async execute(projectPath: string = '.', testType: string = 'unit'): Promise<void> {\n const spinner = ora(`Generating ${testType} tests...`).start();\n\n try {\n const resolvedPath = path.resolve(projectPath);\n const specsDir = path.join(resolvedPath, HERASPEC_DIR_NAME, SPECS_DIR_NAME);\n const projectMdPath = path.join(resolvedPath, HERASPEC_DIR_NAME, HERASPEC_MARKERS.PROJECT_MD);\n\n // Check if specs directory exists\n if (!(await FileSystemUtils.fileExists(specsDir))) {\n spinner.fail('Specs directory not found. Run \"heraspec init\" first.');\n process.exitCode = 1;\n return;\n }\n\n // Determine test directory based on project type (can be customized)\n const testDir = this.getTestDirectory(resolvedPath, testType);\n\n // Ensure test directory exists\n await FileSystemUtils.createDirectory(testDir);\n\n // Read project.md if exists\n let projectInfo: { projectType?: string; stack?: string[] } = {};\n if (await FileSystemUtils.fileExists(projectMdPath)) {\n const projectContent = await FileSystemUtils.readFile(projectMdPath);\n projectInfo = this.extractProjectInfo(projectContent);\n }\n\n // Find all spec files\n const specFiles = await this.findSpecFiles(specsDir);\n\n if (specFiles.length === 0) {\n spinner.warn('No specs found. Create specs first using \"heraspec list --specs\".');\n return;\n }\n\n // Read and parse all specs\n const specs = await this.readSpecs(specFiles);\n\n // Generate test files\n const testFilesCreated = await this.generateTestFiles(specs, testDir, testType, projectInfo);\n\n spinner.succeed(`Generated ${testFilesCreated.length} test file(s) in ${testDir}`);\n console.log(chalk.gray(`\\nTest type: ${testType}`));\n console.log(chalk.gray(`Specs analyzed: ${specFiles.length}`));\n } catch (error) {\n spinner.fail(`Error: ${(error as Error).message}`);\n process.exitCode = 1;\n throw error;\n }\n }\n\n /**\n * Get test directory path based on project type and test type\n */\n private getTestDirectory(projectPath: string, testType: string): string {\n // Default test directories\n const testDirs: Record<string, string> = {\n unit: 'tests/unit',\n integration: 'tests/integration',\n e2e: 'tests/e2e',\n };\n\n const baseDir = testDirs[testType] || 'tests';\n return path.join(projectPath, baseDir);\n }\n\n /**\n * Extract project information from project.md\n */\n private extractProjectInfo(projectContent: string): { projectType?: string; stack?: string[] } {\n const info: { projectType?: string; stack?: string[] } = {};\n\n // Extract project type\n const projectTypeMatch = projectContent.match(/project[-\\s]type[s]?[:\\s]+([^\\n]+)/i);\n if (projectTypeMatch) {\n info.projectType = projectTypeMatch[1].trim();\n }\n\n // Extract tech stack\n const stackMatch = projectContent.match(/tech[-\\s]stack[:\\s]+([^\\n]+)/i);\n if (stackMatch) {\n info.stack = stackMatch[1]\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length > 0);\n }\n\n return info;\n }\n\n /**\n * Find all spec files recursively\n */\n private async findSpecFiles(specsDir: string): Promise<string[]> {\n const specFiles: string[] = [];\n await this.findSpecFilesRecursive(specsDir, specFiles);\n return specFiles.sort();\n }\n\n /**\n * Recursively find spec files\n */\n private async findSpecFilesRecursive(dir: string, files: string[]): Promise<void> {\n const fs = await import('fs/promises');\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await this.findSpecFilesRecursive(entryPath, files);\n } else if (entry.name.endsWith('.md')) {\n files.push(entryPath);\n }\n }\n }\n\n /**\n * Read all spec files\n */\n private async readSpecs(specFiles: string[]): Promise<Array<{ path: string; content: string; name: string }>> {\n const specs = [];\n\n for (const specFile of specFiles) {\n const content = await FileSystemUtils.readFile(specFile);\n const name = this.extractFeatureName(specFile, content);\n\n specs.push({\n path: specFile,\n content,\n name,\n });\n }\n\n return specs;\n }\n\n /**\n * Extract feature name from spec file\n */\n private extractFeatureName(filePath: string, content: string): string {\n // Try to get from first heading\n const headingMatch = content.match(/^#+\\s+(.+)$/m);\n if (headingMatch) {\n return headingMatch[1].trim();\n }\n\n // Fallback to filename\n return path.basename(filePath, '.md');\n }\n\n /**\n * Generate test files from specs\n */\n private async generateTestFiles(\n specs: Array<{ path: string; content: string; name: string }>,\n testDir: string,\n testType: string,\n projectInfo: { projectType?: string; stack?: string[] }\n ): Promise<string[]> {\n const createdFiles: string[] = [];\n\n for (const spec of specs) {\n const testContent = this.generateTestContent(spec, testType, projectInfo);\n const testFileName = this.getTestFileName(spec.name, testType, projectInfo);\n const testFilePath = path.join(testDir, testFileName);\n\n await FileSystemUtils.writeFile(testFilePath, testContent);\n createdFiles.push(testFilePath);\n }\n\n return createdFiles;\n }\n\n /**\n * Generate test file content\n */\n private generateTestContent(\n spec: { path: string; content: string; name: string },\n testType: string,\n projectInfo: { projectType?: string; stack?: string[] }\n ): string {\n const featureInfo = this.extractFeatureInfo(spec.content);\n const testFramework = this.determineTestFramework(projectInfo);\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(`/**`);\n lines.push(` * ${testType.charAt(0).toUpperCase() + testType.slice(1)} tests for: ${spec.name}`);\n lines.push(` * Generated from spec: ${path.basename(spec.path)}`);\n lines.push(` */`);\n lines.push('');\n\n // Test framework setup\n if (testFramework === 'jest') {\n lines.push(`describe('${spec.name}', () => {`);\n lines.push(' // TODO: Implement test cases based on spec requirements');\n lines.push('');\n if (featureInfo.requirements.length > 0) {\n featureInfo.requirements.forEach((req, index) => {\n lines.push(` test('should ${req}', () => {`);\n lines.push(` // Test implementation needed`);\n lines.push(` expect(true).toBe(true);`);\n lines.push(` });`);\n if (index < featureInfo.requirements.length - 1) {\n lines.push('');\n }\n });\n }\n lines.push('});');\n } else if (testFramework === 'phpunit') {\n lines.push(`class ${this.toPascalCase(spec.name)}Test extends TestCase`);\n lines.push('{');\n lines.push(' // TODO: Implement test cases based on spec requirements');\n lines.push('');\n if (featureInfo.requirements.length > 0) {\n featureInfo.requirements.forEach((req, index) => {\n lines.push(` public function test_${this.toSnakeCase(req)}()`);\n lines.push(' {');\n lines.push(' // Test implementation needed');\n lines.push(' $this->assertTrue(true);');\n lines.push(' }');\n if (index < featureInfo.requirements.length - 1) {\n lines.push('');\n }\n });\n }\n lines.push('}');\n } else {\n // Generic test structure\n lines.push(`// ${testType.charAt(0).toUpperCase() + testType.slice(1)} tests for: ${spec.name}`);\n lines.push('');\n lines.push('// TODO: Implement test cases based on spec requirements');\n lines.push('');\n if (featureInfo.requirements.length > 0) {\n featureInfo.requirements.forEach((req) => {\n lines.push(`// Test: ${req}`);\n });\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Determine test framework based on project info\n */\n private determineTestFramework(projectInfo: { projectType?: string; stack?: string[] }): string {\n if (projectInfo.stack) {\n if (projectInfo.stack.some(s => s.toLowerCase().includes('php'))) {\n return 'phpunit';\n }\n if (projectInfo.stack.some(s => s.toLowerCase().includes('node') || s.toLowerCase().includes('javascript'))) {\n return 'jest';\n }\n }\n\n // Default to jest for modern projects\n return 'jest';\n }\n\n /**\n * Get test file name\n */\n private getTestFileName(featureName: string, testType: string, projectInfo: { projectType?: string; stack?: string[] }): string {\n const framework = this.determineTestFramework(projectInfo);\n const baseName = this.toKebabCase(featureName);\n\n if (framework === 'phpunit') {\n return `${this.toPascalCase(featureName)}Test.php`;\n } else if (framework === 'jest') {\n return `${baseName}.test.js`;\n }\n\n return `${baseName}.test.js`;\n }\n\n /**\n * Extract feature info from spec content\n */\n private extractFeatureInfo(content: string): { requirements: string[] } {\n const info: { requirements: string[] } = {\n requirements: [],\n };\n\n const lines = content.split('\\n');\n let inRequirements = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.match(/^##+\\s+Requirements?/i)) {\n inRequirements = true;\n continue;\n } else if (trimmed.match(/^##+/) && inRequirements) {\n break;\n }\n\n if (inRequirements && trimmed.startsWith('-')) {\n const requirement = trimmed.replace(/^-\\s*/, '').trim();\n if (requirement) {\n info.requirements.push(requirement);\n }\n }\n }\n\n return info;\n }\n\n /**\n * Convert to kebab-case\n */\n private toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n /**\n * Convert to PascalCase\n */\n private toPascalCase(str: string): string {\n return str\n .split(/[^a-zA-Z0-9]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n /**\n * Convert to snake_case\n */\n private toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n }\n}\n\n", "/**\n * HeraSpec Make Code Command\n * Generates code skeletons from specs\n */\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { FileSystemUtils } from '../utils/file-system.js';\nimport { HERASPEC_DIR_NAME, SPECS_DIR_NAME, HERASPEC_MARKERS } from '../core/config.js';\nimport { MarkdownParser } from '../core/parsers/markdown-parser.js';\n\nexport class MakeCodeCommand {\n async execute(projectPath: string = '.', specName?: string): Promise<void> {\n const spinner = ora('Generating code from specs...').start();\n\n try {\n const resolvedPath = path.resolve(projectPath);\n const specsDir = path.join(resolvedPath, HERASPEC_DIR_NAME, SPECS_DIR_NAME);\n const projectMdPath = path.join(resolvedPath, HERASPEC_DIR_NAME, HERASPEC_MARKERS.PROJECT_MD);\n\n // Check if specs directory exists\n if (!(await FileSystemUtils.fileExists(specsDir))) {\n spinner.fail('Specs directory not found. Run \"heraspec init\" first.');\n process.exitCode = 1;\n return;\n }\n\n // Read project.md for context\n let projectInfo: { projectType?: string; stack?: string[] } = {};\n if (await FileSystemUtils.fileExists(projectMdPath)) {\n const projectContent = await FileSystemUtils.readFile(projectMdPath);\n projectInfo = this.extractProjectInfo(projectContent);\n }\n\n // Find spec files\n let specFiles: string[] = [];\n if (specName) {\n // Find specific spec\n const specPath = this.findSpecPath(specsDir, specName);\n if (specPath && (await FileSystemUtils.fileExists(specPath))) {\n specFiles = [specPath];\n } else {\n spinner.fail(`Spec \"${specName}\" not found`);\n process.exitCode = 1;\n return;\n }\n } else {\n // Find all specs\n specFiles = await this.findSpecFiles(specsDir);\n }\n\n if (specFiles.length === 0) {\n spinner.warn('No specs found. Create specs first using \"heraspec list --specs\".');\n return;\n }\n\n // Read and parse specs\n const specs = await this.readSpecs(specFiles);\n\n // Generate code files\n const generatedFiles = await this.generateCodeFiles(specs, resolvedPath, projectInfo);\n\n spinner.succeed(`Generated ${generatedFiles.length} code file(s)`);\n console.log(chalk.gray(`\\nSpecs analyzed: ${specFiles.length}`));\n generatedFiles.forEach((file: string) => {\n console.log(chalk.cyan(` \u2713 ${path.relative(resolvedPath, file)}`));\n });\n } catch (error) {\n spinner.fail(`Error: ${(error as Error).message}`);\n process.exitCode = 1;\n throw error;\n }\n }\n\n private extractProjectInfo(content: string): { projectType?: string; stack?: string[] } {\n const projectTypeMatch = content.match(/project[-\\s]type[s]?[:\\s]+([^\\n]+)/i);\n const stackMatch = content.match(/tech[-\\s]stack[:\\s]+([^\\n]+)/i);\n\n return {\n projectType: projectTypeMatch ? projectTypeMatch[1].trim().split(',')[0].trim() : undefined,\n stack: stackMatch ? stackMatch[1].split(',').map(s => s.trim()).filter(Boolean) : undefined,\n };\n }\n\n private findSpecPath(specsDir: string, specName: string): string | null {\n // Try direct path first\n const directPath = path.join(specsDir, `${specName}.md`);\n // Try nested path\n const nestedPath = path.join(specsDir, specName, 'spec.md');\n return directPath; // Return first option, caller will check existence\n }\n\n private async findSpecFiles(specsDir: string): Promise<string[]> {\n const specFiles: string[] = [];\n await this.findSpecFilesRecursive(specsDir, specFiles);\n return specFiles.sort();\n }\n\n private async findSpecFilesRecursive(dir: string, files: string[]): Promise<void> {\n const fs = await import('fs/promises');\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await this.findSpecFilesRecursive(entryPath, files);\n } else if (entry.name.endsWith('.md') && entry.name !== 'README.md') {\n files.push(entryPath);\n }\n }\n }\n\n private async readSpecs(specFiles: string[]): Promise<Array<{ path: string; content: string; name: string; parsed: any }>> {\n const specs = [];\n\n for (const specFile of specFiles) {\n const content = await FileSystemUtils.readFile(specFile);\n const parser = new MarkdownParser(content);\n const specName = path.basename(specFile, '.md');\n\n try {\n const parsed = parser.parseSpec(specName);\n specs.push({\n path: specFile,\n content,\n name: parsed.name,\n parsed,\n });\n } catch (error) {\n console.warn(chalk.yellow(`Warning: Could not parse spec file ${specFile}. Skipping.`));\n }\n }\n\n return specs;\n }\n\n private async generateCodeFiles(\n specs: Array<{ path: string; content: string; name: string; parsed: any }>,\n projectPath: string,\n projectInfo: { projectType?: string; stack?: string[] }\n ): Promise<string[]> {\n const generatedFiles: string[] = [];\n const projectType = projectInfo.projectType || 'generic-webapp';\n\n for (const spec of specs) {\n const codeContent = this.generateCodeContent(spec, projectType, projectInfo);\n const outputPath = this.getOutputPath(projectPath, spec.name, projectType);\n \n // Ensure directory exists\n await FileSystemUtils.createDirectory(path.dirname(outputPath));\n await FileSystemUtils.writeFile(outputPath, codeContent);\n generatedFiles.push(outputPath);\n }\n\n return generatedFiles;\n }\n\n private getOutputPath(projectPath: string, specName: string, projectType: string): string {\n // Generate appropriate path based on project type\n const sanitizedName = specName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n \n if (projectType.includes('wordpress-plugin')) {\n return path.join(projectPath, 'includes', `class-${sanitizedName}.php`);\n } else if (projectType.includes('perfex-module')) {\n return path.join(projectPath, 'modules', sanitizedName, `${sanitizedName}.php`);\n } else if (projectType.includes('laravel')) {\n return path.join(projectPath, 'app', 'Services', `${this.toPascalCase(sanitizedName)}Service.php`);\n } else if (projectType.includes('node')) {\n return path.join(projectPath, 'src', 'services', `${sanitizedName}.js`);\n } else {\n // Generic\n return path.join(projectPath, 'src', `${sanitizedName}.ts`);\n }\n }\n\n private generateCodeContent(\n spec: { path: string; content: string; name: string; parsed: any },\n projectType: string,\n projectInfo: { projectType?: string; stack?: string[] }\n ): string {\n const lines: string[] = [];\n const className = this.toPascalCase(spec.name.replace(/[^a-zA-Z0-9]/g, ''));\n\n // Header comment\n lines.push(`/**`);\n lines.push(` * ${spec.name}`);\n lines.push(` * Generated from spec: ${path.basename(spec.path)}`);\n lines.push(` *`);\n lines.push(` * ${spec.parsed.overview || 'Generated code skeleton'}`);\n lines.push(` */`);\n lines.push('');\n\n if (projectType.includes('wordpress-plugin') || projectType.includes('perfex-module')) {\n // PHP class\n lines.push(`<?php`);\n lines.push('');\n lines.push(`class ${className} {`);\n lines.push('');\n \n // Add methods based on requirements\n spec.parsed.requirements.forEach((req: any) => {\n const methodName = this.toCamelCase(req.name.replace(/[^a-zA-Z0-9]/g, ''));\n lines.push(` /**`);\n lines.push(` * ${req.description || req.name}`);\n lines.push(` */`);\n lines.push(` public function ${methodName}() {`);\n lines.push(` // TODO: Implement ${req.name}`);\n lines.push(` }`);\n lines.push('');\n });\n \n lines.push('}');\n } else if (projectType.includes('laravel')) {\n // PHP Service class\n lines.push(`<?php`);\n lines.push('');\n lines.push(`namespace App\\\\Services;`);\n lines.push('');\n lines.push(`class ${className}Service {`);\n lines.push('');\n \n spec.parsed.requirements.forEach((req: any) => {\n const methodName = this.toCamelCase(req.name.replace(/[^a-zA-Z0-9]/g, ''));\n lines.push(` /**`);\n lines.push(` * ${req.description || req.name}`);\n lines.push(` */`);\n lines.push(` public function ${methodName}() {`);\n lines.push(` // TODO: Implement ${req.name}`);\n lines.push(` }`);\n lines.push('');\n });\n \n lines.push('}');\n } else if (projectType.includes('node')) {\n // JavaScript/TypeScript\n lines.push(`/**`);\n lines.push(` * ${spec.name} service`);\n lines.push(` */`);\n lines.push('');\n lines.push(`class ${className} {`);\n lines.push('');\n \n spec.parsed.requirements.forEach((req: any) => {\n const methodName = this.toCamelCase(req.name.replace(/[^a-zA-Z0-9]/g, ''));\n lines.push(` /**`);\n lines.push(` * ${req.description || req.name}`);\n lines.push(` */`);\n lines.push(` ${methodName}() {`);\n lines.push(` // TODO: Implement ${req.name}`);\n lines.push(` }`);\n lines.push('');\n });\n \n lines.push('}');\n lines.push('');\n lines.push(`module.exports = ${className};`);\n } else {\n // Generic TypeScript\n lines.push(`export class ${className} {`);\n lines.push('');\n \n spec.parsed.requirements.forEach((req: any) => {\n const methodName = this.toCamelCase(req.name.replace(/[^a-zA-Z0-9]/g, ''));\n lines.push(` /**`);\n lines.push(` * ${req.description || req.name}`);\n lines.push(` */`);\n lines.push(` ${methodName}(): void {`);\n lines.push(` // TODO: Implement ${req.name}`);\n lines.push(` }`);\n lines.push('');\n });\n \n lines.push('}');\n }\n\n lines.push('');\n lines.push(`// Generated by HeraSpec - Update this file based on implementation requirements`);\n\n return lines.join('\\n');\n }\n\n private toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,eAAe;AACxB,SAAS,iBAAAA,sBAAqB;AAC9B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,UAAS,QAAAC,aAAY;;;ACF9B,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,OAAOC,WAAU;;;ACHjB,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AAEV,IAAM,kBAAN,MAAsB;AAAA,EAC3B,aAAa,gBAAgB,SAAgC;AAC3D,UAAM,GAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAAA,EAEA,aAAa,WAAW,UAAoC;AAC1D,QAAI;AACF,YAAM,GAAG,OAAO,QAAQ;AACxB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa,SAAS,UAAmC;AACvD,WAAO,MAAM,GAAG,SAAS,UAAU,OAAO;AAAA,EAC5C;AAAA,EAEA,aAAa,UAAU,UAAkB,SAAgC;AACvE,UAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAAA,EAC/C;AAAA,EAEA,aAAa,cAAc,SAAoC;AAC7D,WAAO,MAAM,GAAG,QAAQ,OAAO;AAAA,EACjC;AAAA,EAEA,aAAa,KAAK,UAAkB;AAClC,WAAO,MAAM,GAAG,KAAK,QAAQ;AAAA,EAC/B;AAAA,EAEA,aAAa,SAAS,KAAa,MAA6B;AAC9D,UAAM,GAAG,SAAS,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,aAAa,cAAc,KAAa,MAA6B;AACnE,UAAM,GAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,KAAK,KAAK,KAAK,MAAM,IAAI;AACzC,YAAM,WAAW,KAAK,KAAK,MAAM,MAAM,IAAI;AAE3C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,cAAc,SAAS,QAAQ;AAAA,MAC5C,OAAO;AACL,cAAM,GAAG,SAAS,SAAS,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,WAAW,UAAiC;AACvD,UAAM,GAAG,OAAO,QAAQ;AAAA,EAC1B;AAAA,EAEA,aAAa,gBAAgB,SAAiB,YAAY,MAAqB;AAG7E,QAAI,OAAQ,GAAW,OAAO,YAAY;AACxC,YAAO,GAAW,GAAG,SAAS,EAAE,WAAW,OAAO,KAAK,CAAC;AAAA,IAC1D,OAAO;AACL,YAAM,GAAG,MAAM,SAAS,EAAE,UAAU,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,aAAa,SAAS,KAAa,MAA6B;AAC9D,UAAM,GAAG,OAAO,KAAK,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAO,YAAY,UAA4B;AAC7C,WAAO,KAAK,KAAK,GAAG,QAAQ;AAAA,EAC9B;AAAA,EAEA,OAAO,eAAe,UAA4B;AAChD,WAAO,KAAK,QAAQ,GAAG,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAO,iBAAiB,UAA0B;AAChD,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA,EAEA,OAAO,YAAY,UAA0B;AAC3C,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AACF;;;ACrFO,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBzB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqLxB,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyGhC,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAexB,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB1B,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvB,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,qBAA6B;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAA4B;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAA4B;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,MAAsB;AAC/C,WAAO,kBAAkB,QAAQ,UAAU,IAAI;AAAA,EACjD;AAAA,EAEA,OAAO,mBAA2B;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,mBAA2B;AAChC,WAAO;AAAA,EACT;AACF;;;ACzXO,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAExB,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkGO,IAAM,mBAAmB;AAAA,EAC9B,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AACb;;;AH3GO,IAAM,cAAN,MAAkB;AAAA,EACvB,MAAM,QAAQ,aAAqB,KAAoB;AACrD,UAAM,eAAeC,MAAK,QAAQ,UAAU;AAC5C,UAAM,eAAeA,MAAK,KAAK,cAAc,iBAAiB;AAG9D,UAAM,qBAAqB,MAAM,gBAAgB;AAAA,MAC/CA,MAAK,KAAK,cAAc,iBAAiB,UAAU;AAAA,IACrD;AAEA,UAAM,UAAU,IAAI;AAAA,MAClB,MAAM,qBAAqB,yBAAyB;AAAA,MACpD,OAAO;AAAA,IACT,CAAC,EAAE,MAAM;AAET,QAAI;AAEF,YAAM,gBAAgB,gBAAgB,YAAY;AAClD,YAAM,gBAAgB,gBAAgBA,MAAK,KAAK,cAAc,cAAc,CAAC;AAC7E,YAAM,gBAAgB,gBAAgBA,MAAK,KAAK,cAAc,gBAAgB,CAAC;AAC/E,YAAM,gBAAgB,gBAAgBA,MAAK,KAAK,cAAc,iBAAiB,CAAC;AAChF,YAAM,gBAAgB,gBAAgBA,MAAK,KAAK,cAAc,eAAe,CAAC;AAG9E,YAAM,mBAAmBA,MAAK,KAAK,cAAc,iBAAiB,WAAW;AAC7E,UAAI,CAAE,MAAM,gBAAgB,WAAW,gBAAgB,GAAI;AACzD,cAAM,eAAe,MAAM,KAAK,wBAAwB;AACxD,cAAM,gBAAgB,UAAU,kBAAkB,YAAY;AAAA,MAChE;AAGA,YAAM,gBAAgBA,MAAK,KAAK,cAAc,iBAAiB,gCAAgC;AAC/F,UAAI,CAAE,MAAM,gBAAgB,WAAW,aAAa,GAAI;AACtD,cAAM,YAAY,MAAM,KAAK,sBAAsB;AACnD,cAAM,gBAAgB,UAAU,eAAe,SAAS;AAAA,MAC1D;AAGA,YAAM,KAAK,oBAAoB,cAAc,kBAAkB;AAG/D,YAAM,aAAaA,MAAK,KAAK,cAAc,iBAAiB,SAAS;AACrE,YAAM,KAAK,iBAAiB,YAAY,kBAAkB;AAG1D,YAAM,KAAK,2BAA2B,YAAY;AAElD,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ,qBACI,kCACA;AAAA,QACN;AAAA,MACF;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,aAAa,CAAC;AACrC,cAAQ;AAAA,QACN,MAAM,KAAK,oEAAoE;AAAA,MACjF;AACA,cAAQ;AAAA,QACN,MAAM,KAAK,+DAA+D;AAAA,MAC5E;AACA,cAAQ;AAAA,QACN,MAAM,KAAK,gCAAgC;AAAA,MAC7C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,MAAM,IAAI,UAAW,MAAgB,OAAO,EAAE,CAAC;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,cACA,cACe;AACf,UAAM,gBAAgBA,MAAK,KAAK,cAAc,iBAAiB,UAAU;AACzE,UAAM,iBAAiBA,MAAK,KAAK,cAAc,iBAAiB,WAAW;AAG3E,QAAI,CAAE,MAAM,gBAAgB,WAAW,aAAa,KAAM,CAAC,cAAc;AACvE,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA,gBAAgB,mBAAmB;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,CAAE,MAAM,gBAAgB,WAAW,cAAc,KAAM,CAAC,cAAc;AACxE,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA,gBAAgB,kBAAkB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,YAAoB,oBAA4C;AAC7F,UAAM,sBAAsB;AAC5B,UAAM,yBAAyB;AAE/B,QAAI,CAAC,oBAAoB;AAEvB,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA,gBAAgB,kBAAkB;AAAA,MACpC;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB;AACtB,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,wBAAkB,MAAM,gBAAgB,SAAS,UAAU;AAAA,IAC7D;AAGA,QAAI,gBAAgB,SAAS,mBAAmB,GAAG;AAEjD,YAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,YAAM,iBAAiB,KAAK,qBAAqB,iBAAiB,aAAa;AAC/E,YAAM,gBAAgB,UAAU,YAAY,cAAc;AAAA,IAC5D,OAAO;AAEL,YAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,YAAM,iBAAiB,KAAK,oBAAoB,iBAAiB,aAAa;AAC9E,YAAM,gBAAgB,UAAU,YAAY,cAAc;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,qBAAqB,iBAAyB,kBAAkC;AACtF,UAAM,cAAc;AAEpB,UAAM,aAAa,gBAAgB,QAAQ,WAAW;AACtD,QAAI,eAAe,IAAI;AACrB,aAAO,KAAK,oBAAoB,iBAAiB,gBAAgB;AAAA,IACnE;AAIA,QAAI,WAAW,gBAAgB,QAAQ,SAAS,aAAa,YAAY,MAAM;AAC/E,QAAI,aAAa,IAAI;AAEnB,iBAAW,gBAAgB;AAAA,IAC7B;AAGA,UAAM,SAAS,gBAAgB,UAAU,GAAG,UAAU,EAAE,QAAQ;AAChE,UAAM,QAAQ,gBAAgB,UAAU,QAAQ;AAChD,WAAO,SAAS,SAAS,oBAAoB,MAAM,UAAU,EAAE,WAAW,IAAI,IAAI,KAAK,UAAU;AAAA,EACnG;AAAA,EAEQ,oBAAoB,iBAAyB,eAA+B;AAElF,UAAM,cAAc;AACpB,UAAM,aAAa,gBAAgB,QAAQ,WAAW;AAEtD,QAAI,eAAe,IAAI;AACrB,YAAM,SAAS,gBAAgB,UAAU,GAAG,UAAU,EAAE,QAAQ;AAChE,YAAM,QAAQ,gBAAgB,UAAU,UAAU;AAClD,aAAO,SAAS,SAAS,gBAAgB,SAAS;AAAA,IACpD;AAGA,UAAM,eAAe;AACrB,UAAM,cAAc,gBAAgB,QAAQ,YAAY;AACxD,QAAI,gBAAgB,MAAM,cAAc,GAAG;AACzC,YAAM,SAAS,gBAAgB,UAAU,GAAG,WAAW,EAAE,QAAQ;AACjE,YAAM,QAAQ,gBAAgB,UAAU,WAAW;AACnD,aAAO,SAAS,SAAS,gBAAgB,SAAS;AAAA,IACpD;AAGA,WAAO,gBAAgB,QAAQ,IAAI,SAAS;AAAA,EAC9C;AAAA,EAGA,MAAc,mBAAoC;AAChD,WAAO,gBAAgB,iBAAiB;AAAA,EAC1C;AAAA,EAEA,MAAc,0BAA2C;AACvD,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwHT;AAAA,EAEA,MAAc,wBAAyC;AACrD,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6JT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,2BAA2B,aAAoC;AAE3E,UAAM,aAAaA,MAAK,KAAK,aAAa,WAAW;AACrD,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,YAAM,KAAK,iBAAiB,UAAU;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,YAAmC;AAChE,UAAM,kBAAkB,MAAM,gBAAgB,SAAS,UAAU;AACjE,UAAM,kBAAkB,KAAK,yBAAyB;AAGtD,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,qBAAqB;AACzB,QAAI,oBAAoB;AACxB,QAAI,kBAAkB;AAEtB,eAAW,UAAU,gBAAgB;AACnC,YAAM,QAAQ,gBAAgB,QAAQ,MAAM;AAC5C,UAAI,UAAU,IAAI;AAChB,6BAAqB;AACrB,4BAAoB;AAEpB,0BAAkB,gBAAgB,QAAQ,SAAS,QAAQ,OAAO,MAAM;AACxE,YAAI,oBAAoB,IAAI;AAC1B,4BAAkB,gBAAgB,QAAQ,UAAU,QAAQ,OAAO,MAAM;AAAA,QAC3E;AACA,YAAI,oBAAoB,IAAI;AAC1B,4BAAkB,gBAAgB;AAAA,QACpC;AACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,sBAAsB,sBAAsB,IAAI;AAElD,YAAM,SAAS,gBAAgB,UAAU,GAAG,iBAAiB,EAAE,QAAQ;AACvE,YAAM,QAAQ,gBAAgB,UAAU,eAAe;AACvD,YAAM,iBAAiB,SAAS,SAAS,mBAAmB,MAAM,UAAU,EAAE,WAAW,IAAI,IAAI,KAAK,UAAU;AAChH,YAAM,gBAAgB,UAAU,YAAY,cAAc;AAAA,IAC5D,OAAO;AAGL,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,WAAW;AACf,iBAAW,UAAU,qBAAqB;AACxC,cAAM,QAAQ,gBAAgB,QAAQ,MAAM;AAC5C,YAAI,UAAU,IAAI;AAChB,gBAAM,SAAS,gBAAgB,UAAU,GAAG,KAAK,EAAE,QAAQ;AAC3D,gBAAM,QAAQ,gBAAgB,UAAU,KAAK;AAC7C,gBAAM,iBAAiB,SAAS,SAAS,kBAAkB,SAAS;AACpE,gBAAM,gBAAgB,UAAU,YAAY,cAAc;AAC1D,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,UAAU;AAEb,cAAM,iBAAiB,gBAAgB,QAAQ,IAAI,SAAS;AAC5D,cAAM,gBAAgB,UAAU,YAAY,cAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAmC;AACzC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAwDkE,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EACjH;AACF;;;AIjnBA,OAAOC,WAAU;AAIV,IAAM,cAAN,MAAkB;AAAA,EACvB,MAAM,QACJ,aAAqB,KACrB,OAA4B,WACb;AACf,UAAM,eAAeC,MAAK,KAAK,YAAY,iBAAiB;AAE5D,QAAI,SAAS,WAAW;AACtB,YAAM,KAAK,YAAY,YAAY;AAAA,IACrC,OAAO;AACL,YAAM,KAAK,UAAU,YAAY;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,cAAqC;AAC7D,UAAM,aAAaA,MAAK,KAAK,cAAc,gBAAgB;AAE3D,QAAI;AACF,YAAM,gBAAgB,KAAK,UAAU;AAAA,IACvC,QAAQ;AACN,cAAQ,IAAI,iEAAiE;AAC7E;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,gBAAgB,cAAc,UAAU;AAC9D,UAAM,aAAuB,CAAC;AAE9B,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,YAAY,KAAK;AAC7C,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAClD,UAAI,MAAM,YAAY,KAAK,UAAU,mBAAmB;AACtD,mBAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,0BAA0B;AACtC;AAAA,IACF;AAEA,eAAW,KAAK;AAEhB,YAAQ,IAAI,mBAAmB;AAC/B,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,eAAW,UAAU,YAAY;AAC/B,cAAQ,IAAI,YAAO,MAAM,EAAE;AAAA,IAC7B;AACA,YAAQ,IAAI;AAAA,EACd;AAAA,EAEA,MAAc,UAAU,cAAqC;AAC3D,UAAM,WAAWA,MAAK,KAAK,cAAc,cAAc;AAEvD,QAAI;AACF,YAAM,gBAAgB,KAAK,QAAQ;AAAA,IACrC,QAAQ;AACN,cAAQ,IAAI,+DAA+D;AAC3E;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,KAAK,cAAc,UAAU,EAAE;AAEnD,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,iBAAiB;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK;AAEX,YAAQ,IAAI,UAAU;AACtB,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,eAAW,QAAQ,OAAO;AACxB,cAAQ,IAAI,YAAO,IAAI,EAAE;AAAA,IAC3B;AACA,YAAQ,IAAI;AAAA,EACd;AAAA,EAEA,MAAc,cAAc,KAAa,QAAmC;AAC1E,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAU,MAAM,gBAAgB,cAAc,GAAG;AAEvD,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,KAAK,KAAK;AACtC,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B;AAAA,UACA,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK;AAAA,QAClC;AACA,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,WAAW,UAAU,WAAW;AAC9B,cAAM,KAAK,UAAU,QAAQ;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACtGA,OAAOC,WAAU;AACjB,OAAOC,UAAS;AAChB,OAAOC,YAAW;;;ACQX,IAAM,iBAAN,MAAM,gBAAe;AAAA,EAClB;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,QAAQ,gBAAe,iBAAiB,OAAO,EAAE,MAAM,IAAI;AAAA,EAClE;AAAA,EAEA,OAAiB,iBAAiB,SAAyB;AACzD,WAAO,QAAQ,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI;AAAA,EAC3D;AAAA,EAEA,UAAU,MAAoB;AAC5B,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,OAAO,KAAK,UAAU,QAAQ;AACpC,UAAM,UAAU,KAAK,YAAY,UAAU,SAAS,GAAG,QAAQ,KAAK,IAAI,EAAE,KAAK,KAAK;AACpF,UAAM,sBAAsB,KAAK,YAAY,UAAU,cAAc;AAErE,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,QAAI,CAAC,qBAAqB;AACxB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,eAAe,KAAK,kBAAkB,mBAAmB;AAE/D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,QAAQ,KAAK;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,SAIb;AACA,UAAM,WAAW,KAAK,cAAc;AACpC,UAAM,QAAQ,KAAK,YAAY,UAAU,oBAAoB;AAC7D,UAAM,WAAW,KAAK,YAAY,UAAU,uBAAuB;AACnE,UAAM,UAAU,KAAK,YAAY,UAAU,sBAAsB;AAEjE,WAAO;AAAA,MACL,OAAO,QAAQ,KAAK,uBAAuB,KAAK,IAAI,CAAC;AAAA,MACrD,UAAU,WAAW,KAAK,uBAAuB,QAAQ,IAAI,CAAC;AAAA,MAC9D,SAAS,UAAU,KAAK,uBAAuB,OAAO,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,UAAU,UAA2C;AAC3D,UAAM,cAAc,KAAK,YAAY,UAAU,MAAM;AACrD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,OAAiB,CAAC;AACxB,UAAM,UAAU,YAAY,QAAQ,KAAK,IAAI;AAG7C,UAAM,mBAAmB,QAAQ,MAAM,uBAAuB;AAC9D,QAAI,kBAAkB;AACpB,YAAM,QAAQ,iBAAiB,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAC9D,WAAK,cAAc,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AAAA,IACrD;AAGA,UAAM,cAAc,QAAQ,MAAM,iBAAiB;AACnD,QAAI,aAAa;AACf,WAAK,SAAS,YAAY,CAAC,EAAE,KAAK;AAAA,IACpC;AAGA,UAAM,aAAa,QAAQ,MAAM,gBAAgB;AACjD,QAAI,YAAY;AACd,YAAM,SAAS,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AACzD,WAAK,QAAQ,OAAO,WAAW,IAAI,OAAO,CAAC,IAAI;AAAA,IACjD;AAEA,WAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,EAC/C;AAAA,EAEQ,gBAA2B;AACjC,UAAM,WAAsB,CAAC;AAC7B,QAAI,iBAAiC;AAErC,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,cAAc,KAAK,MAAM,mBAAmB;AAClD,UAAI,aAAa;AACf,YAAI,gBAAgB;AAClB,mBAAS,KAAK,cAAc;AAAA,QAC9B;AACA,yBAAiB;AAAA,UACf,OAAO,YAAY,CAAC,EAAE;AAAA,UACtB,OAAO,YAAY,CAAC,EAAE,KAAK;AAAA,UAC3B,SAAS,CAAC;AAAA,QACZ;AAAA,MACF,WAAW,gBAAgB;AACzB,uBAAe,QAAQ,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,eAAS,KAAK,cAAc;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,UAAqB,OAAoC;AAC3E,WAAO,SAAS;AAAA,MAAK,OACnB,EAAE,MAAM,YAAY,MAAM,MAAM,YAAY,KAC5C,EAAE,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAAuD;AAC/E,UAAM,eAAoD,CAAC;AAC3D,UAAM,QAAQ,QAAQ;AAEtB,QAAI,qBAKO;AAEX,QAAI,gBAAgB;AACpB,QAAI,aAAa;AACjB,QAAI,kBAA4D;AAEhE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAGpB,YAAM,WAAW,KAAK,MAAM,8BAA8B;AAC1D,UAAI,UAAU;AACZ,YAAI,oBAAoB;AACtB,uBAAa,KAAK,kBAAyB;AAAA,QAC7C;AACA,6BAAqB;AAAA,UACnB,MAAM,SAAS,CAAC,EAAE,KAAK;AAAA,UACvB,aAAa;AAAA,UACb,WAAW,CAAC;AAAA,QACd;AACA,wBAAgB;AAChB;AAAA,MACF;AAGA,YAAM,gBAAgB,KAAK,MAAM,4BAA4B;AAC7D,UAAI,iBAAiB,oBAAoB;AACvC,YAAI,iBAAiB;AACnB,6BAAmB,UAAU,KAAK,eAAe;AAAA,QACnD;AACA,0BAAkB;AAAA,UAChB,MAAM,cAAc,CAAC,EAAE,KAAK;AAAA,UAC5B,OAAO,CAAC;AAAA,QACV;AACA,qBAAa;AACb;AAAA,MACF;AAGA,UAAI,mBAAoB,KAAK,MAAM,oCAAoC,GAAI;AACzE,cAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC5C,wBAAgB,MAAM,KAAK,IAAI;AAC/B;AAAA,MACF;AAGA,UAAI,sBAAsB,CAAC,YAAY;AACrC,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,WAAW,CAAC,QAAQ,WAAW,GAAG,GAAG;AACvC,6BAAmB,gBAAgB,mBAAmB,cAAc,OAAO,MAAM;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,mBAAmB,oBAAoB;AACzC,yBAAmB,UAAU,KAAK,eAAe;AAAA,IACnD;AACA,QAAI,oBAAoB;AACtB,mBAAa,KAAK,kBAAyB;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,SAAyB;AAEtD,WAAO,KAAK,kBAAkB,OAAO;AAAA,EACvC;AACF;;;ADtMO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,MAAM,QAAQ,YAAqB,SAA4C;AAC7E,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,qCAAqC;AACnD,cAAQ,IAAI,+CAA+C;AAC3D,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,aAAaC,MAAK,KAAK,KAAK,mBAAmB,kBAAkB,UAAU;AAEjF,QAAI,CAAE,MAAM,gBAAgB,WAAW,UAAU,GAAI;AACnD,cAAQ,MAAM,kBAAkB,UAAU,aAAa;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI,CAAC,SAAS,KAAK;AACjB,cAAQ,IAAI;AAAA,qBAAwB,UAAU,4CAA4C;AAC1F,cAAQ,IAAI,iCAAiC;AAG7C,cAAQ,MAAM,yCAAyC;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,UAAUC,KAAI;AAAA,MAClB,MAAM,qBAAqB,UAAU;AAAA,MACrC,OAAO;AAAA,IACT,CAAC,EAAE,MAAM;AAET,QAAI;AAEF,YAAM,KAAK,gBAAgB,YAAY,UAAU;AAGjD,YAAM,WAAWD,MAAK;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,MAAM,gBAAgB,WAAW,QAAQ,GAAG;AAC9C,cAAM,gBAAgB,gBAAgB,UAAU,IAAI;AAAA,MACtD;AAGA,YAAM,aAAaA,MAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,gBAAgB,gBAAgB,UAAU;AAEhD,YAAM,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACxD,YAAM,cAAcA,MAAK,KAAK,YAAY,GAAG,UAAU,IAAI,UAAU,EAAE;AAGvE,YAAM,gBAAgB,gBAAgB,WAAW;AACjD,YAAM,KAAK,oBAAoB,YAAY,WAAW;AAGtD,YAAM,gBAAgB,gBAAgB,YAAY,IAAI;AAEtD,cAAQ,QAAQE,OAAM,MAAM,WAAW,UAAU,yBAAyB,CAAC;AAAA,IAC7E,SAAS,OAAO;AACd,cAAQ,KAAKA,OAAM,IAAI,UAAW,MAAgB,OAAO,EAAE,CAAC;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,YAAoB,YAAmC;AAEnF,UAAM,gBAAgBF,MAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAE,MAAM,gBAAgB,WAAW,aAAa,GAAI;AACtD;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,mBAAmB,aAAa;AAE9D,eAAW,aAAa,YAAY;AAElC,YAAM,eAAeA,MAAK,SAAS,eAAe,UAAU,IAAI;AAEhE,YAAM,iBAAiBA,MAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,YAAM,eAAe,MAAM,gBAAgB,SAAS,UAAU,IAAI;AAClE,YAAM,SAAS,IAAI,eAAe,YAAY;AAC9C,YAAM,QAAQ,OAAO,eAAe,YAAY;AAGhD,UAAI,gBAAgB;AACpB,UAAI,MAAM,gBAAgB,WAAW,cAAc,GAAG;AACpD,wBAAgB,MAAM,gBAAgB,SAAS,cAAc;AAAA,MAC/D;AAGA,YAAM,gBAAgB,KAAK,mBAAmB,eAAe,OAAO,UAAU,IAAI;AAGlF,YAAM,gBAAgB,gBAAgBA,MAAK,QAAQ,cAAc,CAAC;AAGlE,YAAM,gBAAgB,UAAU,gBAAgB,aAAa;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,mBACN,iBACA,OACA,UACQ;AAIR,QAAI,SAAS,mBAAmB,WAAW,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGnD,QAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,gBAAU;AACV,iBAAW,OAAO,MAAM,OAAO;AAC7B,kBAAU,oBAAoB,IAAI,IAAI;AAAA,EAAK,IAAI,WAAW;AAAA;AAAA;AAAA,MAC5D;AAAA,IACF;AAKA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,oBAAoB,YAAoB,aAAoC;AACxF,UAAM,UAAU,MAAM,gBAAgB,cAAc,UAAU;AAE9D,eAAW,SAAS,SAAS;AAC3B,YAAM,cAAcA,MAAK,KAAK,YAAY,KAAK;AAC/C,YAAM,eAAeA,MAAK,KAAK,aAAa,KAAK;AACjD,YAAM,QAAQ,MAAM,gBAAgB,KAAK,WAAW;AAEpD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,gBAAgB,gBAAgB,YAAY;AAClD,cAAM,KAAK,oBAAoB,aAAa,YAAY;AAAA,MAC1D,OAAO;AACL,cAAM,gBAAgB,SAAS,aAAa,YAAY;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,KACA,SAAS,IACuC;AAChD,UAAM,QAA+C,CAAC;AACtD,UAAM,UAAU,MAAM,gBAAgB,cAAc,GAAG;AAEvD,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,KAAK,KAAK;AACtC,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B;AAAA,UACA,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK;AAAA,QAClC;AACA,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,WAAW,MAAM,SAAS,KAAK,GAAG;AAChC,cAAM,KAAK;AAAA,UACT,MAAM,UAAUA,MAAK,SAAS,OAAO,KAAK;AAAA,UAC1C,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AE1MA,OAAOG,WAAU;AACjB,OAAOC,UAAS;AAChB,OAAOC,YAAW;AAQX,IAAM,iBAAN,MAAqB;AAAA,EAC1B,MAAM,QAAQ,aAAsB,SAA4C;AAC9E,UAAM,cAAcC,MAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,CAAE,MAAM,gBAAgB,WAAW,WAAW,GAAI;AACpD,cAAQ,MAAM,6DAA6D;AAC3E,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI,CAAC,aAAa;AAChB,YAAM,WAAW,MAAM,KAAK,aAAa,WAAW;AACpD,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,4BAA4B;AACxC;AAAA,MACF;AAEA,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,eAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,gBAAQ,IAAI,GAAG,QAAQ,CAAC,KAAK,OAAO,EAAE;AAAA,MACxC,CAAC;AACD,cAAQ,IAAI;AACZ,cAAQ,MAAM,+CAA+C;AAC7D,cAAQ,IAAI,wCAAwC;AACpD,cAAQ,IAAI,0DAA0D;AACtE,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAcA,MAAK,KAAK,aAAa,WAAW;AAGtD,QAAI,CAAE,MAAM,gBAAgB,WAAW,WAAW,GAAI;AACpD,cAAQ,MAAM,mBAAmB,WAAW,aAAa;AACzD,cAAQ,IAAI,uBAAuB;AACnC,YAAM,WAAW,MAAM,KAAK,aAAa,WAAW;AACpD,eAAS,QAAQ,CAAC,YAAY;AAC5B,gBAAQ,IAAI,OAAO,OAAO,EAAE;AAAA,MAC9B,CAAC;AACD,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,kBAAkB,WAAW;AACrD,UAAM,aAAaA,MAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,cAAQ,MAAM,kBAAkB,UAAU,qCAAqC;AAC/E,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI,CAAC,SAAS,KAAK;AACjB,cAAQ,IAAI;AAAA,6BAAgC,WAAW,uBAAuB,UAAU,IAAI;AAC5F,cAAQ,IAAI,4EAA4E;AACxF,cAAQ,MAAM,yCAAyC;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,UAAUC,KAAI;AAAA,MAClB,MAAM,sBAAsB,WAAW;AAAA,MACvC,OAAO;AAAA,IACT,CAAC,EAAE,MAAM;AAET,QAAI;AAEF,YAAM,aAAaD,MAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,gBAAgB,gBAAgB,UAAU;AAGhD,YAAM,gBAAgB,gBAAgB,UAAU;AAGhD,YAAM,KAAK,qBAAqB,aAAa,UAAU;AAGvD,YAAM,gBAAgB,gBAAgB,aAAa,IAAI;AAEvD,cAAQ;AAAA,QACNE,OAAM,MAAM,YAAY,WAAW,+BAA+B,UAAU,GAAG;AAAA,MACjF;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,KAAK,OAAO,CAAC;AAC/B,cAAQ;AAAA,QACNA,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,cAAQ;AAAA,QACNA,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAKA,OAAM,IAAI,UAAW,MAAgB,OAAO,EAAE,CAAC;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,aAAwC;AACjE,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAU,MAAM,gBAAgB,cAAc,WAAW;AAE/D,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYF,MAAK,KAAK,aAAa,KAAK;AAC9C,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAClD,UAAI,MAAM,YAAY,GAAG;AACvB,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEQ,kBAAkB,aAA6B;AAGrD,UAAM,cAAc;AACpB,WAAO,YAAY,QAAQ,aAAa,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAc,qBAAqB,YAAoB,UAAiC;AACtF,UAAM,UAAU,MAAM,gBAAgB,cAAc,UAAU;AAE9D,eAAW,SAAS,SAAS;AAC3B,YAAM,cAAcA,MAAK,KAAK,YAAY,KAAK;AAC/C,YAAM,YAAYA,MAAK,KAAK,UAAU,KAAK;AAC3C,YAAM,QAAQ,MAAM,gBAAgB,KAAK,WAAW;AAEpD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,gBAAgB,gBAAgB,SAAS;AAC/C,cAAM,KAAK,qBAAqB,aAAa,SAAS;AAAA,MACxD,OAAO;AACL,cAAM,gBAAgB,SAAS,aAAa,SAAS;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;;;ACzKA,OAAOG,WAAU;AAEjB,OAAOC,YAAW;;;ACFlB,SAAS,gBAAAC,qBAAoB;;;ACA7B,SAAS,oBAAoB;AAC7B,OAAOC,WAAU;AAqBV,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAO,WAAW,WAAmB,WAA8B;AACjE,UAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AAEnD,QAAI;AACF,YAAM,UAAU,aAAa,aAAa,OAAO;AACjD,aAAO,KAAK,kBAAkB,SAAS,WAAW,SAAS;AAAA,IAC7D,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,IACrH;AAAA,EACF;AAAA,EAEA,OAAe,kBAAkB,SAAiB,WAAmB,WAA8B;AACjG,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,UAAM,QAA4B;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC;AAAA,MACV,cAAc,CAAC;AAAA,MACf,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,MACX,eAAe,CAAC;AAAA,IAClB;AAEA,QAAI,iBAAiB;AACrB,QAAI,cAAwB,CAAC;AAE7B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAG3B,UAAI,KAAK,MAAM,SAAS,GAAG;AAEzB,aAAK,SAAS,gBAAgB,aAAa,KAAK;AAChD,sBAAc,CAAC;AAEf,cAAM,cAAc,KAAK,QAAQ,WAAW,EAAE,EAAE,YAAY;AAC5D,yBAAiB;AAGjB,YAAI,YAAY,SAAS,uBAAU,KAAK,YAAY,SAAS,SAAS,GAAG;AAEvE,cAAI,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG;AAC/C,kBAAM,UAAU,MAAM,IAAI,CAAC,EAAE,KAAK;AAAA,UACpC;AAAA,QACF;AACA;AAAA,MACF;AAGA,UAAI,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AAClD,cAAM,OAAO,KAAK,QAAQ,YAAY,EAAE,EAAE,KAAK;AAC/C,YAAI,MAAM;AACR,sBAAY,KAAK,IAAI;AAAA,QACvB;AACA;AAAA,MACF;AAGA,UAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,cAAM,OAAO,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK;AAChD,YAAI,MAAM;AACR,gBAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,gBAAM,MAAM,KAAK,IAAI;AAAA,QACvB;AACA;AAAA,MACF;AAGA,UAAI,eAAe,SAAS,OAAO,GAAG;AACpC,YAAI,KAAK,WAAW,IAAI,GAAG;AACzB,gBAAM,SAAS,MAAM,UAAU,CAAC;AAChC,gBAAM,OAAO,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,QAC7C;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,QAAQ,GAAG;AACrC,YAAI,KAAK,WAAW,IAAI,GAAG;AACzB,gBAAM,UAAU,MAAM,WAAW,CAAC;AAClC,gBAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,QAC9C;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,UAAU,GAAG;AACvC,YAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,GAAG;AAC3H,gBAAM,YAAY,MAAM,aAAa,CAAC;AACtC,gBAAM,eAAe,KAAK,MAAM,WAAW,KAAK,KAAK,MAAM,iBAAiB;AAC5E,cAAI,cAAc;AAChB,kBAAM,UAAU,KAAK,aAAa,CAAC,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,QAAQ,GAAG;AACrC,YAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,GAAG;AACxE,gBAAM,UAAU,MAAM,WAAW,CAAC;AAClC,gBAAM,aAAa,KAAK,MAAM,WAAW,KAAK,KAAK,MAAM,iBAAiB;AAC1E,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK,WAAW,CAAC,CAAC;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,SAAK,SAAS,gBAAgB,aAAa,KAAK;AAGhD,WAAO;AAAA,MACL,MAAM,MAAM,QAAQ;AAAA,MACpB,WAAW,MAAM,aAAa;AAAA,MAC9B,SAAS,MAAM,WAAW;AAAA,MAC1B,WAAW,MAAM,aAAa,CAAC;AAAA,MAC/B,OAAO,MAAM,SAAS,CAAC;AAAA,MACvB,QAAQ,MAAM,UAAU,CAAC;AAAA,MACzB,SAAS,MAAM,WAAW,CAAC;AAAA,MAC3B,cAAc,MAAM,gBAAgB,CAAC;AAAA,MACrC,WAAW,MAAM,aAAa,CAAC;AAAA,MAC/B,SAAS,MAAM,WAAW,CAAC;AAAA,MAC3B,UAAU,MAAM,YAAY,CAAC;AAAA,MAC7B,eAAe,MAAM,iBAAiB,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAe,SAAS,SAAiB,MAAgB,OAAiC;AACxF,QAAI,KAAK,WAAW,EAAG;AAEvB,QAAI,QAAQ,SAAS,YAAS,KAAK,QAAQ,SAAS,MAAM,GAAG;AAC3D,YAAM,YAAY;AAAA,IACpB,WAAW,QAAQ,SAAS,OAAO,GAAG;AACpC,YAAM,SAAS;AAAA,IACjB,WAAW,QAAQ,SAAS,QAAQ,GAAG;AACrC,YAAM,UAAU;AAAA,IAClB,WAAW,QAAQ,SAAS,mBAAS,KAAK,QAAQ,SAAS,YAAY,GAAG;AACxE,YAAM,eAAe,MAAM,gBAAgB,CAAC;AAC5C,YAAM,aAAa,cAAc;AAAA,IACnC,WAAW,QAAQ,SAAS,kBAAU,KAAK,QAAQ,SAAS,SAAS,GAAG;AACtE,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AACF;;;ACxKA,OAAOC,WAAU;AAKV,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIxB,aAAa,cACX,aACA,WACA,cAAsB,KACE;AAExB,UAAM,mBAAmBC,MAAK;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,WAAWA,MAAK,KAAK,kBAAkB,UAAU,CAAC,GAAG;AAC7E,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmBA,MAAK;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,WAAWA,MAAK,KAAK,kBAAkB,UAAU,CAAC,GAAG;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UACX,aACA,WACA,cAAsB,KACK;AAC3B,UAAM,YAAY,MAAM,KAAK,cAAc,aAAa,WAAW,WAAW;AAE9E,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,YAAY,WAAW,WAAW,SAAS;AAAA,IACpD,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,SAAS,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAChH,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAW,cAAsB,KAAgF;AAC5H,UAAM,YAAYA,MAAK,KAAK,aAAa,mBAAmB,eAAe;AAE3E,QAAI,CAAE,MAAM,gBAAgB,WAAW,SAAS,GAAI;AAClD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAA2E,CAAC;AAClF,UAAM,UAAU,MAAM,gBAAgB,cAAc,SAAS;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,WAAW,KAAK;AAC5C,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AAEvB,cAAM,gBAAgB,cAAc,SAAS,KAAY;AAEzD,YAAI,eAAe;AAEjB,gBAAM,gBAAgB,MAAM,KAAK,sBAAsB,WAAW,KAAK;AACvE,iBAAO,KAAK,GAAG,aAAa;AAAA,QAC9B,OAAO;AAEL,gBAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AACnD,cAAI,MAAM,gBAAgB,WAAW,WAAW,GAAG;AACjD,mBAAO,KAAK;AAAA,cACV,WAAW;AAAA,cACX,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAAqB,UAAmE;AAE7F,UAAM,QAAQ,SAAS,MAAM,uDAAuD;AAEpF,QAAI,OAAO;AACT,aAAO;AAAA,QACL,aAAa,MAAM,CAAC,GAAG,KAAK;AAAA,QAC5B,OAAO,MAAM,CAAC,GAAG,KAAK;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,iBAAiB,SAAS,MAAM,uBAAuB;AAC7D,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL,OAAO,eAAe,CAAC,GAAG,KAAK;AAAA,MACjC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB,sBACnB,KACA,aAC0E;AAC1E,UAAM,SAA0E,CAAC;AACjF,UAAM,UAAU,MAAM,gBAAgB,cAAc,GAAG;AAEvD,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,KAAK,KAAK;AACtC,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AACnD,YAAI,MAAM,gBAAgB,WAAW,WAAW,GAAG;AACjD,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,WAAW;AAAA,YACX,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AFxIO,IAAM,aAAN,MAAiB;AAAA,EACtB,OAAO,WAAW,UAA+B;AAC/C,UAAM,UAAUC,cAAa,UAAU,OAAO;AAC9C,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,UAAM,SAAsB,CAAC;AAC7B,UAAM,aAAa,oBAAI,IAAY;AACnC,QAAI,eAAiC;AAErC,eAAW,QAAQ,OAAO;AAExB,YAAM,aAAa,KAAK,MAAM,iCAAiC;AAE/D,UAAI,YAAY;AAEd,YAAI,cAAc;AAChB,iBAAO,KAAK,YAAY;AAAA,QAC1B;AAEA,cAAM,QAAQ,WAAW,CAAC,EAAE,KAAK;AACjC,cAAM,SAAS,WAAW,CAAC;AAG3B,cAAM,YAAY,aAAa,qBAAqB,IAAI,MAAM,GAAG;AAEjE,uBAAe;AAAA,UACb;AAAA,UACA,aAAa,WAAW;AAAA,UACxB,OAAO,WAAW;AAAA,UAClB,OAAO,CAAC;AAAA,QACV;AAEA,YAAI,WAAW,OAAO;AACpB,gBAAM,WAAW,UAAU,cACvB,GAAG,UAAU,WAAW,IAAI,UAAU,KAAK,KAC3C,UAAU;AACd,qBAAW,IAAI,QAAQ;AAAA,QACzB;AACA;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,MAAM,wBAAwB;AACrD,UAAI,aAAa,cAAc;AAC7B,cAAM,YAAY,UAAU,CAAC,MAAM;AACnC,cAAM,cAAc,UAAU,CAAC,EAAE,KAAK;AAGtC,cAAM,UAAU,YAAY,MAAM,gBAAgB;AAClD,cAAM,KAAK,UAAU,QAAQ,CAAC,IAAI,GAAG,aAAa,MAAM,SAAS,CAAC;AAClE,cAAM,WAAW,UAAU,YAAY,QAAQ,gBAAgB,EAAE,IAAI;AAErE,qBAAa,MAAM,KAAK;AAAA,UACtB;AAAA,UACA,aAAa;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,cAAc;AAChB,aAAO,KAAK,YAAY;AAAA,IAC1B;AAGA,UAAM,cAAc,MAAM,KAAK,UAAU,EAAE,IAAI,cAAY;AACzD,YAAM,CAAC,aAAa,KAAK,IAAI,SAAS,SAAS,GAAG,IAC9C,SAAS,MAAM,GAAG,IAClB,CAAC,QAAW,QAAQ;AACxB,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,aAAa,kBAAkB,UAAyF;AACtH,UAAM,SAAS,KAAK,WAAW,QAAQ;AACvC,UAAM,SAAuE,CAAC;AAE9E,eAAW,aAAa,OAAO,YAAY;AACzC,UAAI,UAAU,OAAO;AACnB,cAAM,YAAY,MAAM,aAAa;AAAA,UACnC,UAAU,eAAe;AAAA,UACzB,UAAU;AAAA,UACV;AAAA,QACF;AAEA,YAAI,WAAW;AACb,iBAAO,KAAK;AAAA,YACV,aAAa,UAAU;AAAA,YACvB,OAAO,UAAU;AAAA,YACjB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AD9GO,IAAM,cAAN,MAAkB;AAAA,EACvB,MAAM,QAAQ,UAAkC;AAC9C,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,6CAA6C;AAC3D,cAAQ,IAAI,oCAAoC;AAChD,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,UAAM,aAAaC,MAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,YAAM,KAAK,WAAW,UAAU,UAAU;AAC1C;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,QAAI,YAAa,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AAC5D,YAAM,KAAK,SAAS,QAAQ;AAC5B;AAAA,IACF;AAEA,YAAQ,MAAM,0BAA0B,QAAQ,aAAa;AAC7D,YAAQ,WAAW;AAAA,EACrB;AAAA,EAEA,MAAc,WAAW,YAAoB,YAAmC;AAC9E,YAAQ,IAAI;AAAA,oBAAgB,UAAU;AAAA,CAAI;AAC1C,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAG1B,UAAM,eAAeA,MAAK,KAAK,YAAY,iBAAiB,WAAW;AACvE,QAAI,MAAM,gBAAgB,WAAW,YAAY,GAAG;AAClD,cAAQ,IAAI,iBAAiB;AAC7B,YAAM,WAAW,MAAM,gBAAgB,SAAS,YAAY;AAC5D,cAAQ,IAAI,QAAQ;AAAA,IACtB;AAGA,UAAM,YAAYA,MAAK,KAAK,YAAY,iBAAiB,QAAQ;AACjE,QAAI,MAAM,gBAAgB,WAAW,SAAS,GAAG;AAC/C,cAAQ,IAAI,cAAc;AAC1B,YAAM,QAAQ,MAAM,gBAAgB,SAAS,SAAS;AACtD,cAAQ,IAAI,KAAK;AAGjB,UAAI;AACF,cAAM,cAAc,WAAW,WAAW,SAAS;AACnD,YAAI,YAAY,WAAW,SAAS,GAAG;AACrC,kBAAQ,IAAI,mCAAmC;AAC/C,qBAAW,aAAa,YAAY,YAAY;AAC9C,gBAAI,UAAU,OAAO;AACnB,oBAAM,aAAa,UAAU,cACzB,GAAG,UAAU,WAAW,IAAI,UAAU,KAAK,KAC3C,UAAU;AACd,sBAAQ,IAAIC,OAAM,KAAK,YAAO,UAAU,EAAE,CAAC;AAC3C,sBAAQ,IAAIA,OAAM,KAAK,iCAAiC,UAAU,cAAc,UAAU,cAAc,MAAM,EAAE,GAAG,UAAU,KAAK,GAAG,CAAC;AAAA,YACxI;AAAA,UACF;AACA,kBAAQ,IAAI;AACZ,kBAAQ,IAAIA,OAAM,OAAO,0EAAmE,CAAC;AAC7F,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAGA,UAAM,aAAaD,MAAK,KAAK,YAAY,iBAAiB,SAAS;AACnE,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,cAAQ,IAAI,eAAe;AAC3B,YAAM,SAAS,MAAM,gBAAgB,SAAS,UAAU;AACxD,cAAQ,IAAI,MAAM;AAAA,IACpB;AAGA,UAAM,YAAYA,MAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,WAAW,SAAS,GAAG;AAC/C,YAAM,aAAa,MAAM,KAAK,eAAe,SAAS;AACtD,UAAI,WAAW,SAAS,GAAG;AACzB,gBAAQ,IAAI,oBAAoB;AAChC,mBAAW,QAAQ,YAAY;AAC7B,kBAAQ,IAAI;AAAA,MAAS,KAAK,IAAI;AAAA,CAAI;AAClC,gBAAM,UAAU,MAAM,gBAAgB,SAAS,KAAK,IAAI;AACxD,kBAAQ,IAAI,OAAO;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAc,SAAS,UAAiC;AACtD,YAAQ,IAAI,oBAAa;AACzB,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,UAAM,UAAU,MAAM,gBAAgB,SAAS,QAAQ;AACvD,YAAQ,IAAI,OAAO;AACnB,YAAQ,IAAI,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EACnC;AAAA,EAEQ,aAAa,UAAiC;AAEpD,UAAM,WAAWA,MAAK,KAAK,KAAK,mBAAmB,cAAc;AACjE,UAAM,QAAQ;AAAA,MACZA,MAAK,KAAK,UAAU,GAAG,QAAQ,KAAK;AAAA,MACpCA,MAAK,KAAK,UAAU,UAAU,SAAS;AAAA,MACvCA,MAAK,KAAK,UAAU,GAAG,SAAS,MAAM,GAAG,GAAG,SAAS;AAAA,IACvD;AAGA,WAAO,MAAM,CAAC;AAAA,EAChB;AAAA,EAEA,MAAc,eAAe,KAAa,SAAS,IAAoD;AACrG,UAAM,QAA+C,CAAC;AACtD,UAAM,UAAU,MAAM,gBAAgB,cAAc,GAAG;AAEvD,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,KAAK,KAAK;AACtC,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B;AAAA,UACA,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK;AAAA,QAClC;AACA,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,WAAW,UAAU,aAAa,MAAM,SAAS,KAAK,GAAG;AACvD,cAAM,KAAK;AAAA,UACT,MAAM,UAAU;AAAA,UAChB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AInKA,OAAOE,YAAU;AACjB,OAAOC,YAAW;;;ACAlB,SAAS,gBAAAC,qBAAoB;AAC7B,OAAOC,WAAU;;;ACFjB,SAAS,SAAS;AAEX,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,MAAM;AAAA,IACnB;AAAA,IACA,EAAE,MAAM,iBAAiB;AAAA,EAC3B,CAAC,EAAE,SAAS;AAAA,EACZ,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,OAAO,EAAE,MAAM;AAAA,IACb,EAAE,OAAO;AAAA,IACT,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACpB,CAAC,EAAE,SAAS;AACd,CAAC,EAAE,SAAS;AAEL,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;AAClC,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO;AAAA,EACtB,WAAW,EAAE,MAAM,cAAc,EAAE,SAAS;AAAA,EAC5C,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAC5C,CAAC;;;ACrCD,SAAS,KAAAC,UAAS;AAGX,IAAM,aAAaC,GAAE,OAAO;AAAA,EACjC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM;AAAA,EACN,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,cAAcA,GAAE,MAAM,iBAAiB,EAAE,IAAI,CAAC;AAAA,EAC9C,UAAUA,GAAE,OAAO;AAAA,IACjB,SAASA,GAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,IACnC,QAAQA,GAAE,QAAQ,UAAU;AAAA,IAC5B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC,EAAE,SAAS;AACd,CAAC;;;ACbD,SAAS,KAAAC,UAAS;AAEX,IAAM,kBAAkBA,GAAE,KAAK,CAAC,SAAS,YAAY,SAAS,CAAC;AAE/D,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,aAAaA,GAAE,OAAO;AAAA,IACpB,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO;AAAA,IACtB,WAAWA,GAAE,MAAMA,GAAE,OAAO;AAAA,MAC1B,MAAMA,GAAE,OAAO;AAAA,MACf,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAC3B,CAAC,CAAC,EAAE,SAAS;AAAA,IACb,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,CAAC;AACH,CAAC;AAEM,IAAM,eAAeA,GAAE,OAAO;AAAA,EACnC,MAAMA,GAAE,OAAO;AAAA,EACf,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpC,QAAQA,GAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;;;AHAM,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EAER,YAAY,aAAsB,OAAO;AACvC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa,UAA6C;AAC9D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI;AACF,YAAM,UAAUC,cAAa,UAAU,OAAO;AAC9C,YAAM,SAAS,IAAI,eAAe,OAAO;AACzC,YAAM,WAAW,KAAK,oBAAoB,QAAQ;AAClD,YAAM,OAAO,OAAO,UAAU,QAAQ;AAGtC,YAAM,SAAS,WAAW,UAAU,IAAI;AAExC,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,MAAM,OAAO,QAAQ,CAAC,QAAQ;AACnC,iBAAO,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE;AAAA,QACrD,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,aAAa,WAAW,GAAG;AAClC,eAAO,KAAK,yCAAyC;AAAA,MACvD;AAEA,iBAAW,OAAO,KAAK,cAAc;AACnC,YAAI,CAAC,IAAI,eAAe,IAAI,YAAY,KAAK,EAAE,WAAW,GAAG;AAC3D,iBAAO,KAAK,gBAAgB,IAAI,IAAI,2BAA2B;AAAA,QACjE;AAEA,YAAI,CAAC,IAAI,aAAa,IAAI,UAAU,WAAW,GAAG;AAChD,mBAAS,KAAK,gBAAgB,IAAI,IAAI,oBAAoB;AAAA,QAC5D;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,OAAO,WAAW;AAAA,QACzB;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACjE,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAA+C;AAClE,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA8B,CAAC;AACrC,UAAM,cAAwB,CAAC;AAG/B,UAAM,eAAeC,MAAK,KAAK,YAAY,aAAa;AACxD,QAAI,CAAE,MAAM,gBAAgB,WAAW,YAAY,GAAI;AACrD,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,YAAY,yBAAyB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAC/C,aAAa;AAAA,MACf,CAAC;AACD,kBAAY,KAAK,8BAA8B,YAAY,EAAE;AAAA,IAC/D;AAGA,UAAM,YAAYA,MAAK,KAAK,YAAY,UAAU;AAClD,QAAI,CAAE,MAAM,gBAAgB,WAAW,SAAS,GAAI;AAClD,eAAS,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAIA,UAAM,aAAaA,MAAK,SAAS,UAAU;AAC3C,UAAM,WAAWA,MAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,WAAW,QAAQ,GAAG;AAC9C,YAAM,aAAa,MAAM,KAAK,eAAe,QAAQ;AACrD,iBAAW,YAAY,YAAY;AACjC,cAAM,SAAS,MAAM,KAAK,kBAAkB,QAAQ;AACpD,eAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,iBAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,YAAI,OAAO,aAAa;AACtB,sBAAY,KAAK,GAAG,OAAO,WAAW;AAAA,QACxC;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,YAAY,yBAAyB,QAAQ;AAAA,QAC7C,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,UAA6C;AAC3E,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA8B,CAAC;AACrC,UAAM,cAAwB,CAAC;AAE/B,QAAI;AACF,YAAM,UAAUD,cAAa,UAAU,OAAO;AAC9C,YAAM,SAAS,IAAI,eAAe,OAAO;AACzC,YAAM,QAAQ,OAAO,eAAe,OAAO;AAG3C,UAAI,MAAM,MAAM,WAAW,KAAK,MAAM,SAAS,WAAW,KAAK,MAAM,QAAQ,WAAW,GAAG;AACzF,iBAAS,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAGA,UAAI,CAAC,QAAQ,SAAS,UAAU,KAAK,CAAC,QAAQ,SAAS,aAAa,KAAK,CAAC,QAAQ,SAAS,YAAY,GAAG;AACxG,iBAAS,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,QACL,OAAO,OAAO,WAAW;AAAA,QACzB;AAAA,QACA;AAAA,QACA,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,YAAM,aAAa,KAAK,wBAAwB,YAAY;AAE5D,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC;AAAA,UACP,SAAS;AAAA,UACT;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,QACD,UAAU,CAAC;AAAA,QACX,aAAa,aAAa,CAAC,UAAU,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,UAA0B;AACpD,UAAM,WAAWC,MAAK,SAAS,UAAU,KAAK;AAC9C,WAAO,aAAa,SAASA,MAAK,SAASA,MAAK,QAAQ,QAAQ,CAAC,IAAI;AAAA,EACvE;AAAA,EAEA,MAAc,eAAe,KAAgC;AAC3D,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAU,MAAM,gBAAgB,cAAc,GAAG;AAEvD,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,KAAK,KAAK;AACtC,YAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS;AAElD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,KAAK,eAAe,SAAS;AACpD,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,WAAW,MAAM,SAAS,KAAK,GAAG;AAChC,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ADjNO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,MAAM,QAAQ,UAAmB,SAA+C;AAC9E,UAAM,YAAY,IAAI,UAAU,SAAS,UAAU,KAAK;AAExD,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,6CAA6C;AAC3D,cAAQ,IAAI,wCAAwC;AACpD,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,UAAM,aAAaC,OAAK,KAAK,KAAK,mBAAmB,kBAAkB,QAAQ;AAC/E,QAAI,MAAM,gBAAgB,WAAW,UAAU,GAAG;AAChD,YAAM,SAAS,MAAM,UAAU,eAAe,UAAU;AACxD,WAAK,YAAY,UAAU,MAAM;AACjC,UAAI,CAAC,OAAO,OAAO;AACjB,gBAAQ,WAAW;AAAA,MACrB;AACA;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,QAAI,YAAa,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AAC5D,YAAM,SAAS,MAAM,UAAU,aAAa,QAAQ;AACpD,WAAK,YAAY,UAAU,MAAM;AACjC,UAAI,CAAC,OAAO,OAAO;AACjB,gBAAQ,WAAW;AAAA,MACrB;AACA;AAAA,IACF;AAEA,YAAQ,MAAM,0BAA0B,QAAQ,aAAa;AAC7D,YAAQ,WAAW;AAAA,EACrB;AAAA,EAEQ,aAAa,UAAiC;AACpD,UAAM,WAAWA,OAAK,KAAK,KAAK,mBAAmB,cAAc;AACjE,WAAOA,OAAK,KAAK,UAAU,GAAG,QAAQ,KAAK;AAAA,EAC7C;AAAA,EAEQ,YAAY,UAAkB,QAAmB;AACvD,YAAQ,IAAI;AAAA,qBAAwB,QAAQ;AAAA,CAAI;AAChD,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAE1B,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAIC,OAAM,MAAM,cAAS,CAAC;AAAA,IACpC,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,gBAAW,CAAC;AAAA,IACpC;AAEA,QAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,cAAQ,IAAIA,OAAM,IAAI,WAAW,CAAC;AAClC,aAAO,OAAO,QAAQ,CAAC,QAAa;AAClC,gBAAQ,IAAIA,OAAM,IAAI,YAAO,IAAI,WAAW,GAAG,EAAE,CAAC;AAClD,YAAI,IAAI,YAAY;AAClB,kBAAQ,IAAIA,OAAM,KAAK,6BAAsB,IAAI,UAAU,EAAE,CAAC;AAAA,QAChE;AACA,YAAI,IAAI,MAAM;AACZ,kBAAQ,IAAIA,OAAM,KAAK,uBAAgB,IAAI,IAAI,EAAE,CAAC;AAAA,QACpD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,cAAQ,IAAIA,OAAM,OAAO,aAAa,CAAC;AACvC,aAAO,SAAS,QAAQ,CAAC,SAAc;AACrC,gBAAQ,IAAIA,OAAM,OAAO,YAAO,KAAK,WAAW,IAAI,EAAE,CAAC;AACvD,YAAI,KAAK,YAAY;AACnB,kBAAQ,IAAIA,OAAM,KAAK,6BAAsB,KAAK,UAAU,EAAE,CAAC;AAAA,QACjE;AACA,YAAI,KAAK,MAAM;AACb,kBAAQ,IAAIA,OAAM,KAAK,uBAAgB,KAAK,IAAI,EAAE,CAAC;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;AACvD,cAAQ,IAAIA,OAAM,KAAK,0BAAmB,CAAC;AAC3C,aAAO,YAAY,QAAQ,CAAC,eAAuB;AACjD,gBAAQ,IAAIA,OAAM,KAAK,YAAO,UAAU,EAAE,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,OAAO,SAAS,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC9D,cAAQ,IAAIA,OAAM,KAAK,yBAAkB,CAAC;AAC1C,cAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAClD,cAAQ,IAAIA,OAAM,KAAK,4BAA4B,CAAC;AACpD,cAAQ,IAAIA,OAAM,KAAK,kDAAkD,QAAQ,CAAC;AAAA,IACpF;AAEA,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AACF;;;AKpGA,OAAOC,YAAU;AAGjB,OAAOC,UAAS;;;ACQT,IAAM,qBAAwD;AAAA;AAAA,EAEnE,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,cAAc,CAAC,WAAW,aAAa,MAAM;AAAA,EAC/C;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,wBAAwB;AAAA,IACtB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,oBAAoB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,IACZ,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA;AAAA,EAGA,iCAAiC;AAAA,IAC/B,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa;AAAA,EACf;AACF;AAKO,SAAS,qBAAqB,WAAmB,aAAgD;AAEtG,MAAI,aAAa;AACf,UAAM,MAAM,GAAG,WAAW,IAAI,SAAS;AACvC,QAAI,mBAAmB,GAAG,GAAG;AAC3B,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,EACF;AAGA,MAAI,mBAAmB,SAAS,GAAG;AACjC,WAAO,mBAAmB,SAAS;AAAA,EACrC;AAEA,SAAO;AACT;AAKO,SAAS,uBAAoG;AAClH,QAAM,SAAsF,CAAC;AAE7F,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AAC5D,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,EAAE,WAAW,KAAK,KAAK,CAAC;AAAA,IACtC,OAAO;AACL,YAAM,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,GAAG;AAC9C,aAAO,KAAK,EAAE,WAAW,aAAa,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;;;AD/EA,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAIpC,eAAe,sBAA8C;AAC3D,QAAM,gBAA0B,CAAC;AAIjC,MAAI;AACF,UAAMC,mBAAkBD,SAAQ,QAAQ,iBAAiB;AACzD,UAAM,aAAaE,OAAK,QAAQD,gBAAe;AAE/C,kBAAc;AAAA,MACZ,KAAK,YAAY,OAAO,QAAQ,aAAa,QAAQ;AAAA;AAAA,MACrD,KAAK,YAAY,QAAQ,QAAQ,aAAa,QAAQ;AAAA;AAAA,IACxD;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAMA,mBAAkBD,SAAQ,QAAQ,uBAAuB;AAC/D,UAAM,aAAaE,OAAK,QAAQD,gBAAe;AAE/C,kBAAc;AAAA,MACZ,KAAK,YAAY,QAAQ,QAAQ,aAAa,QAAQ;AAAA;AAAA,MACtD,KAAK,YAAY,OAAO,QAAQ,aAAa,QAAQ;AAAA;AAAA,IACvD;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,gBAAc;AAAA;AAAA,IAEZ,KAAK,WAAW,MAAM,MAAM,OAAO,QAAQ,aAAa,QAAQ;AAAA;AAAA,IAEhE,KAAK,WAAW,MAAM,QAAQ,aAAa,QAAQ;AAAA;AAAA,IAEnD,KAAK,QAAQ,IAAI,GAAG,OAAO,QAAQ,aAAa,QAAQ;AAAA,EAC1D;AAEA,aAAW,gBAAgB,eAAe;AACxC,QAAI,MAAM,gBAAgB,WAAW,YAAY,GAAG;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,MAAM,KAAK,cAAsB,KAAoB;AACnD,UAAM,SAAS,MAAM,aAAa,WAAW,WAAW;AAExD,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,4DAA4D;AACxE;AAAA,IACF;AAEA,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAG1B,UAAM,gBAA4E,CAAC;AACnF,UAAM,eAA2D,CAAC;AAElE,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,aAAa;AACrB,YAAI,CAAC,cAAc,MAAM,WAAW,GAAG;AACrC,wBAAc,MAAM,WAAW,IAAI,CAAC;AAAA,QACtC;AACA,sBAAc,MAAM,WAAW,EAAE,KAAK;AAAA,UACpC,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,qBAAa,KAAK;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,aAAa,GAAG;AACxE,cAAQ,IAAI;AAAA,YAAQ,WAAW,GAAG;AAClC,iBAAW,SAAS,eAAe;AACjC,gBAAQ,IAAI,aAAQ,MAAM,SAAS,EAAE;AAAA,MACvC;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI;AAAA,gCAA4B;AACxC,iBAAW,SAAS,cAAc;AAChC,gBAAQ,IAAI,aAAQ,MAAM,SAAS,EAAE;AAAA,MACvC;AAAA,IACF;AAEA,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAM,KAAK,WAAmB,aAAsB,cAAsB,KAAoB;AAC5F,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,IAAI,iEAAiE;AAC7E,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI,YAAY;AAEhB,QAAI,aAAa;AACf,kBAAY,MAAM,aAAa,UAAU,aAAa,WAAW,WAAW;AAAA,IAC9E,OAAO;AAEL,YAAM,SAAS,MAAM,aAAa,WAAW,WAAW;AACxD,YAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,cAAc,SAAS;AAExD,UAAI,OAAO;AACT,YAAI;AACF,sBAAY,YAAY,WAAW,MAAM,MAAM,SAAS;AAAA,QAC1D,SAAS,OAAO;AACd,kBAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAClF,kBAAQ,WAAW;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,iBAAiB,SAAS,aAAa;AACrD,UAAI,aAAa;AACf,gBAAQ,IAAI,gCAAgC,WAAW,IAAI,SAAS,GAAG;AAAA,MACzE,OAAO;AACL,gBAAQ,IAAI,+BAA+B;AAAA,MAC7C;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,YAAQ,IAAI;AAAA,mBAAe,UAAU,IAAI;AAAA,CAAI;AAC7C,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAE1B,YAAQ,IAAI;AAAA,kBAAc,UAAU,SAAS;AAAA,CAAI;AAEjD,QAAI,UAAU,SAAS;AACrB,cAAQ,IAAI,YAAY;AACxB,cAAQ,IAAI,UAAU,OAAO;AAC7B,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,UAAU,SAAS,GAAG;AAClC,cAAQ,IAAI,gBAAgB;AAC5B,gBAAU,UAAU,QAAQ,UAAQ;AAClC,gBAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,MACzB,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,MAAM,SAAS,GAAG;AAC9B,cAAQ,IAAI,UAAU;AACtB,gBAAU,MAAM,QAAQ,CAAC,MAAM,UAAU;AACvC,gBAAQ,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,MACrC,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,cAAQ,IAAI,WAAW;AACvB,gBAAU,OAAO,QAAQ,WAAS;AAChC,gBAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,MAC1B,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,QAAQ,SAAS,GAAG;AAChC,cAAQ,IAAI,YAAY;AACxB,gBAAU,QAAQ,QAAQ,YAAU;AAClC,gBAAQ,IAAI,KAAK,MAAM,EAAE;AAAA,MAC3B,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,UAAU,SAAS,GAAG;AAClC,cAAQ,IAAI,wBAAwB;AACpC,gBAAU,UAAU,QAAQ,cAAY;AACtC,gBAAQ,IAAI,KAAK,QAAQ,EAAE;AAAA,MAC7B,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,QAAQ,SAAS,GAAG;AAChC,cAAQ,IAAI,sBAAsB;AAClC,gBAAU,QAAQ,QAAQ,YAAU;AAClC,gBAAQ,IAAI,KAAK,MAAM,EAAE;AAAA,MAC3B,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,aAAa,eAAe,UAAU,aAAa,YAAY,SAAS,GAAG;AACvF,cAAQ,IAAI,gBAAgB;AAC5B,gBAAU,aAAa,YAAY,QAAQ,gBAAc;AACvD,gBAAQ,IAAI,KAAK,UAAU,EAAE;AAAA,MAC/B,CAAC;AACD,cAAQ,IAAI;AAAA,IACd;AAGA,UAAM,cAAcC,OAAK,KAAK,UAAU,WAAW,UAAU;AAC7D,QAAI,MAAM,gBAAgB,WAAW,WAAW,GAAG;AACjD,cAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,cAAQ,IAAI,8BAA8B;AAC1C,YAAM,UAAU,MAAM,gBAAgB,SAAS,WAAW;AAC1D,cAAQ,IAAI,OAAO;AAAA,IACrB;AAEA,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAO,cAAsB,KAAoB;AACrD,UAAM,UAAUC,KAAI,+BAA+B,EAAE,MAAM;AAE3D,QAAI;AACF,YAAM,YAAYD,OAAK,KAAK,aAAa,mBAAmB,eAAe;AAE3E,UAAI,CAAE,MAAM,gBAAgB,WAAW,SAAS,GAAI;AAClD,gBAAQ,KAAK,6DAA6D;AAC1E,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,aAAa,WAAW,WAAW;AACxD,UAAI,QAAQ;AACZ,UAAI,SAAS;AAEb,iBAAW,SAAS,QAAQ;AAC1B,cAAM,YAAY,MAAM;AACxB,cAAM,cAAcA,OAAK,KAAK,WAAW,UAAU;AAGnD,YAAI,CAAE,MAAM,gBAAgB,WAAW,WAAW,GAAI;AACpD,kBAAQ,KAAK,uBAAuB,SAAS,EAAE;AAC/C;AACA;AAAA,QACF;AAGA,cAAM,eAAe,CAAC,aAAa,WAAW,UAAU;AACxD,mBAAW,OAAO,cAAc;AAC9B,gBAAM,UAAUA,OAAK,KAAK,WAAW,GAAG;AACxC,cAAI,CAAE,MAAM,gBAAgB,WAAW,OAAO,GAAI;AAChD,kBAAM,gBAAgB,gBAAgB,OAAO;AAC7C;AAAA,UACF;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,UAAU,MAAM,gBAAgB,SAAS,WAAW;AAC1D,cAAI,CAAC,QAAQ,SAAS,YAAY,KAAK,CAAC,QAAQ,SAAS,UAAU,GAAG;AACpE,oBAAQ,KAAK,iCAAiC,SAAS,EAAE;AAAA,UAC3D;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,2BAA2B,SAAS,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAChH;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,KAAK,UAAU,GAAG;AAC/B,gBAAQ,QAAQ,oCAAoC;AAAA,MACtD,OAAO;AACL,gBAAQ,QAAQ,YAAY,KAAK,kBAAkB,MAAM,SAAS;AAAA,MACpE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACjF,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,WAAmB,aAAsB,cAAsB,KAAoB;AAC3F,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,IAAI,iEAAiE;AAC7E,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,UAAUC,KAAI,iBAAiB,SAAS,MAAM,EAAE,MAAM;AAE5D,QAAI;AAEF,YAAM,eAAe,qBAAqB,WAAW,WAAW;AAEhE,UAAI,CAAC,cAAc;AACjB,gBAAQ,KAAK,mBAAmB,SAAS,aAAa;AACtD,gBAAQ,IAAI,qBAAqB;AACjC,cAAM,eAAe,qBAAqB;AAC1C,mBAAW,EAAE,WAAW,MAAM,aAAa,GAAG,KAAK,cAAc;AAC/D,cAAI,IAAI;AACN,oBAAQ,IAAI,OAAO,IAAI,kBAAkB,EAAE,GAAG;AAAA,UAChD,OAAO;AACL,oBAAQ,IAAI,OAAO,IAAI,kBAAkB;AAAA,UAC3C;AAAA,QACF;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,YAAM,YAAYD,OAAK,KAAK,aAAa,mBAAmB,eAAe;AAE3E,UAAI;AACJ,UAAI,aAAa,gBAAgB;AAC/B,mBAAWA,OAAK,KAAK,WAAW,SAAS;AAAA,MAC3C,OAAO;AACL,YAAI,CAAC,aAAa,aAAa;AAC7B,kBAAQ,KAAK,yCAAyC;AACtD,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,mBAAWA,OAAK,KAAK,WAAW,aAAa,aAAa,SAAS;AAAA,MACrE;AAGA,YAAM,WAAW,MAAM,gBAAgB,WAAW,QAAQ;AAC1D,UAAI,UAAU;AACZ,gBAAQ,KAAK,UAAU,SAAS,uBAAuB,QAAQ,EAAE;AACjE,gBAAQ,MAAM,+CAA+C;AAC7D,YAAI;AACF,gBAAM,gBAAgB,gBAAgB,UAAU,IAAI;AACpD,kBAAQ,QAAQ,sBAAsB,SAAS,GAAG;AAAA,QACpD,SAAS,OAAO;AACd,kBAAQ,KAAK,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACtG,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,gBAAQ,MAAM,yBAAyB,SAAS,MAAM;AAAA,MACxD;AAGA,YAAM,gBAAgB,gBAAgB,QAAQ;AAG9C,YAAM,mBAAmB,MAAM,oBAAoB;AACnD,UAAI,CAAC,kBAAkB;AACrB,gBAAQ,KAAK,wHAAwH;AACrI,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,eAAeA,OAAK,KAAK,kBAAkB,aAAa,gBAAgB;AAG9E,UAAI,CAAE,MAAM,gBAAgB,WAAW,YAAY,GAAI;AACrD,gBAAQ,KAAK,4BAA4B,YAAY,EAAE;AACvD,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,gBAAgB,SAAS,cAAcA,OAAK,KAAK,UAAU,UAAU,CAAC;AAG5E,UAAI,aAAa,cAAc;AAC7B,mBAAW,eAAe,aAAa,cAAc;AACnD,gBAAM,iBAAiBA,OAAK,KAAK,kBAAkB,WAAW;AAC9D,gBAAM,kBAAkBA,OAAK,KAAK,UAAU,WAAW;AAEvD,cAAI,MAAM,gBAAgB,WAAW,cAAc,GAAG;AACpD,kBAAM,gBAAgB,cAAc,gBAAgB,eAAe;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAgB,gBAAgBA,OAAK,KAAK,UAAU,WAAW,CAAC;AACtE,YAAM,gBAAgB,gBAAgBA,OAAK,KAAK,UAAU,SAAS,CAAC;AACpE,YAAM,gBAAgB,gBAAgBA,OAAK,KAAK,UAAU,UAAU,CAAC;AAErE,YAAM,iBAAiB,WACnB,UAAU,SAAS,2BACnB,UAAU,SAAS;AAEvB,cAAQ,QAAQ,cAAc;AAC9B,cAAQ,IAAI;AAAA,sBAAkB,QAAQ,EAAE;AACxC,UAAI,UAAU;AACZ,gBAAQ,IAAI;AAAA,qEAAmE;AAAA,MACjF;AACA,cAAQ,IAAI;AAAA,qCAAiC,SAAS,GAAG,cAAc,mBAAmB,WAAW,KAAK,EAAE;AAAA,CAAqB;AAAA,IACnI,SAAS,OAAO;AACd,cAAQ,KAAK,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACjF,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AE7ZA,OAAOE,YAAW;AAEX,IAAM,gBAAN,MAAoB;AAAA,EACzB,MAAM,UAAyB;AAC7B,YAAQ,IAAIA,OAAM,KAAK,KAAK,6CAAsC,CAAC;AACnE,YAAQ,IAAI,SAAI,OAAO,EAAE,IAAI,IAAI;AAEjC,SAAK,eAAe;AACpB,SAAK,aAAa;AAClB,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAClB,SAAK,SAAS;AAEd,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC;AACjC,YAAQ,IAAIA,OAAM,KAAK,oFAA6E,CAAC;AAAA,EACvG;AAAA,EAEQ,iBAAuB;AAC7B,YAAQ,IAAIA,OAAM,OAAO,KAAK,yBAAkB,CAAC;AACjD,YAAQ,IAAIA,OAAM,MAAM,8BAA8B,CAAC;AACvD,YAAQ,IAAIA,OAAM,KAAK,kBAAkB,CAAC;AAC1C,YAAQ,IAAIA,OAAM,KAAK,oBAAoB,CAAC;AAE5C,YAAQ,IAAIA,OAAM,MAAM,0BAA0B,CAAC;AACnD,YAAQ,IAAIA,OAAM,KAAK,6DAA6D,CAAC;AAErF,YAAQ,IAAIA,OAAM,MAAM,yCAAyC,CAAC;AAClE,YAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAE1E,YAAQ,IAAIA,OAAM,MAAM,eAAe,CAAC;AACxC,YAAQ,IAAIA,OAAM,KAAK,oBAAoB,CAAC;AAE5C,YAAQ,IAAI,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EACnC;AAAA,EAEQ,eAAqB;AAC3B,YAAQ,IAAIA,OAAM,OAAO,KAAK,4BAAuB,CAAC;AAEtD,UAAM,WAAW;AAAA,MACf,EAAE,KAAK,wBAAwB,MAAM,iCAAiC;AAAA,MACtE,EAAE,KAAK,iBAAiB,MAAM,yBAAyB;AAAA,MACvD,EAAE,KAAK,yBAAyB,MAAM,aAAa;AAAA,MACnD,EAAE,KAAK,wBAAwB,MAAM,8BAA8B;AAAA,MACnE,EAAE,KAAK,4BAA4B,MAAM,0BAA0B;AAAA,MACnE,EAAE,KAAK,2BAA2B,MAAM,2BAA2B;AAAA,MACnE,EAAE,KAAK,2BAA2B,MAAM,8BAA8B;AAAA,MACtE,EAAE,KAAK,uBAAuB,MAAM,wBAAwB;AAAA,MAC5D,EAAE,KAAK,8BAA8B,MAAM,qBAAqB;AAAA,MAChE,EAAE,KAAK,sBAAsB,MAAM,iCAAiC;AAAA,MACpE,EAAE,KAAK,qCAAqC,MAAM,8BAA8B;AAAA,MAChF,EAAE,KAAK,sBAAsB,MAAM,iCAAiC;AAAA,MACpE,EAAE,KAAK,oCAAoC,MAAM,wCAAwC;AAAA,MACzF,EAAE,KAAK,oBAAoB,MAAM,mCAAmC;AAAA,MACpE,EAAE,KAAK,iBAAiB,MAAM,0BAA0B;AAAA,MACxD,EAAE,KAAK,mBAAmB,MAAM,kBAAkB;AAAA,IACpD;AAEA,aAAS,QAAQ,CAAC,EAAE,KAAK,KAAK,MAAM;AAClC,cAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC,EAAE,IAAIA,OAAM,MAAM,IAAI,CAAC;AAAA,IACnE,CAAC;AAED,YAAQ,IAAI,OAAO,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AAAA,EAEQ,qBAA2B;AACjC,YAAQ,IAAIA,OAAM,OAAO,KAAK,oCAA6B,CAAC;AAE5D,YAAQ,IAAIA,OAAM,MAAM,KAAK,8BAA8B,CAAC;AAC5D,YAAQ,IAAIA,OAAM,KAAK,mEAAmE,CAAC;AAC3F,YAAQ,IAAIA,OAAM,KAAK,2DAA2D,CAAC;AAEnF,YAAQ,IAAIA,OAAM,MAAM,KAAK,yCAAyC,CAAC;AACvE,YAAQ,IAAIA,OAAM,KAAK,oEAAoE,CAAC;AAC5F,YAAQ,IAAIA,OAAM,KAAK,iCAAiC,CAAC;AACzD,YAAQ,IAAIA,OAAM,KAAK,kEAAkE,CAAC;AAE1F,YAAQ,IAAIA,OAAM,MAAM,KAAK,gCAAgC,CAAC;AAC9D,YAAQ,IAAIA,OAAM,KAAK,wDAAwD,CAAC;AAChF,YAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,YAAQ,IAAIA,OAAM,KAAK,qCAAqC,CAAC;AAC7D,YAAQ,IAAIA,OAAM,KAAK,qDAAqD,CAAC;AAC7E,YAAQ,IAAIA,OAAM,KAAK,0DAA0D,CAAC;AAClF,YAAQ,IAAIA,OAAM,KAAK,4CAA4C,CAAC;AAEpE,YAAQ,IAAIA,OAAM,MAAM,KAAK,0CAA0C,CAAC;AACxE,YAAQ,IAAIA,OAAM,KAAK,0EAA0E,CAAC;AAClG,YAAQ,IAAIA,OAAM,KAAK,mEAAmE,CAAC;AAC3F,YAAQ,IAAIA,OAAM,KAAK,iEAAiE,CAAC;AAEzF,YAAQ,IAAIA,OAAM,MAAM,KAAK,yBAAyB,CAAC;AACvD,YAAQ,IAAIA,OAAM,KAAK,kCAAkC,CAAC;AAC1D,YAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,YAAQ,IAAIA,OAAM,KAAK,yBAAyB,CAAC;AAE1C,YAAQ,IAAIA,OAAM,MAAM,KAAK,sBAAsB,CAAC;AACpD,YAAQ,IAAIA,OAAM,KAAK,gEAAgE,CAAC;AACxF,YAAQ,IAAIA,OAAM,KAAK,8CAA8C,CAAC;AAEtE,YAAQ,IAAIA,OAAM,MAAM,KAAK,8BAA8B,CAAC;AAC5D,YAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAC1E,YAAQ,IAAIA,OAAM,KAAK,yBAAyB,CAAC;AACjD,YAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AACrE,YAAQ,IAAIA,OAAM,KAAK,yCAAyC,CAAC;AACjE,YAAQ,IAAIA,OAAM,KAAK,wCAAwC,CAAC;AAEhE,YAAQ,IAAI,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EAC1C;AAAA,EAEQ,eAAqB;AAC3B,YAAQ,IAAIA,OAAM,OAAO,KAAK,sBAAe,CAAC;AAE9C,UAAM,QAAQ;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,CAAC,kCAAkC;AAAA,QAC5C,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,EAAE,MAAM,SAAS,OAAO,MAAM;AAC3C,cAAQ,IAAIA,OAAM,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC;AACxC,cAAQ,QAAQ,CAAC,WAAW;AAC1B,gBAAQ,IAAIA,OAAM,MAAM,cAAS,MAAM,EAAE,CAAC;AAAA,MAC5C,CAAC;AACD,cAAQ,IAAIA,OAAM,KAAK,iBAAU,MAAM;AAAA,CAAI,CAAC;AAAA,IAC9C,CAAC;AAED,YAAQ,IAAI,SAAI,OAAO,EAAE,IAAI,IAAI;AAAA,EACnC;AAAA,EAEQ,WAAiB;AACvB,YAAQ,IAAIA,OAAM,OAAO,KAAK,mCAA4B,CAAC;AAE3D,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,QAAQ,CAAC,QAAQ;AACpB,cAAQ,IAAIA,OAAM,MAAM,YAAO,GAAG,EAAE,CAAC;AAAA,IACvC,CAAC;AAED,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;;;AC/MA,OAAOC,YAAU;AACjB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAIT,IAAM,kBAAN,MAAsB;AAAA,EAC3B,MAAM,QAAQ,cAAsB,KAAK,QAAgB,WAA0B;AACjF,UAAM,UAAUC,KAAI,4CAA4C,KAAK,MAAM,EAAE,MAAM;AAEnF,QAAI;AACF,YAAM,eAAeC,OAAK,QAAQ,WAAW;AAC7C,YAAM,WAAWA,OAAK,KAAK,cAAc,mBAAmB,cAAc;AAC1E,YAAM,UAAUA,OAAK,KAAK,cAAc,eAAe;AACvD,YAAM,gBAAgBA,OAAK,KAAK,cAAc,mBAAmB,iBAAiB,UAAU;AAG5F,UAAI,CAAE,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AACjD,gBAAQ,KAAK,uDAAuD;AACpE,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,YAAM,gBAAgB,gBAAgB,OAAO;AAG7C,UAAI,cAAuD,CAAC;AAC5D,UAAI,MAAM,gBAAgB,WAAW,aAAa,GAAG;AACnD,cAAM,iBAAiB,MAAM,gBAAgB,SAAS,aAAa;AACnE,sBAAc,KAAK,mBAAmB,cAAc;AAAA,MACtD;AAGA,YAAM,YAAY,MAAM,KAAK,cAAc,QAAQ;AAEnD,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,KAAK,mEAAmE;AAChF;AAAA,MACF;AAGA,YAAM,QAAQ,MAAM,KAAK,UAAU,SAAS;AAG5C,YAAM,aAAa,KAAK,6BAA6B,OAAO,aAAa,KAAK;AAG9E,YAAM,cAAcA,OAAK,KAAK,SAAS,2BAA2B;AAClE,YAAM,gBAAgB,UAAU,aAAa,UAAU;AAEvD,cAAQ,QAAQ,oCAAoC,WAAW,EAAE;AACjE,cAAQ,IAAIC,OAAM,KAAK;AAAA,QAAW,UAAU,MAAM,aAAa,CAAC;AAAA,IAClE,SAAS,OAAO;AACd,cAAQ,KAAK,UAAW,MAAgB,OAAO,EAAE;AACjD,cAAQ,WAAW;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,gBAAiE;AAC1F,UAAM,OAAgD,CAAC;AAGvD,UAAM,YAAY,eAAe,MAAM,aAAa;AACpD,QAAI,WAAW;AACb,WAAK,OAAO,UAAU,CAAC,EAAE,KAAK;AAAA,IAChC;AAGA,UAAM,QAAQ,eAAe,MAAM,IAAI;AACvC,QAAI,mBAAmB;AACvB,UAAM,mBAA6B,CAAC;AAEpC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,GAAG,KAAK,CAAC,kBAAkB;AAC7C,2BAAmB;AACnB;AAAA,MACF;AACA,UAAI,oBAAoB,KAAK,KAAK,KAAK,CAAC,KAAK,WAAW,GAAG,GAAG;AAC5D,yBAAiB,KAAK,KAAK,KAAK,CAAC;AACjC,YAAI,iBAAiB,UAAU,EAAG;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAK,cAAc,iBAAiB,KAAK,GAAG;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,UAAqC;AAC/D,UAAM,YAAsB,CAAC;AAC7B,UAAM,KAAK,uBAAuB,UAAU,SAAS;AACrD,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAuB,KAAa,OAAgC;AAChF,UAAMC,MAAK,MAAM,OAAO,aAAa;AACrC,UAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYF,OAAK,KAAK,KAAK,MAAM,IAAI;AAE3C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,uBAAuB,WAAW,KAAK;AAAA,MACpD,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,WAAsF;AAC5G,UAAM,QAAQ,CAAC;AAEf,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,MAAM,gBAAgB,SAAS,QAAQ;AACvD,YAAM,OAAO,KAAK,mBAAmB,UAAU,OAAO;AAEtD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAAkB,SAAyB;AAEpE,UAAM,eAAe,QAAQ,MAAM,cAAc;AACjD,QAAI,cAAc;AAChB,aAAO,aAAa,CAAC,EAAE,KAAK;AAAA,IAC9B;AAGA,WAAOA,OAAK,SAAS,UAAU,KAAK,EACjC,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACxD,KAAK,GAAG;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKQ,6BACN,OACA,aACA,QAAgB,WACR;AACR,UAAM,QAAkB,CAAC;AAGzB,UAAM,cAAc,YAAY,QAAQ;AACxC,UAAM,KAAK,KAAK,WAAW,EAAE;AAC7B,UAAM,KAAK,EAAE;AAGb,QAAI,YAAY,aAAa;AAC3B,YAAM,KAAK,YAAY,WAAW;AAClC,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,yBAAyB,MAAM,MAAM,gBAAgB,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9F,UAAM,KAAK,EAAE;AACb,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE;AAAA,IACzC,CAAC;AACD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AAEb,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,cAAc,KAAK,mBAAmB,KAAK,OAAO;AAExD,YAAM,KAAK,OAAO,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE;AAC3C,YAAM,KAAK,EAAE;AAGb,UAAI,YAAY,aAAa;AAC3B,cAAM,KAAK,YAAY,WAAW;AAClC,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,UAAI,YAAY,aAAa,SAAS,GAAG;AACvC,cAAM,KAAK,uBAAuB;AAClC,cAAM,KAAK,EAAE;AACb,oBAAY,aAAa,QAAQ,SAAO;AACtC,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB,CAAC;AACD,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,cAAM,KAAK,gBAAgB;AAC3B,cAAM,KAAK,EAAE;AACb,oBAAY,SAAS,QAAQ,aAAW;AACtC,gBAAM,KAAK,KAAK,OAAO,EAAE;AAAA,QAC3B,CAAC;AACD,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,UAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF,CAAC;AAGD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,2EAA2E,KAAK,IAAI;AAC/F,UAAM,KAAK,EAAE;AAEb,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAIzB;AACA,UAAM,OAA4E;AAAA,MAChF,aAAa;AAAA,MACb,cAAc,CAAC;AAAA,MACf,UAAU,CAAC;AAAA,IACb;AAEA,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAI,YAAY;AAChB,QAAI,iBAAiB;AACrB,QAAI,cAAc;AAClB,QAAI,iBAAiB;AAErB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,UAAU,KAAK,KAAK;AAG1B,UAAI,QAAQ,MAAM,iBAAiB,GAAG;AACpC,oBAAY;AACZ,yBAAiB;AACjB,sBAAc;AACd;AAAA,MACF,WAAW,QAAQ,MAAM,uBAAuB,GAAG;AACjD,oBAAY;AACZ,yBAAiB;AACjB,sBAAc;AACd;AAAA,MACF,WAAW,QAAQ,MAAM,oBAAoB,GAAG;AAC9C,oBAAY;AACZ,yBAAiB;AACjB,sBAAc;AACd;AAAA,MACF,WAAW,QAAQ,MAAM,MAAM,GAAG;AAEhC,oBAAY;AACZ,yBAAiB;AACjB,sBAAc;AACd;AAAA,MACF;AAGA,UAAI,aAAa,WAAW,CAAC,QAAQ,WAAW,GAAG,GAAG;AACpD,YAAI,CAAC,KAAK,aAAa;AACrB,eAAK,cAAc;AAAA,QACrB,WAAW,KAAK,YAAY,SAAS,KAAK;AACxC,eAAK,eAAe,MAAM;AAAA,QAC5B;AAAA,MACF;AAGA,UAAI,kBAAkB,QAAQ,WAAW,GAAG,GAAG;AAC7C,cAAM,cAAc,QAAQ,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtD,YAAI,aAAa;AAEf,gBAAM,eAAe,KAAK,iBAAiB,WAAW;AACtD,eAAK,aAAa,KAAK,YAAY;AAAA,QACrC;AAAA,MACF;AAGA,UAAI,eAAe,QAAQ,MAAM,aAAa,GAAG;AAC/C,cAAM,WAAW,QAAQ,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AACpE,YAAI,UAAU;AACZ,gBAAM,eAAe,KAAK,iBAAiB,QAAQ;AACnD,eAAK,SAAS,KAAK,YAAY;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,aAAa;AACrB,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,WAAW,CAAC,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,IAAI;AAC9D,eAAK,cAAc;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAsB;AAE7C,QAAI,SAAS,KACV,QAAQ,cAAc,EAAE,EACxB,QAAQ,iBAAiB,IAAI,EAC7B,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,6CAA6C,EAAE,EACvD,QAAQ,sDAAsD,EAAE,EAChE,KAAK;AAGR,QAAI,QAAQ;AACV,eAAS,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,IAC1D;AAGA,aAAS,OAAO,QAAQ,QAAQ,GAAG;AAEnC,WAAO;AAAA,EACT;AACF;;;ACzWA,OAAOG,YAAU;AACjB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAIT,IAAM,kBAAN,MAAsB;AAAA,EAC3B,MAAM,QAAQ,cAAsB,KAAK,WAAmB,QAAuB;AACjF,UAAM,UAAUC,KAAI,cAAc,QAAQ,WAAW,EAAE,MAAM;AAE7D,QAAI;AACF,YAAM,eAAeC,OAAK,QAAQ,WAAW;AAC7C,YAAM,WAAWA,OAAK,KAAK,cAAc,mBAAmB,cAAc;AAC1E,YAAM,gBAAgBA,OAAK,KAAK,cAAc,mBAAmB,iBAAiB,UAAU;AAG5F,UAAI,CAAE,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AACjD,gBAAQ,KAAK,uDAAuD;AACpE,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,YAAM,UAAU,KAAK,iBAAiB,cAAc,QAAQ;AAG5D,YAAM,gBAAgB,gBAAgB,OAAO;AAG7C,UAAI,cAA0D,CAAC;AAC/D,UAAI,MAAM,gBAAgB,WAAW,aAAa,GAAG;AACnD,cAAM,iBAAiB,MAAM,gBAAgB,SAAS,aAAa;AACnE,sBAAc,KAAK,mBAAmB,cAAc;AAAA,MACtD;AAGA,YAAM,YAAY,MAAM,KAAK,cAAc,QAAQ;AAEnD,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,KAAK,mEAAmE;AAChF;AAAA,MACF;AAGA,YAAM,QAAQ,MAAM,KAAK,UAAU,SAAS;AAG5C,YAAM,mBAAmB,MAAM,KAAK,kBAAkB,OAAO,SAAS,UAAU,WAAW;AAE3F,cAAQ,QAAQ,aAAa,iBAAiB,MAAM,oBAAoB,OAAO,EAAE;AACjF,cAAQ,IAAIC,OAAM,KAAK;AAAA,aAAgB,QAAQ,EAAE,CAAC;AAClD,cAAQ,IAAIA,OAAM,KAAK,mBAAmB,UAAU,MAAM,EAAE,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,cAAQ,KAAK,UAAW,MAAgB,OAAO,EAAE;AACjD,cAAQ,WAAW;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,aAAqB,UAA0B;AAEtE,UAAM,WAAmC;AAAA,MACvC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,KAAK;AAAA,IACP;AAEA,UAAM,UAAU,SAAS,QAAQ,KAAK;AACtC,WAAOD,OAAK,KAAK,aAAa,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,gBAAoE;AAC7F,UAAM,OAAmD,CAAC;AAG1D,UAAM,mBAAmB,eAAe,MAAM,qCAAqC;AACnF,QAAI,kBAAkB;AACpB,WAAK,cAAc,iBAAiB,CAAC,EAAE,KAAK;AAAA,IAC9C;AAGA,UAAM,aAAa,eAAe,MAAM,+BAA+B;AACvE,QAAI,YAAY;AACd,WAAK,QAAQ,WAAW,CAAC,EACtB,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,UAAqC;AAC/D,UAAM,YAAsB,CAAC;AAC7B,UAAM,KAAK,uBAAuB,UAAU,SAAS;AACrD,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAuB,KAAa,OAAgC;AAChF,UAAME,MAAK,MAAM,OAAO,aAAa;AACrC,UAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYF,OAAK,KAAK,KAAK,MAAM,IAAI;AAE3C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,uBAAuB,WAAW,KAAK;AAAA,MACpD,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,WAAsF;AAC5G,UAAM,QAAQ,CAAC;AAEf,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,MAAM,gBAAgB,SAAS,QAAQ;AACvD,YAAM,OAAO,KAAK,mBAAmB,UAAU,OAAO;AAEtD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAAkB,SAAyB;AAEpE,UAAM,eAAe,QAAQ,MAAM,cAAc;AACjD,QAAI,cAAc;AAChB,aAAO,aAAa,CAAC,EAAE,KAAK;AAAA,IAC9B;AAGA,WAAOA,OAAK,SAAS,UAAU,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,OACA,SACA,UACA,aACmB;AACnB,UAAM,eAAyB,CAAC;AAEhC,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,oBAAoB,MAAM,UAAU,WAAW;AACxE,YAAM,eAAe,KAAK,gBAAgB,KAAK,MAAM,UAAU,WAAW;AAC1E,YAAM,eAAeA,OAAK,KAAK,SAAS,YAAY;AAEpD,YAAM,gBAAgB,UAAU,cAAc,WAAW;AACzD,mBAAa,KAAK,YAAY;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,MACA,UACA,aACQ;AACR,UAAM,cAAc,KAAK,mBAAmB,KAAK,OAAO;AACxD,UAAM,gBAAgB,KAAK,uBAAuB,WAAW;AAE7D,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,MAAM,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC,eAAe,KAAK,IAAI,EAAE;AAC/F,UAAM,KAAK,2BAA2BA,OAAK,SAAS,KAAK,IAAI,CAAC,EAAE;AAChE,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAGb,QAAI,kBAAkB,QAAQ;AAC5B,YAAM,KAAK,aAAa,KAAK,IAAI,YAAY;AAC7C,YAAM,KAAK,4DAA4D;AACvE,YAAM,KAAK,EAAE;AACb,UAAI,YAAY,aAAa,SAAS,GAAG;AACvC,oBAAY,aAAa,QAAQ,CAAC,KAAK,UAAU;AAC/C,gBAAM,KAAK,kBAAkB,GAAG,YAAY;AAC5C,gBAAM,KAAK,mCAAmC;AAC9C,gBAAM,KAAK,8BAA8B;AACzC,gBAAM,KAAK,OAAO;AAClB,cAAI,QAAQ,YAAY,aAAa,SAAS,GAAG;AAC/C,kBAAM,KAAK,EAAE;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,KAAK,KAAK;AAAA,IAClB,WAAW,kBAAkB,WAAW;AACtC,YAAM,KAAK,SAAS,KAAK,aAAa,KAAK,IAAI,CAAC,uBAAuB;AACvE,YAAM,KAAK,GAAG;AACd,YAAM,KAAK,8DAA8D;AACzE,YAAM,KAAK,EAAE;AACb,UAAI,YAAY,aAAa,SAAS,GAAG;AACvC,oBAAY,aAAa,QAAQ,CAAC,KAAK,UAAU;AAC/C,gBAAM,KAAK,4BAA4B,KAAK,YAAY,GAAG,CAAC,IAAI;AAChE,gBAAM,KAAK,OAAO;AAClB,gBAAM,KAAK,uCAAuC;AAClD,gBAAM,KAAK,kCAAkC;AAC7C,gBAAM,KAAK,OAAO;AAClB,cAAI,QAAQ,YAAY,aAAa,SAAS,GAAG;AAC/C,kBAAM,KAAK,EAAE;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,KAAK,GAAG;AAAA,IAChB,OAAO;AAEL,YAAM,KAAK,MAAM,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC,eAAe,KAAK,IAAI,EAAE;AAC/F,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,0DAA0D;AACrE,YAAM,KAAK,EAAE;AACb,UAAI,YAAY,aAAa,SAAS,GAAG;AACvC,oBAAY,aAAa,QAAQ,CAAC,QAAQ;AACxC,gBAAM,KAAK,YAAY,GAAG,EAAE;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,aAAiE;AAC9F,QAAI,YAAY,OAAO;AACrB,UAAI,YAAY,MAAM,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,GAAG;AAChE,eAAO;AAAA,MACT;AACA,UAAI,YAAY,MAAM,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,EAAE,SAAS,YAAY,CAAC,GAAG;AAC3G,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,aAAqB,UAAkB,aAAiE;AAC9H,UAAM,YAAY,KAAK,uBAAuB,WAAW;AACzD,UAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,QAAI,cAAc,WAAW;AAC3B,aAAO,GAAG,KAAK,aAAa,WAAW,CAAC;AAAA,IAC1C,WAAW,cAAc,QAAQ;AAC/B,aAAO,GAAG,QAAQ;AAAA,IACpB;AAEA,WAAO,GAAG,QAAQ;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAA6C;AACtE,UAAM,OAAmC;AAAA,MACvC,cAAc,CAAC;AAAA,IACjB;AAEA,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAI,iBAAiB;AAErB,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAE1B,UAAI,QAAQ,MAAM,uBAAuB,GAAG;AAC1C,yBAAiB;AACjB;AAAA,MACF,WAAW,QAAQ,MAAM,MAAM,KAAK,gBAAgB;AAClD;AAAA,MACF;AAEA,UAAI,kBAAkB,QAAQ,WAAW,GAAG,GAAG;AAC7C,cAAM,cAAc,QAAQ,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtD,YAAI,aAAa;AACf,eAAK,aAAa,KAAK,WAAW;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACvC,WAAO,IACJ,QAAQ,mBAAmB,OAAO,EAClC,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAqB;AACxC,WAAO,IACJ,MAAM,eAAe,EACrB,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACvC,WAAO,IACJ,QAAQ,mBAAmB,OAAO,EAClC,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AAAA,EACzB;AACF;;;AC7VA,OAAOG,YAAU;AACjB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAKT,IAAM,kBAAN,MAAsB;AAAA,EAC3B,MAAM,QAAQ,cAAsB,KAAK,UAAkC;AACzE,UAAM,UAAUC,KAAI,+BAA+B,EAAE,MAAM;AAE3D,QAAI;AACF,YAAM,eAAeC,OAAK,QAAQ,WAAW;AAC7C,YAAM,WAAWA,OAAK,KAAK,cAAc,mBAAmB,cAAc;AAC1E,YAAM,gBAAgBA,OAAK,KAAK,cAAc,mBAAmB,iBAAiB,UAAU;AAG5F,UAAI,CAAE,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AACjD,gBAAQ,KAAK,uDAAuD;AACpE,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,UAAI,cAA0D,CAAC;AAC/D,UAAI,MAAM,gBAAgB,WAAW,aAAa,GAAG;AACnD,cAAM,iBAAiB,MAAM,gBAAgB,SAAS,aAAa;AACnE,sBAAc,KAAK,mBAAmB,cAAc;AAAA,MACtD;AAGA,UAAI,YAAsB,CAAC;AAC3B,UAAI,UAAU;AAEZ,cAAM,WAAW,KAAK,aAAa,UAAU,QAAQ;AACrD,YAAI,YAAa,MAAM,gBAAgB,WAAW,QAAQ,GAAI;AAC5D,sBAAY,CAAC,QAAQ;AAAA,QACvB,OAAO;AACL,kBAAQ,KAAK,SAAS,QAAQ,aAAa;AAC3C,kBAAQ,WAAW;AACnB;AAAA,QACF;AAAA,MACF,OAAO;AAEL,oBAAY,MAAM,KAAK,cAAc,QAAQ;AAAA,MAC/C;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,KAAK,mEAAmE;AAChF;AAAA,MACF;AAGA,YAAM,QAAQ,MAAM,KAAK,UAAU,SAAS;AAG5C,YAAM,iBAAiB,MAAM,KAAK,kBAAkB,OAAO,cAAc,WAAW;AAEpF,cAAQ,QAAQ,aAAa,eAAe,MAAM,eAAe;AACjE,cAAQ,IAAIC,OAAM,KAAK;AAAA,kBAAqB,UAAU,MAAM,EAAE,CAAC;AAC/D,qBAAe,QAAQ,CAAC,SAAiB;AACvC,gBAAQ,IAAIA,OAAM,KAAK,YAAOD,OAAK,SAAS,cAAc,IAAI,CAAC,EAAE,CAAC;AAAA,MACpE,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,UAAW,MAAgB,OAAO,EAAE;AACjD,cAAQ,WAAW;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,mBAAmB,SAA6D;AACtF,UAAM,mBAAmB,QAAQ,MAAM,qCAAqC;AAC5E,UAAM,aAAa,QAAQ,MAAM,+BAA+B;AAEhE,WAAO;AAAA,MACL,aAAa,mBAAmB,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,MAClF,OAAO,aAAa,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI;AAAA,IACpF;AAAA,EACF;AAAA,EAEQ,aAAa,UAAkB,UAAiC;AAEtE,UAAM,aAAaA,OAAK,KAAK,UAAU,GAAG,QAAQ,KAAK;AAEvD,UAAM,aAAaA,OAAK,KAAK,UAAU,UAAU,SAAS;AAC1D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAqC;AAC/D,UAAM,YAAsB,CAAC;AAC7B,UAAM,KAAK,uBAAuB,UAAU,SAAS;AACrD,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA,EAEA,MAAc,uBAAuB,KAAa,OAAgC;AAChF,UAAME,MAAK,MAAM,OAAO,aAAa;AACrC,UAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYF,OAAK,KAAK,KAAK,MAAM,IAAI;AAE3C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,uBAAuB,WAAW,KAAK;AAAA,MACpD,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,aAAa;AACnE,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,WAAmG;AACzH,UAAM,QAAQ,CAAC;AAEf,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,MAAM,gBAAgB,SAAS,QAAQ;AACvD,YAAM,SAAS,IAAI,eAAe,OAAO;AACzC,YAAM,WAAWA,OAAK,SAAS,UAAU,KAAK;AAE9C,UAAI;AACF,cAAM,SAAS,OAAO,UAAU,QAAQ;AACxC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,MAAM,OAAO;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,KAAKC,OAAM,OAAO,sCAAsC,QAAQ,aAAa,CAAC;AAAA,MACxF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBACZ,OACA,aACA,aACmB;AACnB,UAAM,iBAA2B,CAAC;AAClC,UAAM,cAAc,YAAY,eAAe;AAE/C,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,oBAAoB,MAAM,aAAa,WAAW;AAC3E,YAAM,aAAa,KAAK,cAAc,aAAa,KAAK,MAAM,WAAW;AAGzE,YAAM,gBAAgB,gBAAgBD,OAAK,QAAQ,UAAU,CAAC;AAC9D,YAAM,gBAAgB,UAAU,YAAY,WAAW;AACvD,qBAAe,KAAK,UAAU;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,aAAqB,UAAkB,aAA6B;AAExF,UAAM,gBAAgB,SAAS,YAAY,EAAE,QAAQ,eAAe,GAAG;AAEvE,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,aAAOA,OAAK,KAAK,aAAa,YAAY,SAAS,aAAa,MAAM;AAAA,IACxE,WAAW,YAAY,SAAS,eAAe,GAAG;AAChD,aAAOA,OAAK,KAAK,aAAa,WAAW,eAAe,GAAG,aAAa,MAAM;AAAA,IAChF,WAAW,YAAY,SAAS,SAAS,GAAG;AAC1C,aAAOA,OAAK,KAAK,aAAa,OAAO,YAAY,GAAG,KAAK,aAAa,aAAa,CAAC,aAAa;AAAA,IACnG,WAAW,YAAY,SAAS,MAAM,GAAG;AACvC,aAAOA,OAAK,KAAK,aAAa,OAAO,YAAY,GAAG,aAAa,KAAK;AAAA,IACxE,OAAO;AAEL,aAAOA,OAAK,KAAK,aAAa,OAAO,GAAG,aAAa,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,oBACN,MACA,aACA,aACQ;AACR,UAAM,QAAkB,CAAC;AACzB,UAAM,YAAY,KAAK,aAAa,KAAK,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AAG1E,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,MAAM,KAAK,IAAI,EAAE;AAC5B,UAAM,KAAK,2BAA2BA,OAAK,SAAS,KAAK,IAAI,CAAC,EAAE;AAChE,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,MAAM,KAAK,OAAO,YAAY,yBAAyB,EAAE;AACpE,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAEb,QAAI,YAAY,SAAS,kBAAkB,KAAK,YAAY,SAAS,eAAe,GAAG;AAErF,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,SAAS,SAAS,IAAI;AACjC,YAAM,KAAK,EAAE;AAGb,WAAK,OAAO,aAAa,QAAQ,CAAC,QAAa;AAC7C,cAAM,aAAa,KAAK,YAAY,IAAI,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACzE,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,EAAE;AAChD,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,qBAAqB,UAAU,MAAM;AAChD,cAAM,KAAK,0BAA0B,IAAI,IAAI,EAAE;AAC/C,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf,CAAC;AAED,YAAM,KAAK,GAAG;AAAA,IAChB,WAAW,YAAY,SAAS,SAAS,GAAG;AAE1C,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,0BAA0B;AACrC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,SAAS,SAAS,WAAW;AACxC,YAAM,KAAK,EAAE;AAEb,WAAK,OAAO,aAAa,QAAQ,CAAC,QAAa;AAC7C,cAAM,aAAa,KAAK,YAAY,IAAI,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACzE,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,EAAE;AAChD,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,qBAAqB,UAAU,MAAM;AAChD,cAAM,KAAK,0BAA0B,IAAI,IAAI,EAAE;AAC/C,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf,CAAC;AAED,YAAM,KAAK,GAAG;AAAA,IAChB,WAAW,YAAY,SAAS,MAAM,GAAG;AAEvC,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,MAAM,KAAK,IAAI,UAAU;AACpC,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,SAAS,SAAS,IAAI;AACjC,YAAM,KAAK,EAAE;AAEb,WAAK,OAAO,aAAa,QAAQ,CAAC,QAAa;AAC7C,cAAM,aAAa,KAAK,YAAY,IAAI,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACzE,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,EAAE;AAChD,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,KAAK,UAAU,MAAM;AAChC,cAAM,KAAK,0BAA0B,IAAI,IAAI,EAAE;AAC/C,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf,CAAC;AAED,YAAM,KAAK,GAAG;AACd,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,SAAS,GAAG;AAAA,IAC7C,OAAO;AAEL,YAAM,KAAK,gBAAgB,SAAS,IAAI;AACxC,YAAM,KAAK,EAAE;AAEb,WAAK,OAAO,aAAa,QAAQ,CAAC,QAAa;AAC7C,cAAM,aAAa,KAAK,YAAY,IAAI,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACzE,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,EAAE;AAChD,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,KAAK,UAAU,YAAY;AACtC,cAAM,KAAK,0BAA0B,IAAI,IAAI,EAAE;AAC/C,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf,CAAC;AAED,YAAM,KAAK,GAAG;AAAA,IAChB;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kFAAkF;AAE7F,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,aAAa,KAAqB;AACxC,WAAO,IACJ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE;AAAA,EACZ;AAAA,EAEQ,YAAY,KAAqB;AACvC,UAAM,SAAS,KAAK,aAAa,GAAG;AACpC,WAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,EACxD;AACF;;;AvBnRA,IAAMG,WAAUC,eAAc,YAAY,GAAG;AAG7C,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,SAAQH,WAAU;AACpC,IAAM,kBAAkBI,MAAKF,YAAW,MAAM,cAAc;AAC5D,IAAM,EAAE,QAAQ,IAAIJ,SAAQ,eAAe;AAE3C,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,kDAAkD,EAC9D,QAAQ,OAAO;AAElB,QACG,QAAQ,aAAa,EACrB,YAAY,qCAAqC,EACjD,OAAO,OAAO,aAAa,QAAQ;AAClC,MAAI;AACF,UAAM,cAAc,IAAI,YAAY;AACpC,UAAM,YAAY,QAAQ,UAAU;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,6DAA6D,EACzE,OAAO,WAAW,+BAA+B,EACjD,OAAO,aAAa,mCAAmC,EACvD,OAAO,OAAO,YAAqD;AAClE,MAAI;AACF,UAAM,cAAc,IAAI,YAAY;AACpC,UAAM,OAA4B,SAAS,QAAQ,UAAU;AAC7D,UAAM,YAAY,QAAQ,KAAK,IAAI;AAAA,EACrC,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,kBAAkB,EAC1B,YAAY,uBAAuB,EACnC,OAAO,OAAO,aAAsB;AACnC,MAAI;AACF,UAAM,cAAc,IAAI,YAAY;AACpC,UAAM,YAAY,QAAQ,QAAQ;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,sBAAsB,EAC9B,YAAY,2BAA2B,EACvC,OAAO,YAAY,+BAA+B,EAClD,OAAO,OAAO,UAAmB,YAAmC;AACnE,MAAI;AACF,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,gBAAgB,QAAQ,UAAU,OAAO;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,uBAAuB,EAC/B,YAAY,kDAAkD,EAC9D,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAqB,YAAgC;AAClE,MAAI;AACF,UAAM,iBAAiB,IAAI,eAAe;AAC1C,UAAM,eAAe,QAAQ,YAAY,OAAO;AAAA,EAClD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,wBAAwB,EAChC,YAAY,mDAAmD,EAC/D,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,aAAsB,YAAgC;AACnE,MAAI;AACF,UAAM,iBAAiB,IAAI,eAAe;AAC1C,UAAM,eAAe,QAAQ,aAAa,OAAO;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,uDAAuD,EACnE,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,cAAc,IAAI,YAAY;AACpC,YAAQ,IAAI,kCAA2B;AACvC,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,UAAM,YAAY,QAAQ,KAAK,SAAS;AACxC,UAAM,YAAY,QAAQ,KAAK,OAAO;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,8DAA8D,EAC1E,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,cAAc,QAAQ;AAAA,EAC9B,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,4BAA4B;AAE3C,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,mBAAmB,yDAAyD,SAAS,EAC5F,OAAO,OAAO,YAAiC;AAC9C,MAAI;AACF,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,gBAAgB,QAAQ,KAAK,SAAS,SAAS,SAAS;AAAA,EAChE,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,iBAAiB,qDAAqD,MAAM,EACnF,OAAO,OAAO,YAAgC;AAC7C,MAAI;AACF,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,gBAAgB,QAAQ,KAAK,SAAS,QAAQ,MAAM;AAAA,EAC5D,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,SAAS,eAAe,+CAA+C,EACvE,OAAO,OAAO,aAAsB;AACnC,MAAI;AACF,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,gBAAgB,QAAQ,KAAK,QAAQ;AAAA,EAC7C,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,iBAAiB,IAAI,eAAe;AAC1C,UAAM,eAAe,QAAQ,GAAG;AAAA,EAClC,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QACd,QAAQ,OAAO,EACf,YAAY,wBAAwB;AAEvC,SACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,aAAa,KAAK,GAAG;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,mBAAmB,EAC3B,YAAY,yCAAyC,EACrD,OAAO,yBAAyB,kDAAkD,EAClF,OAAO,OAAO,WAAmB,YAAuC;AACvE,MAAI;AACF,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,aAAa,KAAK,WAAW,SAAS,aAAa,GAAG;AAAA,EAC9D,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,aAAa,OAAO,GAAG;AAAA,EAC/B,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,kBAAkB,EAC1B,YAAY,4DAA4D,EACxE,OAAO,yBAAyB,kDAAkD,EAClF,OAAO,OAAO,WAAmB,YAAuC;AACvE,MAAI;AACF,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,aAAa,IAAI,WAAW,SAAS,aAAa,GAAG;AAAA,EAC7D,SAAS,OAAO;AACd,YAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,MAAM;",
|
|
6
|
+
"names": ["createRequire", "fileURLToPath", "dirname", "join", "path", "path", "path", "path", "path", "ora", "chalk", "path", "ora", "chalk", "path", "ora", "chalk", "path", "ora", "chalk", "path", "chalk", "readFileSync", "path", "path", "path", "readFileSync", "path", "chalk", "path", "chalk", "readFileSync", "path", "z", "z", "z", "readFileSync", "path", "path", "chalk", "path", "ora", "require", "packageJsonPath", "path", "ora", "chalk", "path", "chalk", "ora", "ora", "path", "chalk", "fs", "path", "chalk", "ora", "ora", "path", "chalk", "fs", "path", "chalk", "ora", "ora", "path", "chalk", "fs", "require", "createRequire", "__filename", "fileURLToPath", "__dirname", "dirname", "join"]
|
|
7
|
+
}
|