@attest-it/cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/attest-it.js +448 -66
- package/dist/bin/attest-it.js.map +1 -1
- package/dist/index.cjs +450 -64
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +448 -66
- package/dist/index.js.map +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/output.ts","../../src/components/theme.ts","../../src/utils/prompts.ts","../../src/utils/exit-codes.ts","../../src/commands/init.ts","../../src/commands/status.ts","../../src/components/Header.tsx","../../src/components/StatusBadge.tsx","../../src/components/SuiteTable.tsx","../../src/components/SelectionPrompt.tsx","../../src/components/SuiteSelector.tsx","../../src/components/ProgressSummary.tsx","../../src/components/TestRunner.tsx","../../src/components/InteractiveRun.tsx","../../src/commands/run-utils.ts","../../src/session/session.ts","../../src/commands/run-interactive.tsx","../../src/commands/run.ts","../../src/commands/keygen-interactive.tsx","../../src/commands/keygen.ts","../../src/commands/prune.ts","../../src/commands/verify.ts","../../src/commands/seal.ts","../../src/commands/identity/list.ts","../../src/commands/identity/create.ts","../../src/commands/identity/use.ts","../../src/commands/identity/show.ts","../../src/commands/identity/edit.ts","../../src/commands/identity/remove.ts","../../src/commands/identity/export.ts","../../src/commands/identity/index.ts","../../src/commands/whoami.ts","../../src/commands/team/list.ts","../../src/commands/team/add.ts","../../src/commands/team/edit.ts","../../src/commands/team/remove.ts","../../src/commands/team/index.ts","../../src/index.ts","../../bin/attest-it.ts"],"names":["theme","getTheme","Command","jsx","Text","Box","input","jsxs","React5","useInput","createAttestation","currentSuite","saveSession","React8","dirname","loadConfig","computeFingerprint","readAttestations","resolve","parseShellCommand","executeCommand","spawn","checkDirtyWorkingTree","os2","upsertAttestation","KeyProviderRegistry","getDefaultPrivateKeyPath","FilesystemKeyProvider","writeSignedAttestations","toAttestItConfig","computeFingerprintSync","fs","readSealsSync","useState","useEffect","error","render","getDefaultPublicKeyPath","OnePasswordKeyProvider","MacOSKeychainKeyProvider","fs2","fs3","verifyGateSeal","verifyAllSeals","colorizeState","formatAge","loadLocalConfigSync","getActiveIdentity","writeSealsSync","isAuthorizedSigner","createKeyProviderFromIdentity","getKeyRefFromIdentity","createSeal","loadLocalConfig","join","mkdir","writeFile","saveLocalConfig","confirm","generateEd25519KeyPair","unlink","stringifyYaml","listCommand","runList","editCommand","runEdit","validatePublicKey","checkbox","findConfigPath","removeCommand","runRemove"],"mappings":"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","file":"attest-it.js","sourcesContent":["import { detectTheme, type Theme } from 'chromaterm'\n\nexport interface OutputOptions {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n}\n\n// Singleton for global output options\nlet globalOptions: OutputOptions = {}\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required mock theme for testing/fallback when async init not called\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOptions = options\n}\n\nexport function getOutputOptions(): OutputOptions {\n return globalOptions\n}\n\n// Logging functions\nexport function log(message: string): void {\n if (!globalOptions.quiet) {\n console.log(message)\n }\n}\n\nexport function verbose(message: string): void {\n if (globalOptions.verbose && !globalOptions.quiet) {\n console.log(getTheme().muted(message))\n }\n}\n\nexport function success(message: string): void {\n log(getTheme().success('✓ ' + message))\n}\n\nexport function error(message: string): void {\n console.error(getTheme().error('✗ ' + message))\n}\n\nexport function warn(message: string): void {\n if (!globalOptions.quiet) {\n console.warn(getTheme().warning('⚠ ' + message))\n }\n}\n\nexport function info(message: string): void {\n log(getTheme().info('ℹ ' + message))\n}\n\n// Table formatting for status display\nexport interface TableRow {\n suite: string\n status: string\n fingerprint: string\n age: string\n}\n\nexport function formatTable(rows: TableRow[]): string {\n // Calculate column widths\n const headers = ['Suite', 'Status', 'Fingerprint', 'Age']\n\n // Helper to get row values in consistent order\n const getRowValues = (row: TableRow): string[] => [\n row.suite,\n row.status,\n row.fingerprint,\n row.age,\n ]\n\n const widths = headers.map((h, i) => {\n const columnValues = rows.map((r) => {\n const values = getRowValues(r)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n return values[i] ?? ''\n })\n const maxValueLength = Math.max(...columnValues.map((v) => v.length), 0)\n return Math.max(h.length, maxValueLength)\n })\n\n // Build table\n const separator = '─'\n const lines: string[] = []\n\n // Header\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(headers.map((h, i) => h.padEnd(widths[i] ?? 0)).join(' │ '))\n lines.push(widths.map((w) => separator.repeat(w)).join('─┼─'))\n\n // Rows\n for (const row of rows) {\n const values = getRowValues(row)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(values.map((v, i) => v.padEnd(widths[i] ?? 0)).join(' │ '))\n }\n\n return lines.join('\\n')\n}\n\n// Status colorization\nexport function colorizeStatus(status: string): string {\n const t = getTheme()\n switch (status) {\n case 'VALID':\n return t.green(status)\n case 'NEEDS_ATTESTATION':\n case 'FINGERPRINT_CHANGED':\n return t.yellow(status)\n case 'EXPIRED':\n case 'INVALIDATED_BY_PARENT':\n return t.red(status)\n case 'SIGNATURE_INVALID':\n return t.red.bold()(status)\n default:\n return status\n }\n}\n\n// JSON output\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n","/**\n * Theme utilities for ink components.\n * Provides access to chromaterm theme and shared styling constants.\n */\n\nimport { detectTheme, type Theme } from 'chromaterm'\n\n/**\n * Status display configuration.\n */\nexport interface StatusDisplay {\n /** Text to display */\n label: string\n /** Ink color name */\n color: string\n /** Whether to apply bold */\n bold?: boolean\n /** Symbol to show before label */\n symbol?: string\n}\n\n/**\n * Map verification status to display configuration.\n */\nexport const STATUS_DISPLAY: Record<string, StatusDisplay> = {\n VALID: {\n label: 'VALID',\n color: 'green',\n symbol: '✓',\n },\n NEEDS_ATTESTATION: {\n label: 'MISSING',\n color: 'yellow',\n symbol: '○',\n },\n FINGERPRINT_CHANGED: {\n label: 'CHANGED',\n color: 'yellow',\n symbol: '⚠',\n },\n EXPIRED: {\n label: 'STALE',\n color: 'red',\n symbol: '⚠',\n },\n SIGNATURE_INVALID: {\n label: 'INVALID',\n color: 'red',\n bold: true,\n symbol: '✗',\n },\n INVALIDATED_BY_PARENT: {\n label: 'PARENT_INVALID',\n color: 'red',\n symbol: '✗',\n },\n}\n\n/**\n * Box drawing characters for consistent UI.\n */\nexport const BOX_CHARS = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n cross: '┼',\n} as const\n\n/**\n * Common column widths for table display.\n */\nexport const COLUMN_WIDTHS = {\n checkbox: 3, // [ ] or [x]\n status: 14, // MISSING, CHANGED, PARENT_INVALID, etc.\n suite: 25, // Suite name\n reason: 30, // Reason text\n} as const\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // Type assertion is required here because we're creating a mock Theme object\n // for testing/fallback purposes. The chromaterm Theme type has complex\n // chainable methods that we're approximating with simple functions.\n // This is safe because all methods accept and return strings.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required to create mock theme for testing\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\n/**\n * Get display configuration for a verification status.\n * Returns a default for unknown statuses.\n */\nexport function getStatusDisplay(status: string): StatusDisplay {\n return (\n // eslint-disable-next-line security/detect-object-injection -- status is a user-controlled string, but we provide a safe default for unknown values\n STATUS_DISPLAY[status] ?? {\n label: status,\n color: 'white',\n symbol: '?',\n }\n )\n}\n","import { confirm } from '@inquirer/prompts'\nimport { getTheme, BOX_CHARS } from '../components/theme.js'\n\nexport interface ConfirmOptions {\n message: string\n default?: boolean\n}\n\n/**\n * Display a visually distinctive confirmation prompt.\n *\n * Creates a styled box with yellow border to make the attestation prompt\n * stand out from test output.\n */\nexport async function confirmAction(options: ConfirmOptions): Promise<boolean> {\n const theme = getTheme()\n\n // Build the styled prompt box\n const defaultIndicator = options.default ? '(Y/n)' : '(y/N)'\n const message = `${options.message}? ${defaultIndicator}`\n const boxWidth = Math.max(message.length + 2, 40)\n const contentPadding = ' '.repeat(boxWidth - message.length - 1)\n\n // Box drawing with yellow border\n const topBorder = theme.yellow(\n `${BOX_CHARS.topLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.topRight}`,\n )\n const bottomBorder = theme.yellow(\n `${BOX_CHARS.bottomLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.bottomRight}`,\n )\n\n // Content line with yellow border and normal text\n const contentLine =\n theme.yellow(BOX_CHARS.vertical) +\n ` ${message}${contentPadding}` +\n theme.yellow(BOX_CHARS.vertical)\n\n // Display the styled box\n console.log('')\n console.log(topBorder)\n console.log(contentLine)\n console.log(bottomBorder)\n console.log('')\n\n // Get the actual confirmation\n return confirm({\n message: '', // Empty message since we displayed it above\n default: options.default ?? false,\n theme: {\n prefix: '', // Remove default prefix\n },\n })\n}\n","/**\n * Standard exit codes for the attest-it CLI.\n *\n * These codes follow Unix conventions and provide consistent error reporting\n * across all CLI commands.\n *\n * @packageDocumentation\n */\n\n/**\n * Standard exit codes for the attest-it CLI.\n * @public\n */\nexport const ExitCode = {\n /** Operation completed successfully */\n SUCCESS: 0,\n /** Tests failed or attestation invalid */\n FAILURE: 1,\n /** Nothing needed attestation */\n NO_WORK: 2,\n /** Configuration or validation error */\n CONFIG_ERROR: 3,\n /** User cancelled the operation */\n CANCELLED: 4,\n /** Missing required key file */\n MISSING_KEY: 5,\n} as const\n\n/**\n * Type representing all possible exit codes.\n * @public\n */\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode]\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { log, success, error } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize attest-it configuration')\n .option('-p, --path <path>', 'Config file path', '.attest-it/config.yaml')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options: InitOptions) => {\n await runInit(options)\n })\n\ninterface InitOptions {\n path: string\n force?: boolean\n}\n\nconst CONFIG_TEMPLATE = `# attest-it configuration\n# See https://github.com/attest-it/attest-it for documentation\n\nversion: 1\n\nsettings:\n # How long attestations remain valid (in days)\n maxAgeDays: 30\n # Path to the public key used for signature verification\n publicKeyPath: .attest-it/pubkey.pem\n # Path to the attestations file\n attestationsPath: .attest-it/attestations.json\n # Signing algorithm\n algorithm: rsa\n\n# Define your test suites below. Each suite groups tests that require\n# human verification before their attestations are accepted.\n#\n# Example:\n#\n# suites:\n# visual-tests:\n# description: Visual regression tests requiring human review\n# packages:\n# - packages/ui\n# - packages/components\n# command: pnpm vitest packages/ui packages/components\n#\n# integration:\n# description: Integration tests with external services\n# packages:\n# - packages/api\n# command: pnpm vitest packages/api --project=integration\n\nsuites: {}\n`\n\n/**\n * Run the init command to create a new attest-it configuration.\n *\n * Creates a configuration file with sensible defaults and commented\n * examples showing how to define test suites.\n *\n * @param options - Command options\n * @param options.path - Config file path (default: .attest-it/config.yaml)\n * @param options.force - Overwrite existing config without prompting\n * @public\n */\nasync function runInit(options: InitOptions): Promise<void> {\n try {\n const configPath = path.resolve(options.path)\n const configDir = path.dirname(configPath)\n\n if (fs.existsSync(configPath) && !options.force) {\n const overwrite = await confirmAction({\n message: `Config already exists at ${configPath}. Overwrite?`,\n default: false,\n })\n if (!overwrite) {\n error('Init cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Create directory and write config\n await fs.promises.mkdir(configDir, { recursive: true })\n await fs.promises.writeFile(configPath, CONFIG_TEMPLATE, 'utf-8')\n\n success(`Configuration created at ${configPath}`)\n log('')\n log('Next steps:')\n log(` 1. Edit ${options.path} to define your test suites`)\n log(' 2. Run: attest-it keygen')\n log(' 3. Run: attest-it status')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\nexport { runInit }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyGateSeal,\n verifyAllSeals,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const statusCommand = new Command('status')\n .description('Show seal status for all gates')\n .argument('[gates...]', 'Show status for specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: StatusOptions) => {\n await runStatus(gates, options)\n })\n\ninterface StatusOptions {\n json?: boolean\n}\n\ninterface GateStatus {\n gateId: string\n state: VerificationState\n currentFingerprint: string\n sealedFingerprint?: string\n sealedBy?: string\n sealedAt?: string\n age?: number\n message?: string | undefined\n}\n\n/**\n * Run the status command to show seal status.\n *\n * Displays the current status of seals for all gates or specific gates,\n * including validation status, fingerprints, and age information.\n *\n * @param gates - Array of gate IDs to show status for, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runStatus(gates: string[], options: StatusOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to check\n const gatesToCheck = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const verificationResults =\n gates.length > 0\n ? gatesToCheck.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Build status results\n const results: GateStatus[] = verificationResults.map((result: SealVerificationResult) => {\n const status: GateStatus = {\n gateId: result.gateId,\n state: result.state,\n currentFingerprint: fingerprints[result.gateId] ?? '',\n message: result.message,\n }\n\n if (result.seal) {\n status.sealedFingerprint = result.seal.fingerprint\n status.sealedBy = result.seal.sealedBy\n status.sealedAt = result.seal.timestamp\n\n // Calculate age\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n status.age = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n }\n\n return status\n })\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayStatusTable(results)\n }\n\n // Exit with appropriate code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER' ||\n r.state === 'STALE',\n )\n\n process.exit(hasInvalid ? ExitCode.FAILURE : ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display status results in a formatted table.\n *\n * @param results - Status results for gates\n */\nfunction displayStatusTable(results: GateStatus[]): void {\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: r.currentFingerprint.slice(0, 16) + '...',\n age: formatAge(r),\n }))\n\n log('')\n log(formatTable(tableRows))\n log('')\n\n // Show seal metadata for each gate (who sealed, when)\n const sealed = results.filter((r) => r.sealedBy && r.sealedAt)\n if (sealed.length > 0) {\n log('Seal metadata:')\n for (const result of sealed) {\n log(` ${result.gateId}:`)\n log(` Sealed by: ${result.sealedBy ?? 'unknown'}`)\n if (result.sealedAt) {\n const date = new Date(result.sealedAt)\n log(` Sealed at: ${date.toLocaleString()}`)\n }\n }\n log('')\n }\n\n // Show messages for any gates with issues\n const withIssues = results.filter((r) => r.state !== 'VALID' && r.message)\n if (withIssues.length > 0) {\n log('Issues:')\n for (const result of withIssues) {\n log(` ${result.gateId}: ${result.message ?? 'Unknown issue'}`)\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const invalidCount = results.length - validCount\n\n if (invalidCount === 0) {\n success('All gate seals valid')\n } else {\n log(`Run 'attest-it seal' to create or update seals`)\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format age for display.\n *\n * @param result - Status result\n * @returns Formatted age string\n */\nfunction formatAge(result: GateStatus): string {\n if (result.state === 'VALID' || result.state === 'STALE') {\n return `${String(result.age ?? 0)} days${result.state === 'STALE' ? ' (stale)' : ''}`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runStatus }\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface HeaderProps {\n /** Number of suites needing attestation */\n pendingCount: number\n}\n\n/**\n * Displays a header box with pending suite count.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ 4 suites need attestation │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function Header({ pendingCount }: HeaderProps): React.ReactElement {\n const message = `${pendingCount.toString()} suite${pendingCount === 1 ? '' : 's'} need${pendingCount === 1 ? 's' : ''} attestation`\n\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>{message}</Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Props for the StatusBadge component.\n * @public\n */\nexport interface StatusBadgeProps {\n /** The verification status to display */\n status: VerificationStatus\n}\n\n/**\n * Displays a colored badge for suite verification status.\n *\n * Status colors:\n * - VALID: green\n * - NEEDS_ATTESTATION: yellow (display as \"MISSING\")\n * - FINGERPRINT_CHANGED: yellow (display as \"CHANGED\")\n * - EXPIRED: red (display as \"STALE\")\n * - SIGNATURE_INVALID: red bold\n * - INVALIDATED_BY_PARENT: red (display as \"INVALIDATED\")\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function StatusBadge({ status }: StatusBadgeProps): React.ReactElement {\n // Map status to display text and color\n const statusConfig = getStatusConfig(status)\n\n // Only pass bold prop if it's true to avoid exactOptionalPropertyTypes issues\n if (statusConfig.bold) {\n return (\n <Text color={statusConfig.color} bold>\n {statusConfig.text}\n </Text>\n )\n }\n\n return <Text color={statusConfig.color}>{statusConfig.text}</Text>\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\ninterface StatusConfig {\n text: string\n color: 'green' | 'yellow' | 'red'\n bold?: boolean\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\nfunction getStatusConfig(status: VerificationStatus): StatusConfig {\n switch (status) {\n case 'VALID':\n return { text: '✓ VALID', color: 'green' }\n case 'NEEDS_ATTESTATION':\n return { text: 'MISSING', color: 'yellow' }\n case 'FINGERPRINT_CHANGED':\n return { text: 'CHANGED', color: 'yellow' }\n case 'EXPIRED':\n return { text: 'STALE', color: 'red' }\n case 'SIGNATURE_INVALID':\n return { text: 'INVALID', color: 'red', bold: true }\n case 'INVALIDATED_BY_PARENT':\n return { text: 'INVALIDATED', color: 'red' }\n default: {\n // Exhaustive check\n const _exhaustive: never = status\n return { text: String(_exhaustive), color: 'yellow' }\n }\n }\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { StatusBadge } from './StatusBadge.js'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Information about a single suite for display in the table.\n * @public\n */\nexport interface SuiteInfo {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason (e.g., \"32 days old (max: 30)\") */\n reason: string\n /** Days since attestation (if exists) */\n age?: number | undefined\n}\n\n/**\n * Props for the SuiteTable component.\n * @public\n */\nexport interface SuiteTableProps {\n /** List of suites to display */\n suites: SuiteInfo[]\n /** Show checkbox column for selection */\n selectable?: boolean | undefined\n /** Currently selected suite names */\n selected?: Set<string> | undefined\n}\n\n/**\n * Displays suites in a table format with status badges.\n *\n * Example output:\n * ```\n * Status Suite Reason\n * ──────────────────────────────────────────────────────────\n * [ ] STALE visual-effects 32 days old (max: 30)\n * [ ] MISSING focus-detection No attestation found\n * ```\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function SuiteTable({\n suites,\n selectable = false,\n selected = new Set(),\n}: SuiteTableProps): React.ReactElement {\n // Calculate column widths\n const columnWidths = calculateColumnWidths(suites, selectable)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box>\n {selectable && <Text>{' '.repeat(4)}</Text>}\n <Text bold>{padEnd('Status', columnWidths.status)}</Text>\n <Text> </Text>\n <Text bold>{padEnd('Suite', columnWidths.suite)}</Text>\n <Text> </Text>\n <Text bold>Reason</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color=\"gray\">\n {'─'.repeat(\n (selectable ? 4 : 0) + columnWidths.status + columnWidths.suite + columnWidths.reason,\n )}\n </Text>\n </Box>\n\n {/* Rows */}\n {suites.map((suite) => (\n <Box key={suite.name}>\n {selectable && <Text>{selected.has(suite.name) ? '[✓] ' : '[ ] '}</Text>}\n <Box width={columnWidths.status}>\n <StatusBadge status={suite.status} />\n </Box>\n <Text> </Text>\n <Text>{padEnd(suite.name, columnWidths.suite)}</Text>\n <Text> </Text>\n <Text color=\"gray\">{suite.reason}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n/**\n * Column width information.\n * @internal\n */\ninterface ColumnWidths {\n status: number\n suite: number\n reason: number\n}\n\n/**\n * Calculate column widths based on content.\n * @internal\n */\nfunction calculateColumnWidths(suites: SuiteInfo[], _selectable: boolean): ColumnWidths {\n const statusHeader = 'Status'\n const suiteHeader = 'Suite'\n const reasonHeader = 'Reason'\n\n // Status column - fixed width for badges\n // Maximum status badge length is \"INVALIDATED\" (11 chars) + \"✓ \" (2 chars) = 13\n const statusWidth = Math.max(statusHeader.length, 13)\n\n // Suite column - max of header and all suite names\n const suiteWidth = Math.max(suiteHeader.length, ...suites.map((s) => s.name.length))\n\n // Reason column - max of header and all reasons\n const reasonWidth = Math.max(reasonHeader.length, ...suites.map((s) => s.reason.length))\n\n return {\n status: statusWidth,\n suite: suiteWidth,\n reason: reasonWidth,\n }\n}\n\n/**\n * Pad a string to the right with spaces.\n * @internal\n */\nfunction padEnd(str: string, width: number): string {\n return str.padEnd(width, ' ')\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\n\ninterface SelectionOption {\n /** Display label */\n label: string\n /** Value returned when selected */\n value: string\n /** Optional keyboard shortcut hint */\n hint?: string\n}\n\nexport interface SelectionPromptProps {\n /** Question to display */\n message: string\n /** Available options */\n options: SelectionOption[]\n /** Callback when option selected */\n onSelect: (value: string) => void\n /** Show group options if available */\n groups?: { name: string; label: string }[] | undefined\n}\n\n/**\n * Displays a selection prompt with keyboard hints.\n *\n * Example output:\n * Select suites to run:\n * [a] All pending [1-4] By number [n] None/exit\n * [g1] ui-tests [g2] behavior-tests\n */\nexport function SelectionPrompt({\n message,\n options,\n onSelect,\n groups,\n}: SelectionPromptProps): React.ReactElement {\n useInput((input) => {\n // Check if input matches any option's hint\n const matchedOption = options.find((opt) => opt.hint === input)\n if (matchedOption) {\n onSelect(matchedOption.value)\n return\n }\n\n // Check if input matches a group name\n if (groups) {\n const matchedGroup = groups.find((group) => group.name === input)\n if (matchedGroup) {\n onSelect(matchedGroup.name)\n }\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{message}</Text>\n <Box marginTop={1} gap={2}>\n {options.map((option) => (\n <Text key={option.value}>\n {option.hint && (\n <>\n <Text color=\"cyan\">[{option.hint}]</Text>{' '}\n </>\n )}\n {option.label}\n </Text>\n ))}\n </Box>\n {groups && groups.length > 0 && (\n <Box marginTop={1} gap={2}>\n {groups.map((group) => (\n <Text key={group.name}>\n <Text color=\"cyan\">[{group.name}]</Text> {group.label}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Header } from './Header.js'\nimport { SuiteTable } from './SuiteTable.js'\nimport { SelectionPrompt } from './SelectionPrompt.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\n\ninterface SuiteSelectorProps {\n /** All suites needing attestation */\n pendingSuites: SuiteStatus[]\n /** Valid suites (for \"Already valid\" display) */\n validSuites: SuiteStatus[]\n /** Available groups from config */\n groups?: Record<string, string[]> | undefined\n /** Called when user confirms selection */\n onSelect: (selectedSuites: string[]) => void\n /** Called when user exits */\n onExit: () => void\n}\n\n/**\n * Main suite selection UI component.\n *\n * Displays:\n * 1. Header with pending count\n * 2. Table of pending suites with checkboxes\n * 3. List of already valid suites\n * 4. Selection prompt with keyboard shortcuts\n *\n * Keyboard controls:\n * - a: Select all pending\n * - n: None/exit\n * - 1-9: Toggle individual suite by number\n * - g1, g2, etc: Select group (if groups available)\n * - Enter: Confirm selection\n * - Space: Toggle current suite\n * - Up/Down: Navigate\n */\nexport function SuiteSelector({\n pendingSuites,\n validSuites,\n groups,\n onSelect,\n onExit,\n}: SuiteSelectorProps): React.ReactElement {\n const [selectedSuites, setSelectedSuites] = React.useState<Set<string>>(new Set())\n const [cursorIndex, setCursorIndex] = React.useState(0)\n\n /**\n * Toggle suite selection state\n */\n const toggleSuite = React.useCallback((suiteName: string) => {\n setSelectedSuites((prev) => {\n const next = new Set(prev)\n if (next.has(suiteName)) {\n next.delete(suiteName)\n } else {\n next.add(suiteName)\n }\n return next\n })\n }, [])\n\n useInput((input, key) => {\n // 'a' - select all pending\n if (input === 'a') {\n setSelectedSuites(new Set(pendingSuites.map((s) => s.name)))\n return\n }\n\n // 'n' - none/exit\n if (input === 'n') {\n onExit()\n return\n }\n\n // Numbers 1-9 - toggle by number\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1\n if (idx < pendingSuites.length) {\n // eslint-disable-next-line security/detect-object-injection -- idx is bounds-checked against pendingSuites.length\n const suite = pendingSuites[idx]\n if (suite) {\n toggleSuite(suite.name)\n }\n }\n return\n }\n\n // Handle group shortcuts like 'g1', 'g2'\n if (input.startsWith('g') && groups) {\n const groupIdx = parseInt(input.slice(1), 10) - 1\n const groupNames = Object.keys(groups)\n if (groupIdx >= 0 && groupIdx < groupNames.length) {\n // eslint-disable-next-line security/detect-object-injection -- groupIdx is bounds-checked against groupNames.length\n const groupName = groupNames[groupIdx]\n if (groupName) {\n // eslint-disable-next-line security/detect-object-injection -- groupName is from Object.keys, so it's safe\n const groupSuites: string[] = groups[groupName] ?? []\n // Add all suites in this group to selection\n const newSelected = new Set(selectedSuites)\n groupSuites.forEach((s: string) => newSelected.add(s))\n setSelectedSuites(newSelected)\n }\n }\n return\n }\n\n // Enter - confirm selection\n if (key.return) {\n onSelect(Array.from(selectedSuites))\n return\n }\n\n // Space - toggle current\n if (input === ' ') {\n // eslint-disable-next-line security/detect-object-injection -- cursorIndex is bounds-checked via Math.min/Math.max\n const currentSuite = pendingSuites[cursorIndex]\n if (currentSuite) {\n toggleSuite(currentSuite.name)\n }\n return\n }\n\n // Arrow navigation\n if (key.upArrow) {\n setCursorIndex(Math.max(0, cursorIndex - 1))\n return\n }\n if (key.downArrow) {\n setCursorIndex(Math.min(pendingSuites.length - 1, cursorIndex + 1))\n return\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n {/* Header showing pending count */}\n <Header pendingCount={pendingSuites.length} />\n\n <Box marginY={1}>\n {/* Table of pending suites with numbers and checkboxes */}\n <SuiteTable suites={pendingSuites} selectable={true} selected={selectedSuites} />\n </Box>\n\n {/* Show valid suites if any */}\n {validSuites.length > 0 && (\n <Box marginY={1} flexDirection=\"column\">\n <Text dimColor>Already valid:</Text>\n {validSuites.map((s) => (\n <Text key={s.name} dimColor>\n {' '}✓ {s.name} (attested {String(s.age ?? 0)} days ago)\n </Text>\n ))}\n </Box>\n )}\n\n {/* Selection prompt */}\n <SelectionPrompt\n message=\"Select suites to run:\"\n options={[\n { label: 'All pending', value: 'all', hint: 'a' },\n { label: 'By number', value: 'number', hint: '1-9' },\n { label: 'None/exit', value: 'none', hint: 'n' },\n ]}\n groups={\n groups\n ? Object.keys(groups).map((name, i) => ({\n name: `g${String(i + 1)}`,\n label: name,\n }))\n : undefined\n }\n onSelect={() => {\n /* Handled by useInput */\n }}\n />\n\n {/* Current selection count */}\n <Text color=\"cyan\">{selectedSuites.size} selected. Press Enter to confirm.</Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ProgressSummaryProps {\n /** Number of suites completed successfully */\n completed: number\n /** Number of suites remaining to run */\n remaining: number\n /** Number of suites that failed */\n failed: number\n /** Number of suites skipped by user */\n skipped: number\n}\n\n/**\n * Displays a summary box showing test run progress.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ Completed: 2 Remaining: 2 Failed: 0 Skipped: 0 │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function ProgressSummary({\n completed,\n remaining,\n failed,\n skipped,\n}: ProgressSummaryProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>\n <Text color=\"green\">Completed: {completed}</Text>\n {' '}\n <Text color=\"yellow\">Remaining: {remaining}</Text>\n {' '}\n <Text color=\"red\">Failed: {failed}</Text>\n {' '}\n <Text color=\"gray\">Skipped: {skipped}</Text>\n </Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ProgressSummary } from './ProgressSummary.js'\n\ntype RunPhase = 'running' | 'confirming' | 'complete'\n\nexport interface TestRunnerProps {\n /** Suites to run in order */\n suites: string[]\n /** Execute a test command and return success/failure */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Called when all suites complete */\n onComplete: (results: RunResults) => void\n}\n\nexport interface RunResults {\n completed: string[]\n failed: string[]\n skipped: string[]\n}\n\n/**\n * Test runner component that executes suites and manages attestations.\n *\n * Flow for each suite:\n * 1. Show \"Running suite-name...\"\n * 2. Execute test command\n * 3. If passed, prompt \"Create attestation? [Y/n]\"\n * 4. If user confirms, create attestation\n * 5. Move to next suite\n *\n * If a test fails, it moves to the next suite without prompting for attestation.\n */\nexport function TestRunner({\n suites,\n executeTest,\n createAttestation,\n onComplete,\n}: TestRunnerProps): React.ReactElement {\n const [currentIndex, setCurrentIndex] = React.useState(0)\n const [phase, setPhase] = React.useState<RunPhase>('running')\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n const [_testPassed, setTestPassed] = React.useState(false)\n\n // Use a ref to store the latest results for the completion callback\n const resultsRef = React.useRef(results)\n React.useEffect(() => {\n resultsRef.current = results\n }, [results])\n\n // Effect to run tests\n React.useEffect(() => {\n if (phase !== 'running') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) {\n // All done - use ref to avoid stale closure\n onComplete(resultsRef.current)\n setPhase('complete')\n return\n }\n\n // Execute the test\n let cancelled = false\n executeTest(currentSuite)\n .then((passed) => {\n if (cancelled) return\n\n setTestPassed(passed)\n if (passed) {\n setPhase('confirming')\n } else {\n // Test failed, move to next\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n }\n })\n .catch(() => {\n if (cancelled) return\n\n // Execution error, treat as failed\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n })\n\n return () => {\n cancelled = true\n }\n }, [currentIndex, phase, suites, executeTest, onComplete])\n\n // Handle attestation confirmation\n useInput(\n (input, key) => {\n if (phase !== 'confirming') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) return\n\n // Y or Enter = create attestation\n if (input.toLowerCase() === 'y' || key.return) {\n createAttestation(currentSuite)\n .then(() => {\n setResults((prev) => ({\n ...prev,\n completed: [...prev.completed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n .catch(() => {\n // If attestation fails, still move on but mark as skipped\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n }\n\n // N = skip attestation\n if (input.toLowerCase() === 'n') {\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n }\n },\n { isActive: phase === 'confirming' },\n )\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n\n return (\n <Box flexDirection=\"column\">\n {/* Progress summary */}\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={suites.length - currentIndex}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {phase === 'running' && currentSuite && (\n <Box>\n <SimpleSpinner />\n <Text> Running {currentSuite}...</Text>\n </Box>\n )}\n\n {phase === 'confirming' && currentSuite && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ Tests passed!</Text>\n <Text>Create attestation for {currentSuite}? [Y/n]: </Text>\n </Box>\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites processed</Text>\n <Text>\n Completed: {results.completed.length}, Failed: {results.failed.length}, Skipped:{' '}\n {results.skipped.length}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Simple spinner component using ASCII animation frames.\n * Fallback for when no dedicated spinner library is available.\n */\nfunction SimpleSpinner(): React.ReactElement {\n const [frame, setFrame] = React.useState(0)\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % frames.length)\n }, 80)\n return () => {\n clearInterval(timer)\n }\n }, [])\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n return <Text color=\"cyan\">{frames[frame]}</Text>\n}\n","import * as React from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { SuiteSelector } from './SuiteSelector.js'\nimport { TestRunner } from './TestRunner.js'\nimport { ProgressSummary } from './ProgressSummary.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\nimport type { Config } from '@attest-it/core'\n\n/**\n * Current phase of the interactive run.\n */\ntype Phase = 'selecting' | 'running' | 'complete'\n\n/**\n * Props for the InteractiveRun component.\n */\nexport interface InteractiveRunProps {\n /** All suite statuses */\n allSuites: SuiteStatus[]\n /** Config for groups and settings */\n config: Config\n /** Execute test for a suite */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Save session state */\n saveSession: (completed: string[], failed: string[], remaining: string[]) => Promise<void>\n /** Optional: pre-selected suites from --continue */\n preSelected?: string[]\n}\n\n/**\n * Results from a test run.\n */\nexport interface RunResults {\n /** Suite names that completed successfully */\n completed: string[]\n /** Suite names that failed */\n failed: string[]\n /** Suite names that were skipped */\n skipped: string[]\n}\n\n/**\n * Main interactive run orchestrator.\n *\n * Phases:\n * 1. selecting - User selects which suites to run\n * 2. running - Tests executing, attestations being created\n * 3. complete - All done, show summary\n */\nexport function InteractiveRun({\n allSuites,\n config,\n executeTest,\n createAttestation,\n saveSession,\n preSelected,\n}: InteractiveRunProps): React.ReactElement {\n const { exit } = useApp()\n\n const [phase, setPhase] = React.useState<Phase>(preSelected ? 'running' : 'selecting')\n const [selectedSuites, setSelectedSuites] = React.useState<string[]>(preSelected ?? [])\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n\n // Compute pending suites (not VALID)\n const pendingSuites = React.useMemo(\n () => allSuites.filter((s) => s.status !== 'VALID'),\n [allSuites],\n )\n\n // Compute valid suites (already attested)\n const validSuites = React.useMemo(\n () => allSuites.filter((s) => s.status === 'VALID'),\n [allSuites],\n )\n\n // Handle selection completion\n const handleSelect = React.useCallback(\n (selected: string[]) => {\n if (selected.length === 0) {\n exit()\n return\n }\n setSelectedSuites(selected)\n setPhase('running')\n },\n [exit],\n )\n\n // Handle run completion (wrapped to avoid promise return in void context)\n const handleRunComplete = React.useCallback(\n (runResults: RunResults) => {\n void (async () => {\n setResults(runResults)\n\n // Save final session state (clear if all done successfully)\n if (runResults.failed.length === 0 && runResults.skipped.length === 0) {\n // All completed - clear session\n await saveSession([], [], [])\n } else {\n // Some remaining - save for --continue\n await saveSession(runResults.completed, runResults.failed, [])\n }\n\n setPhase('complete')\n })()\n },\n [saveSession],\n )\n\n // Handle case where there are no pending suites\n if (pendingSuites.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites are valid. Nothing to run.</Text>\n {validSuites.length > 0 && (\n <Text dimColor>{validSuites.length} suite(s) already attested.</Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {phase === 'selecting' && (\n <SuiteSelector\n pendingSuites={pendingSuites}\n validSuites={validSuites}\n groups={config.groups}\n onSelect={handleSelect}\n onExit={() => {\n exit()\n }}\n />\n )}\n\n {phase === 'running' && (\n <TestRunner\n suites={selectedSuites}\n executeTest={executeTest}\n createAttestation={createAttestation}\n onComplete={handleRunComplete}\n />\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={0}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {results.failed.length === 0 && results.skipped.length === 0 ? (\n <Text color=\"green\">✓ All suites attested successfully!</Text>\n ) : (\n <Box flexDirection=\"column\">\n {results.failed.length > 0 && (\n <Text color=\"red\">\n ✗ {results.failed.length} suite(s) failed: {results.failed.join(', ')}\n </Text>\n )}\n <Text>Run `attest-it run` again to continue with remaining suites.</Text>\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n","/**\n * Shared utilities for the run command.\n *\n * Provides functions for checking suite status, filtering suites,\n * and formatting status information.\n *\n * @packageDocumentation\n */\n\nimport type { Config, VerificationStatus, Attestation, AttestationsFile } from '@attest-it/core'\nimport { computeFingerprint, readAttestations, findAttestation } from '@attest-it/core'\n\n/**\n * Information about a suite's current status.\n * @public\n */\nexport interface SuiteStatus {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason for the status */\n reason: string\n /** Current fingerprint of source files */\n currentFingerprint: string\n /** Fingerprint from existing attestation (if any) */\n attestedFingerprint?: string | undefined\n /** ISO timestamp of attestation (if any) */\n attestedAt?: string | undefined\n /** Days since attestation (if any) */\n age?: number | undefined\n}\n\n/**\n * Determine the verification status for a suite.\n *\n * @param attestation - Existing attestation, if any\n * @param currentFingerprint - Current computed fingerprint\n * @param maxAgeDays - Maximum allowed age in days\n * @returns Verification status\n * @internal\n */\nfunction determineStatus(\n attestation: Attestation | null | undefined,\n currentFingerprint: string,\n maxAgeDays: number,\n): VerificationStatus {\n if (!attestation) {\n return 'NEEDS_ATTESTATION'\n }\n\n if (attestation.fingerprint !== currentFingerprint) {\n return 'FINGERPRINT_CHANGED'\n }\n\n const attestedAt = new Date(attestation.attestedAt)\n const ageInDays = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n\n if (ageInDays > maxAgeDays) {\n return 'EXPIRED'\n }\n\n return 'VALID'\n}\n\n/**\n * Get status information for all suites.\n *\n * @param config - Configuration object\n * @returns Array of suite statuses\n * @public\n */\nexport async function getAllSuiteStatuses(config: Config): Promise<SuiteStatus[]> {\n // Load attestations (may not exist)\n let attestationsFile: AttestationsFile | null = null\n try {\n attestationsFile = await readAttestations(config.settings.attestationsPath)\n } catch (err) {\n // Attestations file may not exist yet - that's okay\n if (err instanceof Error && !err.message.includes('ENOENT')) {\n throw err\n }\n }\n const attestations = attestationsFile?.attestations ?? []\n\n const results: SuiteStatus[] = []\n\n for (const [suiteName, suiteConfig] of Object.entries(config.suites)) {\n // Skip suites without packages\n if (!suiteConfig.packages) {\n continue\n }\n\n // Compute current fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Find existing attestation\n const attestation = findAttestation(\n { schemaVersion: '1', attestations, signature: '' },\n suiteName,\n )\n\n // Determine status\n const status = determineStatus(\n attestation,\n fingerprintResult.fingerprint,\n config.settings.maxAgeDays,\n )\n\n // Calculate age\n let age: number | undefined\n if (attestation) {\n const attestedAt = new Date(attestation.attestedAt)\n age = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n }\n\n results.push({\n name: suiteName,\n status,\n reason: formatStatusReason(status, age, config.settings.maxAgeDays),\n currentFingerprint: fingerprintResult.fingerprint,\n attestedFingerprint: attestation?.fingerprint,\n attestedAt: attestation?.attestedAt,\n age,\n })\n }\n\n return results\n}\n\n/**\n * Get suites that need attestation (not VALID).\n *\n * @param config - Configuration object\n * @returns Array of suite statuses that are not valid\n * @public\n */\nexport async function getSuitesNeedingAttestation(config: Config): Promise<SuiteStatus[]> {\n const allStatuses = await getAllSuiteStatuses(config)\n return allStatuses.filter((s) => s.status !== 'VALID')\n}\n\n/**\n * Filter suites by a glob/regex pattern.\n * Matches against suite name.\n *\n * @param suites - Array of suite statuses to filter\n * @param pattern - Pattern to match (supports * wildcard)\n * @returns Filtered array of suite statuses\n * @public\n */\nexport function filterByPattern(suites: SuiteStatus[], pattern: string): SuiteStatus[] {\n // Support simple glob patterns: * matches anything\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$', 'i')\n return suites.filter((s) => regex.test(s.name))\n}\n\n/**\n * Get suites belonging to a group.\n *\n * @param groupName - Name of the group\n * @param config - Configuration object\n * @returns Array of suite names in the group\n * @public\n */\nexport function getSuitesInGroup(groupName: string, config: Config): string[] {\n // eslint-disable-next-line security/detect-object-injection -- groupName is a user parameter, but we safely return empty array if not found\n return config.groups?.[groupName] ?? []\n}\n\n/**\n * Format a human-readable reason for a suite's status.\n *\n * @param status - Verification status\n * @param age - Age in days (if available)\n * @param maxAgeDays - Maximum allowed age in days (if available)\n * @returns Human-readable status reason\n * @public\n */\nexport function formatStatusReason(\n status: VerificationStatus,\n age?: number,\n maxAgeDays?: number,\n): string {\n switch (status) {\n case 'VALID':\n return `Attested ${String(age ?? 0)} days ago`\n case 'NEEDS_ATTESTATION':\n return 'No attestation found'\n case 'FINGERPRINT_CHANGED':\n return 'Source files modified'\n case 'EXPIRED':\n return `${String(age ?? 0)} days old (max: ${String(maxAgeDays ?? 30)})`\n case 'SIGNATURE_INVALID':\n return 'Signature verification failed'\n case 'INVALIDATED_BY_PARENT':\n return 'Invalidated by parent suite'\n default:\n return status\n }\n}\n","import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\n\n/**\n * Session state for interrupted run recovery.\n */\nexport interface Session {\n /** ISO timestamp when session started */\n started: string\n /** Suites selected by user for this session */\n selected: string[]\n /** Suites that completed successfully */\n completed: string[]\n /** Suites that failed */\n failed: string[]\n /** Suites not yet run (selected - completed - failed) */\n remaining: string[]\n}\n\n/**\n * Get the path to the session file.\n * Returns `.attest-it/session.json` relative to current working directory.\n */\nexport function getSessionPath(): string {\n return join(process.cwd(), '.attest-it', 'session.json')\n}\n\n/**\n * Load an existing session from disk.\n * Returns null if no session exists or session is invalid.\n */\nexport async function loadSession(): Promise<Session | null> {\n try {\n const content = await readFile(getSessionPath(), 'utf-8')\n const data: unknown = JSON.parse(content)\n\n // Validate session structure\n if (!isValidSession(data)) {\n return null\n }\n\n return data\n } catch {\n // File doesn't exist or is unreadable\n return null\n }\n}\n\n/**\n * Save session state to disk.\n * Creates .attest-it directory if it doesn't exist.\n */\nexport async function saveSession(session: Session): Promise<void> {\n const sessionPath = getSessionPath()\n const dir = dirname(sessionPath)\n\n // Create directory if it doesn't exist\n await mkdir(dir, { recursive: true })\n\n // Write session file\n await writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8')\n}\n\n/**\n * Delete the session file.\n * Call this when a session completes successfully.\n */\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(getSessionPath())\n } catch {\n // File doesn't exist - that's fine\n }\n}\n\n/**\n * Create a new session with the given selected suites.\n */\nexport function createSession(selected: string[]): Session {\n return {\n started: new Date().toISOString(),\n selected: [...selected],\n completed: [],\n failed: [],\n remaining: [...selected],\n }\n}\n\n/**\n * Update session after a suite completes.\n */\nexport function updateSessionAfterSuite(\n session: Session,\n suite: string,\n success: boolean,\n): Session {\n const remaining = session.remaining.filter((s) => s !== suite)\n return {\n ...session,\n completed: success ? [...session.completed, suite] : session.completed,\n failed: success ? session.failed : [...session.failed, suite],\n remaining,\n }\n}\n\n/**\n * Type guard to validate session structure.\n */\nfunction isValidSession(data: unknown): data is Session {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n // We need to access properties of unknown object, so we check each property\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj = data as Record<string, unknown>\n\n return (\n typeof obj.started === 'string' &&\n Array.isArray(obj.selected) &&\n obj.selected.every((item) => typeof item === 'string') &&\n Array.isArray(obj.completed) &&\n obj.completed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.failed) &&\n obj.failed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.remaining) &&\n obj.remaining.every((item) => typeof item === 'string')\n )\n}\n","/**\n * Entry point for interactive run mode.\n *\n * This module bridges the Commander.js CLI and the React-based interactive UI.\n * It handles:\n * - Loading configuration and suite statuses\n * - Checking for session resumption (--continue)\n * - Dry run mode (just show what would run)\n * - Rendering the InteractiveRun component with ink\n * - Providing test execution and attestation creation callbacks\n *\n * @packageDocumentation\n */\n\nimport * as React from 'react'\nimport { render } from 'ink'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n computeFingerprint,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n type Config,\n type KeyProvider,\n} from '@attest-it/core'\nimport { InteractiveRun } from '../components/InteractiveRun.js'\nimport { getAllSuiteStatuses, type SuiteStatus } from './run-utils.js'\nimport { loadSession, saveSession as persistSession, clearSession } from '../session/session.js'\nimport { error, log } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/**\n * Options for interactive mode.\n * @public\n */\nexport interface InteractiveOptions {\n /** Show what would run without executing */\n dryRun?: boolean | undefined\n /** Resume from saved session */\n continue?: boolean | undefined\n /** Filter pattern for suite names */\n filter?: string | undefined\n}\n\n/**\n * Run the interactive mode UI.\n *\n * @param options - Interactive mode options\n * @public\n */\nexport async function runInteractive(options: InteractiveOptions): Promise<void> {\n // Load config\n const config = await loadConfig()\n\n // Get all suite statuses\n const allSuites = await getAllSuiteStatuses(config)\n\n // Check if resuming from session\n let preSelected: string[] | undefined\n if (options.continue) {\n const session = await loadSession()\n if (session && session.remaining.length > 0) {\n preSelected = session.remaining\n log(`Resuming session with ${String(preSelected.length)} remaining suite(s)`)\n }\n }\n\n // Dry run mode - just show what would run\n if (options.dryRun) {\n handleDryRun(allSuites, config, options.filter)\n return\n }\n\n // Check for pending suites\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Create test executor\n const executeTest = createTestExecutor(config)\n\n // Create attestation creator\n const createAttestationFn = createAttestationCreator(config)\n\n // Create session saver\n const saveSessionFn = createSessionSaver()\n\n // Render the interactive UI\n const interactiveRunProps = {\n allSuites,\n config,\n executeTest,\n createAttestation: createAttestationFn,\n saveSession: saveSessionFn,\n ...(preSelected !== undefined && { preSelected }),\n }\n\n const { waitUntilExit } = render(<InteractiveRun {...interactiveRunProps} />)\n\n // Wait for UI to exit\n await waitUntilExit()\n}\n\n/**\n * Handle dry run mode.\n * Shows what would run without actually executing.\n *\n * @param allSuites - All suite statuses\n * @param config - Configuration object\n * @param filterPattern - Optional filter pattern\n * @internal\n */\nfunction handleDryRun(allSuites: SuiteStatus[], config: Config, filterPattern?: string): void {\n let pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (filterPattern) {\n const regex = new RegExp('^' + filterPattern.replace(/\\*/g, '.*') + '$', 'i')\n pendingSuites = pendingSuites.filter((s) => regex.test(s.name))\n }\n\n if (pendingSuites.length === 0) {\n log('No suites would run (all valid or filtered out).')\n process.exit(ExitCode.NO_WORK)\n }\n\n log(`Would run ${String(pendingSuites.length)} suite(s):`)\n pendingSuites.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n log('')\n log('Use `attest-it run` to execute.')\n process.exit(ExitCode.SUCCESS)\n}\n\n/**\n * Create a test executor function for a suite.\n *\n * @param config - Configuration object\n * @returns Function that executes a suite's test command\n * @internal\n */\nfunction createTestExecutor(config: Config): (suite: string) => Promise<boolean> {\n return async (suiteName: string): Promise<boolean> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n return false\n }\n\n // Build command\n let command = suiteConfig.command ?? config.settings.defaultCommand\n if (!command) {\n error(`No command specified for suite \"${suiteName}\"`)\n return false\n }\n\n // Substitute ${files} if present\n if (command.includes('${files}') && suiteConfig.files) {\n command = command.replaceAll('${files}', suiteConfig.files.join(' '))\n }\n\n log(`Running: ${command}`)\n\n // Execute command\n const exitCode = await executeCommand(command)\n return exitCode === 0\n }\n}\n\n/**\n * Create an attestation creator function.\n *\n * @param config - Configuration object\n * @returns Function that creates and saves an attestation for a suite\n * @internal\n */\nfunction createAttestationCreator(config: Config): (suite: string) => Promise<void> {\n return async (suiteName: string): Promise<void> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n throw new Error(`Suite \"${suiteName}\" not found`)\n }\n\n if (!suiteConfig.packages) {\n throw new Error(`Suite \"${suiteName}\" has no packages defined`)\n }\n\n // Compute fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command: suiteConfig.command ?? config.settings.defaultCommand ?? '',\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath).catch(() => null)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n const providerName = keyProvider.displayName\n const keygenMessage =\n keyProvider.type === 'filesystem'\n ? 'Run \"attest-it keygen\" first to generate a keypair.'\n : 'Run \"attest-it keygen\" to generate and store a key.'\n throw new Error(`Private key not found in ${providerName}. ${keygenMessage}`)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n log(`✓ Attestation created for ${suiteName}`)\n }\n}\n\n/**\n * Create session saver function.\n *\n * @returns Function that saves or clears session state\n * @internal\n */\nfunction createSessionSaver(): (\n completed: string[],\n failed: string[],\n remaining: string[],\n) => Promise<void> {\n return async (completed: string[], failed: string[], remaining: string[]): Promise<void> => {\n if (completed.length === 0 && failed.length === 0 && remaining.length === 0) {\n // All done - clear session\n await clearSession()\n } else {\n // Save session for --continue\n await persistSession({\n started: new Date().toISOString(),\n selected: [...completed, ...failed, ...remaining],\n completed,\n failed,\n remaining,\n })\n }\n }\n}\n\n/**\n * Execute a shell command and return exit code.\n *\n * @param command - Shell command to execute\n * @returns Promise resolving to exit code\n * @internal\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n const parsed = parseShellCommand(command)\n const stringArgs = parsed.filter((t): t is string => typeof t === 'string')\n\n if (stringArgs.length === 0) {\n error('Empty command')\n resolve(1)\n return\n }\n\n const [executable, ...args] = stringArgs\n if (!executable) {\n resolve(1)\n return\n }\n\n const child = spawn(executable, args, { stdio: 'inherit' })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n child.on('error', (err) => {\n error(`Command failed: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check for uncommitted changes in the working tree.\n *\n * @returns Promise resolving to true if there are uncommitted changes\n * @internal\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n resolve(output.trim().length > 0)\n })\n child.on('error', () => {\n resolve(false)\n })\n })\n}\n","/**\n * Run command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprint,\n computeFingerprintSync,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n loadLocalConfigSync,\n getActiveIdentity,\n isAuthorizedSigner,\n createSeal,\n readSealsSync,\n writeSealsSync,\n type Config,\n type KeyProvider,\n type Identity,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runInteractive } from './run-interactive.js'\nimport { getAllSuiteStatuses } from './run-utils.js'\n\nexport const runCommand = new Command('run')\n .description('Execute tests and create attestation')\n .option('-s, --suite <name>', 'Run specific suite (required unless --all or interactive mode)')\n .option('-a, --all', 'Run all suites needing attestation')\n .option('--no-attest', 'Run tests without creating attestation')\n .option('--dry-run', 'Show what would run without executing')\n .option('-c, --continue', 'Resume interrupted session')\n .option('--filter <pattern>', 'Filter suites by pattern (glob-style)')\n .action(async (options: RunOptions) => {\n await runTests(options)\n })\n\ninterface RunOptions {\n suite?: string\n all?: boolean\n attest?: boolean // Note: --no-attest sets this to false\n dryRun?: boolean\n continue?: boolean\n filter?: string\n}\n\n/**\n * Run tests and create attestations.\n *\n * Routes to the appropriate execution mode based on options:\n * - Direct mode: --suite specified\n * - All pending mode: --all specified\n * - Interactive mode: no --suite and no --all\n *\n * @param options - Command options\n * @param options.suite - Run specific suite\n * @param options.all - Run all suites needing attestation\n * @param options.attest - Create attestation after tests (default: true)\n * @param options.dryRun - Show what would run without executing\n * @param options.continue - Resume interrupted session\n * @param options.filter - Filter suites by pattern\n * @public\n */\nasync function runTests(options: RunOptions): Promise<void> {\n try {\n // If --suite provided, use existing direct mode\n if (options.suite) {\n await runDirectMode(options)\n return\n }\n\n // If --all with no --suite, run all pending non-interactively\n if (options.all) {\n await runAllPending(options)\n return\n }\n\n // No --suite and no --all means interactive mode\n // This includes: no args, --dry-run, --continue, --filter\n await runInteractive({\n dryRun: options.dryRun,\n continue: options.continue,\n filter: options.filter,\n })\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Build the test command to execute.\n *\n * Uses suite-specific command if provided, otherwise falls back to\n * default command from settings. Substitutes ${files} placeholder\n * with suite file patterns.\n *\n * @param config - Configuration object\n * @param suiteCommand - Suite-specific command (optional)\n * @param suiteFiles - File patterns for suite (optional)\n * @returns Constructed command string\n * @public\n */\nfunction buildCommand(config: Config, suiteCommand?: string, suiteFiles?: string[]): string {\n // Use suite command if specified, otherwise default\n let command = suiteCommand ?? config.settings.defaultCommand\n\n if (!command) {\n error('No command specified for suite and no defaultCommand in settings')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Substitute ${files} if present (replace all occurrences)\n if (command.includes('${files}') && suiteFiles) {\n const files = suiteFiles.join(' ')\n command = command.replaceAll('${files}', files)\n }\n\n return command\n}\n\n/**\n * Parsed command result.\n */\ninterface ParsedCommand {\n executable: string\n args: string[]\n}\n\n/**\n * Parse a command string into executable and arguments.\n *\n * Uses shell-quote to safely parse shell syntax without using shell: true.\n *\n * @param command - Command string to parse\n * @returns Parsed command with executable and arguments\n * @throws Error if command is empty or contains only control operators\n * @public\n */\nfunction parseCommand(command: string): ParsedCommand {\n const parsed = parseShellCommand(command)\n\n // shell-quote returns an array of strings and special control operators\n // We only want the string arguments\n const stringArgs = parsed.filter((token): token is string => {\n return typeof token === 'string'\n })\n\n if (stringArgs.length === 0) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n const [executable, ...args] = stringArgs\n // TypeScript doesn't know that stringArgs.length > 0 guarantees executable is defined\n // The check above ensures stringArgs[0] exists, but we assert it for type safety\n if (executable === undefined) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n return { executable, args }\n}\n\n/**\n * Execute a command and return its exit code.\n *\n * Spawns a child process and streams output to the terminal.\n *\n * @param command - Command string to execute\n * @returns Exit code from the command (0 for success)\n * @public\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n let parsed: ParsedCommand\n try {\n parsed = parseCommand(command)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to parse command: ${err.message}`)\n } else {\n error('Failed to parse command: Unknown error')\n }\n resolve(1)\n return\n }\n\n const child = spawn(parsed.executable, parsed.args, {\n stdio: 'inherit', // Stream output to terminal\n })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n\n child.on('error', (err) => {\n error(`Failed to execute command: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n *\n * @returns True if there are uncommitted changes, false otherwise\n * @public\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n // If output is non-empty, there are uncommitted changes\n resolve(output.trim().length > 0)\n })\n\n child.on('error', () => {\n // If git not available, assume not dirty\n resolve(false)\n })\n })\n}\n\n/**\n * Run tests for a specific suite (direct mode with --suite).\n *\n * @param options - Run options with suite specified\n * @public\n */\nasync function runDirectMode(options: RunOptions): Promise<void> {\n if (!options.suite) {\n error('Suite name is required for direct mode')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load config\n const config = await loadConfig()\n\n // Validate suite exists\n if (!config.suites[options.suite]) {\n error(`Suite \"${options.suite}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run the suite\n await runSingleSuite(options.suite, config, options)\n\n log('')\n success('Suite completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run all suites that need attestation (--all mode).\n *\n * @param options - Run options\n * @public\n */\nasync function runAllPending(options: RunOptions): Promise<void> {\n const config = await loadConfig()\n const allSuites = await getAllSuiteStatuses(config)\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Apply filter if specified\n let suitesToRun = pendingSuites\n if (options.filter) {\n const regex = new RegExp('^' + options.filter.replace(/\\*/g, '.*') + '$', 'i')\n suitesToRun = pendingSuites.filter((s) => regex.test(s.name))\n\n if (suitesToRun.length === 0) {\n log(`No suites match filter: ${options.filter}`)\n process.exit(ExitCode.NO_WORK)\n }\n }\n\n // Dry run - just show and exit\n if (options.dryRun) {\n log(`Would run ${String(suitesToRun.length)} suite(s):`)\n suitesToRun.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n process.exit(ExitCode.SUCCESS)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run each suite using existing direct mode logic\n for (const suite of suitesToRun) {\n await runSingleSuite(suite.name, config, options)\n }\n\n log('')\n success('All suites completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run a single suite's tests and optionally create an attestation.\n *\n * @param suiteName - Name of the suite to run\n * @param config - Configuration object\n * @param options - Run options\n * @public\n */\nasync function runSingleSuite(\n suiteName: string,\n config: Config,\n options: RunOptions,\n): Promise<void> {\n // eslint-disable-next-line security/detect-object-injection -- suiteName is from validated config keys\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n if (!suiteConfig.packages) {\n error(`Suite \"${suiteName}\" has no packages defined`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log(`\\n=== Running suite: ${suiteName} ===\\n`)\n\n // Compute fingerprint before running\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const fingerprintResult = await computeFingerprint(fingerprintOptions)\n verbose(`Fingerprint: ${fingerprintResult.fingerprint}`)\n verbose(`Files: ${String(fingerprintResult.fileCount)}`)\n\n // Build the test command\n const command = buildCommand(config, suiteConfig.command, suiteConfig.files)\n log(`Running: ${command}`)\n log('')\n\n // Execute tests\n const exitCode = await executeCommand(command)\n\n if (exitCode !== 0) {\n error(`Tests failed with exit code ${String(exitCode)}`)\n process.exit(ExitCode.FAILURE)\n }\n\n success('Tests passed!')\n\n // Skip attestation if --no-attest\n if (options.attest === false) {\n log('Skipping attestation (--no-attest)')\n return\n }\n\n // Confirm attestation\n const shouldAttest = await confirmAction({\n message: 'Create attestation',\n default: false,\n })\n\n if (!shouldAttest) {\n warn('Attestation cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command,\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n error(`Private key not found in ${keyProvider.displayName}`)\n if (keyProvider.type === 'filesystem') {\n error('Run \"attest-it keygen\" first to generate a keypair.')\n } else {\n error('Run \"attest-it keygen\" to generate and store a key.')\n }\n process.exit(ExitCode.MISSING_KEY)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n success(`Attestation created for ${suiteName}`)\n log(` Fingerprint: ${fingerprintResult.fingerprint}`)\n log(` Attested by: ${attestation.attestedBy}`)\n log(` Attested at: ${attestation.attestedAt}`)\n\n // Check if this suite has a linked gate, and if so, prompt for seal\n if (suiteConfig.gate) {\n await promptForSeal(suiteName, suiteConfig.gate, config)\n }\n}\n\n/**\n * Prompt for seal creation after successful suite execution.\n *\n * @param suiteName - Name of the suite that was executed\n * @param gateId - ID of the gate linked to the suite\n * @param config - Configuration object\n */\nasync function promptForSeal(suiteName: string, gateId: string, config: Config): Promise<void> {\n log('')\n log(`Suite '${suiteName}' is linked to gate '${gateId}'`)\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n warn('No local identity configuration found - cannot create seal')\n warn('Run \"attest-it keygen\" to set up your identity')\n return\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n warn(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n return\n }\n\n // Convert to AttestItConfig\n const attestItConfig = toAttestItConfig(config)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(attestItConfig, gateId, identity.publicKey)\n if (!authorized) {\n warn(`You are not authorized to seal gate '${gateId}'`)\n return\n }\n\n // Prompt for seal confirmation\n const shouldSeal = await confirmAction({\n message: `Create seal for gate '${gateId}'`,\n default: true,\n })\n\n if (!shouldSeal) {\n log('Seal creation skipped')\n return\n }\n\n try {\n // Get gate config\n if (!attestItConfig.gates?.[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n return\n }\n\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n\n // Compute fingerprint for the gate\n const gateFingerprint = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n const keyRef = getKeyRefFromIdentity(identity)\n\n // Get private key from provider\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal\n const seal = createSeal({\n gateId,\n fingerprint: gateFingerprint.fingerprint,\n sealedBy: identity.name,\n privateKey: privateKeyPem,\n })\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n // Write seals file\n writeSealsSync(projectRoot, sealsFile)\n\n success(`Seal created for gate '${gateId}'`)\n log(` Sealed by: ${identity.name}`)\n log(` Timestamp: ${seal.timestamp}`)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to create seal: ${err.message}`)\n } else {\n error('Failed to create seal: Unknown error')\n }\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n service: privateKey.service,\n account: privateKey.account,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n return `${privateKey.service}:${privateKey.account}`\n case '1password':\n return privateKey.item\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n// Export for testing\nexport { buildCommand, parseCommand, executeCommand, checkDirtyWorkingTree }\n","/**\n * Interactive keygen UI component using Ink.\n *\n * @remarks\n * This module provides an interactive CLI interface for generating keypairs\n * with the option to store private keys in either the filesystem or 1Password.\n *\n * @packageDocumentation\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { render, Box, Text } from 'ink'\nimport { Select, TextInput, Spinner } from '@inkjs/ui'\nimport {\n OnePasswordKeyProvider,\n FilesystemKeyProvider,\n MacOSKeychainKeyProvider,\n getDefaultPrivateKeyPath,\n getDefaultPublicKeyPath,\n type OnePasswordAccount,\n type OnePasswordVault,\n} from '@attest-it/core'\n\n/**\n * Result of the interactive keygen flow.\n * @public\n */\nexport interface KeygenResult {\n /** Provider type used */\n provider: 'filesystem' | '1password' | 'macos-keychain'\n /** Path to the public key file */\n publicKeyPath: string\n /** Reference to the private key (path or 1Password item name) */\n privateKeyRef: string\n /** Human-readable description of storage location */\n storageDescription: string\n /** For 1Password: account email */\n account?: string\n /** For 1Password: vault name */\n vault?: string\n /** For 1Password/macOS Keychain: item name */\n itemName?: string\n}\n\n/**\n * Props for the KeygenInteractive component.\n * @public\n */\nexport interface KeygenInteractiveProps {\n /** Public key path (optional, defaults to OS-specific path) */\n publicKeyPath?: string\n /** Overwrite existing keys without prompting */\n force?: boolean\n /** Callback when keygen completes successfully */\n onComplete: (result: KeygenResult) => void\n /** Callback when user cancels */\n onCancel: () => void\n /** Callback when an error occurs */\n onError: (error: Error) => void\n}\n\n/**\n * Step in the interactive keygen flow.\n * @internal\n */\ntype Step =\n | 'checking-providers'\n | 'select-provider'\n | 'select-account'\n | 'select-vault'\n | 'enter-item-name'\n | 'enter-keychain-item-name'\n | 'generating'\n | 'done'\n\n/**\n * Interactive keygen component.\n *\n * @remarks\n * This component walks the user through selecting a key storage provider\n * and configuring it, then generates the keypair.\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function KeygenInteractive(props: KeygenInteractiveProps): React.ReactElement {\n const { onComplete, onError } = props\n\n // State management\n const [step, setStep] = useState<Step>('checking-providers')\n const [opAvailable, setOpAvailable] = useState(false)\n const [keychainAvailable, setKeychainAvailable] = useState(false)\n const [accounts, setAccounts] = useState<OnePasswordAccount[]>([])\n const [vaults, setVaults] = useState<OnePasswordVault[]>([])\n const [_selectedProvider, setSelectedProvider] = useState<\n 'filesystem' | '1password' | 'macos-keychain' | undefined\n >()\n const [selectedAccount, setSelectedAccount] = useState<string | undefined>()\n const [selectedVault, setSelectedVault] = useState<string | undefined>()\n const [itemName, setItemName] = useState('attest-it-private-key')\n const [keychainItemName, setKeychainItemName] = useState('attest-it-private-key')\n\n // Check provider availability on mount\n useEffect(() => {\n const checkProviders = async (): Promise<void> => {\n // Check 1Password\n try {\n const isInstalled = await OnePasswordKeyProvider.isInstalled()\n setOpAvailable(isInstalled)\n\n if (isInstalled) {\n const accountList = await OnePasswordKeyProvider.listAccounts()\n setAccounts(accountList)\n }\n } catch {\n // 1Password not available\n setOpAvailable(false)\n }\n\n // Check macOS Keychain (synchronous check)\n const isKeychainAvailable = MacOSKeychainKeyProvider.isAvailable()\n setKeychainAvailable(isKeychainAvailable)\n\n setStep('select-provider')\n }\n\n void checkProviders()\n }, [])\n\n // Fetch vaults when account is selected\n useEffect(() => {\n if (step === 'select-vault' && selectedAccount) {\n const fetchVaults = async (): Promise<void> => {\n try {\n const vaultList = await OnePasswordKeyProvider.listVaults(selectedAccount)\n setVaults(vaultList)\n } catch (err) {\n onError(err instanceof Error ? err : new Error('Failed to fetch vaults'))\n }\n }\n\n void fetchVaults()\n }\n }, [step, selectedAccount, onError])\n\n // Handle provider selection\n const handleProviderSelect = (value: string): void => {\n if (value === 'filesystem') {\n setSelectedProvider('filesystem')\n // Skip to generation for filesystem\n void generateKeys('filesystem')\n } else if (value === '1password') {\n setSelectedProvider('1password')\n // Move to account selection (or skip if only one)\n if (accounts.length === 1 && accounts[0]) {\n setSelectedAccount(accounts[0].email)\n setStep('select-vault')\n } else {\n setStep('select-account')\n }\n } else if (value === 'macos-keychain') {\n setSelectedProvider('macos-keychain')\n // Move to item name entry for keychain\n setStep('enter-keychain-item-name')\n }\n }\n\n // Handle account selection\n const handleAccountSelect = (value: string): void => {\n setSelectedAccount(value)\n setStep('select-vault')\n }\n\n // Handle vault selection\n const handleVaultSelect = (value: string): void => {\n setSelectedVault(value)\n setStep('enter-item-name')\n }\n\n // Handle item name submission (1Password)\n const handleItemNameSubmit = (value: string): void => {\n setItemName(value)\n void generateKeys('1password')\n }\n\n // Handle keychain item name submission\n const handleKeychainItemNameSubmit = (value: string): void => {\n setKeychainItemName(value)\n void generateKeys('macos-keychain')\n }\n\n // Generate the keypair\n const generateKeys = async (\n provider: 'filesystem' | '1password' | 'macos-keychain',\n ): Promise<void> => {\n setStep('generating')\n\n try {\n const publicKeyPath = props.publicKeyPath ?? getDefaultPublicKeyPath()\n\n if (provider === 'filesystem') {\n const fsProvider = new FilesystemKeyProvider()\n\n // Build options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await fsProvider.generateKeyPair(genOptions)\n\n onComplete({\n provider: 'filesystem',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n })\n } else if (provider === '1password') {\n // 1Password provider\n if (!selectedVault || !itemName) {\n throw new Error('Vault and item name are required for 1Password')\n }\n\n // Build provider options, only including account if defined\n const providerOptions: { vault: string; itemName: string; account?: string } = {\n vault: selectedVault,\n itemName,\n }\n if (selectedAccount !== undefined) {\n providerOptions.account = selectedAccount\n }\n\n const opProvider = new OnePasswordKeyProvider(providerOptions)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await opProvider.generateKeyPair(genOptions)\n\n // Build completion result, only including account if defined\n const completionResult: KeygenResult = {\n provider: '1password',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n vault: selectedVault,\n itemName,\n }\n if (selectedAccount !== undefined) {\n completionResult.account = selectedAccount\n }\n\n onComplete(completionResult)\n } else {\n // macOS Keychain provider (provider === 'macos-keychain')\n if (!keychainItemName) {\n throw new Error('Item name is required for macOS Keychain')\n }\n\n const keychainProvider = new MacOSKeychainKeyProvider({\n itemName: keychainItemName,\n })\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await keychainProvider.generateKeyPair(genOptions)\n\n onComplete({\n provider: 'macos-keychain',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n itemName: keychainItemName,\n })\n }\n\n setStep('done')\n } catch (err) {\n onError(err instanceof Error ? err : new Error('Key generation failed'))\n }\n }\n\n // Render different steps\n if (step === 'checking-providers') {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Checking available key storage providers...</Text>\n </Box>\n </Box>\n )\n }\n\n if (step === 'select-provider') {\n const options = [\n {\n label: `Local Filesystem (${getDefaultPrivateKeyPath()})`,\n value: 'filesystem',\n },\n ]\n\n if (keychainAvailable) {\n options.push({\n label: 'macOS Keychain',\n value: 'macos-keychain',\n })\n }\n\n if (opAvailable) {\n options.push({\n label: '1Password (requires op CLI)',\n value: '1password',\n })\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Where would you like to store your private key?</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleProviderSelect} />\n </Box>\n )\n }\n\n if (step === 'select-account') {\n const options = accounts.map((account) => ({\n label: account.email,\n value: account.email,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Select 1Password account:</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleAccountSelect} />\n </Box>\n )\n }\n\n if (step === 'select-vault') {\n if (vaults.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Loading vaults...</Text>\n </Box>\n </Box>\n )\n }\n\n const options = vaults.map((vault) => ({\n label: vault.name,\n value: vault.name,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Select vault for private key storage:</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleVaultSelect} />\n </Box>\n )\n }\n\n if (step === 'enter-item-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Enter name for the key item:</Text>\n <Text dimColor>(This will be visible in your 1Password vault)</Text>\n <Text dimColor>{''}</Text>\n <TextInput defaultValue={itemName} onSubmit={handleItemNameSubmit} />\n </Box>\n )\n }\n\n if (step === 'enter-keychain-item-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Enter name for the keychain item:</Text>\n <Text dimColor>(This will be the service name in your macOS Keychain)</Text>\n <Text dimColor>{''}</Text>\n <TextInput defaultValue={keychainItemName} onSubmit={handleKeychainItemNameSubmit} />\n </Box>\n )\n }\n\n if (step === 'generating') {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Generating RSA-2048 keypair...</Text>\n </Box>\n </Box>\n )\n }\n\n // Done state (component will be unmounted by parent)\n return <Box />\n}\n\n/**\n * Run the interactive keygen flow.\n *\n * @remarks\n * This function renders the KeygenInteractive component and returns a promise\n * that resolves with the keygen result or rejects if cancelled/errored.\n *\n * @param options - Keygen options\n * @returns Promise that resolves with keygen result\n * @public\n */\nexport async function runKeygenInteractive(options: {\n publicKeyPath?: string\n force?: boolean\n}): Promise<KeygenResult> {\n return new Promise((resolve, reject) => {\n // Build props, only including optional properties if defined\n const props: KeygenInteractiveProps = {\n onComplete: (result) => {\n unmount()\n resolve(result)\n },\n onCancel: () => {\n unmount()\n reject(new Error('Keygen cancelled'))\n },\n onError: (error) => {\n unmount()\n reject(error)\n },\n }\n\n if (options.publicKeyPath !== undefined) {\n props.publicKeyPath = options.publicKeyPath\n }\n if (options.force !== undefined) {\n props.force = options.force\n }\n\n const { unmount } = render(<KeygenInteractive {...props} />)\n })\n}\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n checkOpenSSL,\n generateKeyPair,\n getDefaultPrivateKeyPath,\n getDefaultPublicKeyPath,\n setKeyPermissions,\n OnePasswordKeyProvider,\n MacOSKeychainKeyProvider,\n} from '@attest-it/core'\nimport { log, success, error, warn, info } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runKeygenInteractive } from './keygen-interactive.js'\n\nexport const keygenCommand = new Command('keygen')\n .description('Generate a new RSA keypair for signing attestations')\n .option('-o, --output <path>', 'Public key output path')\n .option('-p, --private <path>', 'Private key output path (filesystem only)')\n .option(\n '--provider <type>',\n 'Key provider: filesystem, 1password, or macos-keychain (skips interactive)',\n )\n .option('--vault <name>', '1Password vault name')\n .option('--item-name <name>', '1Password/macOS Keychain item name')\n .option('--account <email>', '1Password account')\n .option('-f, --force', 'Overwrite existing keys')\n .option('--no-interactive', 'Disable interactive mode')\n .action(async (options: KeygenOptions) => {\n await runKeygen(options)\n })\n\ninterface KeygenOptions {\n output?: string\n private?: string\n provider?: string\n vault?: string\n itemName?: string\n account?: string\n force?: boolean\n interactive?: boolean\n}\n\n/**\n * Run the keygen command to generate a new cryptographic keypair.\n *\n * Generates an RSA-2048 keypair with SHA-256 signatures, which is universally\n * supported across all OpenSSL and LibreSSL versions.\n *\n * @param options - Command options\n * @param options.output - Public key output path\n * @param options.private - Private key output path (filesystem only)\n * @param options.provider - Key provider type (skips interactive)\n * @param options.vault - 1Password vault name\n * @param options.itemName - 1Password item name\n * @param options.account - 1Password account email\n * @param options.force - Overwrite existing keys without prompting\n * @param options.interactive - Enable interactive mode (default: true)\n * @public\n */\nasync function runKeygen(options: KeygenOptions): Promise<void> {\n try {\n // Use interactive mode if not explicitly disabled and provider not specified\n const useInteractive = options.interactive !== false && !options.provider\n\n if (useInteractive) {\n // Run interactive flow\n // Build options, only including properties if defined\n const interactiveOptions: { publicKeyPath?: string; force?: boolean } = {}\n if (options.output !== undefined) {\n interactiveOptions.publicKeyPath = options.output\n }\n if (options.force !== undefined) {\n interactiveOptions.force = options.force\n }\n\n const result = await runKeygenInteractive(interactiveOptions)\n\n // Show success message with next steps\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n log('')\n\n if (result.provider === '1password') {\n log('Add to your .attest-it/config.yaml:')\n log('')\n log('settings:')\n log(` publicKeyPath: ${result.publicKeyPath}`)\n log(' keyProvider:')\n log(' type: 1password')\n log(' options:')\n if (result.account) {\n log(` account: ${result.account}`)\n }\n log(` vault: ${result.vault ?? ''}`)\n log(` itemName: ${result.itemName ?? ''}`)\n log('')\n } else if (result.provider === 'macos-keychain') {\n log('Add to your .attest-it/config.yaml:')\n log('')\n log('settings:')\n log(` publicKeyPath: ${result.publicKeyPath}`)\n log(' keyProvider:')\n log(' type: macos-keychain')\n log(' options:')\n log(` itemName: ${result.itemName ?? ''}`)\n log('')\n }\n\n log('Next steps:')\n log(` 1. git add ${result.publicKeyPath}`)\n if (result.provider === '1password' || result.provider === 'macos-keychain') {\n log(' 2. Update .attest-it/config.yaml with keyProvider settings')\n } else {\n log(' 2. Update .attest-it/config.yaml publicKeyPath if needed')\n }\n log(' 3. attest-it run --suite <suite-name>')\n } else {\n // Non-interactive mode\n await runNonInteractiveKeygen(options)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Run keygen in non-interactive mode.\n * @internal\n */\nasync function runNonInteractiveKeygen(options: KeygenOptions): Promise<void> {\n // Check OpenSSL\n log('Checking OpenSSL...')\n const version = await checkOpenSSL()\n info(`OpenSSL: ${version}`)\n\n const publicPath = options.output ?? getDefaultPublicKeyPath()\n\n if (options.provider === '1password') {\n // 1Password provider mode\n if (!options.vault || !options.itemName) {\n throw new Error('--vault and --item-name are required for 1password provider')\n }\n\n // Build provider options, only including account if defined\n const providerOptions: { vault: string; itemName: string; account?: string } = {\n vault: options.vault,\n itemName: options.itemName,\n }\n if (options.account !== undefined) {\n providerOptions.account = options.account\n }\n\n const provider = new OnePasswordKeyProvider(providerOptions)\n\n log(`Generating keypair with 1Password storage...`)\n log(`Vault: ${options.vault}`)\n log(`Item: ${options.itemName}`)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath: publicPath }\n if (options.force !== undefined) {\n genOptions.force = options.force\n }\n\n const result = await provider.generateKeyPair(genOptions)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n } else if (options.provider === 'macos-keychain') {\n // macOS Keychain provider mode\n if (!options.itemName) {\n throw new Error('--item-name is required for macos-keychain provider')\n }\n\n // Check if macOS Keychain is available (synchronous check)\n const isAvailable = MacOSKeychainKeyProvider.isAvailable()\n if (!isAvailable) {\n throw new Error('macOS Keychain is not available on this platform')\n }\n\n const provider = new MacOSKeychainKeyProvider({\n itemName: options.itemName,\n })\n\n log(`Generating keypair with macOS Keychain storage...`)\n log(`Item: ${options.itemName}`)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath: publicPath }\n if (options.force !== undefined) {\n genOptions.force = options.force\n }\n\n const result = await provider.generateKeyPair(genOptions)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n } else {\n // Filesystem provider mode (default)\n const privatePath = options.private ?? getDefaultPrivateKeyPath()\n\n log(`Private key: ${privatePath}`)\n log(`Public key: ${publicPath}`)\n\n // Check if keys already exist\n const privateExists = fs.existsSync(privatePath)\n const publicExists = fs.existsSync(publicPath)\n\n if ((privateExists || publicExists) && !options.force) {\n if (privateExists) {\n warn(`Private key already exists: ${privatePath}`)\n }\n if (publicExists) {\n warn(`Public key already exists: ${publicPath}`)\n }\n\n const shouldOverwrite = await confirmAction({\n message: 'Overwrite existing keys?',\n default: false,\n })\n\n if (!shouldOverwrite) {\n error('Keygen cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Generate keypair\n log('\\nGenerating RSA-2048 keypair...')\n\n const result = await generateKeyPair({\n privatePath,\n publicPath,\n force: true,\n })\n\n // Set permissions on private key\n await setKeyPermissions(result.privatePath)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key (KEEP SECRET):')\n log(` ${result.privatePath}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicPath}`)\n }\n\n log('')\n info('Important: Back up your private key securely!')\n log('')\n log('Next steps:')\n log(` 1. git add ${publicPath}`)\n log(' 2. Update .attest-it/config.yaml publicKeyPath if needed')\n log(' 3. attest-it run --suite <suite-name>')\n}\n\nexport { runKeygen }\n","/**\n * Prune command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n loadConfig,\n readAttestations,\n writeSignedAttestations,\n computeFingerprint,\n getDefaultPrivateKeyPath,\n type Attestation,\n} from '@attest-it/core'\nimport { log, success, error, info, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const pruneCommand = new Command('prune')\n .description('Remove stale attestations')\n .option('-n, --dry-run', 'Show what would be removed without removing')\n .option('-k, --keep-days <n>', 'Keep attestations newer than n days', '30')\n .action(async (options: PruneOptions) => {\n await runPrune(options)\n })\n\ninterface PruneOptions {\n dryRun?: boolean\n keepDays: string\n}\n\n/**\n * Run the prune command to remove stale attestations.\n *\n * Removes attestations that are outdated (older than keepDays and\n * fingerprint doesn't match current code) or orphaned (suite no\n * longer exists in config). Re-signs the attestations file.\n *\n * @param options - Command options\n * @param options.dryRun - Show what would be removed without removing\n * @param options.keepDays - Keep attestations newer than n days\n * @public\n */\nasync function runPrune(options: PruneOptions): Promise<void> {\n try {\n const keepDays = parseInt(options.keepDays, 10)\n if (isNaN(keepDays) || keepDays < 1) {\n error('--keep-days must be a positive integer')\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n\n // Load config\n const config = await loadConfig()\n\n // Load attestations\n const attestationsPath = config.settings.attestationsPath\n const file = await readAttestations(attestationsPath)\n\n if (!file || file.attestations.length === 0) {\n info('No attestations to prune')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n const now = Date.now()\n const keepMs = keepDays * 24 * 60 * 60 * 1000\n\n // Identify stale attestations\n const stale: Attestation[] = []\n const keep: Attestation[] = []\n\n for (const attestation of file.attestations) {\n const attestedAt = new Date(attestation.attestedAt).getTime()\n const ageMs = now - attestedAt\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n // Check if suite still exists in config\n const suiteExists = attestation.suite in config.suites\n\n // Check if fingerprint still matches current code\n let fingerprintMatches = false\n if (suiteExists) {\n const suiteConfig = config.suites[attestation.suite]\n if (suiteConfig?.packages) {\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const result = await computeFingerprint(fingerprintOptions)\n fingerprintMatches = result.fingerprint === attestation.fingerprint\n }\n }\n\n // Keep if:\n // 1. Age is within keepDays AND fingerprint matches, OR\n // 2. Fingerprint matches current code (regardless of age)\n const isStale = !fingerprintMatches && ageMs > keepMs\n const orphaned = !suiteExists\n\n if (isStale || orphaned) {\n stale.push(attestation)\n const reason = orphaned\n ? 'suite removed'\n : !fingerprintMatches\n ? 'fingerprint changed'\n : 'expired'\n verbose(`Stale: ${attestation.suite} (${reason}, ${String(ageDays)} days old)`)\n } else {\n keep.push(attestation)\n }\n }\n\n // Report what will be pruned\n if (stale.length === 0) {\n success('No stale attestations found')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n log(`Found ${String(stale.length)} stale attestation(s):`)\n for (const attestation of stale) {\n const ageDays = Math.floor(\n (now - new Date(attestation.attestedAt).getTime()) / (1000 * 60 * 60 * 24),\n )\n log(` - ${attestation.suite} (${String(ageDays)} days old)`)\n }\n\n if (options.dryRun) {\n info('Dry run - no changes made')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n // Check for private key\n const privateKeyPath = getDefaultPrivateKeyPath()\n if (!fs.existsSync(privateKeyPath)) {\n error(`Private key not found: ${privateKeyPath}`)\n error('Cannot re-sign attestations file.')\n process.exit(ExitCode.MISSING_KEY)\n return\n }\n\n // Write updated attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: keep,\n privateKeyPath,\n })\n\n success(`Pruned ${String(stale.length)} stale attestation(s)`)\n log(`Remaining: ${String(keep.length)} attestation(s)`)\n process.exit(ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n}\n\nexport { runPrune }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyAllSeals,\n verifyGateSeal,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n warn,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const verifyCommand = new Command('verify')\n .description('Verify all gate seals (for CI)')\n .argument('[gates...]', 'Verify specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: VerifyOptions) => {\n await runVerify(gates, options)\n })\n\ninterface VerifyOptions {\n json?: boolean\n}\n\n/**\n * Run the verify command to validate gate seals.\n *\n * Verifies signature validity and checks seal status for all gates\n * or specific gates. Intended for CI/CD pipelines.\n *\n * @param gates - Array of gate IDs to verify, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runVerify(gates: string[], options: VerifyOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to verify\n const gatesToVerify = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const results =\n gates.length > 0\n ? gatesToVerify.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayResults(results)\n }\n\n // Determine exit code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER',\n )\n\n const hasStale = results.some((r) => r.state === 'STALE')\n\n if (hasInvalid) {\n process.exit(ExitCode.FAILURE)\n } else if (hasStale) {\n // Stale seals are warnings but not failures\n process.exit(ExitCode.SUCCESS)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display verification results in a formatted table.\n *\n * Shows verification state, seal metadata, and remediation steps.\n *\n * @param results - Verification results from verifyAllSeals or verifyGateSeal\n * @public\n */\nfunction displayResults(results: SealVerificationResult[]): void {\n log('')\n\n // Build table rows\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: formatFingerprint(r),\n age: formatAge(r),\n }))\n\n log(formatTable(tableRows))\n log('')\n\n // Show messages for any gates with issues\n const withIssues = results.filter(\n (r) =>\n r.state !== 'VALID' &&\n r.state !== 'STALE' && // STALE gets its own warning below\n r.message,\n )\n\n if (withIssues.length > 0) {\n for (const result of withIssues) {\n if (result.message) {\n log(`${result.gateId}: ${result.message}`)\n }\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const staleCount = results.filter((r) => r.state === 'STALE').length\n const invalidCount = results.length - validCount - staleCount\n\n if (invalidCount === 0 && staleCount === 0) {\n success('All gate seals valid')\n } else {\n if (invalidCount > 0) {\n error(`${String(invalidCount)} gate(s) have invalid or missing seals`)\n log('Run `attest-it seal` to create seals for these gates')\n }\n if (staleCount > 0) {\n warn(`${String(staleCount)} gate(s) have stale seals (exceeds maxAge)`)\n log('Run `attest-it seal --force <gate>` to update stale seals')\n }\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format fingerprint for display.\n *\n * @param result - Verification result\n * @returns Formatted fingerprint string\n */\nfunction formatFingerprint(result: SealVerificationResult): string {\n if (result.seal?.fingerprint) {\n const fp = result.seal.fingerprint\n if (fp.length > 16) {\n return fp.slice(0, 16) + '...'\n }\n return fp\n }\n return result.state === 'MISSING' ? '(none)' : '-'\n}\n\n/**\n * Format age for display.\n *\n * @param result - Verification result\n * @returns Formatted age string\n */\nfunction formatAge(result: SealVerificationResult): string {\n if (result.seal?.timestamp) {\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n if (result.state === 'STALE') {\n return `${String(ageDays)} days (stale)`\n }\n return `${String(ageDays)} days`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runVerify, displayResults }\n","/**\n * Seal command implementation for attest-it CLI.\n * Creates cryptographic seals for gates.\n */\n\nimport { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n loadLocalConfigSync,\n getActiveIdentity,\n computeFingerprintSync,\n isAuthorizedSigner,\n getGate,\n createSeal,\n readSealsSync,\n writeSealsSync,\n KeyProviderRegistry,\n type AttestItConfig,\n type Identity,\n type SealsFile,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const sealCommand = new Command('seal')\n .description('Create seals for gates')\n .argument('[gates...]', 'Gate IDs to seal (defaults to all gates without valid seals)')\n .option('--force', 'Force seal creation even if gate already has a valid seal')\n .option('--dry-run', 'Show what would be sealed without creating seals')\n .action(async (gates: string[], options: SealOptions) => {\n await runSeal(gates, options)\n })\n\ninterface SealOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ninterface SealSummary {\n sealed: string[]\n skipped: {\n gate: string\n reason: string\n }[]\n failed: {\n gate: string\n error: string\n }[]\n}\n\n/**\n * Run the seal command to create seals for gates.\n *\n * @param gates - Array of gate IDs to seal, or empty for all gates\n * @param options - Command options\n * @public\n */\nasync function runSeal(gates: string[], options: SealOptions): Promise<void> {\n try {\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n error('No local identity configuration found')\n error('Run \"attest-it keygen\" first to set up your identity')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n error(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to seal\n const gatesToSeal = gates.length > 0 ? gates : getAllGateIds(attestItConfig)\n\n // Validate that specified gates exist\n for (const gateId of gatesToSeal) {\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Process each gate\n const summary: SealSummary = {\n sealed: [],\n skipped: [],\n failed: [],\n }\n\n for (const gateId of gatesToSeal) {\n try {\n const result = await processSingleGate(gateId, attestItConfig, identity, sealsFile, options)\n\n if (result.sealed) {\n summary.sealed.push(gateId)\n } else if (result.skipped) {\n summary.skipped.push({ gate: gateId, reason: result.reason ?? 'Unknown' })\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error'\n summary.failed.push({ gate: gateId, error: errorMsg })\n }\n }\n\n // Write seals file if not dry run and we sealed anything\n if (!options.dryRun && summary.sealed.length > 0) {\n writeSealsSync(projectRoot, sealsFile)\n }\n\n // Display summary\n displaySummary(summary, options.dryRun)\n\n // Exit with appropriate code\n if (summary.failed.length > 0) {\n process.exit(ExitCode.FAILURE)\n } else if (summary.sealed.length === 0 && summary.skipped.length === 0) {\n process.exit(ExitCode.NO_WORK)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\ninterface ProcessGateResult {\n sealed: boolean\n skipped: boolean\n reason?: string\n}\n\n/**\n * Process a single gate for sealing.\n *\n * @param gateId - Gate identifier\n * @param config - The attest-it configuration\n * @param identity - Active identity for signing\n * @param sealsFile - The seals file to update\n * @param options - Command options\n * @returns Result indicating whether gate was sealed or skipped\n */\nasync function processSingleGate(\n gateId: string,\n config: AttestItConfig,\n identity: Identity,\n sealsFile: SealsFile,\n options: SealOptions,\n): Promise<ProcessGateResult> {\n verbose(`Processing gate: ${gateId}`)\n\n // Get gate config\n const gate = getGate(config, gateId)\n if (!gate) {\n return { sealed: false, skipped: true, reason: 'Gate not found in configuration' }\n }\n\n // Check if gate already has a valid seal and --force not specified\n // eslint-disable-next-line security/detect-object-injection\n const existingSeal = sealsFile.seals[gateId]\n if (existingSeal && !options.force) {\n return {\n sealed: false,\n skipped: true,\n reason: 'Gate already has a seal (use --force to override)',\n }\n }\n\n // Compute current fingerprint\n const fingerprintResult = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n verbose(` Fingerprint: ${fingerprintResult.fingerprint}`)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(config, gateId, identity.publicKey)\n if (!authorized) {\n return {\n sealed: false,\n skipped: true,\n reason: `Not authorized to seal this gate (authorized signers: ${gate.authorizedSigners.join(', ')})`,\n }\n }\n\n // If dry-run, stop here\n if (options.dryRun) {\n log(` Would seal gate: ${gateId}`)\n return { sealed: true, skipped: false }\n }\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n\n // Get private key from provider\n const keyRef = getKeyRefFromIdentity(identity)\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal\n const seal = createSeal({\n gateId,\n fingerprint: fingerprintResult.fingerprint,\n sealedBy: identity.name,\n privateKey: privateKeyPem,\n })\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n log(` Sealed gate: ${gateId}`)\n verbose(` Sealed by: ${identity.name}`)\n verbose(` Timestamp: ${seal.timestamp}`)\n\n return { sealed: true, skipped: false }\n}\n\n/**\n * Get all gate IDs from configuration.\n *\n * @param config - The attest-it configuration\n * @returns Array of gate IDs\n */\nfunction getAllGateIds(config: AttestItConfig): string[] {\n return Object.keys(config.gates ?? {})\n}\n\n/**\n * Display summary of seal operations.\n *\n * @param summary - Summary of operations\n * @param dryRun - Whether this was a dry run\n */\nfunction displaySummary(summary: SealSummary, dryRun?: boolean): void {\n log('')\n\n const prefix = dryRun ? 'Would seal' : 'Sealed'\n\n if (summary.sealed.length > 0) {\n success(`${prefix} ${String(summary.sealed.length)} gate(s): ${summary.sealed.join(', ')}`)\n }\n\n if (summary.skipped.length > 0) {\n log('')\n warn(`Skipped ${String(summary.skipped.length)} gate(s):`)\n for (const skip of summary.skipped) {\n log(` ${skip.gate}: ${skip.reason}`)\n }\n }\n\n if (summary.failed.length > 0) {\n log('')\n error(`Failed to seal ${String(summary.failed.length)} gate(s):`)\n for (const fail of summary.failed) {\n log(` ${fail.gate}: ${fail.error}`)\n }\n }\n\n if (summary.sealed.length === 0 && summary.skipped.length === 0 && summary.failed.length === 0) {\n log('No gates to seal')\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n // MacOSKeychainKeyProvider uses 'itemName' which becomes the service name\n // The account is hardcoded to 'attest-it' in the provider\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n itemName: privateKey.service,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n // The provider uses the service name as the keyRef\n // Account is hardcoded to 'attest-it' in MacOSKeychainKeyProvider\n return privateKey.service\n case '1password':\n return privateKey.item\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List all local identities')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all configured identities.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const identities = Object.entries(config.identities)\n\n log('')\n log(theme.blue.bold()('Local Identities:'))\n log('')\n\n for (const [slug, identity] of identities) {\n const isActive = slug === config.activeIdentity\n const marker = isActive ? theme.green('★') : ' '\n const nameDisplay = isActive ? theme.green.bold()(identity.name) : identity.name\n\n // Truncate public key for display\n const keyPreview = identity.publicKey.slice(0, 12) + '...'\n\n // Determine key storage type\n let keyType: string\n switch (identity.privateKey.type) {\n case 'file':\n keyType = 'file'\n break\n case 'keychain':\n keyType = 'keychain'\n break\n case '1password':\n keyType = '1password'\n break\n }\n\n log(`${marker} ${theme.blue(slug)}`)\n log(` Name: ${nameDisplay}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n log(` Key Type: ${keyType}`)\n log('')\n }\n\n if (identities.length === 1) {\n log(`1 identity configured`)\n } else {\n log(`${identities.length.toString()} identities configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, select } from '@inquirer/prompts'\nimport { generateEd25519KeyPair, loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport type { Identity, LocalConfig, PrivateKeyRef } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { writeFile, mkdir } from 'node:fs/promises'\n\nexport const createCommand = new Command('create')\n .description('Create a new identity with Ed25519 keypair')\n .action(async () => {\n await runCreate()\n })\n\n/**\n * Run the create command to interactively create a new identity.\n */\nasync function runCreate(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Create New Identity'))\n log('')\n\n // Load existing config if it exists\n const existingConfig = await loadLocalConfig()\n\n // Prompt for identity details\n const slug = await input({\n message: 'Identity slug (unique identifier):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n if (existingConfig?.identities[value]) {\n return `Identity \"${value}\" already exists`\n }\n return true\n },\n })\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n // Prompt for key storage type\n const keyStorageType = await select({\n message: 'Where should the private key be stored?',\n choices: [\n { name: 'File system (~/.config/attest-it/keys/)', value: 'file' },\n { name: 'macOS Keychain', value: 'keychain' },\n { name: '1Password', value: '1password' },\n ],\n })\n\n log('')\n log('Generating Ed25519 keypair...')\n\n // Generate keypair (this is synchronous, returns KeyPair not Promise)\n const keyPair = generateEd25519KeyPair()\n\n // Build private key reference based on storage type\n let privateKeyRef: PrivateKeyRef\n let keyStorageDescription: string\n\n switch (keyStorageType) {\n case 'file': {\n // Save to filesystem\n const keysDir = join(homedir(), '.config', 'attest-it', 'keys')\n await mkdir(keysDir, { recursive: true })\n const keyPath = join(keysDir, `${slug}.pem`)\n await writeFile(keyPath, keyPair.privateKey, { mode: 0o600 })\n\n privateKeyRef = { type: 'file', path: keyPath }\n keyStorageDescription = keyPath\n break\n }\n case 'keychain': {\n // For macOS Keychain, we need to use the security command\n // Import the key provider to check if available\n const { MacOSKeychainKeyProvider } = await import('@attest-it/core')\n\n // Check if available (using static method)\n if (!MacOSKeychainKeyProvider.isAvailable()) {\n error('macOS Keychain is not available on this system')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Store the private key in keychain using security command\n // Keys are stored as base64-encoded PEM strings\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n await execFileAsync('security', [\n 'add-generic-password',\n '-a',\n 'attest-it',\n '-s',\n slug,\n '-w',\n encodedKey,\n '-U',\n ])\n } catch (err) {\n throw new Error(\n `Failed to store key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n // In the keychain, -s is the service name (slug) and -a is the account (\"attest-it\")\n privateKeyRef = { type: 'keychain', service: slug, account: 'attest-it' }\n keyStorageDescription = 'macOS Keychain (' + slug + '/attest-it)'\n break\n }\n case '1password': {\n // For 1Password, prompt for additional details\n const vault = await input({\n message: '1Password vault name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Vault name cannot be empty'\n }\n return true\n },\n })\n\n const item = await input({\n message: '1Password item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Store the private key in 1Password\n // We'll use the op CLI tool\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n // Create the item with the private key\n await execFileAsync('op', [\n 'item',\n 'create',\n '--category=SecureNote',\n '--vault',\n vault,\n `--title=${item}`,\n `privateKey[password]=${keyPair.privateKey}`,\n ])\n } catch (err) {\n throw new Error(\n `Failed to store key in 1Password: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n privateKeyRef = { type: '1password', vault, item, field: 'privateKey' }\n keyStorageDescription = `1Password (${vault}/${item})`\n break\n }\n default:\n throw new Error(`Unknown key storage type: ${keyStorageType}`)\n }\n\n // Build identity object\n const identity: Identity = {\n name,\n publicKey: keyPair.publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n // Create or update config\n let newConfig: LocalConfig\n if (existingConfig) {\n // Add to existing config\n newConfig = {\n ...existingConfig,\n identities: {\n ...existingConfig.identities,\n [slug]: identity,\n },\n }\n } else {\n // Create new config with this identity as active\n newConfig = {\n activeIdentity: slug,\n identities: {\n [slug]: identity,\n },\n }\n }\n\n // Save config\n await saveLocalConfig(newConfig)\n\n log('')\n success('Identity created successfully')\n log('')\n log(` Slug: ${slug}`)\n log(` Name: ${name}`)\n if (email) {\n log(` Email: ${email}`)\n }\n if (github) {\n log(` GitHub: ${github}`)\n }\n log(` Public Key: ${keyPair.publicKey.slice(0, 32)}...`)\n log(` Private Key: ${keyStorageDescription}`)\n log('')\n\n if (!existingConfig) {\n success(`Set as active identity`)\n log('')\n } else {\n log(`To use this identity, run: attest-it identity use ${slug}`)\n log('')\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\n\nexport const useCommand = new Command('use')\n .description('Set the active identity')\n .argument('<slug>', 'Identity slug to activate')\n .action(async (slug: string) => {\n await runUse(slug)\n })\n\n/**\n * Run the use command to set the active identity.\n */\nasync function runUse(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if identity exists\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Update active identity\n const newConfig = {\n ...config,\n activeIdentity: slug,\n }\n\n await saveLocalConfig(newConfig)\n\n success(`Active identity set to: ${identity.name} (${slug})`)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const showCommand = new Command('show')\n .description('Show identity details')\n .argument('[slug]', 'Identity slug (defaults to active identity)')\n .action(async (slug?: string) => {\n await runShow(slug)\n })\n\n/**\n * Run the show command to display identity details.\n */\nasync function runShow(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to show\n let targetSlug: string\n let isActive: boolean\n\n if (slug) {\n targetSlug = slug\n isActive = slug === config.activeIdentity\n } else {\n targetSlug = config.activeIdentity\n isActive = true\n }\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Identity Details:'))\n log('')\n log(` Slug: ${theme.blue(targetSlug)}${isActive ? theme.green(' (active)') : ''}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log('')\n log(` Public Key: ${identity.publicKey}`)\n log('')\n\n // Show private key reference details\n log(' Private Key Storage:')\n switch (identity.privateKey.type) {\n case 'file':\n log(` Type: File`)\n log(` Path: ${identity.privateKey.path}`)\n break\n case 'keychain':\n log(` Type: macOS Keychain`)\n log(` Service: ${identity.privateKey.service}`)\n log(` Account: ${identity.privateKey.account}`)\n break\n case '1password':\n log(` Type: 1Password`)\n if (identity.privateKey.account) {\n log(` Account: ${identity.privateKey.account}`)\n }\n log(` Vault: ${identity.privateKey.vault}`)\n log(` Item: ${identity.privateKey.item}`)\n if (identity.privateKey.field) {\n log(` Field: ${identity.privateKey.field}`)\n }\n break\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig, generateEd25519KeyPair } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\n\nexport const editCommand = new Command('edit')\n .description('Edit identity or rotate keypair')\n .argument('<slug>', 'Identity slug to edit')\n .action(async (slug: string) => {\n await runEdit(slug)\n })\n\n/**\n * Run the edit command to modify an identity.\n */\nasync function runEdit(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Edit Identity: ${slug}`))\n log('')\n\n // Prompt for new values (show current values as defaults)\n const name = await input({\n message: 'Display name:',\n default: identity.name,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: identity.email ?? '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: identity.github ?? '',\n })\n\n // Ask about keypair rotation\n const rotateKey = await confirm({\n message: 'Rotate keypair (generate new keys)?',\n default: false,\n })\n\n let publicKey = identity.publicKey\n const privateKeyRef = identity.privateKey\n\n if (rotateKey) {\n log('')\n log('Generating new Ed25519 keypair...')\n\n // Generate new keypair\n const keyPair = generateEd25519KeyPair()\n publicKey = keyPair.publicKey\n\n // Update private key storage based on existing type\n switch (identity.privateKey.type) {\n case 'file': {\n // Update file\n await writeFile(identity.privateKey.path, keyPair.privateKey, { mode: 0o600 })\n log(` Updated private key at: ${identity.privateKey.path}`)\n break\n }\n case 'keychain': {\n // Update macOS Keychain entry\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n // Delete old entry\n await execFileAsync('security', [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ])\n\n // Add new entry\n await execFileAsync('security', [\n 'add-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n '-w',\n encodedKey,\n '-U',\n ])\n log(` Updated private key in macOS Keychain`)\n } catch (err) {\n throw new Error(\n `Failed to update key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n break\n }\n case '1password': {\n // Update 1Password item\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n // Update the item field\n const opArgs = [\n 'item',\n 'edit',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n `privateKey[password]=${keyPair.privateKey}`,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Updated private key in 1Password`)\n } catch (err) {\n throw new Error(\n `Failed to update key in 1Password: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n break\n }\n }\n }\n\n // Update identity\n const updatedIdentity = {\n name,\n publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n const newConfig = {\n ...config,\n identities: {\n ...config.identities,\n [slug]: updatedIdentity,\n },\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success('Identity updated successfully')\n log('')\n if (rotateKey) {\n log(' New Public Key: ' + publicKey.slice(0, 32) + '...')\n log('')\n log(\n theme.yellow(\n ' Warning: If this identity is used in team configurations,\\n you must update those configurations with the new public key.',\n ),\n )\n log('')\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { unlink } from 'node:fs/promises'\n\nexport const removeCommand = new Command('remove')\n .description('Delete identity and optionally delete private key')\n .argument('<slug>', 'Identity slug to remove')\n .action(async (slug: string) => {\n await runRemove(slug)\n })\n\n/**\n * Run the remove command to delete an identity.\n */\nasync function runRemove(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Remove Identity: ${slug}`))\n log('')\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n log('')\n\n // Confirm deletion\n const confirmDelete = await confirm({\n message: 'Are you sure you want to delete this identity?',\n default: false,\n })\n\n if (!confirmDelete) {\n log('Cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Ask about deleting private key\n const deletePrivateKey = await confirm({\n message: 'Also delete the private key from storage?',\n default: false,\n })\n\n // Delete private key if requested\n if (deletePrivateKey) {\n switch (identity.privateKey.type) {\n case 'file': {\n try {\n await unlink(identity.privateKey.path)\n log(` Deleted private key file: ${identity.privateKey.path}`)\n } catch (err) {\n // Ignore file not found errors\n if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {\n throw err\n }\n }\n break\n }\n case 'keychain': {\n // Delete from macOS Keychain\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n await execFileAsync('security', [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ])\n log(` Deleted private key from macOS Keychain`)\n } catch (err) {\n // Ignore if key doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('could not be found') &&\n !err.message.includes('does not exist')\n ) {\n throw err\n }\n }\n break\n }\n case '1password': {\n // Delete from 1Password\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const opArgs = [\n 'item',\n 'delete',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Deleted private key from 1Password`)\n } catch (err) {\n // Ignore if item doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('not found') &&\n !err.message.includes(\"doesn't exist\")\n ) {\n throw err\n }\n }\n break\n }\n }\n }\n\n // Remove from config\n const { [slug]: _removed, ...remainingIdentities } = config.identities\n\n // Check if this was the last identity\n if (Object.keys(remainingIdentities).length === 0) {\n error('Cannot remove last identity')\n log('')\n log('At least one identity must exist')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if this was the active identity\n let newActiveIdentity = config.activeIdentity\n if (slug === config.activeIdentity) {\n // Set first remaining identity as active\n const firstKey = Object.keys(remainingIdentities)[0]\n if (!firstKey) {\n throw new Error('No remaining identities after removal')\n }\n newActiveIdentity = firstKey\n log('')\n log(theme.yellow(` Removed active identity. New active identity: ${newActiveIdentity}`))\n }\n\n const newConfig = {\n activeIdentity: newActiveIdentity,\n identities: remainingIdentities,\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success(`Identity \"${slug}\" removed`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const exportCommand = new Command('export')\n .description('Export identity for team onboarding (YAML snippet)')\n .argument('[slug]', 'Identity slug to export (defaults to active identity)')\n .action(async (slug?: string) => {\n await runExport(slug)\n })\n\n/**\n * Run the export command to output a YAML snippet for team config.\n */\nasync function runExport(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to export\n const targetSlug = slug ?? config.activeIdentity\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Team Configuration YAML:'))\n log('')\n log(theme.muted('# Add this to your team config file (.attest-it/team-config.yaml)'))\n log('')\n\n // Build export object (only include fields that are present)\n const exportData: Record<string, unknown> = {\n name: identity.name,\n publicKey: identity.publicKey,\n }\n\n if (identity.email) {\n exportData.email = identity.email\n }\n\n if (identity.github) {\n exportData.github = identity.github\n }\n\n // Create YAML with slug as key\n const yamlData = {\n [targetSlug]: exportData,\n }\n\n const yamlString = stringifyYaml(yamlData)\n\n log(yamlString)\n log('')\n log(theme.muted('# The team owner can add this to the \"members:\" section'))\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { createCommand } from './create.js'\nimport { useCommand } from './use.js'\nimport { showCommand } from './show.js'\nimport { editCommand } from './edit.js'\nimport { removeCommand } from './remove.js'\nimport { exportCommand } from './export.js'\n\nexport const identityCommand = new Command('identity')\n .description('Manage local identities and keypairs')\n .addCommand(listCommand)\n .addCommand(createCommand)\n .addCommand(useCommand)\n .addCommand(showCommand)\n .addCommand(editCommand)\n .addCommand(removeCommand)\n .addCommand(exportCommand)\n","import { Command } from 'commander'\nimport { loadLocalConfig, getActiveIdentity } from '@attest-it/core'\nimport { log, error } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { getTheme } from '../components/theme.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show the current active identity')\n .action(async () => {\n await runWhoami()\n })\n\n/**\n * Run the whoami command to display the current active identity.\n */\nasync function runWhoami(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = getActiveIdentity(config)\n\n if (!identity) {\n error('Active identity not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.green.bold()(identity.name))\n if (identity.email) {\n log(theme.muted(identity.email))\n }\n if (identity.github) {\n log(theme.muted('@' + identity.github))\n }\n log('')\n log(`Identity: ${theme.blue(config.activeIdentity)}`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadConfig, toAttestItConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List team members and their authorizations')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all team members.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n if (!attestItConfig.team || Object.keys(attestItConfig.team).length === 0) {\n error('No team members configured')\n log('')\n log('Run: attest-it team add')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const teamMembers = Object.entries(attestItConfig.team)\n\n log('')\n log(theme.blue.bold()('Team Members:'))\n log('')\n\n for (const [slug, member] of teamMembers) {\n // Truncate public key for display\n const keyPreview = member.publicKey.slice(0, 12) + '...'\n\n log(theme.blue(slug))\n log(` Name: ${member.name}`)\n if (member.email) {\n log(` Email: ${member.email}`)\n }\n if (member.github) {\n log(` GitHub: ${member.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n\n // Show gate authorizations\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log(` Gates: ${authorizedGates.join(', ')}`)\n } else {\n log(` Gates: ${theme.muted('(none)')}`)\n }\n\n log('')\n }\n\n if (teamMembers.length === 1) {\n log(`1 team member configured`)\n } else {\n log(`${teamMembers.length.toString()} team members configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, checkbox } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport type { Config, TeamMember } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const addCommand = new Command('add')\n .description('Add a new team member')\n .action(async () => {\n await runAdd()\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the add command to interactively add a team member.\n */\nasync function runAdd(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Add Team Member'))\n log('')\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Prompt for member details\n const slug = await input({\n message: 'Member slug (unique identifier):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection\n if (existingTeam[value]) {\n return `Team member \"${value}\" already exists`\n }\n return true\n },\n })\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n log('')\n log('Paste the public key (from \"attest-it identity export\"):')\n const publicKey = await input({\n message: 'Public key:',\n validate: validatePublicKey,\n })\n\n // Prompt for gate authorizations\n let authorizedGates: string[] = []\n if (attestItConfig.gates && Object.keys(attestItConfig.gates).length > 0) {\n log('')\n const gateChoices = Object.entries(attestItConfig.gates).map(([gateId, gate]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n }))\n\n authorizedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n }\n\n // Build team member object\n const teamMember: TeamMember = {\n name,\n publicKey: publicKey.trim(),\n }\n\n if (email && email.trim().length > 0) {\n teamMember.email = email.trim()\n }\n\n if (github && github.trim().length > 0) {\n teamMember.github = github.trim()\n }\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: {\n ...existingTeam,\n [slug]: teamMember,\n },\n }\n\n // Update gate authorizations\n if (authorizedGates.length > 0 && updatedConfig.gates) {\n for (const gateId of authorizedGates) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = updatedConfig.gates[gateId]\n if (gate) {\n // Add to authorizedSigners if not already present\n if (!gate.authorizedSigners.includes(slug)) {\n gate.authorizedSigners.push(slug)\n }\n }\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, confirm, checkbox } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport type { Config, TeamMember } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const editCommand = new Command('edit')\n .description('Edit a team member')\n .argument('<slug>', 'Team member slug to edit')\n .action(async (slug: string) => {\n await runEdit(slug)\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the edit command to modify an existing team member.\n */\nasync function runEdit(slug: string): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Edit Team Member: ${slug}`))\n log('')\n log(theme.muted('Leave blank to keep current value'))\n log('')\n\n // Prompt for updated details\n const name = await input({\n message: 'Display name:',\n default: existingMember.name,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: existingMember.email ?? '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: existingMember.github ?? '',\n })\n\n // Ask if they want to update the public key\n const updateKey = await confirm({\n message: 'Update public key?',\n default: false,\n })\n\n let publicKey = existingMember.publicKey\n if (updateKey) {\n log('')\n log('Paste the new public key:')\n publicKey = await input({\n message: 'Public key:',\n default: existingMember.publicKey,\n validate: validatePublicKey,\n })\n }\n\n // Get current gate authorizations\n const currentGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n currentGates.push(gateId)\n }\n }\n }\n\n // Prompt for gate authorizations\n let selectedGates: string[] = currentGates\n if (attestItConfig.gates && Object.keys(attestItConfig.gates).length > 0) {\n log('')\n const gateChoices = Object.entries(attestItConfig.gates).map(([gateId, gate]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n checked: currentGates.includes(gateId),\n }))\n\n selectedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n }\n\n // Build updated team member object\n const updatedMember: TeamMember = {\n name: name.trim(),\n publicKey: publicKey.trim(),\n }\n\n if (email && email.trim().length > 0) {\n updatedMember.email = email.trim()\n }\n\n if (github && github.trim().length > 0) {\n updatedMember.github = github.trim()\n }\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: {\n ...attestItConfig.team,\n [slug]: updatedMember,\n },\n }\n\n // Update gate authorizations\n if (updatedConfig.gates) {\n for (const [gateId, gate] of Object.entries(updatedConfig.gates)) {\n // Remove from gates that are no longer selected\n if (currentGates.includes(gateId) && !selectedGates.includes(gateId)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n\n // Add to gates that are newly selected\n if (!currentGates.includes(gateId) && selectedGates.includes(gateId)) {\n if (!gate.authorizedSigners.includes(slug)) {\n gate.authorizedSigners.push(slug)\n }\n }\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" updated successfully`)\n\n if (selectedGates.length > 0) {\n log(`Authorized for gates: ${selectedGates.join(', ')}`)\n } else {\n log('Not authorized for any gates')\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath, readSealsSync } from '@attest-it/core'\nimport type { Config } from '@attest-it/core'\nimport { log, success, error, warn } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const removeCommand = new Command('remove')\n .description('Remove a team member')\n .argument('<slug>', 'Team member slug to remove')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(async (slug: string, options: { force?: boolean }) => {\n await runRemove(slug, options)\n })\n\n/**\n * Run the remove command to delete a team member.\n */\nasync function runRemove(slug: string, options: { force?: boolean }): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Remove Team Member: ${slug}`))\n log('')\n log(`Name: ${existingMember.name}`)\n if (existingMember.email) {\n log(`Email: ${existingMember.email}`)\n }\n if (existingMember.github) {\n log(`GitHub: ${existingMember.github}`)\n }\n log('')\n\n // Check for existing seals by this member\n const projectRoot = process.cwd()\n let sealsFile\n try {\n sealsFile = readSealsSync(projectRoot)\n } catch {\n // No seals file exists yet\n sealsFile = { version: 1, seals: {} }\n }\n\n const sealsCreatedByMember: string[] = []\n for (const [gateId, seal] of Object.entries(sealsFile.seals)) {\n if (seal.sealedBy === slug) {\n sealsCreatedByMember.push(gateId)\n }\n }\n\n if (sealsCreatedByMember.length > 0) {\n warn('This member has created seals for the following gates:')\n for (const gateId of sealsCreatedByMember) {\n warn(` - ${gateId}`)\n }\n log('')\n warn('These seals will still be valid but attributed to a removed member.')\n log('')\n }\n\n // Get gates this member is authorized for\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log('This member is authorized for the following gates:')\n for (const gateId of authorizedGates) {\n log(` - ${gateId}`)\n }\n log('')\n }\n\n // Confirm removal\n if (!options.force) {\n const confirmed = await confirm({\n message: `Are you sure you want to remove \"${slug}\"?`,\n default: false,\n })\n\n if (!confirmed) {\n error('Removal cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Remove from team\n const updatedTeam = { ...attestItConfig.team }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete, security/detect-object-injection\n delete updatedTeam[slug]\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: updatedTeam,\n }\n\n // Remove from all gate authorizations\n if (updatedConfig.gates) {\n for (const gate of Object.values(updatedConfig.gates)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" removed successfully`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { addCommand } from './add.js'\nimport { editCommand } from './edit.js'\nimport { removeCommand } from './remove.js'\n\nexport const teamCommand = new Command('team')\n .description('Manage team members and authorizations')\n .addCommand(listCommand)\n .addCommand(addCommand)\n .addCommand(editCommand)\n .addCommand(removeCommand)\n","import { Command } from 'commander'\nimport { initCommand } from './commands/init.js'\nimport { statusCommand } from './commands/status.js'\nimport { runCommand } from './commands/run.js'\nimport { keygenCommand } from './commands/keygen.js'\nimport { pruneCommand } from './commands/prune.js'\nimport { verifyCommand } from './commands/verify.js'\nimport { sealCommand } from './commands/seal.js'\nimport { identityCommand } from './commands/identity/index.js'\nimport { whoamiCommand } from './commands/whoami.js'\nimport { teamCommand } from './commands/team/index.js'\nimport { setOutputOptions, initTheme } from './utils/output.js'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\n// Type guard for package.json structure\nfunction hasVersion(data: unknown): data is { version: string } {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n// Lazy-load version from package.json to avoid startup latency\nlet cachedVersion: string | undefined\n\nfunction getPackageVersion(): string {\n if (cachedVersion !== undefined) {\n return cachedVersion\n }\n\n // Read version from package.json at runtime\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles for each entry point:\n // - dist/index.js (library entry) needs ../package.json\n // - dist/bin/attest-it.js (CLI entry) needs ../../package.json\n const possiblePaths = [join(__dirname, '../package.json'), join(__dirname, '../../package.json')]\n\n for (const packageJsonPath of possiblePaths) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8')\n const packageJsonData: unknown = JSON.parse(content)\n\n if (!hasVersion(packageJsonData)) {\n throw new Error(`Invalid package.json at ${packageJsonPath}: missing version field`)\n }\n\n cachedVersion = packageJsonData.version\n return cachedVersion\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find package.json')\n}\n\nconst program = new Command()\n\nprogram\n .name('attest-it')\n .description('Human-gated test attestation system')\n .option('-c, --config <path>', 'Path to config file')\n .option('-v, --verbose', 'Verbose output')\n .option('-q, --quiet', 'Minimal output')\n\n// Handle --version manually to avoid loading package.json on every invocation\nprogram.option('-V, --version', 'output the version number')\n\n// Register commands\nprogram.addCommand(initCommand)\nprogram.addCommand(statusCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(keygenCommand)\nprogram.addCommand(pruneCommand)\nprogram.addCommand(verifyCommand)\nprogram.addCommand(sealCommand)\nprogram.addCommand(identityCommand)\nprogram.addCommand(teamCommand)\nprogram.addCommand(whoamiCommand)\n\nexport async function run(): Promise<void> {\n // Check for --version flag before initializing theme or doing other work\n if (process.argv.includes('--version') || process.argv.includes('-V')) {\n console.log(getPackageVersion())\n process.exit(0)\n }\n\n // Initialize theme before any output\n await initTheme()\n\n // Parse options and set global output options\n program.parse()\n const options = program.opts<{ verbose?: boolean; quiet?: boolean }>()\n\n const outputOptions: { verbose?: boolean; quiet?: boolean } = {}\n if (options.verbose !== undefined) {\n outputOptions.verbose = options.verbose\n }\n if (options.quiet !== undefined) {\n outputOptions.quiet = options.quiet\n }\n\n setOutputOptions(outputOptions)\n}\n\nexport { program }\n","import { run } from '../src/index.js'\n\nvoid run()\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/output.ts","../../src/components/theme.ts","../../src/utils/prompts.ts","../../src/utils/exit-codes.ts","../../src/commands/init.ts","../../src/commands/status.ts","../../src/components/Header.tsx","../../src/components/StatusBadge.tsx","../../src/components/SuiteTable.tsx","../../src/components/SelectionPrompt.tsx","../../src/components/SuiteSelector.tsx","../../src/components/ProgressSummary.tsx","../../src/components/TestRunner.tsx","../../src/components/InteractiveRun.tsx","../../src/commands/run-utils.ts","../../src/session/session.ts","../../src/commands/run-interactive.tsx","../../src/commands/run.ts","../../src/commands/keygen-interactive.tsx","../../src/commands/keygen.ts","../../src/commands/prune.ts","../../src/commands/verify.ts","../../src/commands/seal.ts","../../src/commands/identity/list.ts","../../src/commands/identity/validation.ts","../../src/commands/identity/create.ts","../../src/commands/identity/use.ts","../../src/commands/identity/show.ts","../../src/commands/identity/edit.ts","../../src/utils/format-key-location.ts","../../src/commands/identity/remove.ts","../../src/commands/identity/export.ts","../../src/commands/identity/index.ts","../../src/commands/whoami.ts","../../src/commands/team/list.ts","../../src/commands/team/add.ts","../../src/commands/team/edit.ts","../../src/commands/team/remove.ts","../../src/commands/team/index.ts","../../src/commands/completion.ts","../../src/index.ts","../../bin/attest-it.ts"],"names":["theme","getTheme","Command","jsx","Text","Box","input","jsxs","React5","useInput","createAttestation","currentSuite","saveSession","React8","dirname","loadConfig","computeFingerprint","readAttestations","resolve","parseShellCommand","executeCommand","spawn","checkDirtyWorkingTree","os2","upsertAttestation","KeyProviderRegistry","getDefaultPrivateKeyPath","FilesystemKeyProvider","writeSignedAttestations","toAttestItConfig","computeFingerprintSync","fs","readSealsSync","useState","useEffect","error","render","getDefaultPublicKeyPath","OnePasswordKeyProvider","MacOSKeychainKeyProvider","fs2","fs3","verifyGateSeal","verifyAllSeals","colorizeState","formatAge","loadLocalConfigSync","getActiveIdentity","writeSealsSync","isAuthorizedSigner","createKeyProviderFromIdentity","getKeyRefFromIdentity","createSeal","loadLocalConfig","join","mkdir","writeFile","name","execFile","promisify","execFileAsync","saveLocalConfig","confirm","generateEd25519KeyPair","unlink","stringifyYaml","listCommand","runList","editCommand","runEdit","validatePublicKey","checkbox","findConfigPath","removeCommand","runRemove","globalOptions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AASA,IAAI,gBAA+B,EAAC;AAGpC,IAAI,KAAA;AAMJ,eAAsB,SAAA,GAA2B;AAC/C,EAAA,KAAA,GAAQ,MAAM,WAAA,EAAY;AAC5B;AAMO,SAAS,QAAA,GAAkB;AAChC,EAAA,IAAI,CAAC,KAAA,EAAO;AAGV,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB,GAAA;AAChC,IAAA,MAAM,YAAY,MAAM,MAAA;AAExB,IAAA,KAAA,GAAQ;AAAA,MACN,GAAA,EAAK,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAC9D,KAAA,EAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAChE,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MACjE,IAAA,EAAM,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAC/D,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAiB,OAAA,EAA8B;AAC7D,EAAA,aAAA,GAAgB,OAAA;AAClB;AAOO,SAAS,IAAI,OAAA,EAAuB;AACzC,EAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrB;AACF;AAEO,SAAS,QAAQ,OAAA,EAAuB;AAC7C,EAAA,IAAI,aAAA,CAAc,OAAA,IAAW,CAAC,aAAA,CAAc,KAAA,EAAO;AACjD,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAS,CAAE,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACvC;AACF;AAEO,SAAS,QAAQ,OAAA,EAAuB;AAC7C,EAAA,GAAA,CAAI,QAAA,EAAS,CAAE,OAAA,CAAQ,SAAA,GAAO,OAAO,CAAC,CAAA;AACxC;AAEO,SAAS,MAAM,OAAA,EAAuB;AAC3C,EAAA,OAAA,CAAQ,MAAM,QAAA,EAAS,CAAE,KAAA,CAAM,SAAA,GAAO,OAAO,CAAC,CAAA;AAChD;AAEO,SAAS,KAAK,OAAA,EAAuB;AAC1C,EAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,KAAK,QAAA,EAAS,CAAE,OAAA,CAAQ,SAAA,GAAO,OAAO,CAAC,CAAA;AAAA,EACjD;AACF;AAEO,SAAS,KAAK,OAAA,EAAuB;AAC1C,EAAA,GAAA,CAAI,QAAA,EAAS,CAAE,IAAA,CAAK,SAAA,GAAO,OAAO,CAAC,CAAA;AACrC;AAUO,SAAS,YAAY,IAAA,EAA0B;AAEpD,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,EAAS,QAAA,EAAU,eAAe,KAAK,CAAA;AAGxD,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA4B;AAAA,IAChD,GAAA,CAAI,KAAA;AAAA,IACJ,GAAA,CAAI,MAAA;AAAA,IACJ,GAAA,CAAI,WAAA;AAAA,IACJ,GAAA,CAAI;AAAA,GACN;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,MAAA,MAAM,MAAA,GAAS,aAAa,CAAC,CAAA;AAE7B,MAAA,OAAO,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,cAAc,CAAA;AAAA,EAC1C,CAAC,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,QAAA;AAClB,EAAA,MAAM,QAAkB,EAAC;AAIzB,EAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,UAAK,CAAC,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,SAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,oBAAK,CAAC,CAAA;AAG7D,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAE/B,IAAA,KAAA,CAAM,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,UAAK,CAAC,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAsBO,SAAS,WAAW,IAAA,EAAqB;AAC9C,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C;ACjGO,IAAM,SAAA,GAAY;AAAA,EACvB,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAEZ,CAAA;AAaA,IAAIA,MAAAA;AAcG,SAASC,SAAAA,GAAkB;AAChC,EAAA,IAAI,CAACD,MAAAA,EAAO;AAGV,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB,GAAA;AAChC,IAAA,MAAM,YAAY,MAAM,MAAA;AAMxB,IAAAA,MAAAA,GAAQ;AAAA,MACN,GAAA,EAAK,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAC9D,KAAA,EAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAChE,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MACjE,IAAA,EAAM,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,MAC/D,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,OAAOA,MAAAA;AACT;;;AC1GA,eAAsB,cAAc,OAAA,EAA2C;AAC7E,EAAA,MAAMA,SAAQC,SAAAA,EAAS;AAGvB,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,OAAA,GAAU,OAAA,GAAU,OAAA;AACrD,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,OAAO,KAAK,gBAAgB,CAAA,CAAA;AACvD,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,GAAG,EAAE,CAAA;AAChD,EAAA,MAAM,iBAAiB,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,SAAS,CAAC,CAAA;AAG/D,EAAA,MAAM,YAAYD,MAAAA,CAAM,MAAA;AAAA,IACtB,CAAA,EAAG,SAAA,CAAU,OAAO,CAAA,EAAG,SAAA,CAAU,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,SAAA,CAAU,QAAQ,CAAA;AAAA,GACnF;AACA,EAAA,MAAM,eAAeA,MAAAA,CAAM,MAAA;AAAA,IACzB,CAAA,EAAG,SAAA,CAAU,UAAU,CAAA,EAAG,SAAA,CAAU,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,SAAA,CAAU,WAAW,CAAA;AAAA,GACzF;AAGA,EAAA,MAAM,WAAA,GACJA,MAAAA,CAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,GAC/B,CAAA,CAAA,EAAI,OAAO,CAAA,EAAG,cAAc,CAAA,CAAA,GAC5BA,MAAAA,CAAM,MAAA,CAAO,UAAU,QAAQ,CAAA;AAGjC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,EAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AACvB,EAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,OAAA,EAAS,EAAA;AAAA;AAAA,IACT,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ;AAAA;AAAA;AACV,GACD,CAAA;AACH;;;ACvCO,IAAM,QAAA,GAAW;AAAA;AAAA,EAEtB,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,YAAA,EAAc,CAAA;AAAA;AAAA,EAEd,SAAA,EAAW,CAAA;AAAA;AAAA,EAEX,WAAA,EAAa;AACf,CAAA;;;ACnBO,IAAM,cAAc,IAAI,OAAA,CAAQ,MAAM,CAAA,CAC1C,WAAA,CAAY,oCAAoC,CAAA,CAChD,MAAA,CAAO,qBAAqB,kBAAA,EAAoB,wBAAwB,EACxE,MAAA,CAAO,aAAA,EAAe,2BAA2B,CAAA,CACjD,MAAA,CAAO,OAAO,OAAA,KAAyB;AACtC,EAAA,MAAM,QAAQ,OAAO,CAAA;AACvB,CAAC,CAAA;AAOH,IAAM,eAAA,GAAkB,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAgDxB,eAAe,QAAQ,OAAA,EAAqC;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAkB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAiB,aAAQ,UAAU,CAAA;AAEzC,IAAA,IAAO,EAAA,CAAA,UAAA,CAAW,UAAU,CAAA,IAAK,CAAC,QAAQ,KAAA,EAAO;AAC/C,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc;AAAA,QACpC,OAAA,EAAS,4BAA4B,UAAU,CAAA,YAAA,CAAA;AAAA,QAC/C,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,gBAAgB,CAAA;AACtB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,MACjC;AAAA,IACF;AAGA,IAAA,MAAS,YAAS,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AACtD,IAAA,MAAS,EAAA,CAAA,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,eAAA,EAAiB,OAAO,CAAA;AAEhE,IAAA,OAAA,CAAQ,CAAA,yBAAA,EAA4B,UAAU,CAAA,CAAE,CAAA;AAChD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,aAAa,CAAA;AACjB,IAAA,GAAA,CAAI,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAC1D,IAAA,GAAA,CAAI,4BAA4B,CAAA;AAChC,IAAA,GAAA,CAAI,4BAA4B,CAAA;AAAA,EAClC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AChFO,IAAM,gBAAgB,IAAIE,OAAAA,CAAQ,QAAQ,CAAA,CAC9C,WAAA,CAAY,gCAAgC,CAAA,CAC5C,QAAA,CAAS,cAAc,qCAAqC,CAAA,CAC5D,OAAO,QAAA,EAAU,iCAAiC,EAClD,MAAA,CAAO,OAAO,OAAiB,OAAA,KAA2B;AACzD,EAAA,MAAM,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,CAAC,CAAA;AA4BH,eAAe,SAAA,CAAU,OAAiB,OAAA,EAAuC;AAC/E,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiB,iBAAiB,MAAM,CAAA;AAG9C,IAAA,IAAI,CAAC,eAAe,KAAA,IAAS,MAAA,CAAO,KAAK,cAAA,CAAe,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,mCAAmC,CAAA;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,IAAA,MAAM,SAAA,GAAY,cAAc,WAAW,CAAA;AAG3C,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,GAAS,CAAA,GAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,eAAe,KAAK,CAAA;AAGhF,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AAEjC,MAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,QAAA,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,CAAA,4BAAA,CAA8B,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AAEjC,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACxC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,SAAS,sBAAA,CAAuB;AAAA,QACpC,QAAA,EAAU,KAAK,WAAA,CAAY,KAAA;AAAA,QAC3B,GAAI,KAAK,WAAA,CAAY,OAAA,IAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,OAAA;AAAQ,OACpE,CAAA;AAED,MAAA,YAAA,CAAa,MAAM,IAAI,MAAA,CAAO,WAAA;AAAA,IAChC;AAGA,IAAA,MAAM,mBAAA,GACJ,KAAA,CAAM,MAAA,GAAS,CAAA,GACX,YAAA,CAAa,GAAA;AAAA,MAAI,CAAC,MAAA;AAAA;AAAA,QAEhB,eAAe,cAAA,EAAgB,MAAA,EAAQ,WAAW,YAAA,CAAa,MAAM,KAAK,EAAE;AAAA;AAAA,KAC9E,GACA,cAAA,CAAe,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAA;AAG5D,IAAA,MAAM,OAAA,GAAwB,mBAAA,CAAoB,GAAA,CAAI,CAAC,MAAA,KAAmC;AACxF,MAAA,MAAM,MAAA,GAAqB;AAAA,QACzB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,kBAAA,EAAoB,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,IAAK,EAAA;AAAA,QACnD,SAAS,MAAA,CAAO;AAAA,OAClB;AAEA,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAA,CAAO,iBAAA,GAAoB,OAAO,IAAA,CAAK,WAAA;AACvC,QAAA,MAAA,CAAO,QAAA,GAAW,OAAO,IAAA,CAAK,QAAA;AAC9B,QAAA,MAAA,CAAO,QAAA,GAAW,OAAO,IAAA,CAAK,SAAA;AAG9B,QAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAChD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,SAAA,CAAU,OAAA,EAAQ;AACtC,QAAA,MAAA,CAAO,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAAA,MACvD;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,UAAA,CAAW,OAAO,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAC5B;AAGA,IAAA,MAAM,aAAa,OAAA,CAAQ,IAAA;AAAA,MACzB,CAAC,CAAA,KACC,CAAA,CAAE,KAAA,KAAU,aACZ,CAAA,CAAE,KAAA,KAAU,sBAAA,IACZ,CAAA,CAAE,UAAU,mBAAA,IACZ,CAAA,CAAE,KAAA,KAAU,gBAAA,IACZ,EAAE,KAAA,KAAU;AAAA,KAChB;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,OAAA,GAAU,SAAS,OAAO,CAAA;AAAA,EAC/D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AAOA,SAAS,mBAAmB,OAAA,EAA6B;AACvD,EAAA,MAAM,SAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAChD,OAAO,CAAA,CAAE,MAAA;AAAA,IACT,MAAA,EAAQ,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAAA,IAC7B,aAAa,CAAA,CAAE,kBAAA,CAAmB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IACjD,GAAA,EAAK,UAAU,CAAC;AAAA,GAClB,CAAE,CAAA;AAEF,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA,CAAI,WAAA,CAAY,SAAS,CAAC,CAAA;AAC1B,EAAA,GAAA,CAAI,EAAE,CAAA;AAGN,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,IAAY,EAAE,QAAQ,CAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,gBAAgB,CAAA;AACpB,IAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAC3B,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AACzB,MAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,MAAA,CAAO,QAAA,IAAY,SAAS,CAAA,CAAE,CAAA;AACpD,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AACrC,QAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA,IACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR;AAGA,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAA,IAAW,CAAA,CAAE,OAAO,CAAA;AACzE,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,GAAA,CAAI,SAAS,CAAA;AACb,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAA,GAAA,CAAI,KAAK,MAAA,CAAO,MAAM,KAAK,MAAA,CAAO,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR;AAGA,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,GAAS,UAAA;AAEtC,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,sBAAsB,CAAA;AAAA,EAChC,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,CAAA,8CAAA,CAAgD,CAAA;AAAA,EACtD;AACF;AAQA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,MAAMF,SAAQ,QAAA,EAAS;AAEvB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,MAAM,KAAK,CAAA;AAAA,IAC1B,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,OAAO,KAAK,CAAA;AAAA,IAC3B,KAAK,sBAAA;AAAA,IACL,KAAK,mBAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACxB;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAQA,SAAS,UAAU,MAAA,EAA4B;AAC7C,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,OAAA,IAAW,MAAA,CAAO,UAAU,OAAA,EAAS;AACxD,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,GAAA,IAAO,CAAC,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,KAAA,KAAU,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA,CAAA;AAAA,EACrF;AAEA,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,sBAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT;AACE,MAAA,OAAO,GAAA;AAAA;AAEb;AChPO,SAAS,MAAA,CAAO,EAAE,YAAA,EAAa,EAAoC;AACxE,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,YAAA,CAAa,QAAA,EAAU,CAAA,MAAA,EAAS,YAAA,KAAiB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,KAAA,EAAQ,YAAA,KAAiB,CAAA,GAAI,MAAM,EAAE,CAAA,YAAA,CAAA;AAErH,EAAA,uBACE,GAAA,CAAC,OAAI,WAAA,EAAY,QAAA,EAAS,UAAU,CAAA,EAClC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,OAAA,EAAQ,CAAA,EACjB,CAAA;AAEJ;ACIO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAyC;AAE5E,EAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAG3C,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,uBACEG,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,aAAa,KAAA,EAAO,IAAA,EAAI,IAAA,EAClC,QAAA,EAAA,YAAA,CAAa,IAAA,EAChB,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOD,IAACC,IAAAA,EAAA,EAAK,OAAO,YAAA,CAAa,KAAA,EAAQ,uBAAa,IAAA,EAAK,CAAA;AAC7D;AAgBA,SAAS,gBAAgB,MAAA,EAA0C;AACjE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC3C,KAAK,mBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,QAAA,EAAS;AAAA,IAC5C,KAAK,qBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,QAAA,EAAS;AAAA,IAC5C,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAAA,IACvC,KAAK,mBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,IACrD,KAAK,uBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,KAAA,EAAM;AAAA,IAC7C,SAAS;AAEP,MAAA,MAAM,WAAA,GAAqB,MAAA;AAC3B,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,CAAA,EAAG,OAAO,QAAA,EAAS;AAAA,IACtD;AAAA;AAEJ;AC9BO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,uBAAe,GAAA;AACjB,CAAA,EAAwC;AAEtC,EAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,MAAkB,CAAA;AAE7D,EAAA,uBACE,IAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAEjB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAACA,KAAA,EACE,QAAA,EAAA;AAAA,MAAA,UAAA,oBAAcF,GAAAA,CAACC,IAAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAE,CAAA;AAAA,sBACpCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAE,QAAA,EAAA,MAAA,CAAO,QAAA,EAAU,YAAA,CAAa,MAAM,CAAA,EAAE,CAAA;AAAA,sBAClDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAE,QAAA,EAAA,MAAA,CAAO,OAAA,EAAS,YAAA,CAAa,KAAK,CAAA,EAAE,CAAA;AAAA,sBAChDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,QAAA,EAAM;AAAA,KAAA,EACnB,CAAA;AAAA,oBAGAD,GAAAA,CAACE,GAAAA,EAAA,EACC,QAAA,kBAAAF,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EACT,QAAA,EAAA,QAAA,CAAI,MAAA;AAAA,MAAA,CACF,aAAa,CAAA,GAAI,CAAA,IAAK,aAAa,MAAA,GAAS,YAAA,CAAa,QAAQ,YAAA,CAAa;AAAA,OAEnF,CAAA,EACF,CAAA;AAAA,IAGC,OAAO,GAAA,CAAI,CAAC,KAAA,qBACX,IAAA,CAACC,KAAA,EACE,QAAA,EAAA;AAAA,MAAA,UAAA,oBAAcF,GAAAA,CAACC,IAAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,IAAI,KAAA,CAAM,IAAI,CAAA,GAAI,WAAA,GAAS,MAAA,EAAO,CAAA;AAAA,sBACjED,GAAAA,CAACE,GAAAA,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,MAAA,EACvB,QAAA,kBAAAF,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA,EACrC,CAAA;AAAA,sBACAA,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,IAACC,IAAAA,EAAA,EAAM,iBAAO,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,KAAK,CAAA,EAAE,CAAA;AAAA,sBAC9CD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAQ,gBAAM,MAAA,EAAO;AAAA,KAAA,EAAA,EARzB,KAAA,CAAM,IAShB,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAgBA,SAAS,qBAAA,CAAsB,QAAqB,WAAA,EAAoC;AACtF,EAAA,MAAM,YAAA,GAAe,QAAA;AACrB,EAAA,MAAM,WAAA,GAAc,OAAA;AACpB,EAAA,MAAM,YAAA,GAAe,QAAA;AAIrB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,QAAQ,EAAE,CAAA;AAGpD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,MAAA,EAAQ,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAGnF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,MAAA,EAAQ,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,MAAM,CAAC,CAAA;AAEvF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAMA,SAAS,MAAA,CAAO,KAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,GAAG,CAAA;AAC9B;ACzGO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA6C;AAC3C,EAAA,QAAA,CAAS,CAACE,MAAAA,KAAU;AAElB,IAAA,MAAM,gBAAgB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,SAASA,MAAK,CAAA;AAC9D,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,CAAS,cAAc,KAAK,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAASA,MAAK,CAAA;AAChE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,aAAa,IAAI,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,uBACEC,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBACpBD,GAAAA,CAACE,GAAAA,EAAA,EAAI,WAAW,CAAA,EAAG,GAAA,EAAK,CAAA,EACrB,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAC,MAAA,qBACZE,IAAAA,CAACH,MAAA,EACE,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,IAAA,oBACNG,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAACH,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAE,MAAA,CAAO,IAAA;AAAA,UAAK;AAAA,SAAA,EAAC,CAAA;AAAA,QAAQ;AAAA,OAAA,EAC5C,CAAA;AAAA,MAED,MAAA,CAAO;AAAA,KAAA,EAAA,EANC,MAAA,CAAO,KAOlB,CACD,CAAA,EACH,CAAA;AAAA,IACC,UAAU,MAAA,CAAO,MAAA,GAAS,qBACzBD,GAAAA,CAACE,KAAA,EAAI,SAAA,EAAW,GAAG,GAAA,EAAK,CAAA,EACrB,iBAAO,GAAA,CAAI,CAAC,0BACXE,IAAAA,CAACH,MAAA,EACC,QAAA,EAAA;AAAA,sBAAAG,IAAAA,CAACH,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,KAAA,CAAM,IAAA;AAAA,QAAK;AAAA,OAAA,EAAC,CAAA;AAAA,MAAO,GAAA;AAAA,MAAE,KAAA,CAAM;AAAA,KAAA,EAAA,EADvC,KAAA,CAAM,IAEjB,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC1CO,SAAS,aAAA,CAAc;AAAA,EAC5B,aAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,IAAUI,MAAA,CAAA,QAAA,iBAAsB,IAAI,KAAK,CAAA;AACjF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,gBAAS,CAAC,CAAA;AAKtD,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,WAAA,CAAY,CAAC,SAAA,KAAsB;AAC3D,IAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,QAAAA,CAAS,CAACH,MAAAA,EAAO,GAAA,KAAQ;AAEvB,IAAA,IAAIA,WAAU,GAAA,EAAK;AACjB,MAAA,iBAAA,CAAkB,IAAI,IAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC3D,MAAA;AAAA,IACF;AAGA,IAAA,IAAIA,WAAU,GAAA,EAAK;AACjB,MAAA,MAAA,EAAO;AACP,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,IAAA,CAAKA,MAAK,CAAA,EAAG;AACzB,MAAA,MAAM,GAAA,GAAM,QAAA,CAASA,MAAAA,EAAO,EAAE,CAAA,GAAI,CAAA;AAClC,MAAA,IAAI,GAAA,GAAM,cAAc,MAAA,EAAQ;AAE9B,QAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,QACxB;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAIA,MAAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,EAAQ;AACnC,MAAA,MAAM,WAAW,QAAA,CAASA,MAAAA,CAAM,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAChD,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,IAAI,QAAA,IAAY,CAAA,IAAK,QAAA,GAAW,UAAA,CAAW,MAAA,EAAQ;AAEjD,QAAA,MAAM,SAAA,GAAY,WAAW,QAAQ,CAAA;AACrC,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,MAAM,WAAA,GAAwB,MAAA,CAAO,SAAS,CAAA,IAAK,EAAC;AAEpD,UAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,cAAc,CAAA;AAC1C,UAAA,WAAA,CAAY,QAAQ,CAAC,CAAA,KAAc,WAAA,CAAY,GAAA,CAAI,CAAC,CAAC,CAAA;AACrD,UAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,QAC/B;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAGA,IAAA,IAAIA,WAAU,GAAA,EAAK;AAEjB,MAAA,MAAM,YAAA,GAAe,cAAc,WAAW,CAAA;AAC9C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,WAAA,CAAY,aAAa,IAAI,CAAA;AAAA,MAC/B;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,SAAA,EAAW;AACjB,MAAA,cAAA,CAAe,KAAK,GAAA,CAAI,aAAA,CAAc,SAAS,CAAA,EAAG,WAAA,GAAc,CAAC,CAAC,CAAA;AAClE,MAAA;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,uBACEC,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EAEjB,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,YAAA,EAAc,aAAA,CAAc,MAAA,EAAQ,CAAA;AAAA,oBAE5CA,GAAAA,CAACE,GAAAA,EAAA,EAAI,SAAS,CAAA,EAEZ,QAAA,kBAAAF,GAAAA,CAAC,UAAA,EAAA,EAAW,QAAQ,aAAA,EAAe,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,gBAAgB,CAAA,EACjF,CAAA;AAAA,IAGC,WAAA,CAAY,MAAA,GAAS,CAAA,oBACpBI,IAAAA,CAACF,KAAA,EAAI,OAAA,EAAS,CAAA,EAAG,aAAA,EAAc,QAAA,EAC7B,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,MAC5B,WAAA,CAAY,IAAI,CAAC,CAAA,qBAChBG,IAAAA,CAACH,IAAAA,EAAA,EAAkB,QAAA,EAAQ,IAAA,EACxB,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK,SAAA;AAAA,QAAG,CAAA,CAAE,IAAA;AAAA,QAAK,aAAA;AAAA,QAAY,MAAA,CAAO,CAAA,CAAE,GAAA,IAAO,CAAC,CAAA;AAAA,QAAE;AAAA,OAAA,EAAA,EADtC,CAAA,CAAE,IAEb,CACD;AAAA,KAAA,EACH,CAAA;AAAA,oBAIFD,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,uBAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,UAChD,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,MAAM,KAAA,EAAM;AAAA,UACnD,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAA;AAAI,SACjD;AAAA,QACA,MAAA,EACE,SACI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,MAAO;AAAA,UACpC,IAAA,EAAM,CAAA,CAAA,EAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA;AAAA,UACvB,KAAA,EAAO;AAAA,UACP,CAAA,GACF,MAAA;AAAA,QAEN,UAAU,MAAM;AAAA,QAEhB;AAAA;AAAA,KACF;AAAA,oBAGAI,IAAAA,CAACH,IAAAA,EAAA,EAAK,OAAM,MAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,cAAA,CAAe,IAAA;AAAA,MAAK;AAAA,KAAA,EAAkC;AAAA,GAAA,EAC5E,CAAA;AAEJ;AChKO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA6C;AAC3C,EAAA,uBACED,GAAAA,CAACE,GAAAA,EAAA,EAAI,WAAA,EAAY,QAAA,EAAS,QAAA,EAAU,CAAA,EAClC,QAAA,kBAAAE,IAAAA,CAACH,IAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAG,IAAAA,CAACH,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MAAY;AAAA,KAAA,EAAU,CAAA;AAAA,IACzC,MAAA;AAAA,oBACDG,IAAAA,CAACH,IAAAA,EAAA,EAAK,OAAM,QAAA,EAAS,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MAAY;AAAA,KAAA,EAAU,CAAA;AAAA,IAC1C,MAAA;AAAA,oBACDG,IAAAA,CAACH,IAAAA,EAAA,EAAK,OAAM,KAAA,EAAM,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MAAS;AAAA,KAAA,EAAO,CAAA;AAAA,IACjC,MAAA;AAAA,oBACDG,IAAAA,CAACH,IAAAA,EAAA,EAAK,OAAM,MAAA,EAAO,QAAA,EAAA;AAAA,MAAA,WAAA;AAAA,MAAU;AAAA,KAAA,EAAQ;AAAA,GAAA,EACvC,CAAA,EACF,CAAA;AAEJ;ACNO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA,EAAAM,kBAAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAmB,SAAS,CAAA;AAC5D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,MAAA,CAAA,QAAA,CAAqB;AAAA,IACvD,WAAW,EAAC;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,SAAS;AAAC,GACX,CAAA;AACD,EAAA,MAAM,CAAC,WAAA,EAAa,aAAa,CAAA,GAAU,gBAAS,KAAK,CAAA;AAGzD,EAAA,MAAM,UAAA,GAAmB,cAAO,OAAO,CAAA;AACvC,EAAM,iBAAU,MAAM;AACpB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,UAAU,SAAA,EAAW;AAGzB,IAAA,MAAMC,aAAAA,GAAe,OAAO,YAAY,CAAA;AACxC,IAAA,IAAI,CAACA,aAAAA,EAAc;AAEjB,MAAA,UAAA,CAAW,WAAW,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,UAAU,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,WAAA,CAAYA,aAAY,CAAA,CACrB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,QAAA,CAAS,YAAY,CAAA;AAAA,MACvB,CAAA,MAAO;AAEL,QAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,UACpB,GAAG,IAAA;AAAA,UACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,QAAQA,aAAY;AAAA,SACvC,CAAE,CAAA;AACF,QAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,IAAI,SAAA,EAAW;AAGf,MAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,QACpB,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,QAAQA,aAAY;AAAA,OACvC,CAAE,CAAA;AACF,MAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAO,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAC,CAAA;AAGzD,EAAAF,QAAAA;AAAA,IACE,CAACH,QAAO,GAAA,KAAQ;AACd,MAAA,IAAI,UAAU,YAAA,EAAc;AAG5B,MAAA,MAAMK,aAAAA,GAAe,OAAO,YAAY,CAAA;AACxC,MAAA,IAAI,CAACA,aAAAA,EAAc;AAGnB,MAAA,IAAIL,MAAAA,CAAM,WAAA,EAAY,KAAM,GAAA,IAAO,IAAI,MAAA,EAAQ;AAC7C,QAAAI,kBAAAA,CAAkBC,aAAY,CAAA,CAC3B,IAAA,CAAK,MAAM;AACV,UAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,YACpB,GAAG,IAAA;AAAA,YACH,SAAA,EAAW,CAAC,GAAG,IAAA,CAAK,WAAWA,aAAY;AAAA,WAC7C,CAAE,CAAA;AACF,UAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAClC,UAAA,QAAA,CAAS,SAAS,CAAA;AAAA,QACpB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,UAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,YACpB,GAAG,IAAA;AAAA,YACH,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,SAASA,aAAY;AAAA,WACzC,CAAE,CAAA;AACF,UAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAClC,UAAA,QAAA,CAAS,SAAS,CAAA;AAAA,QACpB,CAAC,CAAA;AAAA,MACL;AAGA,MAAA,IAAIL,MAAAA,CAAM,WAAA,EAAY,KAAM,GAAA,EAAK;AAC/B,QAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,UACpB,GAAG,IAAA;AAAA,UACH,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,SAASK,aAAY;AAAA,SACzC,CAAE,CAAA;AACF,QAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,EAAE,QAAA,EAAU,KAAA,KAAU,YAAA;AAAa,GACrC;AAGA,EAAA,MAAM,YAAA,GAAe,OAAO,YAAY,CAAA;AAExC,EAAA,uBACEJ,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EAEjB,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,QAAQ,SAAA,CAAU,MAAA;AAAA,QAC7B,MAAA,EAAQ,QAAQ,MAAA,CAAO,MAAA;AAAA,QACvB,SAAA,EAAW,OAAO,MAAA,GAAS,YAAA;AAAA,QAC3B,OAAA,EAAS,QAAQ,OAAA,CAAQ;AAAA;AAAA,KAC3B;AAAA,oBAEAI,IAAAA,CAACF,GAAAA,EAAA,EAAI,SAAS,CAAA,EACX,QAAA,EAAA;AAAA,MAAA,KAAA,KAAU,SAAA,IAAa,YAAA,oBACtBE,IAAAA,CAACF,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAF,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,wBACfI,IAAAA,CAACH,IAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAU,YAAA;AAAA,UAAa;AAAA,SAAA,EAAG;AAAA,OAAA,EAClC,CAAA;AAAA,MAGD,KAAA,KAAU,gBAAgB,YAAA,oBACzBG,KAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAQ,QAAA,EAAA,sBAAA,EAAe,CAAA;AAAA,wBACnCG,IAAAA,CAACH,IAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,yBAAA;AAAA,UAAwB,YAAA;AAAA,UAAa;AAAA,SAAA,EAAS;AAAA,OAAA,EACtD,CAAA;AAAA,MAGD,UAAU,UAAA,oBACTG,KAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAQ,QAAA,EAAA,6BAAA,EAAsB,CAAA;AAAA,wBAC1CG,IAAAA,CAACH,IAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,aAAA;AAAA,UACQ,QAAQ,SAAA,CAAU,MAAA;AAAA,UAAO,YAAA;AAAA,UAAW,QAAQ,MAAA,CAAO,MAAA;AAAA,UAAO,YAAA;AAAA,UAAW,GAAA;AAAA,UAChF,QAAQ,OAAA,CAAQ;AAAA,SAAA,EACnB;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,SAAS,aAAA,GAAoC;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAEhE,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,QAAA,CAAS,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,OAAO,MAAM,CAAA;AAAA,IACzC,GAAG,EAAE,CAAA;AACL,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,uBAAOD,IAACC,IAAAA,EAAA,EAAK,OAAM,MAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EAAE,CAAA;AAC3C;AC7JO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA,EAAAM,kBAAAA;AAAA,EACA,WAAA,EAAAE,YAAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAA,EAAO;AAExB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAUC,MAAA,CAAA,QAAA,CAAgB,WAAA,GAAc,YAAY,WAAW,CAAA;AACrF,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,IAAUA,MAAA,CAAA,QAAA,CAAmB,WAAA,IAAe,EAAE,CAAA;AACtF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAqB;AAAA,IACvD,WAAW,EAAC;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,SAAS;AAAC,GACX,CAAA;AAGD,EAAA,MAAM,aAAA,GAAsBA,MAAA,CAAA,OAAA;AAAA,IAC1B,MAAM,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAAA,IAClD,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,OAAA;AAAA,IACxB,MAAM,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAAA,IAClD,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,MAAM,YAAA,GAAqBA,MAAA,CAAA,WAAA;AAAA,IACzB,CAAC,QAAA,KAAuB;AACtB,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,EAAK;AACL,QAAA;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAGA,EAAA,MAAM,iBAAA,GAA0BA,MAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,UAAA,KAA2B;AAC1B,MAAA,KAAA,CAAM,YAAY;AAChB,QAAA,UAAA,CAAW,UAAU,CAAA;AAGrB,QAAA,IAAI,WAAW,MAAA,CAAO,MAAA,KAAW,KAAK,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA,EAAG;AAErE,UAAA,MAAMD,aAAY,EAAC,EAAG,EAAC,EAAG,EAAE,CAAA;AAAA,QAC9B,CAAA,MAAO;AAEL,UAAA,MAAMA,aAAY,UAAA,CAAW,SAAA,EAAW,UAAA,CAAW,MAAA,EAAQ,EAAE,CAAA;AAAA,QAC/D;AAEA,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA,MACrB,CAAA,GAAG;AAAA,IACL,CAAA;AAAA,IACA,CAACA,YAAW;AAAA,GACd;AAGA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,uBACEL,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAQ,QAAA,EAAA,8CAAA,EAAuC,CAAA;AAAA,MAC1D,WAAA,CAAY,SAAS,CAAA,oBACpBG,KAACH,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAE,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,MAAA;AAAA,QAAO;AAAA,OAAA,EAA2B;AAAA,KAAA,EAElE,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEG,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,IAAA,KAAA,KAAU,+BACTF,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,QAAA,EAAU,YAAA;AAAA,QACV,QAAQ,MAAM;AACZ,UAAA,IAAA,EAAK;AAAA,QACP;AAAA;AAAA,KACF;AAAA,IAGD,KAAA,KAAU,6BACTA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,WAAA;AAAA,QACA,iBAAA,EAAmBO,kBAAAA;AAAA,QACnB,UAAA,EAAY;AAAA;AAAA,KACd;AAAA,IAGD,UAAU,UAAA,oBACTH,KAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,QAAQ,SAAA,CAAU,MAAA;AAAA,UAC7B,MAAA,EAAQ,QAAQ,MAAA,CAAO,MAAA;AAAA,UACvB,SAAA,EAAW,CAAA;AAAA,UACX,OAAA,EAAS,QAAQ,OAAA,CAAQ;AAAA;AAAA,OAC3B;AAAA,sBAEAA,GAAAA,CAACE,GAAAA,EAAA,EAAI,OAAA,EAAS,CAAA,EACX,QAAA,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,KAAW,CAAA,mBACzDF,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,0CAAA,EAAmC,CAAA,mBAEvDG,IAAAA,CAACF,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAChB,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,oBACvBE,KAACH,IAAAA,EAAA,EAAK,OAAM,KAAA,EAAM,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACb,QAAQ,MAAA,CAAO,MAAA;AAAA,UAAO,oBAAA;AAAA,UAAmB,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI;AAAA,SAAA,EACtE,CAAA;AAAA,wBAEFD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,8DAAA,EAA4D;AAAA,OAAA,EACpE,CAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACvIA,SAAS,eAAA,CACP,WAAA,EACA,kBAAA,EACA,UAAA,EACoB;AACpB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,gBAAgB,kBAAA,EAAoB;AAClD,IAAA,OAAO,qBAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,CAAW,OAAA,EAAQ,KAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAG,CAAA;AAExF,EAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AASA,eAAsB,oBAAoB,MAAA,EAAwC;AAEhF,EAAA,IAAI,gBAAA,GAA4C,IAAA;AAChD,EAAA,IAAI;AACF,IAAA,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA;AAAA,EAC5E,SAAS,GAAA,EAAK;AAEZ,IAAA,IAAI,eAAe,KAAA,IAAS,CAAC,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC3D,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,MAAM,YAAA,GAAe,gBAAA,EAAkB,YAAA,IAAgB,EAAC;AAExD,EAAA,MAAM,UAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,CAAC,WAAW,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAEpE,IAAA,IAAI,CAAC,YAAY,QAAA,EAAU;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAM,kBAAA,CAAmB;AAAA,MACjD,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,GAAI,WAAA,CAAY,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA;AAAO,KACxD,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,eAAA;AAAA,MAClB,EAAE,aAAA,EAAe,GAAA,EAAK,YAAA,EAAc,WAAW,EAAA,EAAG;AAAA,MAClD;AAAA,KACF;AAGA,IAAA,MAAM,MAAA,GAAS,eAAA;AAAA,MACb,WAAA;AAAA,MACA,iBAAA,CAAkB,WAAA;AAAA,MAClB,OAAO,QAAA,CAAS;AAAA,KAClB;AAGA,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAClD,MAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,CAAW,OAAA,EAAQ,KAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAG,CAAA;AAAA,IAC9E;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,MAAA;AAAA,MACA,QAAQ,kBAAA,CAAmB,MAAA,EAAQ,GAAA,EAAK,MAAA,CAAO,SAAS,UAAU,CAAA;AAAA,MAClE,oBAAoB,iBAAA,CAAkB,WAAA;AAAA,MACtC,qBAAqB,WAAA,EAAa,WAAA;AAAA,MAClC,YAAY,WAAA,EAAa,UAAA;AAAA,MACzB;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAmDO,SAAS,kBAAA,CACd,MAAA,EACA,GAAA,EACA,UAAA,EACQ;AACR,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,MAAA,CAAO,GAAA,IAAO,CAAC,CAAC,CAAA,SAAA,CAAA;AAAA,IACrC,KAAK,mBAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT,KAAK,qBAAA;AACH,MAAA,OAAO,uBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,GAAA,IAAO,CAAC,CAAC,CAAA,gBAAA,EAAmB,MAAA,CAAO,UAAA,IAAc,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,IACvE,KAAK,mBAAA;AACH,MAAA,OAAO,+BAAA;AAAA,IACT,KAAK,uBAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;ACpLO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,cAAc,cAAc,CAAA;AACzD;AAMA,eAAsB,WAAA,GAAuC;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,cAAA,IAAkB,OAAO,CAAA;AACxD,IAAA,MAAM,IAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGxC,IAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,eAAsB,YAAY,OAAA,EAAiC;AACjE,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,GAAA,GAAMU,QAAQ,WAAW,CAAA;AAG/B,EAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAGpC,EAAA,MAAM,SAAA,CAAU,aAAa,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AACxE;AAMA,eAAsB,YAAA,GAA8B;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,gBAAgB,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAmCA,SAAS,eAAe,IAAA,EAAgC;AACtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,MAAM,GAAA,GAAM,IAAA;AAEZ,EAAA,OACE,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,IACvB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAC1B,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS,QAAQ,CAAA,IACrD,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAC3B,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,CAAC,IAAA,KAAS,OAAO,SAAS,QAAQ,CAAA,IACtD,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IACxB,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS,QAAQ,CAAA,IACnD,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAC3B,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS,QAAQ,CAAA;AAE1D;ACvEA,eAAsB,eAAe,OAAA,EAA4C;AAE/E,EAAA,MAAM,MAAA,GAAS,MAAMC,UAAAA,EAAW;AAGhC,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,MAAM,CAAA;AAGlD,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,EAAY;AAClC,IAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC3C,MAAA,WAAA,GAAc,OAAA,CAAQ,SAAA;AACtB,MAAA,GAAA,CAAI,CAAA,sBAAA,EAAyB,MAAA,CAAO,WAAA,CAAY,MAAM,CAAC,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC9E;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,YAAA,CAAa,SAAA,EAAW,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA;AAC9C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAClE,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,uCAAuC,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,EAAsB;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,gFAAgF,CAAA;AACtF,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,WAAA,GAAc,mBAAmB,MAAM,CAAA;AAG7C,EAAA,MAAM,mBAAA,GAAsB,yBAAyB,MAAM,CAAA;AAG3D,EAAA,MAAM,gBAAgB,kBAAA,EAAmB;AAGzC,EAAA,MAAM,mBAAA,GAAsB;AAAA,IAC1B,SAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA,EAAmB,mBAAA;AAAA,IACnB,WAAA,EAAa,aAAA;AAAA,IACb,GAAI,WAAA,KAAgB,MAAA,IAAa,EAAE,WAAA;AAAY,GACjD;AAEA,EAAA,MAAM,EAAE,eAAc,GAAI,MAAA,iBAAOZ,GAAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,mBAAA,EAAqB,CAAE,CAAA;AAG5E,EAAA,MAAM,aAAA,EAAc;AACtB;AAWA,SAAS,YAAA,CAAa,SAAA,EAA0B,MAAA,EAAgB,aAAA,EAA8B;AAC5F,EAAA,IAAI,gBAAgB,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAEhE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,GAAA,GAAM,aAAA,CAAc,QAAQ,KAAA,EAAO,IAAI,CAAA,GAAI,GAAA,EAAK,GAAG,CAAA;AAC5E,IAAA,aAAA,GAAgB,aAAA,CAAc,OAAO,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,kDAAkD,CAAA;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,aAAA,CAAc,MAAM,CAAC,CAAA,UAAA,CAAY,CAAA;AACzD,EAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC9B,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EACnD,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA,CAAI,iCAAiC,CAAA;AACrC,EAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC/B;AASA,SAAS,mBAAmB,MAAA,EAAqD;AAC/E,EAAA,OAAO,OAAO,SAAA,KAAwC;AAEpD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,KAAA,CAAM,CAAA,OAAA,EAAU,SAAS,CAAA,qBAAA,CAAuB,CAAA;AAChD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,GAAU,WAAA,CAAY,OAAA,IAAW,MAAA,CAAO,QAAA,CAAS,cAAA;AACrD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,KAAA,CAAM,CAAA,gCAAA,EAAmC,SAAS,CAAA,CAAA,CAAG,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAAK,YAAY,KAAA,EAAO;AACrD,MAAA,OAAA,GAAU,QAAQ,UAAA,CAAW,UAAA,EAAY,YAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IACtE;AAEA,IAAA,GAAA,CAAI,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAGzB,IAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,OAAO,CAAA;AAC7C,IAAA,OAAO,QAAA,KAAa,CAAA;AAAA,EACtB,CAAA;AACF;AASA,SAAS,yBAAyB,MAAA,EAAkD;AAClF,EAAA,OAAO,OAAO,SAAA,KAAqC;AAEjD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,SAAS,CAAA,WAAA,CAAa,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,CAAC,YAAY,QAAA,EAAU;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAChE;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAMa,kBAAAA,CAAmB;AAAA,MACjD,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,GAAI,WAAA,CAAY,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA;AAAO,KACxD,CAAA;AAGD,IAAA,MAAM,cAAc,iBAAA,CAAkB;AAAA,MACpC,KAAA,EAAO,SAAA;AAAA,MACP,aAAa,iBAAA,CAAkB,WAAA;AAAA,MAC/B,OAAA,EAAS,WAAA,CAAY,OAAA,IAAW,MAAA,CAAO,SAAS,cAAA,IAAkB,EAAA;AAAA,MAClE,UAAA,EAAe,aAAS,CAAE;AAAA,KAC3B,CAAA;AAGD,IAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,CAAS,gBAAA;AACzC,IAAA,MAAM,eAAe,MAAMC,gBAAAA,CAAiB,gBAAgB,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9E,IAAA,MAAM,oBAAA,GAAuB,YAAA,EAAc,YAAA,IAAgB,EAAC;AAG5D,IAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,oBAAA,EAAsB,WAAW,CAAA;AAG3E,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,MAAA,WAAA,GAAc,oBAAoB,MAAA,CAAO;AAAA,QACvC,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,IAAA;AAAA,QAClC,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,WAAW;AAAC,OAClD,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,kBAAkB,wBAAA,EAAyB;AAAA,MAC3F,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,SAAS,WAAA,EAAa;AAC3D,QAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,QAAA,IAAY,uBAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,MACtF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,IAAI,qBAAA,EAAsB;AACxC,MAAA,MAAA,GAAS,wBAAA,EAAyB;AAAA,IACpC;AAGA,IAAA,IAAI,CAAE,MAAM,WAAA,CAAY,SAAA,CAAU,MAAM,CAAA,EAAI;AAC1C,MAAA,MAAM,eAAe,WAAA,CAAY,WAAA;AACjC,MAAA,MAAM,aAAA,GACJ,WAAA,CAAY,IAAA,KAAS,YAAA,GACjB,qDAAA,GACA,qDAAA;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,YAAY,CAAA,EAAA,EAAK,aAAa,CAAA,CAAE,CAAA;AAAA,IAC9E;AAGA,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,QAAA,EAAU,gBAAA;AAAA,MACV,YAAA,EAAc,eAAA;AAAA,MACd,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,GAAA,CAAI,CAAA,+BAAA,EAA6B,SAAS,CAAA,CAAE,CAAA;AAAA,EAC9C,CAAA;AACF;AAQA,SAAS,kBAAA,GAIU;AACjB,EAAA,OAAO,OAAO,SAAA,EAAqB,MAAA,EAAkB,SAAA,KAAuC;AAC1F,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,IAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AAE3E,MAAA,MAAM,YAAA,EAAa;AAAA,IACrB,CAAA,MAAO;AAEL,MAAA,MAAM,WAAA,CAAe;AAAA,QACnB,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC,UAAU,CAAC,GAAG,WAAW,GAAG,MAAA,EAAQ,GAAG,SAAS,CAAA;AAAA,QAChD,SAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF;AASA,eAAe,eAAe,OAAA,EAAkC;AAC9D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,QAAAA,KAAY;AAC9B,IAAA,MAAM,MAAA,GAASC,MAAkB,OAAO,CAAA;AACxC,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAQ,CAAA;AAE1E,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,KAAA,CAAM,eAAe,CAAA;AACrB,MAAAD,SAAQ,CAAC,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,GAAG,IAAI,CAAA,GAAI,UAAA;AAC9B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAAA,SAAQ,CAAC,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,MAAM,EAAE,KAAA,EAAO,WAAW,CAAA;AAE1D,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAAA,QAAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACtC,MAAAA,SAAQ,CAAC,CAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAQA,eAAe,qBAAA,GAA0C;AACvD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,EAAO,CAAC,QAAA,EAAU,aAAa,CAAA,EAAG;AAAA,MACpD,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,KACjC,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACxC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AACtB,MAAAA,QAAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AACtB,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACnUO,IAAM,UAAA,GAAa,IAAIhB,OAAAA,CAAQ,KAAK,EACxC,WAAA,CAAY,sCAAsC,CAAA,CAClD,MAAA,CAAO,sBAAsB,gEAAgE,CAAA,CAC7F,MAAA,CAAO,WAAA,EAAa,oCAAoC,CAAA,CACxD,MAAA,CAAO,aAAA,EAAe,wCAAwC,CAAA,CAC9D,MAAA,CAAO,WAAA,EAAa,uCAAuC,EAC3D,MAAA,CAAO,gBAAA,EAAkB,4BAA4B,CAAA,CACrD,OAAO,oBAAA,EAAsB,uCAAuC,CAAA,CACpE,MAAA,CAAO,OAAO,OAAA,KAAwB;AACrC,EAAA,MAAM,SAAS,OAAO,CAAA;AACxB,CAAC,CAAA;AA4BH,eAAe,SAAS,OAAA,EAAoC;AAC1D,EAAA,IAAI;AAEF,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,MAAM,cAAc,OAAO,CAAA;AAC3B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,cAAc,OAAO,CAAA;AAC3B,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,cAAA,CAAe;AAAA,MACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AAeA,SAAS,YAAA,CAAa,MAAA,EAAgB,YAAA,EAAuB,UAAA,EAA+B;AAE1F,EAAA,IAAI,OAAA,GAAU,YAAA,IAAgB,MAAA,CAAO,QAAA,CAAS,cAAA;AAE9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,KAAA,CAAM,kEAAkE,CAAA;AACxE,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,EAAY;AAC9C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACjC,IAAA,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,KAAK,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,OAAA;AACT;AAoBA,SAAS,aAAa,OAAA,EAAgC;AACpD,EAAA,MAAM,MAAA,GAASiB,MAAkB,OAAO,CAAA;AAIxC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAA2B;AAC3D,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA;AAAA,EAC1B,CAAC,CAAA;AAED,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,CAAC,UAAA,EAAY,GAAG,IAAI,CAAA,GAAI,UAAA;AAG9B,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,EAAE,YAAY,IAAA,EAAK;AAC5B;AAWA,eAAeC,gBAAe,OAAA,EAAkC;AAC9D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACF,QAAAA,KAAY;AAC9B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,aAAa,OAAO,CAAA;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,wCAAwC,CAAA;AAAA,MAChD;AACA,MAAAA,SAAQ,CAAC,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQG,KAAAA,CAAM,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA,EAAM;AAAA,MAClD,KAAA,EAAO;AAAA;AAAA,KACR,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAAH,QAAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACjD,MAAAA,SAAQ,CAAC,CAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAQA,eAAeI,sBAAAA,GAA0C;AACvD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACJ,QAAAA,KAAY;AAC9B,IAAA,MAAM,QAAQG,KAAAA,CAAM,KAAA,EAAO,CAAC,QAAA,EAAU,aAAa,CAAA,EAAG;AAAA,MACpD,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,KACjC,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACxC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AAEtB,MAAAH,QAAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AAEtB,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAQA,eAAe,cAAc,OAAA,EAAoC;AAC/D,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,KAAA,CAAM,wCAAwC,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,MAAA,GAAS,MAAMH,UAAAA,EAAW;AAGhC,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjC,IAAA,KAAA,CAAM,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,qBAAA,CAAuB,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,OAAA,GAAU,MAAMO,sBAAAA,EAAsB;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,gFAAgF,CAAA;AACtF,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAEnD,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,OAAA,CAAQ,kBAAkB,CAAA;AAC1B,EAAA,GAAA;AAAA,IACE;AAAA,mBAAA,EAAwB,MAAA,CAAO,SAAS,gBAAgB,CAAA,uCAAA;AAAA,GAC1D;AACF;AAQA,eAAe,cAAc,OAAA,EAAoC;AAC/D,EAAA,MAAM,MAAA,GAAS,MAAMP,UAAAA,EAAW;AAChC,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,MAAM,CAAA;AAClD,EAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAElE,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,uCAAuC,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,WAAA,GAAc,aAAA;AAClB,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,GAAI,GAAA,EAAK,GAAG,CAAA;AAC7E,IAAA,WAAA,GAAc,aAAA,CAAc,OAAO,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAE5D,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,GAAA,CAAI,CAAA,wBAAA,EAA2B,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,WAAA,CAAY,MAAM,CAAC,CAAA,UAAA,CAAY,CAAA;AACvD,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,OAAA,GAAU,MAAMO,sBAAAA,EAAsB;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,gFAAgF,CAAA;AACtF,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAGA,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD;AAEA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,OAAA,CAAQ,uBAAuB,CAAA;AAC/B,EAAA,GAAA;AAAA,IACE;AAAA,mBAAA,EAAwB,MAAA,CAAO,SAAS,gBAAgB,CAAA,uCAAA;AAAA,GAC1D;AACF;AAUA,eAAe,cAAA,CACb,SAAA,EACA,MAAA,EACA,OAAA,EACe;AAEf,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAC3C,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,KAAA,CAAM,CAAA,OAAA,EAAU,SAAS,CAAA,qBAAA,CAAuB,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,CAAC,YAAY,QAAA,EAAU;AACzB,IAAA,KAAA,CAAM,CAAA,OAAA,EAAU,SAAS,CAAA,yBAAA,CAA2B,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AAEA,EAAA,GAAA,CAAI;AAAA,mBAAA,EAAwB,SAAS,CAAA;AAAA,CAAQ,CAAA;AAG7C,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,GAAI,WAAA,CAAY,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA;AAAO,GACzD;AACA,EAAA,MAAM,iBAAA,GAAoB,MAAMN,kBAAAA,CAAmB,kBAAkB,CAAA;AACrE,EAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,iBAAA,CAAkB,WAAW,CAAA,CAAE,CAAA;AACvD,EAAA,OAAA,CAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,iBAAA,CAAkB,SAAS,CAAC,CAAA,CAAE,CAAA;AAGvD,EAAA,MAAM,UAAU,YAAA,CAAa,MAAA,EAAQ,WAAA,CAAY,OAAA,EAAS,YAAY,KAAK,CAAA;AAC3E,EAAA,GAAA,CAAI,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AACzB,EAAA,GAAA,CAAI,EAAE,CAAA;AAGN,EAAA,MAAM,QAAA,GAAW,MAAMI,eAAAA,CAAe,OAAO,CAAA;AAE7C,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAE,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAA,CAAQ,eAAe,CAAA;AAGvB,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,EAAO;AAC5B,IAAA,GAAA,CAAI,oCAAoC,CAAA;AACxC,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,aAAA,CAAc;AAAA,IACvC,OAAA,EAAS,oBAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,cAAcV,iBAAAA,CAAkB;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,aAAa,iBAAA,CAAkB,WAAA;AAAA,IAC/B,OAAA;AAAA,IACA,UAAA,EAAea,aAAS,CAAE;AAAA,GAC3B,CAAA;AAGD,EAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,CAAS,gBAAA;AACzC,EAAA,MAAM,YAAA,GAAe,MAAMN,gBAAAA,CAAiB,gBAAgB,CAAA;AAC5D,EAAA,MAAM,oBAAA,GAAuB,YAAA,EAAc,YAAA,IAAgB,EAAC;AAG5D,EAAA,MAAM,eAAA,GAAkBO,iBAAAA,CAAkB,oBAAA,EAAsB,WAAW,CAAA;AAG3E,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,IAAA,WAAA,GAAcC,oBAAoB,MAAA,CAAO;AAAA,MACvC,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,IAAA;AAAA,MAClC,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,WAAW;AAAC,KAClD,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,IAAA,KAAS,YAAA,EAAc;AACrD,MAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,kBAAkBC,wBAAAA,EAAyB;AAAA,IAC3F,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,SAAS,WAAA,EAAa;AAC3D,MAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,QAAA,IAAY,uBAAA;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,IACtF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,WAAA,GAAc,IAAIC,qBAAAA,EAAsB;AACxC,IAAA,MAAA,GAASD,wBAAAA,EAAyB;AAAA,EACpC;AAGA,EAAA,IAAI,CAAE,MAAM,WAAA,CAAY,SAAA,CAAU,MAAM,CAAA,EAAI;AAC1C,IAAA,KAAA,CAAM,CAAA,yBAAA,EAA4B,WAAA,CAAY,WAAW,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,WAAA,CAAY,SAAS,YAAA,EAAc;AACrC,MAAA,KAAA,CAAM,qDAAqD,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,qDAAqD,CAAA;AAAA,IAC7D;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,EACnC;AAGA,EAAA,MAAME,uBAAAA,CAAwB;AAAA,IAC5B,QAAA,EAAU,gBAAA;AAAA,IACV,YAAA,EAAc,eAAA;AAAA,IACd,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAA,CAAQ,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE,CAAA;AAC9C,EAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,iBAAA,CAAkB,WAAW,CAAA,CAAE,CAAA;AACrD,EAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,WAAA,CAAY,UAAU,CAAA,CAAE,CAAA;AAC9C,EAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,WAAA,CAAY,UAAU,CAAA,CAAE,CAAA;AAG9C,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,aAAA,CAAc,SAAA,EAAW,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAAA,EACzD;AACF;AASA,eAAe,aAAA,CAAc,SAAA,EAAmB,MAAA,EAAgB,MAAA,EAA+B;AAC7F,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA,CAAI,CAAA,OAAA,EAAU,SAAS,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,CAAG,CAAA;AAGxD,EAAA,MAAM,cAAc,mBAAA,EAAoB;AACxC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,IAAA,CAAK,4DAA4D,CAAA;AACjE,IAAA,IAAA,CAAK,gDAAgD,CAAA;AACrD,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,kBAAkB,WAAW,CAAA;AAC9C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,IAAA,CAAK,CAAA,iBAAA,EAAoB,WAAA,CAAY,cAAc,CAAA,2BAAA,CAA6B,CAAA;AAChF,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiBC,iBAAiB,MAAM,CAAA;AAG9C,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,cAAA,EAAgB,MAAA,EAAQ,SAAS,SAAS,CAAA;AAChF,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,IAAA,CAAK,CAAA,qCAAA,EAAwC,MAAM,CAAA,CAAA,CAAG,CAAA;AACtD,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc;AAAA,IACrC,OAAA,EAAS,yBAAyB,MAAM,CAAA,CAAA,CAAA;AAAA,IACxC,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,GAAA,CAAI,uBAAuB,CAAA;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,cAAA,CAAe,KAAA,GAAQ,MAAM,CAAA,EAAG;AACnC,MAAA,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,CAAA,4BAAA,CAA8B,CAAA;AACnD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAGxC,IAAA,MAAM,kBAAkBC,sBAAAA,CAAuB;AAAA,MAC7C,QAAA,EAAU,KAAK,WAAA,CAAY,KAAA;AAAA,MAC3B,GAAI,KAAK,WAAA,CAAY,OAAA,IAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,OAAA;AAAQ,KACpE,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,8BAA8B,QAAQ,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,sBAAsB,QAAQ,CAAA;AAG7C,IAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,aAAA,CAAc,MAAM,CAAA;AAGxD,IAAA,MAAMC,GAAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,IAAA,MAAM,gBAAgB,MAAMA,GAAAA,CAAG,QAAA,CAAS,SAAA,CAAU,SAAS,MAAM,CAAA;AAGjE,IAAA,MAAM,UAAU,OAAA,EAAQ;AAGxB,IAAA,MAAM,OAAO,UAAA,CAAW;AAAA,MACtB,MAAA;AAAA,MACA,aAAa,eAAA,CAAgB,WAAA;AAAA,MAC7B,UAAU,QAAA,CAAS,IAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,IAAA,MAAM,SAAA,GAAYC,cAAc,WAAW,CAAA;AAI3C,IAAA,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA;AAG1B,IAAA,cAAA,CAAe,aAAa,SAAS,CAAA;AAErC,IAAA,OAAA,CAAQ,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAA,CAAG,CAAA;AAC3C,IAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACnC,IAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,sCAAsC,CAAA;AAAA,IAC9C;AAAA,EACF;AACF;AAQA,SAAS,8BACP,QAAA,EAC+C;AAC/C,EAAA,MAAM,EAAE,YAAW,GAAI,QAAA;AAEvB,EAAA,QAAQ,WAAW,IAAA;AAAM,IACvB,KAAK,MAAA;AACH,MAAA,OAAOP,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,EAAE,cAAA,EAAgB,UAAA,CAAW,IAAA;AAAK,OAC5C,CAAA;AAAA,IACH,KAAK,UAAA;AACH,MAAA,OAAOA,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,SAAS,UAAA,CAAW;AAAA;AACtB,OACD,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAOA,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,UAAU,UAAA,CAAW,IAAA;AAAA,UACrB,OAAO,UAAA,CAAW;AAAA;AACpB,OACD,CAAA;AAAA,IACH,SAAS;AAEP,MAAA,MAAM,gBAAA,GAA0B,UAAA;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAA,CAAO,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;AAQA,SAAS,sBAAsB,QAAA,EAA4B;AACzD,EAAA,MAAM,EAAE,YAAW,GAAI,QAAA;AAEvB,EAAA,QAAQ,WAAW,IAAA;AAAM,IACvB,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IACpB,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,CAAA,EAAI,WAAW,OAAO,CAAA,CAAA;AAAA,IACpD,KAAK,WAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IACpB,SAAS;AACP,MAAA,MAAM,gBAAA,GAA0B,UAAA;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAA,CAAO,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;ACjjBO,SAAS,kBAAkB,KAAA,EAAmD;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,KAAA;AAGhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIQ,SAAe,oBAAoB,CAAA;AAC3D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAA+B,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAA6B,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,iBAAA,EAAmB,mBAAmB,CAAA,GAAIA,QAAAA,EAE/C;AACF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,EAA6B;AAC3E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,EAA6B;AACvE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,uBAAuB,CAAA;AAChE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,uBAAuB,CAAA;AAGhF,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,iBAAiB,YAA2B;AAEhD,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,sBAAA,CAAuB,WAAA,EAAY;AAC7D,QAAA,cAAA,CAAe,WAAW,CAAA;AAE1B,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,WAAA,GAAc,MAAM,sBAAA,CAAuB,YAAA,EAAa;AAC9D,UAAA,WAAA,CAAY,WAAW,CAAA;AAAA,QACzB;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAGA,MAAA,MAAM,mBAAA,GAAsB,yBAAyB,WAAA,EAAY;AACjE,MAAA,oBAAA,CAAqB,mBAAmB,CAAA;AAExC,MAAA,OAAA,CAAQ,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,KAAK,cAAA,EAAe;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,KAAS,kBAAkB,eAAA,EAAiB;AAC9C,MAAA,MAAM,cAAc,YAA2B;AAC7C,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,MAAM,sBAAA,CAAuB,UAAA,CAAW,eAAe,CAAA;AACzE,UAAA,SAAA,CAAU,SAAS,CAAA;AAAA,QACrB,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,QAC1E;AAAA,MACF,CAAA;AAEA,MAAA,KAAK,WAAA,EAAY;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,eAAA,EAAiB,OAAO,CAAC,CAAA;AAGnC,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAwB;AACpD,IAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,MAAA,mBAAA,CAAoB,YAAY,CAAA;AAEhC,MAAA,KAAK,aAAa,YAAY,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,UAAU,WAAA,EAAa;AAChC,MAAA,mBAAA,CAAoB,WAAW,CAAA;AAE/B,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AACxC,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAC,CAAA,CAAE,KAAK,CAAA;AACpC,QAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAA,IAAW,UAAU,gBAAA,EAAkB;AACrC,MAAA,mBAAA,CAAoB,gBAAgB,CAAA;AAEpC,MAAA,OAAA,CAAQ,0BAA0B,CAAA;AAAA,IACpC;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAAC,KAAA,KAAwB;AACnD,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,EACxB,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAwB;AACjD,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EAC3B,CAAA;AAGA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAwB;AACpD,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,KAAK,aAAa,WAAW,CAAA;AAAA,EAC/B,CAAA;AAGA,EAAA,MAAM,4BAAA,GAA+B,CAAC,KAAA,KAAwB;AAC5D,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,KAAK,aAAa,gBAAgB,CAAA;AAAA,EACpC,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,OACnB,QAAA,KACkB;AAClB,IAAA,OAAA,CAAQ,YAAY,CAAA;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,IAAiB,uBAAA,EAAwB;AAErE,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,MAAM,UAAA,GAAa,IAAIP,qBAAAA,EAAsB;AAG7C,QAAA,MAAM,UAAA,GAAyD,EAAE,aAAA,EAAc;AAC/E,QAAA,IAAI,KAAA,CAAM,UAAU,KAAA,CAAA,EAAW;AAC7B,UAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,KAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,eAAA,CAAgB,UAAU,CAAA;AAE1D,QAAA,UAAA,CAAW;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UACV,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,oBAAoB,MAAA,CAAO;AAAA,SAC5B,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AAEnC,QAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,QAAA,EAAU;AAC/B,UAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,QAClE;AAGA,QAAA,MAAM,eAAA,GAAyE;AAAA,UAC7E,KAAA,EAAO,aAAA;AAAA,UACP;AAAA,SACF;AACA,QAAA,IAAI,oBAAoB,KAAA,CAAA,EAAW;AACjC,UAAA,eAAA,CAAgB,OAAA,GAAU,eAAA;AAAA,QAC5B;AAEA,QAAA,MAAM,UAAA,GAAa,IAAI,sBAAA,CAAuB,eAAe,CAAA;AAG7D,QAAA,MAAM,UAAA,GAAyD,EAAE,aAAA,EAAc;AAC/E,QAAA,IAAI,KAAA,CAAM,UAAU,KAAA,CAAA,EAAW;AAC7B,UAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,KAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,eAAA,CAAgB,UAAU,CAAA;AAG1D,QAAA,MAAM,gBAAA,GAAiC;AAAA,UACrC,QAAA,EAAU,WAAA;AAAA,UACV,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,oBAAoB,MAAA,CAAO,kBAAA;AAAA,UAC3B,KAAA,EAAO,aAAA;AAAA,UACP;AAAA,SACF;AACA,QAAA,IAAI,oBAAoB,KAAA,CAAA,EAAW;AACjC,UAAA,gBAAA,CAAiB,OAAA,GAAU,eAAA;AAAA,QAC7B;AAEA,QAAA,UAAA,CAAW,gBAAgB,CAAA;AAAA,MAC7B,CAAA,MAAO;AAEL,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AAEA,QAAA,MAAM,gBAAA,GAAmB,IAAI,wBAAA,CAAyB;AAAA,UACpD,QAAA,EAAU;AAAA,SACX,CAAA;AAGD,QAAA,MAAM,UAAA,GAAyD,EAAE,aAAA,EAAc;AAC/E,QAAA,IAAI,KAAA,CAAM,UAAU,KAAA,CAAA,EAAW;AAC7B,UAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,KAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,eAAA,CAAgB,UAAU,CAAA;AAEhE,QAAA,UAAA,CAAW;AAAA,UACT,QAAA,EAAU,gBAAA;AAAA,UACV,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,oBAAoB,MAAA,CAAO,kBAAA;AAAA,UAC3B,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAAA,IACzE;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,IAAA,uBACExB,GAAAA,CAACE,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EACjB,QAAA,kBAAAE,IAAAA,CAACF,GAAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,KAAK,CAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAF,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACTA,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,6CAAA,EAA2C;AAAA,KAAA,EACnD,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd;AAAA,QACE,KAAA,EAAO,CAAA,kBAAA,EAAqBsB,wBAAAA,EAA0B,CAAA,CAAA,CAAA;AAAA,QACtD,KAAA,EAAO;AAAA;AACT,KACF;AAEA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,gBAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,6BAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,uBACEnB,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,iDAAA,EAA+C,CAAA;AAAA,sBAC1DD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,sBACnBD,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAkB,UAAU,oBAAA,EAAsB;AAAA,KAAA,EAC5D,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACzC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAO,OAAA,CAAQ;AAAA,KACjB,CAAE,CAAA;AAEF,IAAA,uBACEI,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,2BAAA,EAAyB,CAAA;AAAA,sBACpCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,sBACnBD,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAkB,UAAU,mBAAA,EAAqB;AAAA,KAAA,EAC3D,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,uBACEA,GAAAA,CAACE,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EACjB,QAAA,kBAAAE,IAAAA,CAACF,GAAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,KAAK,CAAA,EAC5B,QAAA,EAAA;AAAA,wBAAAF,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,wBACTA,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,mBAAA,EAAiB;AAAA,OAAA,EACzB,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrC,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,OAAO,KAAA,CAAM;AAAA,KACf,CAAE,CAAA;AAEF,IAAA,uBACEG,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,uCAAA,EAAqC,CAAA;AAAA,sBAChDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,sBACnBD,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAkB,UAAU,iBAAA,EAAmB;AAAA,KAAA,EACzD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,uBACEI,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,8BAAA,EAA4B,CAAA;AAAA,sBACvCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,gDAAA,EAA8C,CAAA;AAAA,sBAC7DD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,sBACnBD,GAAAA,CAAC,SAAA,EAAA,EAAU,YAAA,EAAc,QAAA,EAAU,UAAU,oBAAA,EAAsB;AAAA,KAAA,EACrE,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,0BAAA,EAA4B;AACvC,IAAA,uBACEI,IAAAA,CAACF,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,mCAAA,EAAiC,CAAA;AAAA,sBAC5CD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,wDAAA,EAAsD,CAAA;AAAA,sBACrED,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,sBACnBD,GAAAA,CAAC,SAAA,EAAA,EAAU,YAAA,EAAc,gBAAA,EAAkB,UAAU,4BAAA,EAA8B;AAAA,KAAA,EACrF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,uBACEA,GAAAA,CAACE,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EACjB,QAAA,kBAAAE,IAAAA,CAACF,GAAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,KAAK,CAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAF,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACTA,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,gCAAA,EAA8B;AAAA,KAAA,EACtC,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOD,GAAAA,CAACE,GAAAA,EAAA,EAAI,CAAA;AACd;AAaA,eAAsB,qBAAqB,OAAA,EAGjB;AACxB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACa,QAAAA,EAAS,MAAA,KAAW;AAEtC,IAAA,MAAM,KAAA,GAAgC;AAAA,MACpC,UAAA,EAAY,CAAC,MAAA,KAAW;AACtB,QAAA,OAAA,EAAQ;AACR,QAAAA,SAAQ,MAAM,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,OAAA,EAAS,CAACiB,MAAAA,KAAU;AAClB,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAOA,MAAK,CAAA;AAAA,MACd;AAAA,KACF;AAEA,IAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,KAAA,CAAM,gBAAgB,OAAA,CAAQ,aAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,SAAQ,GAAIC,MAAAA,iBAAOjC,GAAAA,CAAC,iBAAA,EAAA,EAAmB,GAAG,KAAA,EAAO,CAAE,CAAA;AAAA,EAC7D,CAAC,CAAA;AACH;;;ACpbO,IAAM,aAAA,GAAgB,IAAID,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,qDAAqD,CAAA,CACjE,MAAA,CAAO,uBAAuB,wBAAwB,CAAA,CACtD,MAAA,CAAO,sBAAA,EAAwB,2CAA2C,CAAA,CAC1E,MAAA;AAAA,EACC,mBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,kBAAkB,sBAAsB,CAAA,CAC/C,OAAO,oBAAA,EAAsB,oCAAoC,CAAA,CACjE,MAAA,CAAO,mBAAA,EAAqB,mBAAmB,EAC/C,MAAA,CAAO,aAAA,EAAe,yBAAyB,CAAA,CAC/C,MAAA,CAAO,oBAAoB,0BAA0B,CAAA,CACrD,MAAA,CAAO,OAAO,OAAA,KAA2B;AACxC,EAAA,MAAM,UAAU,OAAO,CAAA;AACzB,CAAC,CAAA;AA8BH,eAAe,UAAU,OAAA,EAAuC;AAC9D,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,WAAA,KAAgB,KAAA,IAAS,CAAC,OAAA,CAAQ,QAAA;AAEjE,IAAA,IAAI,cAAA,EAAgB;AAGlB,MAAA,MAAM,qBAAkE,EAAC;AACzE,MAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,CAAA,EAAW;AAChC,QAAA,kBAAA,CAAmB,gBAAgB,OAAA,CAAQ,MAAA;AAAA,MAC7C;AACA,MAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,CAAA,EAAW;AAC/B,QAAA,kBAAA,CAAmB,QAAQ,OAAA,CAAQ,KAAA;AAAA,MACrC;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,kBAAkB,CAAA;AAG5D,MAAA,OAAA,CAAQ,iCAAiC,CAAA;AACzC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,kBAAkB,CAAA,CAAE,CAAA;AACpC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAC/B,MAAA,GAAA,CAAI,EAAE,CAAA;AAEN,MAAA,IAAI,MAAA,CAAO,aAAa,WAAA,EAAa;AACnC,QAAA,GAAA,CAAI,qCAAqC,CAAA;AACzC,QAAA,GAAA,CAAI,EAAE,CAAA;AACN,QAAA,GAAA,CAAI,WAAW,CAAA;AACf,QAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAC9C,QAAA,GAAA,CAAI,gBAAgB,CAAA;AACpB,QAAA,GAAA,CAAI,qBAAqB,CAAA;AACzB,QAAA,GAAA,CAAI,cAAc,CAAA;AAClB,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,QACxC;AACA,QAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,CAAE,CAAA;AACxC,QAAA,GAAA,CAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,CAAE,CAAA;AAC9C,QAAA,GAAA,CAAI,EAAE,CAAA;AAAA,MACR,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB;AAC/C,QAAA,GAAA,CAAI,qCAAqC,CAAA;AACzC,QAAA,GAAA,CAAI,EAAE,CAAA;AACN,QAAA,GAAA,CAAI,WAAW,CAAA;AACf,QAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAC9C,QAAA,GAAA,CAAI,gBAAgB,CAAA;AACpB,QAAA,GAAA,CAAI,0BAA0B,CAAA;AAC9B,QAAA,GAAA,CAAI,cAAc,CAAA;AAClB,QAAA,GAAA,CAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,CAAE,CAAA;AAC9C,QAAA,GAAA,CAAI,EAAE,CAAA;AAAA,MACR;AAEA,MAAA,GAAA,CAAI,aAAa,CAAA;AACjB,MAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAC1C,MAAA,IAAI,MAAA,CAAO,QAAA,KAAa,WAAA,IAAe,MAAA,CAAO,aAAa,gBAAA,EAAkB;AAC3E,QAAA,GAAA,CAAI,8DAA8D,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,4DAA4D,CAAA;AAAA,MAClE;AACA,MAAA,GAAA,CAAI,yCAAyC,CAAA;AAAA,IAC/C,CAAA,MAAO;AAEL,MAAA,MAAM,wBAAwB,OAAO,CAAA;AAAA,IACvC;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AAMA,eAAe,wBAAwB,OAAA,EAAuC;AAE5E,EAAA,GAAA,CAAI,qBAAqB,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,EAAa;AACnC,EAAA,IAAA,CAAK,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAE1B,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,IAAUmC,uBAAAA,EAAwB;AAE7D,EAAA,IAAI,OAAA,CAAQ,aAAa,WAAA,EAAa;AAEpC,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,eAAA,GAAyE;AAAA,MAC7E,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,OAAA,CAAQ;AAAA,KACpB;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,eAAA,CAAgB,UAAU,OAAA,CAAQ,OAAA;AAAA,IACpC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAIC,sBAAAA,CAAuB,eAAe,CAAA;AAE3D,IAAA,GAAA,CAAI,CAAA,4CAAA,CAA8C,CAAA;AAClD,IAAA,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,CAAA,MAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAG/B,IAAA,MAAM,UAAA,GAAyD,EAAE,aAAA,EAAe,UAAA,EAAW;AAC3F,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,UAAA,CAAW,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,eAAA,CAAgB,UAAU,CAAA;AAExD,IAAA,OAAA,CAAQ,iCAAiC,CAAA;AACzC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,kBAAkB,CAAA,CAAE,CAAA;AACpC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,EACjC,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,KAAa,gBAAA,EAAkB;AAEhD,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAGA,IAAA,MAAM,WAAA,GAAcC,yBAAyB,WAAA,EAAY;AACzD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,QAAA,GAAW,IAAIA,wBAAAA,CAAyB;AAAA,MAC5C,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,GAAA,CAAI,CAAA,iDAAA,CAAmD,CAAA;AACvD,IAAA,GAAA,CAAI,CAAA,MAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAG/B,IAAA,MAAM,UAAA,GAAyD,EAAE,aAAA,EAAe,UAAA,EAAW;AAC3F,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,UAAA,CAAW,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,eAAA,CAAgB,UAAU,CAAA;AAExD,IAAA,OAAA,CAAQ,iCAAiC,CAAA;AACzC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,kBAAkB,CAAA,CAAE,CAAA;AACpC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,IAAWb,wBAAAA,EAAyB;AAEhE,IAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE,CAAA;AACjC,IAAA,GAAA,CAAI,CAAA,YAAA,EAAe,UAAU,CAAA,CAAE,CAAA;AAG/B,IAAA,MAAM,aAAA,GAAmBc,cAAW,WAAW,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAkBA,cAAW,UAAU,CAAA;AAE7C,IAAA,IAAA,CAAK,aAAA,IAAiB,YAAA,KAAiB,CAAC,OAAA,CAAQ,KAAA,EAAO;AACrD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAA,CAAK,CAAA,4BAAA,EAA+B,WAAW,CAAA,CAAE,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAE,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc;AAAA,QAC1C,OAAA,EAAS,0BAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,KAAA,CAAM,kBAAkB,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,MACjC;AAAA,IACF;AAGA,IAAA,GAAA,CAAI,kCAAkC,CAAA;AAEtC,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,MACnC,WAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAGD,IAAA,MAAM,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAE1C,IAAA,OAAA,CAAQ,iCAAiC,CAAA;AACzC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,4BAA4B,CAAA;AAChC,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,WAAW,CAAA,CAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,EAC9B;AAEA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA,CAAK,+CAA+C,CAAA;AACpD,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA,CAAI,aAAa,CAAA;AACjB,EAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAE,CAAA;AAChC,EAAA,GAAA,CAAI,4DAA4D,CAAA;AAChE,EAAA,GAAA,CAAI,yCAAyC,CAAA;AAC/C;ACpQO,IAAM,eAAe,IAAItC,OAAAA,CAAQ,OAAO,CAAA,CAC5C,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,iBAAiB,6CAA6C,CAAA,CACrE,OAAO,qBAAA,EAAuB,qCAAA,EAAuC,IAAI,CAAA,CACzE,MAAA,CAAO,OAAO,OAAA,KAA0B;AACvC,EAAA,MAAM,SAAS,OAAO,CAAA;AACxB,CAAC,CAAA;AAmBH,eAAe,SAAS,OAAA,EAAsC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,QAAA,GAAW,CAAA,EAAG;AACnC,MAAA,KAAA,CAAM,wCAAwC,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAClC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAMa,UAAAA,EAAW;AAGhC,IAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,CAAS,gBAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAME,gBAAAA,CAAiB,gBAAgB,CAAA;AAEpD,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,0BAA0B,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,QAAA,GAAW,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAGzC,IAAA,MAAM,QAAuB,EAAC;AAC9B,IAAA,MAAM,OAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,WAAA,IAAe,KAAK,YAAA,EAAc;AAC3C,MAAA,MAAM,aAAa,IAAI,IAAA,CAAK,WAAA,CAAY,UAAU,EAAE,OAAA,EAAQ;AAC5D,MAAA,MAAM,QAAQ,GAAA,GAAM,UAAA;AACpB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAS,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAGxD,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,IAAS,MAAA,CAAO,MAAA;AAGhD,MAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AACnD,QAAA,IAAI,aAAa,QAAA,EAAU;AACzB,UAAA,MAAM,kBAAA,GAAqB;AAAA,YACzB,UAAU,WAAA,CAAY,QAAA;AAAA,YACtB,GAAI,WAAA,CAAY,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA;AAAO,WACzD;AACA,UAAA,MAAM,MAAA,GAAS,MAAMD,kBAAAA,CAAmB,kBAAkB,CAAA;AAC1D,UAAA,kBAAA,GAAqB,MAAA,CAAO,gBAAgB,WAAA,CAAY,WAAA;AAAA,QAC1D;AAAA,MACF;AAKA,MAAA,MAAM,OAAA,GAAU,CAAC,kBAAA,IAAsB,KAAA,GAAQ,MAAA;AAC/C,MAAA,MAAM,WAAW,CAAC,WAAA;AAElB,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,QAAA,MAAM,MAAA,GAAS,QAAA,GACX,eAAA,GACA,CAAC,qBACC,qBAAA,GACA,SAAA;AACN,QAAA,OAAA,CAAQ,CAAA,OAAA,EAAU,YAAY,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,MAChF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,MACvB;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,6BAA6B,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,CAAA,MAAA,EAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,sBAAA,CAAwB,CAAA;AACzD,IAAA,KAAA,MAAW,eAAe,KAAA,EAAO;AAC/B,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AAAA,QAAA,CAClB,GAAA,GAAM,IAAI,IAAA,CAAK,WAAA,CAAY,UAAU,EAAE,OAAA,EAAQ,KAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,OACzE;AACA,MAAA,GAAA,CAAI,OAAO,WAAA,CAAY,KAAK,KAAK,MAAA,CAAO,OAAO,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,2BAA2B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC7B,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,iBAAiBU,wBAAAA,EAAyB;AAChD,IAAA,IAAI,CAAIe,EAAA,CAAA,UAAA,CAAW,cAAc,CAAA,EAAG;AAClC,MAAA,KAAA,CAAM,CAAA,uBAAA,EAA0B,cAAc,CAAA,CAAE,CAAA;AAChD,MAAA,KAAA,CAAM,mCAAmC,CAAA;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,MAAMb,uBAAAA,CAAwB;AAAA,MAC5B,QAAA,EAAU,gBAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd;AAAA,KACD,CAAA;AAED,IAAA,OAAA,CAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,qBAAA,CAAuB,CAAA;AAC7D,IAAA,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,eAAA,CAAiB,CAAA;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAClC,IAAA;AAAA,EACF;AACF;AC1IO,IAAM,gBAAgB,IAAI1B,OAAAA,CAAQ,QAAQ,CAAA,CAC9C,WAAA,CAAY,gCAAgC,CAAA,CAC5C,QAAA,CAAS,cAAc,4BAA4B,CAAA,CACnD,OAAO,QAAA,EAAU,iCAAiC,EAClD,MAAA,CAAO,OAAO,OAAiB,OAAA,KAA2B;AACzD,EAAA,MAAM,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,CAAC,CAAA;AAiBH,eAAe,SAAA,CAAU,OAAiB,OAAA,EAAuC;AAC/E,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAMa,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAG9C,IAAA,IAAI,CAAC,eAAe,KAAA,IAAS,MAAA,CAAO,KAAK,cAAA,CAAe,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,mCAAmC,CAAA;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,IAAA,MAAM,SAAA,GAAYG,cAAc,WAAW,CAAA;AAG3C,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,GAAS,CAAA,GAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,eAAe,KAAK,CAAA;AAGjF,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAElC,MAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,QAAA,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,CAAA,4BAAA,CAA8B,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAElC,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACxC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,SAASF,sBAAAA,CAAuB;AAAA,QACpC,QAAA,EAAU,KAAK,WAAA,CAAY,KAAA;AAAA,QAC3B,GAAI,KAAK,WAAA,CAAY,OAAA,IAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,OAAA;AAAQ,OACpE,CAAA;AAED,MAAA,YAAA,CAAa,MAAM,IAAI,MAAA,CAAO,WAAA;AAAA,IAChC;AAGA,IAAA,MAAM,OAAA,GACJ,KAAA,CAAM,MAAA,GAAS,CAAA,GACX,aAAA,CAAc,GAAA;AAAA,MAAI,CAAC,MAAA;AAAA;AAAA,QAEjBY,eAAe,cAAA,EAAgB,MAAA,EAAQ,WAAW,YAAA,CAAa,MAAM,KAAK,EAAE;AAAA;AAAA,KAC9E,GACAC,cAAAA,CAAe,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAA;AAG5D,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,UAAA,CAAW,OAAO,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB;AAGA,IAAA,MAAM,aAAa,OAAA,CAAQ,IAAA;AAAA,MACzB,CAAC,CAAA,KACC,CAAA,CAAE,KAAA,KAAU,SAAA,IACZ,CAAA,CAAE,KAAA,KAAU,sBAAA,IACZ,CAAA,CAAE,KAAA,KAAU,mBAAA,IACZ,CAAA,CAAE,KAAA,KAAU;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA;AAExD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B,WAAW,QAAA,EAAU;AAEnB,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AAUA,SAAS,eAAe,OAAA,EAAyC;AAC/D,EAAA,GAAA,CAAI,EAAE,CAAA;AAGN,EAAA,MAAM,SAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAChD,OAAO,CAAA,CAAE,MAAA;AAAA,IACT,MAAA,EAAQC,cAAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAAA,IAC7B,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAAA,IAChC,GAAA,EAAKC,WAAU,CAAC;AAAA,GAClB,CAAE,CAAA;AAEF,EAAA,GAAA,CAAI,WAAA,CAAY,SAAS,CAAC,CAAA;AAC1B,EAAA,GAAA,CAAI,EAAE,CAAA;AAGN,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA;AAAA,IACzB,CAAC,CAAA,KACC,CAAA,CAAE,KAAA,KAAU,OAAA,IACZ,EAAE,KAAA,KAAU,OAAA;AAAA,IACZ,CAAA,CAAE;AAAA,GACN;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,GAAA,CAAI,GAAG,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR;AAGA,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,GAAS,UAAA,GAAa,UAAA;AAEnD,EAAA,IAAI,YAAA,KAAiB,CAAA,IAAK,UAAA,KAAe,CAAA,EAAG;AAC1C,IAAA,OAAA,CAAQ,sBAAsB,CAAA;AAAA,EAChC,CAAA,MAAO;AACL,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,YAAY,CAAC,CAAA,sCAAA,CAAwC,CAAA;AACrE,MAAA,GAAA,CAAI,sDAAsD,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA,0CAAA,CAA4C,CAAA;AACtE,MAAA,GAAA,CAAI,2DAA2D,CAAA;AAAA,IACjE;AAAA,EACF;AACF;AAQA,SAASD,eAAc,KAAA,EAAkC;AACvD,EAAA,MAAM5C,SAAQ,QAAA,EAAS;AAEvB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,MAAM,KAAK,CAAA;AAAA,IAC1B,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,OAAO,KAAK,CAAA;AAAA,IAC3B,KAAK,sBAAA;AAAA,IACL,KAAK,mBAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAOA,MAAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACxB;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAQA,SAAS,kBAAkB,MAAA,EAAwC;AACjE,EAAA,IAAI,MAAA,CAAO,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,WAAA;AACvB,IAAA,IAAI,EAAA,CAAG,SAAS,EAAA,EAAI;AAClB,MAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IAC3B;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,KAAA,KAAU,SAAA,GAAY,QAAA,GAAW,GAAA;AACjD;AAQA,SAAS6C,WAAU,MAAA,EAAwC;AACzD,EAAA,IAAI,MAAA,CAAO,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,SAAA,CAAU,OAAA,EAAQ;AACtC,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAS,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAExD,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC5B,MAAA,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA,aAAA,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA,KAAA,CAAA;AAAA,EAC3B;AAEA,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,sBAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT;AACE,MAAA,OAAO,GAAA;AAAA;AAEb;AC3OO,IAAM,WAAA,GAAc,IAAI3C,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,wBAAwB,CAAA,CACpC,QAAA,CAAS,YAAA,EAAc,8DAA8D,EACrF,MAAA,CAAO,SAAA,EAAW,2DAA2D,CAAA,CAC7E,MAAA,CAAO,WAAA,EAAa,kDAAkD,CAAA,CACtE,MAAA,CAAO,OAAO,KAAA,EAAiB,OAAA,KAAyB;AACvD,EAAA,MAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC9B,CAAC,CAAA;AA0BH,eAAe,OAAA,CAAQ,OAAiB,OAAA,EAAqC;AAC3E,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAMa,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAG9C,IAAA,IAAI,CAAC,eAAe,KAAA,IAAS,MAAA,CAAO,KAAK,cAAA,CAAe,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,mCAAmC,CAAA;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,cAAciB,mBAAAA,EAAoB;AACxC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,KAAA,CAAM,uCAAuC,CAAA;AAC7C,MAAA,KAAA,CAAM,sDAAsD,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,QAAA,GAAWC,kBAAkB,WAAW,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,iBAAA,EAAoB,WAAA,CAAY,cAAc,CAAA,2BAAA,CAA6B,CAAA;AACjF,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,IAAA,MAAM,SAAA,GAAYf,cAAc,WAAW,CAAA;AAG3C,IAAA,MAAM,cAAc,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,cAAc,cAAc,CAAA;AAG3E,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,QAAA,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,CAAA,4BAAA,CAA8B,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,QAAQ,EAAC;AAAA,MACT,SAAS,EAAC;AAAA,MACV,QAAQ;AAAC,KACX;AAEA,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,QAAQ,cAAA,EAAgB,QAAA,EAAU,WAAW,OAAO,CAAA;AAE3F,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,QAC5B,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AACzB,UAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,SAAA,EAAW,CAAA;AAAA,QAC3E;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACtD,QAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAAA,MACvD;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAChD,MAAAgB,cAAAA,CAAe,aAAa,SAAS,CAAA;AAAA,IACvC;AAGA,IAAA,cAAA,CAAe,OAAA,EAAS,QAAQ,MAAM,CAAA;AAGtC,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,QAAQ,MAAA,CAAO,MAAA,KAAW,KAAK,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtE,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AAkBA,eAAe,iBAAA,CACb,MAAA,EACA,MAAA,EACA,QAAA,EACA,WACA,OAAA,EAC4B;AAC5B,EAAA,OAAA,CAAQ,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAE,CAAA;AAGpC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,QAAQ,iCAAA,EAAkC;AAAA,EACnF;AAIA,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA;AAC3C,EAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,CAAQ,KAAA,EAAO;AAClC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAGA,EAAA,MAAM,oBAAoBlB,sBAAAA,CAAuB;AAAA,IAC/C,QAAA,EAAU,KAAK,WAAA,CAAY,KAAA;AAAA,IAC3B,GAAI,KAAK,WAAA,CAAY,OAAA,IAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,OAAA;AAAQ,GACpE,CAAA;AACD,EAAA,OAAA,CAAQ,CAAA,eAAA,EAAkB,iBAAA,CAAkB,WAAW,CAAA,CAAE,CAAA;AAGzD,EAAA,MAAM,UAAA,GAAamB,kBAAAA,CAAmB,MAAA,EAAQ,MAAA,EAAQ,SAAS,SAAS,CAAA;AACxE,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,CAAA,sDAAA,EAAyD,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KACpG;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,GAAA,CAAI,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAClC,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,EACxC;AAGA,EAAA,MAAM,WAAA,GAAcC,+BAA8B,QAAQ,CAAA;AAG1D,EAAA,MAAM,MAAA,GAASC,uBAAsB,QAAQ,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,aAAA,CAAc,MAAM,CAAA;AAGxD,EAAA,MAAMpB,GAAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,EAAA,MAAM,gBAAgB,MAAMA,GAAAA,CAAG,QAAA,CAAS,SAAA,CAAU,SAAS,MAAM,CAAA;AAGjE,EAAA,MAAM,UAAU,OAAA,EAAQ;AAGxB,EAAA,MAAM,OAAOqB,UAAAA,CAAW;AAAA,IACtB,MAAA;AAAA,IACA,aAAa,iBAAA,CAAkB,WAAA;AAAA,IAC/B,UAAU,QAAA,CAAS,IAAA;AAAA,IACnB,UAAA,EAAY;AAAA,GACb,CAAA;AAID,EAAA,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA;AAE1B,EAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE,CAAA;AAC9B,EAAA,OAAA,CAAQ,CAAA,eAAA,EAAkB,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACzC,EAAA,OAAA,CAAQ,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAE1C,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AACxC;AAQA,SAAS,cAAc,MAAA,EAAkC;AACvD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AACvC;AAQA,SAAS,cAAA,CAAe,SAAsB,MAAA,EAAwB;AACpE,EAAA,GAAA,CAAI,EAAE,CAAA;AAEN,EAAA,MAAM,MAAA,GAAS,SAAS,YAAA,GAAe,QAAA;AAEvC,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5F;AAEA,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,SAAA,CAAW,CAAA;AACzD,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,OAAA,EAAS;AAClC,MAAA,GAAA,CAAI,KAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,KAAA,CAAM,kBAAkB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,SAAA,CAAW,CAAA;AAChE,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,MAAA,EAAQ;AACjC,MAAA,GAAA,CAAI,KAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9F,IAAA,GAAA,CAAI,kBAAkB,CAAA;AAAA,EACxB;AACF;AAQA,SAASF,+BACP,QAAA,EAC+C;AAC/C,EAAA,MAAM,EAAE,YAAW,GAAI,QAAA;AAEvB,EAAA,QAAQ,WAAW,IAAA;AAAM,IACvB,KAAK,MAAA;AACH,MAAA,OAAOzB,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,EAAE,cAAA,EAAgB,UAAA,CAAW,IAAA;AAAK,OAC5C,CAAA;AAAA,IACH,KAAK,UAAA;AAGH,MAAA,OAAOA,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,UAAU,UAAA,CAAW;AAAA;AACvB,OACD,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAOA,oBAAoB,MAAA,CAAO;AAAA,QAChC,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,UAAU,UAAA,CAAW,IAAA;AAAA,UACrB,OAAO,UAAA,CAAW;AAAA;AACpB,OACD,CAAA;AAAA,IACH,SAAS;AAEP,MAAA,MAAM,gBAAA,GAA0B,UAAA;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAA,CAAO,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;AAQA,SAAS0B,uBAAsB,QAAA,EAA4B;AACzD,EAAA,MAAM,EAAE,YAAW,GAAI,QAAA;AAEvB,EAAA,QAAQ,WAAW,IAAA;AAAM,IACvB,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IACpB,KAAK,UAAA;AAGH,MAAA,OAAO,UAAA,CAAW,OAAA;AAAA,IACpB,KAAK,WAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IACpB,SAAS;AACP,MAAA,MAAM,gBAAA,GAA0B,UAAA;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAA,CAAO,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;ACjWO,IAAM,WAAA,GAAc,IAAIjD,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,OAAA,EAAQ;AAChB,CAAC,CAAA;AAKH,eAAe,OAAA,GAAyB;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,gCAAgC,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMF,SAAQC,SAAAA,EAAS;AACvB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAEnD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,mBAAmB,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,EAAE,CAAA;AAEN,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,UAAA,EAAY;AACzC,MAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,cAAA;AACjC,MAAA,MAAM,MAAA,GAAS,QAAA,GAAWA,MAAAA,CAAM,KAAA,CAAM,QAAG,CAAA,GAAI,GAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,WAAWA,MAAAA,CAAM,KAAA,CAAM,MAAK,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA,CAAS,IAAA;AAG5E,MAAA,MAAM,aAAa,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAGrD,MAAA,IAAI,OAAA;AACJ,MAAA,QAAQ,QAAA,CAAS,WAAW,IAAA;AAAM,QAChC,KAAK,MAAA;AACH,UAAA,OAAA,GAAU,MAAA;AACV,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,OAAA,GAAU,UAAA;AACV,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,OAAA,GAAU,WAAA;AACV,UAAA;AAAA;AAGJ,MAAA,GAAA,CAAI,GAAG,MAAM,CAAA,CAAA,EAAIA,OAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnC,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,WAAW,CAAA,CAAE,CAAA;AAClC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AAAA,MACvC;AACA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACxC;AACA,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE,CAAA;AACjC,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AAC9B,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,GAAA,CAAI,CAAA,qBAAA,CAAuB,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,QAAA,EAAU,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC7D;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;;;ACvEO,SAAS,YAAA,CACd,OACA,kBAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAE3B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,sBAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AACjC,IAAA,OAAO,gEAAA;AAAA,EACT;AAEA,EAAA,IAAI,kBAAA,GAAqB,OAAO,CAAA,EAAG;AACjC,IAAA,OAAO,aAAa,OAAO,CAAA,gBAAA,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,IAAM,WAAA,GAAc,4BAAA;AASb,SAAS,aAAA,CAAc,KAAA,EAAe,QAAA,GAAW,KAAA,EAAsB;AAC5E,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAG3B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,WAAW,uBAAA,GAA0B,IAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAO,oCAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;ACzCO,IAAM,aAAA,GAAgB,IAAIE,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,4CAA4C,CAAA,CACxD,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,SAAA,EAAU;AAClB,CAAC,CAAA;AAKH,eAAe,SAAA,GAA2B;AACxC,EAAA,IAAI;AACF,IAAA,MAAMF,SAAQ,QAAA,EAAS;AAEvB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,qBAAqB,CAAC,CAAA;AAC5C,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,cAAA,GAAiB,MAAMqD,eAAAA,EAAgB;AAG7C,IAAA,MAAM,IAAA,GAAA,CACJ,MAAM,KAAA,CAAM;AAAA,MACV,OAAA,EAAS,oCAAA;AAAA,MACT,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,gBAAgB,UAAU;AAAA,KACpE,GACD,IAAA,EAAK;AAEP,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM;AAAA,MACvB,OAAA,EAAS,eAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,UAAA,OAAO,sBAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GAAA,CACJ,MAAM,KAAA,CAAM;AAAA,MACV,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS,EAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,GACD,IAAA,EAAK;AAEP,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM;AAAA,MACzB,OAAA,EAAS,6BAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAGD,IAAA,IAAA,CAAK,6CAA6C,CAAA;AAClD,IAAA,MAAM,WAAA,GAAc,MAAMf,sBAAAA,CAAuB,WAAA,EAAY;AAC7D,IAAA,MAAM,iBAAA,GAAoBC,yBAAyB,WAAA,EAAY;AAG/D,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,cAAA,GAAoD;AAAA,MACxD,EAAE,MAAM,CAAA,aAAA,EAAgBe,IAAAA,CAAK,WAAW,MAAM,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,MAAA;AAAO,KACpE;AAEA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,cAAA,CAAe,KAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,YAAY,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,aAAa,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO;AAAA,MAClC,OAAA,EAAS,yCAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,+BAA+B,CAAA;AAGnC,IAAA,MAAM,UAAU,sBAAA,EAAuB;AAGvC,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,qBAAA;AAEJ,IAAA,QAAQ,cAAA;AAAgB,MACtB,KAAK,MAAA,EAAQ;AAEX,QAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,oBAAA,EAAqB,EAAG,MAAM,CAAA;AACnD,QAAA,MAAMC,KAAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,QAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAA;AAC3C,QAAA,MAAME,UAAU,OAAA,EAAS,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAM,KAAO,CAAA;AAE5D,QAAA,aAAA,GAAgB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AAC9C,QAAA,qBAAA,GAAwB,OAAA;AACxB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AAEf,QAAA,IAAI,CAACjB,wBAAAA,CAAyB,WAAA,EAAY,EAAG;AAC3C,UAAA,KAAA,CAAM,gDAAgD,CAAA;AACtD,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,QACpC;AAGA,QAAA,MAAM,SAAA,GAAY,MAAMA,wBAAAA,CAAyB,aAAA,EAAc;AAE/D,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,QACrD;AAGA,QAAA,MAAM,oBAAA,GAAuB,CAAC,EAAA,KAA+C;AAC3E,UAAA,OAAO,CAAA,EAAGvC,MAAAA,CAAM,IAAA,CAAK,IAAA,GAAO,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA,EAAIA,OAAM,KAAA,CAAM,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,GAAG,CAAC,CAAA,CAAA;AAAA,QACrE,CAAA;AAGA,QAAA,IAAI,gBAAA;AACJ,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AAC1C,UAAA,gBAAA,GAAmB,UAAU,CAAC,CAAA;AAC9B,UAAA,IAAA,CAAK,CAAA,gBAAA,EAAmB,oBAAA,CAAqB,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,QAClE,CAAA,MAAO;AACL,UAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO;AAAA,YAChC,OAAA,EAAS,kBAAA;AAAA,YACT,OAAA,EAAS,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,cAC9B,IAAA,EAAM,qBAAqB,EAAE,CAAA;AAAA,cAC7B,OAAO,EAAA,CAAG;AAAA,aACZ,CAAE;AAAA,WACH,CAAA;AACD,UAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,YAAY,CAAA;AACrE,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,UAC/C;AACA,UAAA,gBAAA,GAAmB,aAAA;AAAA,QACrB;AAGA,QAAA,MAAM,gBAAA,GAAmB,MAAM,KAAA,CAAM;AAAA,UACnC,OAAA,EAAS,qBAAA;AAAA,UACT,OAAA,EAAS,aAAa,IAAI,CAAA,CAAA;AAAA,UAC1B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,cAAA,OAAO,2BAAA;AAAA,YACT;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,SACD,CAAA;AAID,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,QAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAGxC,QAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,SAAS,QAAQ,CAAA;AAEpE,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU;AAAA,YACd,sBAAA;AAAA,YACA,IAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,gBAAA;AAAA,YACA,IAAA;AAAA,YACA,UAAA;AAAA,YACA,IAAA;AAAA,YACA,gBAAA,CAAiB;AAAA,WACnB;AACA,UAAA,MAAM,aAAA,CAAc,YAAY,OAAO,CAAA;AAAA,QACzC,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,0CAA0C,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,WAC5F;AAAA,QACF;AAGA,QAAA,aAAA,GAAgB;AAAA,UACd,IAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAS,gBAAA;AAAA,UACT,OAAA,EAAS,WAAA;AAAA,UACT,UAAU,gBAAA,CAAiB;AAAA,SAC7B;AACA,QAAA,qBAAA,GAAwB,CAAA,gBAAA,EAAmB,gBAAA,CAAiB,IAAI,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AACpF,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,QAAA,GAAW,MAAMsC,sBAAAA,CAAuB,YAAA,EAAa;AAE3D,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,QAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAQxC,QAAA,MAAM,cAAA,GAAmC,MAAM,OAAA,CAAQ,GAAA;AAAA,UACrD,QAAA,CAAS,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC1B,YAAA,IAAI;AAEF,cAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,cAAc,IAAA,EAAM;AAAA,gBAC3C,SAAA;AAAA,gBACA,KAAA;AAAA,gBACA,WAAA;AAAA,gBACA,GAAA,CAAI,SAAA;AAAA,gBACJ;AAAA,eACD,CAAA;AACD,cAAA,MAAM,OAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAE1C,cAAA,MAAMmB,KAAAA,GACJ,OAAA,KAAY,IAAA,IACZ,OAAO,YAAY,QAAA,IACnB,MAAA,IAAU,OAAA,IACV,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GACpB,OAAA,CAAQ,OACR,GAAA,CAAI,GAAA;AACV,cAAA,OAAO;AAAA,gBACL,KAAK,GAAA,CAAI,GAAA;AAAA,gBACT,OAAO,GAAA,CAAI,KAAA;AAAA,gBACX,IAAA,EAAAA;AAAA,eACF;AAAA,YACF,CAAA,CAAA,MAAQ;AAEN,cAAA,OAAO;AAAA,gBACL,KAAK,GAAA,CAAI,GAAA;AAAA,gBACT,OAAO,GAAA,CAAI,KAAA;AAAA,gBACX,MAAM,GAAA,CAAI;AAAA,eACZ;AAAA,YACF;AAAA,UACF,CAAC;AAAA,SACH;AAGA,QAAA,MAAM,mBAAA,GAAsB,CAAC,GAAA,KAAgC;AAC3D,UAAA,OAAO,CAAA,EAAGzD,MAAAA,CAAM,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAIA,OAAM,KAAA,CAAM,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,GAAG,CAAC,CAAA,CAAA;AAAA,QACtE,CAAA;AAIA,QAAA,IAAI,eAAA;AACJ,QAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,IAAK,cAAA,CAAe,CAAC,CAAA,EAAG;AACpD,UAAA,eAAA,GAAkB,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA;AACpC,UAAA,IAAA,CAAK,4BAA4B,mBAAA,CAAoB,cAAA,CAAe,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QAC3E,CAAA,MAAO;AACL,UAAA,eAAA,GAAkB,MAAM,MAAA,CAAO;AAAA,YAC7B,OAAA,EAAS,2BAAA;AAAA,YACT,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,cACpC,IAAA,EAAM,oBAAoB,GAAG,CAAA;AAAA,cAC7B,OAAO,GAAA,CAAI;AAAA,aACb,CAAE;AAAA,WACH,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,MAAA,GAAS,MAAMsC,sBAAAA,CAAuB,UAAA,CAAW,eAAe,CAAA;AAEtE,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,eAAe,CAAA,CAAE,CAAA;AAAA,QAC5E;AAGA,QAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO;AAAA,UACjC,OAAA,EAAS,uCAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE;AAAA,WACX,CAAE;AAAA,SACH,CAAA;AAGD,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM;AAAA,UACvB,OAAA,EAAS,sBAAA;AAAA,UACT,OAAA,EAAS,aAAa,IAAI,CAAA,CAAA;AAAA,UAC1B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,cAAA,OAAO,2BAAA;AAAA,YACT;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,SACD,CAAA;AAGD,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,IAAS,CAAA;AACzC,QAAA,MAAM,OAAA,GAAUgB,IAAAA,CAAK,MAAA,EAAO,EAAG,CAAA,UAAA,EAAa,OAAO,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAChE,QAAA,MAAMC,KAAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,QAAA,MAAM,eAAA,GAAkBD,IAAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAME,UAAU,eAAA,EAAiB,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAM,KAAO,CAAA;AAGpE,UAAA,MAAM,EAAE,QAAA,EAAAE,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,UAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,UAAA,MAAMC,cAAAA,GAAgBD,WAAUD,SAAQ,CAAA;AAExC,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,UAAA;AAAA,YACA,QAAA;AAAA,YACA,eAAA;AAAA,YACA,SAAA;AAAA,YACA,IAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,MAAA,CAAO,IAAA,CAAK,aAAa,eAAe,CAAA;AAAA,UAC1C;AAEA,UAAA,MAAME,cAAAA,CAAc,MAAM,MAAM,CAAA;AAAA,QAClC,CAAA,SAAE;AAEA,UAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAkB,CAAA;AAC9C,UAAA,MAAM,EAAA,CAAG,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAEhE,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,aAAA,GAAgB;AAAA,UACd,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,IAAA;AAAA,UACA,GAAI,eAAA,IAAmB,EAAE,OAAA,EAAS,eAAA;AAAgB,SACpD;AACA,QAAA,qBAAA,GAAwB,CAAA,WAAA,EAAc,aAAa,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAC3D,QAAA;AAAA,MACF;AAAA,MACA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,cAAc,CAAA,CAAE,CAAA;AAAA;AAIjE,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAA;AAAA,MACA,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,UAAA,EAAY,aAAA;AAAA,MACZ,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,MACrB,GAAI,MAAA,IAAU,EAAE,MAAA;AAAO,KACzB;AAGA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,SAAA,GAAY;AAAA,QACV,GAAG,cAAA;AAAA,QACH,UAAA,EAAY;AAAA,UACV,GAAG,cAAA,CAAe,UAAA;AAAA,UAClB,CAAC,IAAI,GAAG;AAAA;AACV,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,SAAA,GAAY;AAAA,QACV,cAAA,EAAgB,IAAA;AAAA,QAChB,UAAA,EAAY;AAAA,UACV,CAAC,IAAI,GAAG;AAAA;AACV,OACF;AAAA,IACF;AAGA,IAAA,MAAM,gBAAgB,SAAS,CAAA;AAE/B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,+BAA+B,CAAA;AACvC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE,CAAA;AAAA,IAChC;AACA,IAAA,GAAA,CAAI,kBAAkB,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AACzD,IAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,qBAAqB,CAAA,CAAE,CAAA;AAC7C,IAAA,GAAA,CAAI,EAAE,CAAA;AAEN,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAA,CAAQ,CAAA,sBAAA,CAAwB,CAAA;AAChC,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,kDAAA,EAAqD,IAAI,CAAA,CAAE,CAAA;AAC/D,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AClaO,IAAM,UAAA,GAAa,IAAI1D,OAAAA,CAAQ,KAAK,EACxC,WAAA,CAAY,yBAAyB,CAAA,CACrC,QAAA,CAAS,QAAA,EAAU,2BAA2B,CAAA,CAC9C,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,EAAA,MAAM,OAAO,IAAI,CAAA;AACnB,CAAC,CAAA;AAKH,eAAe,OAAO,IAAA,EAA6B;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,CAAa,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,MAAA;AAAA,MACH,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,MAAMQ,gBAAgB,SAAS,CAAA;AAE/B,IAAA,OAAA,CAAQ,CAAA,wBAAA,EAA2B,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AC1CO,IAAM,WAAA,GAAc,IAAI3D,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,uBAAuB,CAAA,CACnC,QAAA,CAAS,QAAA,EAAU,6CAA6C,CAAA,CAChE,MAAA,CAAO,OAAO,IAAA,KAAkB;AAC/B,EAAA,MAAM,QAAQ,IAAI,CAAA;AACpB,CAAC,CAAA;AAKH,eAAe,QAAQ,IAAA,EAA8B;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMrD,SAAQC,SAAAA,EAAS;AAGvB,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,cAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,MAAA,CAAO,cAAA;AACpB,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,WAAA,CAAa,CAAA;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,mBAAmB,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiBA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,EAAG,QAAA,GAAWA,MAAAA,CAAM,KAAA,CAAM,WAAW,CAAA,GAAI,EAAE,CAAA,CAAE,CAAA;AACxF,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AACzC,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,IAAA,QAAQ,QAAA,CAAS,WAAW,IAAA;AAAM,MAChC,KAAK,MAAA;AACH,QAAA,GAAA,CAAI,CAAA,cAAA,CAAgB,CAAA;AACpB,QAAA,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,GAAA,CAAI,CAAA,wBAAA,CAA0B,CAAA;AAC9B,QAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AACjD,QAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,GAAA,CAAI,CAAA,mBAAA,CAAqB,CAAA;AACzB,QAAA,IAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AAC/B,UAAA,GAAA,CAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAAA,QACnD;AACA,QAAA,GAAA,CAAI,CAAA,WAAA,EAAc,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAC7C,QAAA,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAC3C,QAAA,IAAI,QAAA,CAAS,WAAW,KAAA,EAAO;AAC7B,UAAA,GAAA,CAAI,CAAA,WAAA,EAAc,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAAA,QAC/C;AACA,QAAA;AAAA;AAEJ,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;ACrFO,IAAM,WAAA,GAAc,IAAIE,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,iCAAiC,CAAA,CAC7C,QAAA,CAAS,QAAA,EAAU,uBAAuB,CAAA,CAC1C,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,EAAA,MAAM,QAAQ,IAAI,CAAA;AACpB,CAAC,CAAA;AAKH,eAAe,QAAQ,IAAA,EAA6B;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,CAAa,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMrD,SAAQC,SAAAA,EAAS;AAEvB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,OAAM,IAAA,CAAK,IAAA,GAAO,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,IAAA,GAAO,MAAMM,KAAAA,CAAM;AAAA,MACvB,OAAA,EAAS,eAAA;AAAA,MACT,SAAS,QAAA,CAAS,IAAA;AAAA,MAClB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,UAAA,OAAO,sBAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAMA,KAAAA,CAAM;AAAA,MACxB,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS,SAAS,KAAA,IAAS;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAMA,KAAAA,CAAM;AAAA,MACzB,OAAA,EAAS,6BAAA;AAAA,MACT,OAAA,EAAS,SAAS,MAAA,IAAU;AAAA,KAC7B,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,MAAMwD,OAAAA,CAAQ;AAAA,MAC9B,OAAA,EAAS,qCAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,YAAY,QAAA,CAAS,SAAA;AACzB,IAAA,MAAM,gBAAgB,QAAA,CAAS,UAAA;AAE/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,mCAAmC,CAAA;AAGvC,MAAA,MAAM,UAAUC,sBAAAA,EAAuB;AACvC,MAAA,SAAA,GAAY,OAAA,CAAQ,SAAA;AAGpB,MAAA,QAAQ,QAAA,CAAS,WAAW,IAAA;AAAM,QAChC,KAAK,MAAA,EAAQ;AAEX,UAAA,MAAMP,SAAAA,CAAU,SAAS,UAAA,CAAW,IAAA,EAAM,QAAQ,UAAA,EAAY,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAC7E,UAAA,GAAA,CAAI,CAAA,0BAAA,EAA6B,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAC3D,UAAA;AAAA,QACF;AAAA,QACA,KAAK,UAAA,EAAY;AAEf,UAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,UAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAGxC,UAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,SAAS,QAAQ,CAAA;AAEpE,UAAA,IAAI;AAEF,YAAA,MAAM,cAAc,UAAA,EAAY;AAAA,cAC9B,yBAAA;AAAA,cACA,IAAA;AAAA,cACA,SAAS,UAAA,CAAW,OAAA;AAAA,cACpB,IAAA;AAAA,cACA,SAAS,UAAA,CAAW;AAAA,aACrB,CAAA;AAGD,YAAA,MAAM,cAAc,UAAA,EAAY;AAAA,cAC9B,sBAAA;AAAA,cACA,IAAA;AAAA,cACA,SAAS,UAAA,CAAW,OAAA;AAAA,cACpB,IAAA;AAAA,cACA,SAAS,UAAA,CAAW,OAAA;AAAA,cACpB,IAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,GAAA,CAAI,CAAA,uCAAA,CAAyC,CAAA;AAAA,UAC/C,SAAS,GAAA,EAAK;AACZ,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,2CAA2C,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,aAC7F;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAEhB,UAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,UAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAExC,UAAA,IAAI;AAEF,YAAA,MAAM,MAAA,GAAS;AAAA,cACb,MAAA;AAAA,cACA,MAAA;AAAA,cACA,SAAS,UAAA,CAAW,IAAA;AAAA,cACpB,SAAA;AAAA,cACA,SAAS,UAAA,CAAW,KAAA;AAAA,cACpB,CAAA,qBAAA,EAAwB,QAAQ,UAAU,CAAA;AAAA,aAC5C;AAEA,YAAA,IAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AAC/B,cAAA,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AAAA,YACtD;AAEA,YAAA,MAAM,aAAA,CAAc,MAAM,MAAM,CAAA;AAChC,YAAA,GAAA,CAAI,CAAA,kCAAA,CAAoC,CAAA;AAAA,UAC1C,SAAS,GAAA,EAAK;AACZ,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,sCAAsC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,aACxF;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,IAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA,EAAY,aAAA;AAAA,MACZ,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,MACrB,GAAI,MAAA,IAAU,EAAE,MAAA;AAAO,KACzB;AAEA,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,MAAA;AAAA,MACH,UAAA,EAAY;AAAA,QACV,GAAG,MAAA,CAAO,UAAA;AAAA,QACV,CAAC,IAAI,GAAG;AAAA;AACV,KACF;AAEA,IAAA,MAAMK,gBAAgB,SAAS,CAAA;AAE/B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,+BAA+B,CAAA;AACvC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,uBAAuB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,IAAI,KAAK,CAAA;AACzD,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA;AAAA,QACE7D,MAAAA,CAAM,MAAA;AAAA,UACJ;AAAA;AACF,OACF;AACA,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;;;AC5LO,SAAS,kBAAkB,UAAA,EAAmC;AACnE,EAAA,MAAMA,SAAQ,QAAA,EAAS;AAEvB,EAAA,QAAQ,WAAW,IAAA;AAAM,IACvB,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,EAAGA,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,CAAC,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAAA,IACtE,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,YAAA,GAAe,SAAA;AACnB,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,MAAM,QAAA,GAAW,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,UAAA,CAAW,QAAA;AACpE,QAAA,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,GAAGA,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,gBAAgB,CAAC,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,GAAG,YAAY,CAAA,CAAA,EAAI,UAAA,CAAW,OAAO,EAAE,CAAC,CAAA,CAAA;AAAA,IACxG;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,KAAA,GAAQ,CAAC,UAAA,CAAW,KAAA,EAAO,WAAW,IAAI,CAAA;AAChD,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,KAAA,CAAM,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,CAAA,EAAGA,MAAAA,CAAM,IAAA,CAAK,IAAA,GAAO,WAAW,CAAC,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IAC3E;AAAA,IACA;AACE,MAAA,OAAO,iBAAA;AAAA;AAEb;ACzBO,IAAM,aAAA,GAAgB,IAAIE,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,mDAAmD,CAAA,CAC/D,QAAA,CAAS,QAAA,EAAU,yBAAyB,CAAA,CAC5C,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,EAAA,MAAM,UAAU,IAAI,CAAA;AACtB,CAAC,CAAA;AAKH,eAAe,UAAU,IAAA,EAA6B;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,CAAa,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMrD,SAAQ,QAAA,EAAS;AAEvB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIA,OAAM,IAAA,CAAK,IAAA,GAAO,CAAA,iBAAA,EAAoB,IAAI,EAAE,CAAC,CAAA;AACjD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,SAAA,EAAY,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAC/B,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,GAAA,CAAI,CAAA,SAAA,EAAY,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AAAA,IAClC;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,aAAA,GAAgB,MAAM8D,OAAAA,CAAQ;AAAA,MAClC,OAAA,EAAS,gDAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,GAAA,CAAI,WAAW,CAAA;AACf,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,QAAA,CAAS,UAAU,CAAA;AACzD,IAAA,GAAA,CAAI,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAA;AACnC,IAAA,GAAA,CAAI,EAAE,CAAA;AAEN,IAAA,MAAM,gBAAA,GAAmB,MAAMA,OAAAA,CAAQ;AAAA,MACrC,OAAA,EAAS,2CAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAGD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,QAAQ,QAAA,CAAS,WAAW,IAAA;AAAM,QAChC,KAAK,MAAA,EAAQ;AACX,UAAA,IAAI;AACF,YAAA,MAAME,MAAAA,CAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AACrC,YAAA,GAAA,CAAI,CAAA,4BAAA,EAA+B,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAAA,UAC/D,SAAS,GAAA,EAAK;AAEZ,YAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,UAAU,GAAA,IAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAC5E,cAAA,MAAM,GAAA;AAAA,YACR;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,UAAA,EAAY;AAEf,UAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,UAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAExC,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,GAAa;AAAA,cACjB,yBAAA;AAAA,cACA,IAAA;AAAA,cACA,SAAS,UAAA,CAAW,OAAA;AAAA,cACpB,IAAA;AAAA,cACA,SAAS,UAAA,CAAW;AAAA,aACtB;AACA,YAAA,IAAI,QAAA,CAAS,WAAW,QAAA,EAAU;AAChC,cAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA;AAAA,YAC9C;AACA,YAAA,MAAM,aAAA,CAAc,YAAY,UAAU,CAAA;AAC1C,YAAA,GAAA,CAAI,CAAA,yCAAA,CAA2C,CAAA;AAAA,UACjD,SAAS,GAAA,EAAK;AAEZ,YAAA,IACE,GAAA,YAAe,KAAA,IACf,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,IAC1C,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,EACtC;AACA,cAAA,MAAM,GAAA;AAAA,YACR;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAEhB,UAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,UAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAExC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS;AAAA,cACb,MAAA;AAAA,cACA,QAAA;AAAA,cACA,SAAS,UAAA,CAAW,IAAA;AAAA,cACpB,SAAA;AAAA,cACA,SAAS,UAAA,CAAW;AAAA,aACtB;AAEA,YAAA,IAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AAC/B,cAAA,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AAAA,YACtD;AAEA,YAAA,MAAM,aAAA,CAAc,MAAM,MAAM,CAAA;AAChC,YAAA,GAAA,CAAI,CAAA,oCAAA,CAAsC,CAAA;AAAA,UAC5C,SAAS,GAAA,EAAK;AAEZ,YAAA,IACE,GAAA,YAAe,KAAA,IACf,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,IACjC,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA,EACrC;AACA,cAAA,MAAM,GAAA;AAAA,YACR;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAGA,IAAA,MAAM,EAAE,CAAC,IAAI,GAAG,UAAU,GAAG,mBAAA,KAAwB,MAAA,CAAO,UAAA;AAG5D,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,mBAAmB,CAAA,CAAE,WAAW,CAAA,EAAG;AACjD,MAAA,KAAA,CAAM,6BAA6B,CAAA;AACnC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,kCAAkC,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,oBAAoB,MAAA,CAAO,cAAA;AAC/B,IAAA,IAAI,IAAA,KAAS,OAAO,cAAA,EAAgB;AAElC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,mBAAmB,EAAE,CAAC,CAAA;AACnD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AACA,MAAA,iBAAA,GAAoB,QAAA;AACpB,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAIhE,MAAAA,CAAM,MAAA,CAAO,CAAA,gDAAA,EAAmD,iBAAiB,EAAE,CAAC,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,cAAA,EAAgB,iBAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM6D,gBAAgB,SAAS,CAAA;AAE/B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,CAAA,UAAA,EAAa,IAAI,CAAA,SAAA,CAAW,CAAA;AACpC,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;ACtLO,IAAM,aAAA,GAAgB,IAAI3D,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,oDAAoD,CAAA,CAChE,QAAA,CAAS,QAAA,EAAU,uDAAuD,CAAA,CAC1E,MAAA,CAAO,OAAO,IAAA,KAAkB;AAC/B,EAAA,MAAM,UAAU,IAAI,CAAA;AACtB,CAAC,CAAA;AAKH,eAAe,UAAU,IAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMrD,SAAQC,SAAAA,EAAS;AAGvB,IAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,cAAA;AAElC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,WAAA,CAAa,CAAA;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,0BAA0B,CAAC,CAAA;AACjD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,mEAAmE,CAAC,CAAA;AACpF,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,WAAW,QAAA,CAAS;AAAA,KACtB;AAEA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,UAAA,CAAW,QAAQ,QAAA,CAAS,KAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,UAAA,CAAW,SAAS,QAAA,CAAS,MAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,CAAC,UAAU,GAAG;AAAA,KAChB;AAEA,IAAA,MAAM,UAAA,GAAaiE,UAAc,QAAQ,CAAA;AAEzC,IAAA,GAAA,CAAI,UAAU,CAAA;AACd,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIjE,MAAAA,CAAM,KAAA,CAAM,yDAAyD,CAAC,CAAA;AAC1E,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;;;ACnEO,IAAM,eAAA,GAAkB,IAAIE,OAAAA,CAAQ,UAAU,CAAA,CAClD,WAAA,CAAY,sCAAsC,CAAA,CAClD,UAAA,CAAW,WAAW,CAAA,CACtB,UAAA,CAAW,aAAa,CAAA,CACxB,UAAA,CAAW,UAAU,CAAA,CACrB,UAAA,CAAW,WAAW,CAAA,CACtB,UAAA,CAAW,WAAW,CAAA,CACtB,UAAA,CAAW,aAAa,CAAA,CACxB,UAAA,CAAW,aAAa,CAAA;ACXpB,IAAM,aAAA,GAAgB,IAAIA,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,kCAAkC,CAAA,CAC9C,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,SAAA,EAAU;AAClB,CAAC,CAAA;AAKH,eAAe,SAAA,GAA2B;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMmD,eAAAA,EAAgB;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,gCAAgC,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,QAAA,GAAWN,kBAAkB,MAAM,CAAA;AAEzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,CAAM,2BAA2B,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM/C,SAAQ,QAAA,EAAS;AAEvB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,iBAAiB,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiBA,OAAM,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,CAAA;AAChE,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,GAAA,CAAI,iBAAiBA,MAAAA,CAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,GAAA,CAAI,iBAAiBA,MAAAA,CAAM,KAAA,CAAM,MAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiBA,MAAAA,CAAM,KAAA,CAAM,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAK,CAAC,CAAA,CAAE,CAAA;AAC3E,IAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,iBAAA,CAAkB,QAAA,CAAS,UAAU,CAAC,CAAA,CAAE,CAAA;AAC7D,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;ACnDO,IAAMkE,YAAAA,GAAc,IAAIhE,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,4CAA4C,CAAA,CACxD,MAAA,CAAO,YAAY;AAClB,EAAA,MAAMiE,QAAAA,EAAQ;AAChB,CAAC,CAAA;AAKH,eAAeA,QAAAA,GAAyB;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMpD,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAE9C,IAAA,IAAI,CAAC,eAAe,IAAA,IAAQ,MAAA,CAAO,KAAK,cAAA,CAAe,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzE,MAAA,KAAA,CAAM,4BAA4B,CAAA;AAClC,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,yBAAyB,CAAA;AAC7B,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM7B,SAAQC,SAAAA,EAAS;AACvB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,IAAI,CAAA;AAEtD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,eAAe,CAAC,CAAA;AACtC,IAAA,GAAA,CAAI,EAAE,CAAA;AAEN,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,WAAA,EAAa;AAExC,MAAA,MAAM,aAAa,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAEnD,MAAA,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AACpB,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAClC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,MACtC;AACA,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE,CAAA;AAGjC,MAAA,MAAM,kBAA4B,EAAC;AACnC,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,KAAA,MAAW,CAAC,QAAQ,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,EAAG;AACjE,UAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,EAAG;AACzC,YAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACnD,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAA,cAAA,EAAiBA,MAAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,GAAA,CAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChE;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;ACvEO,IAAM,UAAA,GAAa,IAAIE,OAAAA,CAAQ,KAAK,EACxC,WAAA,CAAY,uBAAuB,CAAA,CACnC,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,MAAA,EAAO;AACf,CAAC,CAAA;AAMH,SAAS,kBAAkB,KAAA,EAAiC;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO,4BAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,oBAAA;AACpB,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,iCAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,EAAA,EAAI;AACvB,IAAA,OAAO,uDAAA;AAAA,EACT;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,WAAW,EAAA,EAAI;AACzB,MAAA,OAAO,oCAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,yBAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,eAAe,MAAA,GAAwB;AACrC,EAAA,IAAI;AACF,IAAA,MAAMF,SAAQC,SAAAA,EAAS;AAEvB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,iBAAiB,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,MAAA,GAAS,MAAMe,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,IAAQ,EAAC;AAG7C,IAAA,MAAM,IAAA,GAAO,MAAMvB,KAAAA,CAAM;AAAA,MACvB,OAAA,EAAS,kCAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,UAAA,OAAO,sBAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/B,UAAA,OAAO,gEAAA;AAAA,QACT;AAEA,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAA,OAAO,gBAAgB,KAAK,CAAA,gBAAA,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAMA,KAAAA,CAAM;AAAA,MACvB,OAAA,EAAS,eAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,UAAA,OAAO,sBAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAMA,KAAAA,CAAM;AAAA,MACxB,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAMA,KAAAA,CAAM;AAAA,MACzB,OAAA,EAAS,6BAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,0DAA0D,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAY,MAAMA,KAAAA,CAAM;AAAA,MAC5B,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,IAAI,kBAA4B,EAAC;AACjC,IAAA,IAAI,cAAA,CAAe,SAAS,MAAA,CAAO,IAAA,CAAK,eAAe,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACxE,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,IAAI,CAAA,MAAO;AAAA,QAChF,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,KAAK,IAAI,CAAA,CAAA;AAAA,QAC9B,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAEF,MAAA,eAAA,GAAkB,MAAM,QAAA,CAAS;AAAA,QAC/B,OAAA,EAAS,kDAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC7B,IAAA;AAAA,MACA,SAAA,EAAW,UAAU,IAAA;AAAK,KAC5B;AAEA,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACpC,MAAA,UAAA,CAAW,KAAA,GAAQ,MAAM,IAAA,EAAK;AAAA,IAChC;AAEA,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,UAAA,CAAW,MAAA,GAAS,OAAO,IAAA,EAAK;AAAA,IAClC;AAGA,IAAA,MAAM,aAAA,GAAwB;AAAA,MAC5B,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,YAAA;AAAA,QACH,CAAC,IAAI,GAAG;AAAA;AACV,KACF;AAGA,IAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,aAAA,CAAc,KAAA,EAAO;AACrD,MAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AAEpC,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACvC,QAAA,IAAI,IAAA,EAAM;AAER,UAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,YAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,cAAA,EAAe;AAClC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,KAAA,CAAM,8BAA8B,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,WAAA,GAAc2D,UAAc,aAAa,CAAA;AAC/C,IAAA,MAAMT,SAAAA,CAAU,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAE/C,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,IAAI,CAAA,oBAAA,CAAsB,CAAA;AAElD,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,CAAA,sBAAA,EAAyB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;AClLO,IAAMY,YAAAA,GAAc,IAAIlE,OAAAA,CAAQ,MAAM,EAC1C,WAAA,CAAY,oBAAoB,CAAA,CAChC,QAAA,CAAS,QAAA,EAAU,0BAA0B,CAAA,CAC7C,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,EAAA,MAAMmE,SAAQ,IAAI,CAAA;AACpB,CAAC,CAAA;AAMH,SAASC,mBAAkB,KAAA,EAAiC;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO,4BAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,oBAAA;AACpB,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,iCAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,EAAA,EAAI;AACvB,IAAA,OAAO,uDAAA;AAAA,EACT;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,WAAW,EAAA,EAAI;AACzB,MAAA,OAAO,oCAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,yBAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,eAAeD,SAAQ,IAAA,EAA6B;AAClD,EAAA,IAAI;AACF,IAAA,MAAMrE,SAAQC,SAAAA,EAAS;AAGvB,IAAA,MAAM,MAAA,GAAS,MAAMc,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAI9C,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,GAAO,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAI,CAAA,WAAA,CAAa,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI7B,OAAM,IAAA,CAAK,IAAA,GAAO,CAAA,kBAAA,EAAqB,IAAI,EAAE,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,mCAAmC,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,IAAA,GAAO,MAAMM,KAAAA,CAAM;AAAA,MACvB,OAAA,EAAS,eAAA;AAAA,MACT,SAAS,cAAA,CAAe,IAAA;AAAA,MACxB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,UAAA,OAAO,sBAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAMA,KAAAA,CAAM;AAAA,MACxB,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS,eAAe,KAAA,IAAS;AAAA,KAClC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAMA,KAAAA,CAAM;AAAA,MACzB,OAAA,EAAS,6BAAA;AAAA,MACT,OAAA,EAAS,eAAe,MAAA,IAAU;AAAA,KACnC,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,MAAMwD,OAAAA,CAAQ;AAAA,MAC9B,OAAA,EAAS,oBAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,YAAY,cAAA,CAAe,SAAA;AAC/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,GAAA,CAAI,2BAA2B,CAAA;AAC/B,MAAA,SAAA,GAAY,MAAMxD,KAAAA,CAAM;AAAA,QACtB,OAAA,EAAS,aAAA;AAAA,QACT,SAAS,cAAA,CAAe,SAAA;AAAA,QACxB,QAAA,EAAUgE;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,MAAW,CAAC,QAAQ,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,EAAG;AACjE,QAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,EAAG;AACzC,UAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,GAA0B,YAAA;AAC9B,IAAA,IAAI,cAAA,CAAe,SAAS,MAAA,CAAO,IAAA,CAAK,eAAe,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACxE,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,IAAI,CAAA,MAAO;AAAA,QAChF,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,KAAK,IAAI,CAAA,CAAA;AAAA,QAC9B,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,MAAM;AAAA,OACvC,CAAE,CAAA;AAEF,MAAA,aAAA,GAAgB,MAAMC,QAAAA,CAAS;AAAA,QAC7B,OAAA,EAAS,kDAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,aAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,SAAA,EAAW,UAAU,IAAA;AAAK,KAC5B;AAEA,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACpC,MAAA,aAAA,CAAc,KAAA,GAAQ,MAAM,IAAA,EAAK;AAAA,IACnC;AAEA,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,aAAA,CAAc,MAAA,GAAS,OAAO,IAAA,EAAK;AAAA,IACrC;AAGA,IAAA,MAAM,aAAA,GAAwB;AAAA,MAC5B,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,cAAA,CAAe,IAAA;AAAA,QAClB,CAAC,IAAI,GAAG;AAAA;AACV,KACF;AAGA,IAAA,IAAI,cAAc,KAAA,EAAO;AACvB,MAAA,KAAA,MAAW,CAAC,QAAQ,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA,EAAG;AAEhE,QAAA,IAAI,YAAA,CAAa,SAAS,MAAM,CAAA,IAAK,CAAC,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA,EAAG;AACpE,UAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAAA,QAC1E;AAGA,QAAA,IAAI,CAAC,aAAa,QAAA,CAAS,MAAM,KAAK,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA,EAAG;AACpE,UAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,YAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAaC,cAAAA,EAAe;AAClC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,KAAA,CAAM,8BAA8B,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,WAAA,GAAcP,UAAc,aAAa,CAAA;AAC/C,IAAA,MAAMT,SAAAA,CAAU,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAE/C,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,IAAI,CAAA,sBAAA,CAAwB,CAAA;AAEpD,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,GAAA,CAAI,CAAA,sBAAA,EAAyB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,8BAA8B,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;ACtMO,IAAMiB,iBAAgB,IAAIvE,OAAAA,CAAQ,QAAQ,CAAA,CAC9C,WAAA,CAAY,sBAAsB,CAAA,CAClC,QAAA,CAAS,UAAU,4BAA4B,CAAA,CAC/C,OAAO,aAAA,EAAe,0BAA0B,EAChD,MAAA,CAAO,OAAO,MAAc,OAAA,KAAiC;AAC5D,EAAA,MAAMwE,UAAAA,CAAU,MAAM,OAAO,CAAA;AAC/B,CAAC,CAAA;AAKH,eAAeA,UAAAA,CAAU,MAAc,OAAA,EAA6C;AAClF,EAAA,IAAI;AACF,IAAA,MAAM1E,SAAQC,SAAAA,EAAS;AAGvB,IAAA,MAAM,MAAA,GAAS,MAAMc,UAAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiBc,iBAAiB,MAAM,CAAA;AAI9C,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,GAAO,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAI,CAAA,WAAA,CAAa,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI7B,OAAM,IAAA,CAAK,IAAA,GAAO,CAAA,oBAAA,EAAuB,IAAI,EAAE,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,CAAA,MAAA,EAAS,cAAA,CAAe,IAAI,CAAA,CAAE,CAAA;AAClC,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,GAAA,CAAI,CAAA,OAAA,EAAU,cAAA,CAAe,KAAK,CAAA,CAAE,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,GAAA,CAAI,CAAA,QAAA,EAAW,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAGN,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAYgC,cAAc,WAAW,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAEN,MAAA,SAAA,GAAY,EAAE,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,IACtC;AAEA,IAAA,MAAM,uBAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,QAAQ,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5D,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,QAAA,oBAAA,CAAqB,KAAK,MAAM,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,IAAI,oBAAA,CAAqB,SAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,wDAAwD,CAAA;AAC7D,MAAA,KAAA,MAAW,UAAU,oBAAA,EAAsB;AACzC,QAAA,IAAA,CAAK,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,MACtB;AACA,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA,IAAA,CAAK,qEAAqE,CAAA;AAC1E,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,MAAW,CAAC,QAAQ,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,EAAG;AACjE,QAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,EAAG;AACzC,UAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,oDAAoD,CAAA;AACxD,MAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,QAAA,GAAA,CAAI,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,MACrB;AACA,MAAA,GAAA,CAAI,EAAE,CAAA;AAAA,IACR;AAGA,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,SAAA,GAAY,MAAM8B,OAAAA,CAAQ;AAAA,QAC9B,OAAA,EAAS,oCAAoC,IAAI,CAAA,EAAA,CAAA;AAAA,QACjD,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,mBAAmB,CAAA;AACzB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,MACjC;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,EAAE,GAAG,cAAA,CAAe,IAAA,EAAK;AAE7C,IAAA,OAAO,YAAY,IAAI,CAAA;AAGvB,IAAA,MAAM,aAAA,GAAwB;AAAA,MAC5B,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACR;AAGA,IAAA,IAAI,cAAc,KAAA,EAAO;AACvB,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,EAAG;AACrD,QAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAAA,MAC1E;AAAA,IACF;AAGA,IAAA,MAAM,aAAaU,cAAAA,EAAe;AAClC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,KAAA,CAAM,8BAA8B,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,WAAA,GAAcP,UAAc,aAAa,CAAA;AAC/C,IAAA,MAAMT,SAAAA,CAAU,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAE/C,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,IAAI,CAAA,sBAAA,CAAwB,CAAA;AACpD,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,IAChC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF;;;AC5IO,IAAM,cAAc,IAAItD,OAAAA,CAAQ,MAAM,CAAA,CAC1C,WAAA,CAAY,wCAAwC,CAAA,CACpD,UAAA,CAAWgE,YAAW,CAAA,CACtB,WAAW,UAAU,CAAA,CACrB,WAAWE,YAAW,CAAA,CACtB,WAAWK,cAAa,CAAA;ACL3B,IAAM,YAAA,GAAe,WAAA;AAOrB,eAAe,eAAe,GAAA,EAA2C;AACvE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,eAAA,CAAgB,OAAA,CAAQ,GAAG,CAAA;AAExD,IAAA,KAAA,GAAQ,aAAA,KAAkB,SAAS,MAAA,GAAS,aAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AAEN,IAAA,KAAA,GAAQ,MAAA;AAAA,EACV;AAGA,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,8BAAA,EAA+B;AAAA,IAC5D,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,0BAAA,EAA2B;AAAA,IAC1D,EAAE,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,+BAAA,EAAgC;AAAA,IAC5D,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,4BAAA,EAA6B;AAAA,IAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,0BAAA,EAA2B;AAAA,IACxD,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,wBAAA,EAAyB;AAAA,IACxD,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,2BAAA,EAA4B;AAAA,IAC1D,EAAE,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,mBAAA,EAAoB;AAAA,IACrD,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,qBAAA,EAAsB;AAAA,IACnD,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,sBAAA,EAAuB;AAAA,IACtD,EAAE,IAAA,EAAM,YAAA,EAAc,WAAA,EAAa,2BAAA;AAA4B,GACjE;AAGA,EAAA,MAAME,cAAAA,GAAyC;AAAA,IAC7C,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,WAAA,EAAY;AAAA,IAC3C,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,cAAA,EAAe;AAAA,IACjD,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,gBAAA,EAAiB;AAAA,IACnD,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,gBAAA,EAAiB;AAAA,IACjD,EAAE,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,qBAAA;AAAsB,GACzD;AAGA,EAAA,MAAM,mBAAA,GAA+C;AAAA,IACnD,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,uBAAA,EAAwB;AAAA,IACvD,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,qBAAA,EAAsB;AAAA,IACnD,EAAE,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,wBAAA,EAAyB;AAAA,IACrD,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,oBAAA;AAAqB,GACtD;AAGA,EAAA,MAAM,eAAA,GAA2C;AAAA,IAC/C,EAAE,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,0BAAA,EAA2B;AAAA,IACvD,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,mBAAA,EAAoB;AAAA,IACjD,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,sBAAA;AAAuB,GACxD;AAGA,EAAA,MAAM,qBAAA,GAAiD;AAAA,IACrD,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,0BAAA,EAA2B;AAAA,IAC3D,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,4BAAA;AAA6B,GACjE;AAGA,EAAA,MAAM,QAAkB,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAmB,GAAA,CAAI,IAAA;AAC7B,EAAA,MAAM,WAAmB,GAAA,CAAI,IAAA;AAG7B,EAAA,IAAI,QAAA,KAAa,UAAA,IAAc,QAAA,KAAa,IAAA,EAAM;AAEhD,IAAA,MAAA,CAAO,QAAA,EAAS;AAChB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,GAAA,CAAIA,cAAAA,EAAe,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,eAAe,KAAA,CAAM,SAAA;AAAA,IACzB,CAAC,MAAc,CAAC,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,KAAM,YAAA,IAAgB,CAAA,KAAM;AAAA,GACnE;AACA,EAAA,MAAM,iBAAgC,YAAA,IAAgB,CAAA,GAAK,KAAA,CAAM,YAAY,KAAK,IAAA,GAAQ,IAAA;AAG1F,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,MAAM,kBAAkB,KAAA,CAAM,SAAA;AAAA,MAC5B,CAAC,GAAW,CAAA,KAAc,CAAA,GAAI,gBAAgB,CAAC,CAAA,CAAE,WAAW,GAAG;AAAA,KACjE;AACA,IAAA,MAAM,aAA4B,eAAA,IAAmB,CAAA,GAAK,KAAA,CAAM,eAAe,KAAK,IAAA,GAAQ,IAAA;AAE5F,IAAA,IAAI,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,QAAA,EAAU;AAEnD,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAC1C,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACzC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,eAAA,GAAkB,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,EAAqB,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAClD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,IAAA,MAAM,kBAAkB,KAAA,CAAM,SAAA;AAAA,MAC5B,CAAC,GAAW,CAAA,KAAc,CAAA,GAAI,gBAAgB,CAAC,CAAA,CAAE,WAAW,GAAG;AAAA,KACjE;AACA,IAAA,MAAM,aAA4B,eAAA,IAAmB,CAAA,GAAK,KAAA,CAAM,eAAe,KAAK,IAAA,GAAQ,IAAA;AAE5F,IAAA,IAAI,CAAC,UAAA,IAAc,eAAA,GAAkB,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAC9C,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,mBAAmB,YAAA,EAAc;AACnC,IAAA,MAAM,kBAAkB,KAAA,CAAM,SAAA;AAAA,MAC5B,CAAC,GAAW,CAAA,KAAc,CAAA,GAAI,gBAAgB,CAAC,CAAA,CAAE,WAAW,GAAG;AAAA,KACjE;AACA,IAAA,MAAM,aAA4B,eAAA,IAAmB,CAAA,GAAK,KAAA,CAAM,eAAe,KAAK,IAAA,GAAQ,IAAA;AAE5F,IAAA,IAAI,eAAe,SAAA,EAAW;AAE5B,MAAA,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAAG,KAAA,EAAO,QAAQ,GAAG,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,eAAA,GAAkB,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,GAAA,CAAI,qBAAA,EAAuB,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACpD,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,KAAmB,QAAA,IAAY,cAAA,KAAmB,QAAA,IAAY,mBAAmB,MAAA,EAAQ;AAC3F,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AACjC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACpC,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACrC,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,GAAGA,cAAa,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,EAChE;AACF;AAKA,eAAe,gBAAA,GAAsC;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMtB,eAAAA,EAAgB;AACrC,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAKA,eAAe,YAAA,GAAkC;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMtC,UAAAA,EAAW;AAChC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAKA,eAAe,aAAA,GAAmC;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,UAAAA,EAAW;AAChC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAEO,IAAM,oBAAoB,IAAIb,OAAAA,CAAQ,YAAY,CAAA,CAAE,YAAY,2BAA2B,CAAA;AAGlG,iBAAA,CACG,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,+CAA+C,CAAA,CAC3D,MAAA,CAAO,OAAO,QAAA,KAAsB;AACnC,EAAA,IAAI;AAEF,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,MAAA,IAAI,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AACrC,QAAA,KAAA,GAAQ,QAAA;AAAA,MACV,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,2CAAA,CAA6C,CAAA;AACrE,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAA,CAAQ;AAAA,MACnB,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,YAAA;AAAA,MACX;AAAA,KACD,CAAA;AAED,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,6BAA6B,CAAA;AACrC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAA,CAAK,4BAA4B,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAU,CAAC,KAAA,EAAO;AAC9B,MAAA,GAAA,CAAI,oBAAoB,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,KAAA,KAAU,KAAA,IAAS,CAAC,KAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,mBAAmB,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,KAAA,KAAU,MAAA,IAAU,CAAC,KAAA,EAAO;AAC9B,MAAA,GAAA,CAAI,qCAAqC,CAAA;AAAA,IAC3C;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF,CAAC,CAAA;AAGH,iBAAA,CACG,QAAQ,WAAW,CAAA,CACnB,YAAY,4BAA4B,CAAA,CACxC,OAAO,YAAY;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,SAAA,CAAU;AAAA,MACrB,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,+BAA+B,CAAA;AACvC,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,CAAA,gCAAA,EAAmC,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAC3F,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACpC;AACF,CAAC,CAAA;AAGH,iBAAA,CACG,OAAA,CAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAClC,WAAA,CAAY,8BAA8B,CAAA,CAC1C,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AACvC,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,MAAM,eAAe,GAAG,CAAA;AAAA,EAC1B;AACF,CAAC,CAAA;AC1QH,SAAS,WAAW,IAAA,EAA4C;AAC9D,EAAA,OACE,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,KAAS,QACT,SAAA,IAAa,IAAA;AAAA,EAEb,OAAQ,KAA8B,OAAA,KAAY,QAAA;AAEtD;AAGA,IAAI,aAAA;AAEJ,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYY,QAAQ,UAAU,CAAA;AAKpC,EAAA,MAAM,aAAA,GAAgB,CAACwC,IAAAA,CAAK,SAAA,EAAW,iBAAiB,CAAA,EAAGA,IAAAA,CAAK,SAAA,EAAW,oBAAoB,CAAC,CAAA;AAEhG,EAAA,KAAA,MAAW,mBAAmB,aAAA,EAAe;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAA;AACrD,MAAA,MAAM,eAAA,GAA2B,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEnD,MAAA,IAAI,CAAC,UAAA,CAAW,eAAe,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,eAAe,CAAA,uBAAA,CAAyB,CAAA;AAAA,MACrF;AAEA,MAAA,aAAA,GAAgB,eAAA,CAAgB,OAAA;AAChC,MAAA,OAAO,aAAA;AAAA,IACT,SAASnB,MAAAA,EAAO;AAEd,MAAA,IAAIA,kBAAiB,KAAA,IAAS,MAAA,IAAUA,MAAAA,IAASA,MAAAA,CAAM,SAAS,QAAA,EAAU;AAExE,QAAA;AAAA,MACF;AACA,MAAA,MAAMA,MAAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/C;AAEA,IAAM,OAAA,GAAU,IAAIjC,OAAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,WAAW,CAAA,CAChB,WAAA,CAAY,qCAAqC,EACjD,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA,CACnD,OAAO,eAAA,EAAiB,gBAAgB,CAAA,CACxC,MAAA,CAAO,eAAe,gBAAgB,CAAA;AAGzC,OAAA,CAAQ,MAAA,CAAO,iBAAiB,2BAA2B,CAAA;AAG3D,OAAA,CAAQ,WAAW,WAAW,CAAA;AAC9B,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,UAAU,CAAA;AAC7B,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,YAAY,CAAA;AAC/B,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,WAAW,CAAA;AAC9B,OAAA,CAAQ,WAAW,eAAe,CAAA;AAClC,OAAA,CAAQ,WAAW,WAAW,CAAA;AAC9B,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,iBAAiB,CAAA;AAMpC,SAAS,oBAAA,GAA6B;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AACtD,EAAA,IAAI,iBAAiB,EAAA,IAAM,YAAA,GAAe,CAAA,GAAI,OAAA,CAAQ,KAAK,MAAA,EAAQ;AACjE,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA;AAC7C,IAAA,IAAI,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACvC,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAE1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AACF;AAEA,eAAsB,GAAA,GAAqB;AAEzC,EAAA,oBAAA,EAAqB;AAGrB,EAAA,IAAI,OAAA,CAAQ,KAAK,QAAA,CAAS,WAAW,KAAK,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAC/B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,SAAA,EAAU;AAGhB,EAAA,OAAA,CAAQ,KAAA,EAAM;AACd,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAA6C;AAErE,EAAA,MAAM,gBAAwD,EAAC;AAC/D,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,aAAA,CAAc,UAAU,OAAA,CAAQ,OAAA;AAAA,EAClC;AACA,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,IAAA,aAAA,CAAc,QAAQ,OAAA,CAAQ,KAAA;AAAA,EAChC;AAEA,EAAA,gBAAA,CAAiB,aAAa,CAAA;AAChC;;;ACvIA,KAAK,GAAA,EAAI","file":"attest-it.js","sourcesContent":["import { detectTheme, type Theme } from 'chromaterm'\n\nexport interface OutputOptions {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n}\n\n// Singleton for global output options\nlet globalOptions: OutputOptions = {}\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required mock theme for testing/fallback when async init not called\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOptions = options\n}\n\nexport function getOutputOptions(): OutputOptions {\n return globalOptions\n}\n\n// Logging functions\nexport function log(message: string): void {\n if (!globalOptions.quiet) {\n console.log(message)\n }\n}\n\nexport function verbose(message: string): void {\n if (globalOptions.verbose && !globalOptions.quiet) {\n console.log(getTheme().muted(message))\n }\n}\n\nexport function success(message: string): void {\n log(getTheme().success('✓ ' + message))\n}\n\nexport function error(message: string): void {\n console.error(getTheme().error('✗ ' + message))\n}\n\nexport function warn(message: string): void {\n if (!globalOptions.quiet) {\n console.warn(getTheme().warning('⚠ ' + message))\n }\n}\n\nexport function info(message: string): void {\n log(getTheme().info('ℹ ' + message))\n}\n\n// Table formatting for status display\nexport interface TableRow {\n suite: string\n status: string\n fingerprint: string\n age: string\n}\n\nexport function formatTable(rows: TableRow[]): string {\n // Calculate column widths\n const headers = ['Suite', 'Status', 'Fingerprint', 'Age']\n\n // Helper to get row values in consistent order\n const getRowValues = (row: TableRow): string[] => [\n row.suite,\n row.status,\n row.fingerprint,\n row.age,\n ]\n\n const widths = headers.map((h, i) => {\n const columnValues = rows.map((r) => {\n const values = getRowValues(r)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n return values[i] ?? ''\n })\n const maxValueLength = Math.max(...columnValues.map((v) => v.length), 0)\n return Math.max(h.length, maxValueLength)\n })\n\n // Build table\n const separator = '─'\n const lines: string[] = []\n\n // Header\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(headers.map((h, i) => h.padEnd(widths[i] ?? 0)).join(' │ '))\n lines.push(widths.map((w) => separator.repeat(w)).join('─┼─'))\n\n // Rows\n for (const row of rows) {\n const values = getRowValues(row)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(values.map((v, i) => v.padEnd(widths[i] ?? 0)).join(' │ '))\n }\n\n return lines.join('\\n')\n}\n\n// Status colorization\nexport function colorizeStatus(status: string): string {\n const t = getTheme()\n switch (status) {\n case 'VALID':\n return t.green(status)\n case 'NEEDS_ATTESTATION':\n case 'FINGERPRINT_CHANGED':\n return t.yellow(status)\n case 'EXPIRED':\n case 'INVALIDATED_BY_PARENT':\n return t.red(status)\n case 'SIGNATURE_INVALID':\n return t.red.bold()(status)\n default:\n return status\n }\n}\n\n// JSON output\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n","/**\n * Theme utilities for ink components.\n * Provides access to chromaterm theme and shared styling constants.\n */\n\nimport { detectTheme, type Theme } from 'chromaterm'\n\n/**\n * Status display configuration.\n */\nexport interface StatusDisplay {\n /** Text to display */\n label: string\n /** Ink color name */\n color: string\n /** Whether to apply bold */\n bold?: boolean\n /** Symbol to show before label */\n symbol?: string\n}\n\n/**\n * Map verification status to display configuration.\n */\nexport const STATUS_DISPLAY: Record<string, StatusDisplay> = {\n VALID: {\n label: 'VALID',\n color: 'green',\n symbol: '✓',\n },\n NEEDS_ATTESTATION: {\n label: 'MISSING',\n color: 'yellow',\n symbol: '○',\n },\n FINGERPRINT_CHANGED: {\n label: 'CHANGED',\n color: 'yellow',\n symbol: '⚠',\n },\n EXPIRED: {\n label: 'STALE',\n color: 'red',\n symbol: '⚠',\n },\n SIGNATURE_INVALID: {\n label: 'INVALID',\n color: 'red',\n bold: true,\n symbol: '✗',\n },\n INVALIDATED_BY_PARENT: {\n label: 'PARENT_INVALID',\n color: 'red',\n symbol: '✗',\n },\n}\n\n/**\n * Box drawing characters for consistent UI.\n */\nexport const BOX_CHARS = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n cross: '┼',\n} as const\n\n/**\n * Common column widths for table display.\n */\nexport const COLUMN_WIDTHS = {\n checkbox: 3, // [ ] or [x]\n status: 14, // MISSING, CHANGED, PARENT_INVALID, etc.\n suite: 25, // Suite name\n reason: 30, // Reason text\n} as const\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // Type assertion is required here because we're creating a mock Theme object\n // for testing/fallback purposes. The chromaterm Theme type has complex\n // chainable methods that we're approximating with simple functions.\n // This is safe because all methods accept and return strings.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required to create mock theme for testing\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\n/**\n * Get display configuration for a verification status.\n * Returns a default for unknown statuses.\n */\nexport function getStatusDisplay(status: string): StatusDisplay {\n return (\n // eslint-disable-next-line security/detect-object-injection -- status is a user-controlled string, but we provide a safe default for unknown values\n STATUS_DISPLAY[status] ?? {\n label: status,\n color: 'white',\n symbol: '?',\n }\n )\n}\n","import { confirm } from '@inquirer/prompts'\nimport { getTheme, BOX_CHARS } from '../components/theme.js'\n\nexport interface ConfirmOptions {\n message: string\n default?: boolean\n}\n\n/**\n * Display a visually distinctive confirmation prompt.\n *\n * Creates a styled box with yellow border to make the attestation prompt\n * stand out from test output.\n */\nexport async function confirmAction(options: ConfirmOptions): Promise<boolean> {\n const theme = getTheme()\n\n // Build the styled prompt box\n const defaultIndicator = options.default ? '(Y/n)' : '(y/N)'\n const message = `${options.message}? ${defaultIndicator}`\n const boxWidth = Math.max(message.length + 2, 40)\n const contentPadding = ' '.repeat(boxWidth - message.length - 1)\n\n // Box drawing with yellow border\n const topBorder = theme.yellow(\n `${BOX_CHARS.topLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.topRight}`,\n )\n const bottomBorder = theme.yellow(\n `${BOX_CHARS.bottomLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.bottomRight}`,\n )\n\n // Content line with yellow border and normal text\n const contentLine =\n theme.yellow(BOX_CHARS.vertical) +\n ` ${message}${contentPadding}` +\n theme.yellow(BOX_CHARS.vertical)\n\n // Display the styled box\n console.log('')\n console.log(topBorder)\n console.log(contentLine)\n console.log(bottomBorder)\n console.log('')\n\n // Get the actual confirmation\n return confirm({\n message: '', // Empty message since we displayed it above\n default: options.default ?? false,\n theme: {\n prefix: '', // Remove default prefix\n },\n })\n}\n","/**\n * Standard exit codes for the attest-it CLI.\n *\n * These codes follow Unix conventions and provide consistent error reporting\n * across all CLI commands.\n *\n * @packageDocumentation\n */\n\n/**\n * Standard exit codes for the attest-it CLI.\n * @public\n */\nexport const ExitCode = {\n /** Operation completed successfully */\n SUCCESS: 0,\n /** Tests failed or attestation invalid */\n FAILURE: 1,\n /** Nothing needed attestation */\n NO_WORK: 2,\n /** Configuration or validation error */\n CONFIG_ERROR: 3,\n /** User cancelled the operation */\n CANCELLED: 4,\n /** Missing required key file */\n MISSING_KEY: 5,\n} as const\n\n/**\n * Type representing all possible exit codes.\n * @public\n */\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode]\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { log, success, error } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize attest-it configuration')\n .option('-p, --path <path>', 'Config file path', '.attest-it/config.yaml')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options: InitOptions) => {\n await runInit(options)\n })\n\ninterface InitOptions {\n path: string\n force?: boolean\n}\n\nconst CONFIG_TEMPLATE = `# attest-it configuration\n# See https://github.com/attest-it/attest-it for documentation\n\nversion: 1\n\nsettings:\n # How long attestations remain valid (in days)\n maxAgeDays: 30\n # Path to the public key used for signature verification\n publicKeyPath: .attest-it/pubkey.pem\n # Path to the attestations file\n attestationsPath: .attest-it/attestations.json\n # Signing algorithm\n algorithm: rsa\n\n# Define your test suites below. Each suite groups tests that require\n# human verification before their attestations are accepted.\n#\n# Example:\n#\n# suites:\n# visual-tests:\n# description: Visual regression tests requiring human review\n# packages:\n# - packages/ui\n# - packages/components\n# command: pnpm vitest packages/ui packages/components\n#\n# integration:\n# description: Integration tests with external services\n# packages:\n# - packages/api\n# command: pnpm vitest packages/api --project=integration\n\nsuites: {}\n`\n\n/**\n * Run the init command to create a new attest-it configuration.\n *\n * Creates a configuration file with sensible defaults and commented\n * examples showing how to define test suites.\n *\n * @param options - Command options\n * @param options.path - Config file path (default: .attest-it/config.yaml)\n * @param options.force - Overwrite existing config without prompting\n * @public\n */\nasync function runInit(options: InitOptions): Promise<void> {\n try {\n const configPath = path.resolve(options.path)\n const configDir = path.dirname(configPath)\n\n if (fs.existsSync(configPath) && !options.force) {\n const overwrite = await confirmAction({\n message: `Config already exists at ${configPath}. Overwrite?`,\n default: false,\n })\n if (!overwrite) {\n error('Init cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Create directory and write config\n await fs.promises.mkdir(configDir, { recursive: true })\n await fs.promises.writeFile(configPath, CONFIG_TEMPLATE, 'utf-8')\n\n success(`Configuration created at ${configPath}`)\n log('')\n log('Next steps:')\n log(` 1. Edit ${options.path} to define your test suites`)\n log(' 2. Run: attest-it keygen')\n log(' 3. Run: attest-it status')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\nexport { runInit }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyGateSeal,\n verifyAllSeals,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const statusCommand = new Command('status')\n .description('Show seal status for all gates')\n .argument('[gates...]', 'Show status for specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: StatusOptions) => {\n await runStatus(gates, options)\n })\n\ninterface StatusOptions {\n json?: boolean\n}\n\ninterface GateStatus {\n gateId: string\n state: VerificationState\n currentFingerprint: string\n sealedFingerprint?: string\n sealedBy?: string\n sealedAt?: string\n age?: number\n message?: string | undefined\n}\n\n/**\n * Run the status command to show seal status.\n *\n * Displays the current status of seals for all gates or specific gates,\n * including validation status, fingerprints, and age information.\n *\n * @param gates - Array of gate IDs to show status for, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runStatus(gates: string[], options: StatusOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to check\n const gatesToCheck = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const verificationResults =\n gates.length > 0\n ? gatesToCheck.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Build status results\n const results: GateStatus[] = verificationResults.map((result: SealVerificationResult) => {\n const status: GateStatus = {\n gateId: result.gateId,\n state: result.state,\n currentFingerprint: fingerprints[result.gateId] ?? '',\n message: result.message,\n }\n\n if (result.seal) {\n status.sealedFingerprint = result.seal.fingerprint\n status.sealedBy = result.seal.sealedBy\n status.sealedAt = result.seal.timestamp\n\n // Calculate age\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n status.age = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n }\n\n return status\n })\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayStatusTable(results)\n }\n\n // Exit with appropriate code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER' ||\n r.state === 'STALE',\n )\n\n process.exit(hasInvalid ? ExitCode.FAILURE : ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display status results in a formatted table.\n *\n * @param results - Status results for gates\n */\nfunction displayStatusTable(results: GateStatus[]): void {\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: r.currentFingerprint.slice(0, 16) + '...',\n age: formatAge(r),\n }))\n\n log('')\n log(formatTable(tableRows))\n log('')\n\n // Show seal metadata for each gate (who sealed, when)\n const sealed = results.filter((r) => r.sealedBy && r.sealedAt)\n if (sealed.length > 0) {\n log('Seal metadata:')\n for (const result of sealed) {\n log(` ${result.gateId}:`)\n log(` Sealed by: ${result.sealedBy ?? 'unknown'}`)\n if (result.sealedAt) {\n const date = new Date(result.sealedAt)\n log(` Sealed at: ${date.toLocaleString()}`)\n }\n }\n log('')\n }\n\n // Show messages for any gates with issues\n const withIssues = results.filter((r) => r.state !== 'VALID' && r.message)\n if (withIssues.length > 0) {\n log('Issues:')\n for (const result of withIssues) {\n log(` ${result.gateId}: ${result.message ?? 'Unknown issue'}`)\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const invalidCount = results.length - validCount\n\n if (invalidCount === 0) {\n success('All gate seals valid')\n } else {\n log(`Run 'attest-it seal' to create or update seals`)\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format age for display.\n *\n * @param result - Status result\n * @returns Formatted age string\n */\nfunction formatAge(result: GateStatus): string {\n if (result.state === 'VALID' || result.state === 'STALE') {\n return `${String(result.age ?? 0)} days${result.state === 'STALE' ? ' (stale)' : ''}`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runStatus }\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface HeaderProps {\n /** Number of suites needing attestation */\n pendingCount: number\n}\n\n/**\n * Displays a header box with pending suite count.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ 4 suites need attestation │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function Header({ pendingCount }: HeaderProps): React.ReactElement {\n const message = `${pendingCount.toString()} suite${pendingCount === 1 ? '' : 's'} need${pendingCount === 1 ? 's' : ''} attestation`\n\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>{message}</Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Props for the StatusBadge component.\n * @public\n */\nexport interface StatusBadgeProps {\n /** The verification status to display */\n status: VerificationStatus\n}\n\n/**\n * Displays a colored badge for suite verification status.\n *\n * Status colors:\n * - VALID: green\n * - NEEDS_ATTESTATION: yellow (display as \"MISSING\")\n * - FINGERPRINT_CHANGED: yellow (display as \"CHANGED\")\n * - EXPIRED: red (display as \"STALE\")\n * - SIGNATURE_INVALID: red bold\n * - INVALIDATED_BY_PARENT: red (display as \"INVALIDATED\")\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function StatusBadge({ status }: StatusBadgeProps): React.ReactElement {\n // Map status to display text and color\n const statusConfig = getStatusConfig(status)\n\n // Only pass bold prop if it's true to avoid exactOptionalPropertyTypes issues\n if (statusConfig.bold) {\n return (\n <Text color={statusConfig.color} bold>\n {statusConfig.text}\n </Text>\n )\n }\n\n return <Text color={statusConfig.color}>{statusConfig.text}</Text>\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\ninterface StatusConfig {\n text: string\n color: 'green' | 'yellow' | 'red'\n bold?: boolean\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\nfunction getStatusConfig(status: VerificationStatus): StatusConfig {\n switch (status) {\n case 'VALID':\n return { text: '✓ VALID', color: 'green' }\n case 'NEEDS_ATTESTATION':\n return { text: 'MISSING', color: 'yellow' }\n case 'FINGERPRINT_CHANGED':\n return { text: 'CHANGED', color: 'yellow' }\n case 'EXPIRED':\n return { text: 'STALE', color: 'red' }\n case 'SIGNATURE_INVALID':\n return { text: 'INVALID', color: 'red', bold: true }\n case 'INVALIDATED_BY_PARENT':\n return { text: 'INVALIDATED', color: 'red' }\n default: {\n // Exhaustive check\n const _exhaustive: never = status\n return { text: String(_exhaustive), color: 'yellow' }\n }\n }\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { StatusBadge } from './StatusBadge.js'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Information about a single suite for display in the table.\n * @public\n */\nexport interface SuiteInfo {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason (e.g., \"32 days old (max: 30)\") */\n reason: string\n /** Days since attestation (if exists) */\n age?: number | undefined\n}\n\n/**\n * Props for the SuiteTable component.\n * @public\n */\nexport interface SuiteTableProps {\n /** List of suites to display */\n suites: SuiteInfo[]\n /** Show checkbox column for selection */\n selectable?: boolean | undefined\n /** Currently selected suite names */\n selected?: Set<string> | undefined\n}\n\n/**\n * Displays suites in a table format with status badges.\n *\n * Example output:\n * ```\n * Status Suite Reason\n * ──────────────────────────────────────────────────────────\n * [ ] STALE visual-effects 32 days old (max: 30)\n * [ ] MISSING focus-detection No attestation found\n * ```\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function SuiteTable({\n suites,\n selectable = false,\n selected = new Set(),\n}: SuiteTableProps): React.ReactElement {\n // Calculate column widths\n const columnWidths = calculateColumnWidths(suites, selectable)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box>\n {selectable && <Text>{' '.repeat(4)}</Text>}\n <Text bold>{padEnd('Status', columnWidths.status)}</Text>\n <Text> </Text>\n <Text bold>{padEnd('Suite', columnWidths.suite)}</Text>\n <Text> </Text>\n <Text bold>Reason</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color=\"gray\">\n {'─'.repeat(\n (selectable ? 4 : 0) + columnWidths.status + columnWidths.suite + columnWidths.reason,\n )}\n </Text>\n </Box>\n\n {/* Rows */}\n {suites.map((suite) => (\n <Box key={suite.name}>\n {selectable && <Text>{selected.has(suite.name) ? '[✓] ' : '[ ] '}</Text>}\n <Box width={columnWidths.status}>\n <StatusBadge status={suite.status} />\n </Box>\n <Text> </Text>\n <Text>{padEnd(suite.name, columnWidths.suite)}</Text>\n <Text> </Text>\n <Text color=\"gray\">{suite.reason}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n/**\n * Column width information.\n * @internal\n */\ninterface ColumnWidths {\n status: number\n suite: number\n reason: number\n}\n\n/**\n * Calculate column widths based on content.\n * @internal\n */\nfunction calculateColumnWidths(suites: SuiteInfo[], _selectable: boolean): ColumnWidths {\n const statusHeader = 'Status'\n const suiteHeader = 'Suite'\n const reasonHeader = 'Reason'\n\n // Status column - fixed width for badges\n // Maximum status badge length is \"INVALIDATED\" (11 chars) + \"✓ \" (2 chars) = 13\n const statusWidth = Math.max(statusHeader.length, 13)\n\n // Suite column - max of header and all suite names\n const suiteWidth = Math.max(suiteHeader.length, ...suites.map((s) => s.name.length))\n\n // Reason column - max of header and all reasons\n const reasonWidth = Math.max(reasonHeader.length, ...suites.map((s) => s.reason.length))\n\n return {\n status: statusWidth,\n suite: suiteWidth,\n reason: reasonWidth,\n }\n}\n\n/**\n * Pad a string to the right with spaces.\n * @internal\n */\nfunction padEnd(str: string, width: number): string {\n return str.padEnd(width, ' ')\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\n\ninterface SelectionOption {\n /** Display label */\n label: string\n /** Value returned when selected */\n value: string\n /** Optional keyboard shortcut hint */\n hint?: string\n}\n\nexport interface SelectionPromptProps {\n /** Question to display */\n message: string\n /** Available options */\n options: SelectionOption[]\n /** Callback when option selected */\n onSelect: (value: string) => void\n /** Show group options if available */\n groups?: { name: string; label: string }[] | undefined\n}\n\n/**\n * Displays a selection prompt with keyboard hints.\n *\n * Example output:\n * Select suites to run:\n * [a] All pending [1-4] By number [n] None/exit\n * [g1] ui-tests [g2] behavior-tests\n */\nexport function SelectionPrompt({\n message,\n options,\n onSelect,\n groups,\n}: SelectionPromptProps): React.ReactElement {\n useInput((input) => {\n // Check if input matches any option's hint\n const matchedOption = options.find((opt) => opt.hint === input)\n if (matchedOption) {\n onSelect(matchedOption.value)\n return\n }\n\n // Check if input matches a group name\n if (groups) {\n const matchedGroup = groups.find((group) => group.name === input)\n if (matchedGroup) {\n onSelect(matchedGroup.name)\n }\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{message}</Text>\n <Box marginTop={1} gap={2}>\n {options.map((option) => (\n <Text key={option.value}>\n {option.hint && (\n <>\n <Text color=\"cyan\">[{option.hint}]</Text>{' '}\n </>\n )}\n {option.label}\n </Text>\n ))}\n </Box>\n {groups && groups.length > 0 && (\n <Box marginTop={1} gap={2}>\n {groups.map((group) => (\n <Text key={group.name}>\n <Text color=\"cyan\">[{group.name}]</Text> {group.label}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Header } from './Header.js'\nimport { SuiteTable } from './SuiteTable.js'\nimport { SelectionPrompt } from './SelectionPrompt.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\n\ninterface SuiteSelectorProps {\n /** All suites needing attestation */\n pendingSuites: SuiteStatus[]\n /** Valid suites (for \"Already valid\" display) */\n validSuites: SuiteStatus[]\n /** Available groups from config */\n groups?: Record<string, string[]> | undefined\n /** Called when user confirms selection */\n onSelect: (selectedSuites: string[]) => void\n /** Called when user exits */\n onExit: () => void\n}\n\n/**\n * Main suite selection UI component.\n *\n * Displays:\n * 1. Header with pending count\n * 2. Table of pending suites with checkboxes\n * 3. List of already valid suites\n * 4. Selection prompt with keyboard shortcuts\n *\n * Keyboard controls:\n * - a: Select all pending\n * - n: None/exit\n * - 1-9: Toggle individual suite by number\n * - g1, g2, etc: Select group (if groups available)\n * - Enter: Confirm selection\n * - Space: Toggle current suite\n * - Up/Down: Navigate\n */\nexport function SuiteSelector({\n pendingSuites,\n validSuites,\n groups,\n onSelect,\n onExit,\n}: SuiteSelectorProps): React.ReactElement {\n const [selectedSuites, setSelectedSuites] = React.useState<Set<string>>(new Set())\n const [cursorIndex, setCursorIndex] = React.useState(0)\n\n /**\n * Toggle suite selection state\n */\n const toggleSuite = React.useCallback((suiteName: string) => {\n setSelectedSuites((prev) => {\n const next = new Set(prev)\n if (next.has(suiteName)) {\n next.delete(suiteName)\n } else {\n next.add(suiteName)\n }\n return next\n })\n }, [])\n\n useInput((input, key) => {\n // 'a' - select all pending\n if (input === 'a') {\n setSelectedSuites(new Set(pendingSuites.map((s) => s.name)))\n return\n }\n\n // 'n' - none/exit\n if (input === 'n') {\n onExit()\n return\n }\n\n // Numbers 1-9 - toggle by number\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1\n if (idx < pendingSuites.length) {\n // eslint-disable-next-line security/detect-object-injection -- idx is bounds-checked against pendingSuites.length\n const suite = pendingSuites[idx]\n if (suite) {\n toggleSuite(suite.name)\n }\n }\n return\n }\n\n // Handle group shortcuts like 'g1', 'g2'\n if (input.startsWith('g') && groups) {\n const groupIdx = parseInt(input.slice(1), 10) - 1\n const groupNames = Object.keys(groups)\n if (groupIdx >= 0 && groupIdx < groupNames.length) {\n // eslint-disable-next-line security/detect-object-injection -- groupIdx is bounds-checked against groupNames.length\n const groupName = groupNames[groupIdx]\n if (groupName) {\n // eslint-disable-next-line security/detect-object-injection -- groupName is from Object.keys, so it's safe\n const groupSuites: string[] = groups[groupName] ?? []\n // Add all suites in this group to selection\n const newSelected = new Set(selectedSuites)\n groupSuites.forEach((s: string) => newSelected.add(s))\n setSelectedSuites(newSelected)\n }\n }\n return\n }\n\n // Enter - confirm selection\n if (key.return) {\n onSelect(Array.from(selectedSuites))\n return\n }\n\n // Space - toggle current\n if (input === ' ') {\n // eslint-disable-next-line security/detect-object-injection -- cursorIndex is bounds-checked via Math.min/Math.max\n const currentSuite = pendingSuites[cursorIndex]\n if (currentSuite) {\n toggleSuite(currentSuite.name)\n }\n return\n }\n\n // Arrow navigation\n if (key.upArrow) {\n setCursorIndex(Math.max(0, cursorIndex - 1))\n return\n }\n if (key.downArrow) {\n setCursorIndex(Math.min(pendingSuites.length - 1, cursorIndex + 1))\n return\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n {/* Header showing pending count */}\n <Header pendingCount={pendingSuites.length} />\n\n <Box marginY={1}>\n {/* Table of pending suites with numbers and checkboxes */}\n <SuiteTable suites={pendingSuites} selectable={true} selected={selectedSuites} />\n </Box>\n\n {/* Show valid suites if any */}\n {validSuites.length > 0 && (\n <Box marginY={1} flexDirection=\"column\">\n <Text dimColor>Already valid:</Text>\n {validSuites.map((s) => (\n <Text key={s.name} dimColor>\n {' '}✓ {s.name} (attested {String(s.age ?? 0)} days ago)\n </Text>\n ))}\n </Box>\n )}\n\n {/* Selection prompt */}\n <SelectionPrompt\n message=\"Select suites to run:\"\n options={[\n { label: 'All pending', value: 'all', hint: 'a' },\n { label: 'By number', value: 'number', hint: '1-9' },\n { label: 'None/exit', value: 'none', hint: 'n' },\n ]}\n groups={\n groups\n ? Object.keys(groups).map((name, i) => ({\n name: `g${String(i + 1)}`,\n label: name,\n }))\n : undefined\n }\n onSelect={() => {\n /* Handled by useInput */\n }}\n />\n\n {/* Current selection count */}\n <Text color=\"cyan\">{selectedSuites.size} selected. Press Enter to confirm.</Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ProgressSummaryProps {\n /** Number of suites completed successfully */\n completed: number\n /** Number of suites remaining to run */\n remaining: number\n /** Number of suites that failed */\n failed: number\n /** Number of suites skipped by user */\n skipped: number\n}\n\n/**\n * Displays a summary box showing test run progress.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ Completed: 2 Remaining: 2 Failed: 0 Skipped: 0 │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function ProgressSummary({\n completed,\n remaining,\n failed,\n skipped,\n}: ProgressSummaryProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>\n <Text color=\"green\">Completed: {completed}</Text>\n {' '}\n <Text color=\"yellow\">Remaining: {remaining}</Text>\n {' '}\n <Text color=\"red\">Failed: {failed}</Text>\n {' '}\n <Text color=\"gray\">Skipped: {skipped}</Text>\n </Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ProgressSummary } from './ProgressSummary.js'\n\ntype RunPhase = 'running' | 'confirming' | 'complete'\n\nexport interface TestRunnerProps {\n /** Suites to run in order */\n suites: string[]\n /** Execute a test command and return success/failure */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Called when all suites complete */\n onComplete: (results: RunResults) => void\n}\n\nexport interface RunResults {\n completed: string[]\n failed: string[]\n skipped: string[]\n}\n\n/**\n * Test runner component that executes suites and manages attestations.\n *\n * Flow for each suite:\n * 1. Show \"Running suite-name...\"\n * 2. Execute test command\n * 3. If passed, prompt \"Create attestation? [Y/n]\"\n * 4. If user confirms, create attestation\n * 5. Move to next suite\n *\n * If a test fails, it moves to the next suite without prompting for attestation.\n */\nexport function TestRunner({\n suites,\n executeTest,\n createAttestation,\n onComplete,\n}: TestRunnerProps): React.ReactElement {\n const [currentIndex, setCurrentIndex] = React.useState(0)\n const [phase, setPhase] = React.useState<RunPhase>('running')\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n const [_testPassed, setTestPassed] = React.useState(false)\n\n // Use a ref to store the latest results for the completion callback\n const resultsRef = React.useRef(results)\n React.useEffect(() => {\n resultsRef.current = results\n }, [results])\n\n // Effect to run tests\n React.useEffect(() => {\n if (phase !== 'running') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) {\n // All done - use ref to avoid stale closure\n onComplete(resultsRef.current)\n setPhase('complete')\n return\n }\n\n // Execute the test\n let cancelled = false\n executeTest(currentSuite)\n .then((passed) => {\n if (cancelled) return\n\n setTestPassed(passed)\n if (passed) {\n setPhase('confirming')\n } else {\n // Test failed, move to next\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n }\n })\n .catch(() => {\n if (cancelled) return\n\n // Execution error, treat as failed\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n })\n\n return () => {\n cancelled = true\n }\n }, [currentIndex, phase, suites, executeTest, onComplete])\n\n // Handle attestation confirmation\n useInput(\n (input, key) => {\n if (phase !== 'confirming') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) return\n\n // Y or Enter = create attestation\n if (input.toLowerCase() === 'y' || key.return) {\n createAttestation(currentSuite)\n .then(() => {\n setResults((prev) => ({\n ...prev,\n completed: [...prev.completed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n .catch(() => {\n // If attestation fails, still move on but mark as skipped\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n }\n\n // N = skip attestation\n if (input.toLowerCase() === 'n') {\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n }\n },\n { isActive: phase === 'confirming' },\n )\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n\n return (\n <Box flexDirection=\"column\">\n {/* Progress summary */}\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={suites.length - currentIndex}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {phase === 'running' && currentSuite && (\n <Box>\n <SimpleSpinner />\n <Text> Running {currentSuite}...</Text>\n </Box>\n )}\n\n {phase === 'confirming' && currentSuite && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ Tests passed!</Text>\n <Text>Create attestation for {currentSuite}? [Y/n]: </Text>\n </Box>\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites processed</Text>\n <Text>\n Completed: {results.completed.length}, Failed: {results.failed.length}, Skipped:{' '}\n {results.skipped.length}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Simple spinner component using ASCII animation frames.\n * Fallback for when no dedicated spinner library is available.\n */\nfunction SimpleSpinner(): React.ReactElement {\n const [frame, setFrame] = React.useState(0)\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % frames.length)\n }, 80)\n return () => {\n clearInterval(timer)\n }\n }, [])\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n return <Text color=\"cyan\">{frames[frame]}</Text>\n}\n","import * as React from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { SuiteSelector } from './SuiteSelector.js'\nimport { TestRunner } from './TestRunner.js'\nimport { ProgressSummary } from './ProgressSummary.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\nimport type { Config } from '@attest-it/core'\n\n/**\n * Current phase of the interactive run.\n */\ntype Phase = 'selecting' | 'running' | 'complete'\n\n/**\n * Props for the InteractiveRun component.\n */\nexport interface InteractiveRunProps {\n /** All suite statuses */\n allSuites: SuiteStatus[]\n /** Config for groups and settings */\n config: Config\n /** Execute test for a suite */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Save session state */\n saveSession: (completed: string[], failed: string[], remaining: string[]) => Promise<void>\n /** Optional: pre-selected suites from --continue */\n preSelected?: string[]\n}\n\n/**\n * Results from a test run.\n */\nexport interface RunResults {\n /** Suite names that completed successfully */\n completed: string[]\n /** Suite names that failed */\n failed: string[]\n /** Suite names that were skipped */\n skipped: string[]\n}\n\n/**\n * Main interactive run orchestrator.\n *\n * Phases:\n * 1. selecting - User selects which suites to run\n * 2. running - Tests executing, attestations being created\n * 3. complete - All done, show summary\n */\nexport function InteractiveRun({\n allSuites,\n config,\n executeTest,\n createAttestation,\n saveSession,\n preSelected,\n}: InteractiveRunProps): React.ReactElement {\n const { exit } = useApp()\n\n const [phase, setPhase] = React.useState<Phase>(preSelected ? 'running' : 'selecting')\n const [selectedSuites, setSelectedSuites] = React.useState<string[]>(preSelected ?? [])\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n\n // Compute pending suites (not VALID)\n const pendingSuites = React.useMemo(\n () => allSuites.filter((s) => s.status !== 'VALID'),\n [allSuites],\n )\n\n // Compute valid suites (already attested)\n const validSuites = React.useMemo(\n () => allSuites.filter((s) => s.status === 'VALID'),\n [allSuites],\n )\n\n // Handle selection completion\n const handleSelect = React.useCallback(\n (selected: string[]) => {\n if (selected.length === 0) {\n exit()\n return\n }\n setSelectedSuites(selected)\n setPhase('running')\n },\n [exit],\n )\n\n // Handle run completion (wrapped to avoid promise return in void context)\n const handleRunComplete = React.useCallback(\n (runResults: RunResults) => {\n void (async () => {\n setResults(runResults)\n\n // Save final session state (clear if all done successfully)\n if (runResults.failed.length === 0 && runResults.skipped.length === 0) {\n // All completed - clear session\n await saveSession([], [], [])\n } else {\n // Some remaining - save for --continue\n await saveSession(runResults.completed, runResults.failed, [])\n }\n\n setPhase('complete')\n })()\n },\n [saveSession],\n )\n\n // Handle case where there are no pending suites\n if (pendingSuites.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites are valid. Nothing to run.</Text>\n {validSuites.length > 0 && (\n <Text dimColor>{validSuites.length} suite(s) already attested.</Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {phase === 'selecting' && (\n <SuiteSelector\n pendingSuites={pendingSuites}\n validSuites={validSuites}\n groups={config.groups}\n onSelect={handleSelect}\n onExit={() => {\n exit()\n }}\n />\n )}\n\n {phase === 'running' && (\n <TestRunner\n suites={selectedSuites}\n executeTest={executeTest}\n createAttestation={createAttestation}\n onComplete={handleRunComplete}\n />\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={0}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {results.failed.length === 0 && results.skipped.length === 0 ? (\n <Text color=\"green\">✓ All suites attested successfully!</Text>\n ) : (\n <Box flexDirection=\"column\">\n {results.failed.length > 0 && (\n <Text color=\"red\">\n ✗ {results.failed.length} suite(s) failed: {results.failed.join(', ')}\n </Text>\n )}\n <Text>Run `attest-it run` again to continue with remaining suites.</Text>\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n","/**\n * Shared utilities for the run command.\n *\n * Provides functions for checking suite status, filtering suites,\n * and formatting status information.\n *\n * @packageDocumentation\n */\n\nimport type { Config, VerificationStatus, Attestation, AttestationsFile } from '@attest-it/core'\nimport { computeFingerprint, readAttestations, findAttestation } from '@attest-it/core'\n\n/**\n * Information about a suite's current status.\n * @public\n */\nexport interface SuiteStatus {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason for the status */\n reason: string\n /** Current fingerprint of source files */\n currentFingerprint: string\n /** Fingerprint from existing attestation (if any) */\n attestedFingerprint?: string | undefined\n /** ISO timestamp of attestation (if any) */\n attestedAt?: string | undefined\n /** Days since attestation (if any) */\n age?: number | undefined\n}\n\n/**\n * Determine the verification status for a suite.\n *\n * @param attestation - Existing attestation, if any\n * @param currentFingerprint - Current computed fingerprint\n * @param maxAgeDays - Maximum allowed age in days\n * @returns Verification status\n * @internal\n */\nfunction determineStatus(\n attestation: Attestation | null | undefined,\n currentFingerprint: string,\n maxAgeDays: number,\n): VerificationStatus {\n if (!attestation) {\n return 'NEEDS_ATTESTATION'\n }\n\n if (attestation.fingerprint !== currentFingerprint) {\n return 'FINGERPRINT_CHANGED'\n }\n\n const attestedAt = new Date(attestation.attestedAt)\n const ageInDays = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n\n if (ageInDays > maxAgeDays) {\n return 'EXPIRED'\n }\n\n return 'VALID'\n}\n\n/**\n * Get status information for all suites.\n *\n * @param config - Configuration object\n * @returns Array of suite statuses\n * @public\n */\nexport async function getAllSuiteStatuses(config: Config): Promise<SuiteStatus[]> {\n // Load attestations (may not exist)\n let attestationsFile: AttestationsFile | null = null\n try {\n attestationsFile = await readAttestations(config.settings.attestationsPath)\n } catch (err) {\n // Attestations file may not exist yet - that's okay\n if (err instanceof Error && !err.message.includes('ENOENT')) {\n throw err\n }\n }\n const attestations = attestationsFile?.attestations ?? []\n\n const results: SuiteStatus[] = []\n\n for (const [suiteName, suiteConfig] of Object.entries(config.suites)) {\n // Skip suites without packages\n if (!suiteConfig.packages) {\n continue\n }\n\n // Compute current fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Find existing attestation\n const attestation = findAttestation(\n { schemaVersion: '1', attestations, signature: '' },\n suiteName,\n )\n\n // Determine status\n const status = determineStatus(\n attestation,\n fingerprintResult.fingerprint,\n config.settings.maxAgeDays,\n )\n\n // Calculate age\n let age: number | undefined\n if (attestation) {\n const attestedAt = new Date(attestation.attestedAt)\n age = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n }\n\n results.push({\n name: suiteName,\n status,\n reason: formatStatusReason(status, age, config.settings.maxAgeDays),\n currentFingerprint: fingerprintResult.fingerprint,\n attestedFingerprint: attestation?.fingerprint,\n attestedAt: attestation?.attestedAt,\n age,\n })\n }\n\n return results\n}\n\n/**\n * Get suites that need attestation (not VALID).\n *\n * @param config - Configuration object\n * @returns Array of suite statuses that are not valid\n * @public\n */\nexport async function getSuitesNeedingAttestation(config: Config): Promise<SuiteStatus[]> {\n const allStatuses = await getAllSuiteStatuses(config)\n return allStatuses.filter((s) => s.status !== 'VALID')\n}\n\n/**\n * Filter suites by a glob/regex pattern.\n * Matches against suite name.\n *\n * @param suites - Array of suite statuses to filter\n * @param pattern - Pattern to match (supports * wildcard)\n * @returns Filtered array of suite statuses\n * @public\n */\nexport function filterByPattern(suites: SuiteStatus[], pattern: string): SuiteStatus[] {\n // Support simple glob patterns: * matches anything\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$', 'i')\n return suites.filter((s) => regex.test(s.name))\n}\n\n/**\n * Get suites belonging to a group.\n *\n * @param groupName - Name of the group\n * @param config - Configuration object\n * @returns Array of suite names in the group\n * @public\n */\nexport function getSuitesInGroup(groupName: string, config: Config): string[] {\n // eslint-disable-next-line security/detect-object-injection -- groupName is a user parameter, but we safely return empty array if not found\n return config.groups?.[groupName] ?? []\n}\n\n/**\n * Format a human-readable reason for a suite's status.\n *\n * @param status - Verification status\n * @param age - Age in days (if available)\n * @param maxAgeDays - Maximum allowed age in days (if available)\n * @returns Human-readable status reason\n * @public\n */\nexport function formatStatusReason(\n status: VerificationStatus,\n age?: number,\n maxAgeDays?: number,\n): string {\n switch (status) {\n case 'VALID':\n return `Attested ${String(age ?? 0)} days ago`\n case 'NEEDS_ATTESTATION':\n return 'No attestation found'\n case 'FINGERPRINT_CHANGED':\n return 'Source files modified'\n case 'EXPIRED':\n return `${String(age ?? 0)} days old (max: ${String(maxAgeDays ?? 30)})`\n case 'SIGNATURE_INVALID':\n return 'Signature verification failed'\n case 'INVALIDATED_BY_PARENT':\n return 'Invalidated by parent suite'\n default:\n return status\n }\n}\n","import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\n\n/**\n * Session state for interrupted run recovery.\n */\nexport interface Session {\n /** ISO timestamp when session started */\n started: string\n /** Suites selected by user for this session */\n selected: string[]\n /** Suites that completed successfully */\n completed: string[]\n /** Suites that failed */\n failed: string[]\n /** Suites not yet run (selected - completed - failed) */\n remaining: string[]\n}\n\n/**\n * Get the path to the session file.\n * Returns `.attest-it/session.json` relative to current working directory.\n */\nexport function getSessionPath(): string {\n return join(process.cwd(), '.attest-it', 'session.json')\n}\n\n/**\n * Load an existing session from disk.\n * Returns null if no session exists or session is invalid.\n */\nexport async function loadSession(): Promise<Session | null> {\n try {\n const content = await readFile(getSessionPath(), 'utf-8')\n const data: unknown = JSON.parse(content)\n\n // Validate session structure\n if (!isValidSession(data)) {\n return null\n }\n\n return data\n } catch {\n // File doesn't exist or is unreadable\n return null\n }\n}\n\n/**\n * Save session state to disk.\n * Creates .attest-it directory if it doesn't exist.\n */\nexport async function saveSession(session: Session): Promise<void> {\n const sessionPath = getSessionPath()\n const dir = dirname(sessionPath)\n\n // Create directory if it doesn't exist\n await mkdir(dir, { recursive: true })\n\n // Write session file\n await writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8')\n}\n\n/**\n * Delete the session file.\n * Call this when a session completes successfully.\n */\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(getSessionPath())\n } catch {\n // File doesn't exist - that's fine\n }\n}\n\n/**\n * Create a new session with the given selected suites.\n */\nexport function createSession(selected: string[]): Session {\n return {\n started: new Date().toISOString(),\n selected: [...selected],\n completed: [],\n failed: [],\n remaining: [...selected],\n }\n}\n\n/**\n * Update session after a suite completes.\n */\nexport function updateSessionAfterSuite(\n session: Session,\n suite: string,\n success: boolean,\n): Session {\n const remaining = session.remaining.filter((s) => s !== suite)\n return {\n ...session,\n completed: success ? [...session.completed, suite] : session.completed,\n failed: success ? session.failed : [...session.failed, suite],\n remaining,\n }\n}\n\n/**\n * Type guard to validate session structure.\n */\nfunction isValidSession(data: unknown): data is Session {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n // We need to access properties of unknown object, so we check each property\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj = data as Record<string, unknown>\n\n return (\n typeof obj.started === 'string' &&\n Array.isArray(obj.selected) &&\n obj.selected.every((item) => typeof item === 'string') &&\n Array.isArray(obj.completed) &&\n obj.completed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.failed) &&\n obj.failed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.remaining) &&\n obj.remaining.every((item) => typeof item === 'string')\n )\n}\n","/**\n * Entry point for interactive run mode.\n *\n * This module bridges the Commander.js CLI and the React-based interactive UI.\n * It handles:\n * - Loading configuration and suite statuses\n * - Checking for session resumption (--continue)\n * - Dry run mode (just show what would run)\n * - Rendering the InteractiveRun component with ink\n * - Providing test execution and attestation creation callbacks\n *\n * @packageDocumentation\n */\n\nimport * as React from 'react'\nimport { render } from 'ink'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n computeFingerprint,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n type Config,\n type KeyProvider,\n} from '@attest-it/core'\nimport { InteractiveRun } from '../components/InteractiveRun.js'\nimport { getAllSuiteStatuses, type SuiteStatus } from './run-utils.js'\nimport { loadSession, saveSession as persistSession, clearSession } from '../session/session.js'\nimport { error, log } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/**\n * Options for interactive mode.\n * @public\n */\nexport interface InteractiveOptions {\n /** Show what would run without executing */\n dryRun?: boolean | undefined\n /** Resume from saved session */\n continue?: boolean | undefined\n /** Filter pattern for suite names */\n filter?: string | undefined\n}\n\n/**\n * Run the interactive mode UI.\n *\n * @param options - Interactive mode options\n * @public\n */\nexport async function runInteractive(options: InteractiveOptions): Promise<void> {\n // Load config\n const config = await loadConfig()\n\n // Get all suite statuses\n const allSuites = await getAllSuiteStatuses(config)\n\n // Check if resuming from session\n let preSelected: string[] | undefined\n if (options.continue) {\n const session = await loadSession()\n if (session && session.remaining.length > 0) {\n preSelected = session.remaining\n log(`Resuming session with ${String(preSelected.length)} remaining suite(s)`)\n }\n }\n\n // Dry run mode - just show what would run\n if (options.dryRun) {\n handleDryRun(allSuites, config, options.filter)\n return\n }\n\n // Check for pending suites\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Create test executor\n const executeTest = createTestExecutor(config)\n\n // Create attestation creator\n const createAttestationFn = createAttestationCreator(config)\n\n // Create session saver\n const saveSessionFn = createSessionSaver()\n\n // Render the interactive UI\n const interactiveRunProps = {\n allSuites,\n config,\n executeTest,\n createAttestation: createAttestationFn,\n saveSession: saveSessionFn,\n ...(preSelected !== undefined && { preSelected }),\n }\n\n const { waitUntilExit } = render(<InteractiveRun {...interactiveRunProps} />)\n\n // Wait for UI to exit\n await waitUntilExit()\n}\n\n/**\n * Handle dry run mode.\n * Shows what would run without actually executing.\n *\n * @param allSuites - All suite statuses\n * @param config - Configuration object\n * @param filterPattern - Optional filter pattern\n * @internal\n */\nfunction handleDryRun(allSuites: SuiteStatus[], config: Config, filterPattern?: string): void {\n let pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (filterPattern) {\n const regex = new RegExp('^' + filterPattern.replace(/\\*/g, '.*') + '$', 'i')\n pendingSuites = pendingSuites.filter((s) => regex.test(s.name))\n }\n\n if (pendingSuites.length === 0) {\n log('No suites would run (all valid or filtered out).')\n process.exit(ExitCode.NO_WORK)\n }\n\n log(`Would run ${String(pendingSuites.length)} suite(s):`)\n pendingSuites.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n log('')\n log('Use `attest-it run` to execute.')\n process.exit(ExitCode.SUCCESS)\n}\n\n/**\n * Create a test executor function for a suite.\n *\n * @param config - Configuration object\n * @returns Function that executes a suite's test command\n * @internal\n */\nfunction createTestExecutor(config: Config): (suite: string) => Promise<boolean> {\n return async (suiteName: string): Promise<boolean> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n return false\n }\n\n // Build command\n let command = suiteConfig.command ?? config.settings.defaultCommand\n if (!command) {\n error(`No command specified for suite \"${suiteName}\"`)\n return false\n }\n\n // Substitute ${files} if present\n if (command.includes('${files}') && suiteConfig.files) {\n command = command.replaceAll('${files}', suiteConfig.files.join(' '))\n }\n\n log(`Running: ${command}`)\n\n // Execute command\n const exitCode = await executeCommand(command)\n return exitCode === 0\n }\n}\n\n/**\n * Create an attestation creator function.\n *\n * @param config - Configuration object\n * @returns Function that creates and saves an attestation for a suite\n * @internal\n */\nfunction createAttestationCreator(config: Config): (suite: string) => Promise<void> {\n return async (suiteName: string): Promise<void> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n throw new Error(`Suite \"${suiteName}\" not found`)\n }\n\n if (!suiteConfig.packages) {\n throw new Error(`Suite \"${suiteName}\" has no packages defined`)\n }\n\n // Compute fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command: suiteConfig.command ?? config.settings.defaultCommand ?? '',\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath).catch(() => null)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n const providerName = keyProvider.displayName\n const keygenMessage =\n keyProvider.type === 'filesystem'\n ? 'Run \"attest-it keygen\" first to generate a keypair.'\n : 'Run \"attest-it keygen\" to generate and store a key.'\n throw new Error(`Private key not found in ${providerName}. ${keygenMessage}`)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n log(`✓ Attestation created for ${suiteName}`)\n }\n}\n\n/**\n * Create session saver function.\n *\n * @returns Function that saves or clears session state\n * @internal\n */\nfunction createSessionSaver(): (\n completed: string[],\n failed: string[],\n remaining: string[],\n) => Promise<void> {\n return async (completed: string[], failed: string[], remaining: string[]): Promise<void> => {\n if (completed.length === 0 && failed.length === 0 && remaining.length === 0) {\n // All done - clear session\n await clearSession()\n } else {\n // Save session for --continue\n await persistSession({\n started: new Date().toISOString(),\n selected: [...completed, ...failed, ...remaining],\n completed,\n failed,\n remaining,\n })\n }\n }\n}\n\n/**\n * Execute a shell command and return exit code.\n *\n * @param command - Shell command to execute\n * @returns Promise resolving to exit code\n * @internal\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n const parsed = parseShellCommand(command)\n const stringArgs = parsed.filter((t): t is string => typeof t === 'string')\n\n if (stringArgs.length === 0) {\n error('Empty command')\n resolve(1)\n return\n }\n\n const [executable, ...args] = stringArgs\n if (!executable) {\n resolve(1)\n return\n }\n\n const child = spawn(executable, args, { stdio: 'inherit' })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n child.on('error', (err) => {\n error(`Command failed: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check for uncommitted changes in the working tree.\n *\n * @returns Promise resolving to true if there are uncommitted changes\n * @internal\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n resolve(output.trim().length > 0)\n })\n child.on('error', () => {\n resolve(false)\n })\n })\n}\n","/**\n * Run command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprint,\n computeFingerprintSync,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n loadLocalConfigSync,\n getActiveIdentity,\n isAuthorizedSigner,\n createSeal,\n readSealsSync,\n writeSealsSync,\n type Config,\n type KeyProvider,\n type Identity,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runInteractive } from './run-interactive.js'\nimport { getAllSuiteStatuses } from './run-utils.js'\n\nexport const runCommand = new Command('run')\n .description('Execute tests and create attestation')\n .option('-s, --suite <name>', 'Run specific suite (required unless --all or interactive mode)')\n .option('-a, --all', 'Run all suites needing attestation')\n .option('--no-attest', 'Run tests without creating attestation')\n .option('--dry-run', 'Show what would run without executing')\n .option('-c, --continue', 'Resume interrupted session')\n .option('--filter <pattern>', 'Filter suites by pattern (glob-style)')\n .action(async (options: RunOptions) => {\n await runTests(options)\n })\n\ninterface RunOptions {\n suite?: string\n all?: boolean\n attest?: boolean // Note: --no-attest sets this to false\n dryRun?: boolean\n continue?: boolean\n filter?: string\n}\n\n/**\n * Run tests and create attestations.\n *\n * Routes to the appropriate execution mode based on options:\n * - Direct mode: --suite specified\n * - All pending mode: --all specified\n * - Interactive mode: no --suite and no --all\n *\n * @param options - Command options\n * @param options.suite - Run specific suite\n * @param options.all - Run all suites needing attestation\n * @param options.attest - Create attestation after tests (default: true)\n * @param options.dryRun - Show what would run without executing\n * @param options.continue - Resume interrupted session\n * @param options.filter - Filter suites by pattern\n * @public\n */\nasync function runTests(options: RunOptions): Promise<void> {\n try {\n // If --suite provided, use existing direct mode\n if (options.suite) {\n await runDirectMode(options)\n return\n }\n\n // If --all with no --suite, run all pending non-interactively\n if (options.all) {\n await runAllPending(options)\n return\n }\n\n // No --suite and no --all means interactive mode\n // This includes: no args, --dry-run, --continue, --filter\n await runInteractive({\n dryRun: options.dryRun,\n continue: options.continue,\n filter: options.filter,\n })\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Build the test command to execute.\n *\n * Uses suite-specific command if provided, otherwise falls back to\n * default command from settings. Substitutes ${files} placeholder\n * with suite file patterns.\n *\n * @param config - Configuration object\n * @param suiteCommand - Suite-specific command (optional)\n * @param suiteFiles - File patterns for suite (optional)\n * @returns Constructed command string\n * @public\n */\nfunction buildCommand(config: Config, suiteCommand?: string, suiteFiles?: string[]): string {\n // Use suite command if specified, otherwise default\n let command = suiteCommand ?? config.settings.defaultCommand\n\n if (!command) {\n error('No command specified for suite and no defaultCommand in settings')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Substitute ${files} if present (replace all occurrences)\n if (command.includes('${files}') && suiteFiles) {\n const files = suiteFiles.join(' ')\n command = command.replaceAll('${files}', files)\n }\n\n return command\n}\n\n/**\n * Parsed command result.\n */\ninterface ParsedCommand {\n executable: string\n args: string[]\n}\n\n/**\n * Parse a command string into executable and arguments.\n *\n * Uses shell-quote to safely parse shell syntax without using shell: true.\n *\n * @param command - Command string to parse\n * @returns Parsed command with executable and arguments\n * @throws Error if command is empty or contains only control operators\n * @public\n */\nfunction parseCommand(command: string): ParsedCommand {\n const parsed = parseShellCommand(command)\n\n // shell-quote returns an array of strings and special control operators\n // We only want the string arguments\n const stringArgs = parsed.filter((token): token is string => {\n return typeof token === 'string'\n })\n\n if (stringArgs.length === 0) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n const [executable, ...args] = stringArgs\n // TypeScript doesn't know that stringArgs.length > 0 guarantees executable is defined\n // The check above ensures stringArgs[0] exists, but we assert it for type safety\n if (executable === undefined) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n return { executable, args }\n}\n\n/**\n * Execute a command and return its exit code.\n *\n * Spawns a child process and streams output to the terminal.\n *\n * @param command - Command string to execute\n * @returns Exit code from the command (0 for success)\n * @public\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n let parsed: ParsedCommand\n try {\n parsed = parseCommand(command)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to parse command: ${err.message}`)\n } else {\n error('Failed to parse command: Unknown error')\n }\n resolve(1)\n return\n }\n\n const child = spawn(parsed.executable, parsed.args, {\n stdio: 'inherit', // Stream output to terminal\n })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n\n child.on('error', (err) => {\n error(`Failed to execute command: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n *\n * @returns True if there are uncommitted changes, false otherwise\n * @public\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n // If output is non-empty, there are uncommitted changes\n resolve(output.trim().length > 0)\n })\n\n child.on('error', () => {\n // If git not available, assume not dirty\n resolve(false)\n })\n })\n}\n\n/**\n * Run tests for a specific suite (direct mode with --suite).\n *\n * @param options - Run options with suite specified\n * @public\n */\nasync function runDirectMode(options: RunOptions): Promise<void> {\n if (!options.suite) {\n error('Suite name is required for direct mode')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load config\n const config = await loadConfig()\n\n // Validate suite exists\n if (!config.suites[options.suite]) {\n error(`Suite \"${options.suite}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run the suite\n await runSingleSuite(options.suite, config, options)\n\n log('')\n success('Suite completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run all suites that need attestation (--all mode).\n *\n * @param options - Run options\n * @public\n */\nasync function runAllPending(options: RunOptions): Promise<void> {\n const config = await loadConfig()\n const allSuites = await getAllSuiteStatuses(config)\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Apply filter if specified\n let suitesToRun = pendingSuites\n if (options.filter) {\n const regex = new RegExp('^' + options.filter.replace(/\\*/g, '.*') + '$', 'i')\n suitesToRun = pendingSuites.filter((s) => regex.test(s.name))\n\n if (suitesToRun.length === 0) {\n log(`No suites match filter: ${options.filter}`)\n process.exit(ExitCode.NO_WORK)\n }\n }\n\n // Dry run - just show and exit\n if (options.dryRun) {\n log(`Would run ${String(suitesToRun.length)} suite(s):`)\n suitesToRun.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n process.exit(ExitCode.SUCCESS)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run each suite using existing direct mode logic\n for (const suite of suitesToRun) {\n await runSingleSuite(suite.name, config, options)\n }\n\n log('')\n success('All suites completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run a single suite's tests and optionally create an attestation.\n *\n * @param suiteName - Name of the suite to run\n * @param config - Configuration object\n * @param options - Run options\n * @public\n */\nasync function runSingleSuite(\n suiteName: string,\n config: Config,\n options: RunOptions,\n): Promise<void> {\n // eslint-disable-next-line security/detect-object-injection -- suiteName is from validated config keys\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n if (!suiteConfig.packages) {\n error(`Suite \"${suiteName}\" has no packages defined`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log(`\\n=== Running suite: ${suiteName} ===\\n`)\n\n // Compute fingerprint before running\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const fingerprintResult = await computeFingerprint(fingerprintOptions)\n verbose(`Fingerprint: ${fingerprintResult.fingerprint}`)\n verbose(`Files: ${String(fingerprintResult.fileCount)}`)\n\n // Build the test command\n const command = buildCommand(config, suiteConfig.command, suiteConfig.files)\n log(`Running: ${command}`)\n log('')\n\n // Execute tests\n const exitCode = await executeCommand(command)\n\n if (exitCode !== 0) {\n error(`Tests failed with exit code ${String(exitCode)}`)\n process.exit(ExitCode.FAILURE)\n }\n\n success('Tests passed!')\n\n // Skip attestation if --no-attest\n if (options.attest === false) {\n log('Skipping attestation (--no-attest)')\n return\n }\n\n // Confirm attestation\n const shouldAttest = await confirmAction({\n message: 'Create attestation',\n default: false,\n })\n\n if (!shouldAttest) {\n warn('Attestation cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command,\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n error(`Private key not found in ${keyProvider.displayName}`)\n if (keyProvider.type === 'filesystem') {\n error('Run \"attest-it keygen\" first to generate a keypair.')\n } else {\n error('Run \"attest-it keygen\" to generate and store a key.')\n }\n process.exit(ExitCode.MISSING_KEY)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n success(`Attestation created for ${suiteName}`)\n log(` Fingerprint: ${fingerprintResult.fingerprint}`)\n log(` Attested by: ${attestation.attestedBy}`)\n log(` Attested at: ${attestation.attestedAt}`)\n\n // Check if this suite has a linked gate, and if so, prompt for seal\n if (suiteConfig.gate) {\n await promptForSeal(suiteName, suiteConfig.gate, config)\n }\n}\n\n/**\n * Prompt for seal creation after successful suite execution.\n *\n * @param suiteName - Name of the suite that was executed\n * @param gateId - ID of the gate linked to the suite\n * @param config - Configuration object\n */\nasync function promptForSeal(suiteName: string, gateId: string, config: Config): Promise<void> {\n log('')\n log(`Suite '${suiteName}' is linked to gate '${gateId}'`)\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n warn('No local identity configuration found - cannot create seal')\n warn('Run \"attest-it keygen\" to set up your identity')\n return\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n warn(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n return\n }\n\n // Convert to AttestItConfig\n const attestItConfig = toAttestItConfig(config)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(attestItConfig, gateId, identity.publicKey)\n if (!authorized) {\n warn(`You are not authorized to seal gate '${gateId}'`)\n return\n }\n\n // Prompt for seal confirmation\n const shouldSeal = await confirmAction({\n message: `Create seal for gate '${gateId}'`,\n default: true,\n })\n\n if (!shouldSeal) {\n log('Seal creation skipped')\n return\n }\n\n try {\n // Get gate config\n if (!attestItConfig.gates?.[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n return\n }\n\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n\n // Compute fingerprint for the gate\n const gateFingerprint = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n const keyRef = getKeyRefFromIdentity(identity)\n\n // Get private key from provider\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal\n const seal = createSeal({\n gateId,\n fingerprint: gateFingerprint.fingerprint,\n sealedBy: identity.name,\n privateKey: privateKeyPem,\n })\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n // Write seals file\n writeSealsSync(projectRoot, sealsFile)\n\n success(`Seal created for gate '${gateId}'`)\n log(` Sealed by: ${identity.name}`)\n log(` Timestamp: ${seal.timestamp}`)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to create seal: ${err.message}`)\n } else {\n error('Failed to create seal: Unknown error')\n }\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n service: privateKey.service,\n account: privateKey.account,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n return `${privateKey.service}:${privateKey.account}`\n case '1password':\n return privateKey.item\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n// Export for testing\nexport { buildCommand, parseCommand, executeCommand, checkDirtyWorkingTree }\n","/**\n * Interactive keygen UI component using Ink.\n *\n * @remarks\n * This module provides an interactive CLI interface for generating keypairs\n * with the option to store private keys in either the filesystem or 1Password.\n *\n * @packageDocumentation\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { render, Box, Text } from 'ink'\nimport { Select, TextInput, Spinner } from '@inkjs/ui'\nimport {\n OnePasswordKeyProvider,\n FilesystemKeyProvider,\n MacOSKeychainKeyProvider,\n getDefaultPrivateKeyPath,\n getDefaultPublicKeyPath,\n type OnePasswordAccount,\n type OnePasswordVault,\n} from '@attest-it/core'\n\n/**\n * Result of the interactive keygen flow.\n * @public\n */\nexport interface KeygenResult {\n /** Provider type used */\n provider: 'filesystem' | '1password' | 'macos-keychain'\n /** Path to the public key file */\n publicKeyPath: string\n /** Reference to the private key (path or 1Password item name) */\n privateKeyRef: string\n /** Human-readable description of storage location */\n storageDescription: string\n /** For 1Password: account email */\n account?: string\n /** For 1Password: vault name */\n vault?: string\n /** For 1Password/macOS Keychain: item name */\n itemName?: string\n}\n\n/**\n * Props for the KeygenInteractive component.\n * @public\n */\nexport interface KeygenInteractiveProps {\n /** Public key path (optional, defaults to OS-specific path) */\n publicKeyPath?: string\n /** Overwrite existing keys without prompting */\n force?: boolean\n /** Callback when keygen completes successfully */\n onComplete: (result: KeygenResult) => void\n /** Callback when user cancels */\n onCancel: () => void\n /** Callback when an error occurs */\n onError: (error: Error) => void\n}\n\n/**\n * Step in the interactive keygen flow.\n * @internal\n */\ntype Step =\n | 'checking-providers'\n | 'select-provider'\n | 'select-account'\n | 'select-vault'\n | 'enter-item-name'\n | 'enter-keychain-item-name'\n | 'generating'\n | 'done'\n\n/**\n * Interactive keygen component.\n *\n * @remarks\n * This component walks the user through selecting a key storage provider\n * and configuring it, then generates the keypair.\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function KeygenInteractive(props: KeygenInteractiveProps): React.ReactElement {\n const { onComplete, onError } = props\n\n // State management\n const [step, setStep] = useState<Step>('checking-providers')\n const [opAvailable, setOpAvailable] = useState(false)\n const [keychainAvailable, setKeychainAvailable] = useState(false)\n const [accounts, setAccounts] = useState<OnePasswordAccount[]>([])\n const [vaults, setVaults] = useState<OnePasswordVault[]>([])\n const [_selectedProvider, setSelectedProvider] = useState<\n 'filesystem' | '1password' | 'macos-keychain' | undefined\n >()\n const [selectedAccount, setSelectedAccount] = useState<string | undefined>()\n const [selectedVault, setSelectedVault] = useState<string | undefined>()\n const [itemName, setItemName] = useState('attest-it-private-key')\n const [keychainItemName, setKeychainItemName] = useState('attest-it-private-key')\n\n // Check provider availability on mount\n useEffect(() => {\n const checkProviders = async (): Promise<void> => {\n // Check 1Password\n try {\n const isInstalled = await OnePasswordKeyProvider.isInstalled()\n setOpAvailable(isInstalled)\n\n if (isInstalled) {\n const accountList = await OnePasswordKeyProvider.listAccounts()\n setAccounts(accountList)\n }\n } catch {\n // 1Password not available\n setOpAvailable(false)\n }\n\n // Check macOS Keychain (synchronous check)\n const isKeychainAvailable = MacOSKeychainKeyProvider.isAvailable()\n setKeychainAvailable(isKeychainAvailable)\n\n setStep('select-provider')\n }\n\n void checkProviders()\n }, [])\n\n // Fetch vaults when account is selected\n useEffect(() => {\n if (step === 'select-vault' && selectedAccount) {\n const fetchVaults = async (): Promise<void> => {\n try {\n const vaultList = await OnePasswordKeyProvider.listVaults(selectedAccount)\n setVaults(vaultList)\n } catch (err) {\n onError(err instanceof Error ? err : new Error('Failed to fetch vaults'))\n }\n }\n\n void fetchVaults()\n }\n }, [step, selectedAccount, onError])\n\n // Handle provider selection\n const handleProviderSelect = (value: string): void => {\n if (value === 'filesystem') {\n setSelectedProvider('filesystem')\n // Skip to generation for filesystem\n void generateKeys('filesystem')\n } else if (value === '1password') {\n setSelectedProvider('1password')\n // Move to account selection (or skip if only one)\n if (accounts.length === 1 && accounts[0]) {\n setSelectedAccount(accounts[0].email)\n setStep('select-vault')\n } else {\n setStep('select-account')\n }\n } else if (value === 'macos-keychain') {\n setSelectedProvider('macos-keychain')\n // Move to item name entry for keychain\n setStep('enter-keychain-item-name')\n }\n }\n\n // Handle account selection\n const handleAccountSelect = (value: string): void => {\n setSelectedAccount(value)\n setStep('select-vault')\n }\n\n // Handle vault selection\n const handleVaultSelect = (value: string): void => {\n setSelectedVault(value)\n setStep('enter-item-name')\n }\n\n // Handle item name submission (1Password)\n const handleItemNameSubmit = (value: string): void => {\n setItemName(value)\n void generateKeys('1password')\n }\n\n // Handle keychain item name submission\n const handleKeychainItemNameSubmit = (value: string): void => {\n setKeychainItemName(value)\n void generateKeys('macos-keychain')\n }\n\n // Generate the keypair\n const generateKeys = async (\n provider: 'filesystem' | '1password' | 'macos-keychain',\n ): Promise<void> => {\n setStep('generating')\n\n try {\n const publicKeyPath = props.publicKeyPath ?? getDefaultPublicKeyPath()\n\n if (provider === 'filesystem') {\n const fsProvider = new FilesystemKeyProvider()\n\n // Build options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await fsProvider.generateKeyPair(genOptions)\n\n onComplete({\n provider: 'filesystem',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n })\n } else if (provider === '1password') {\n // 1Password provider\n if (!selectedVault || !itemName) {\n throw new Error('Vault and item name are required for 1Password')\n }\n\n // Build provider options, only including account if defined\n const providerOptions: { vault: string; itemName: string; account?: string } = {\n vault: selectedVault,\n itemName,\n }\n if (selectedAccount !== undefined) {\n providerOptions.account = selectedAccount\n }\n\n const opProvider = new OnePasswordKeyProvider(providerOptions)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await opProvider.generateKeyPair(genOptions)\n\n // Build completion result, only including account if defined\n const completionResult: KeygenResult = {\n provider: '1password',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n vault: selectedVault,\n itemName,\n }\n if (selectedAccount !== undefined) {\n completionResult.account = selectedAccount\n }\n\n onComplete(completionResult)\n } else {\n // macOS Keychain provider (provider === 'macos-keychain')\n if (!keychainItemName) {\n throw new Error('Item name is required for macOS Keychain')\n }\n\n const keychainProvider = new MacOSKeychainKeyProvider({\n itemName: keychainItemName,\n })\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath }\n if (props.force !== undefined) {\n genOptions.force = props.force\n }\n\n const result = await keychainProvider.generateKeyPair(genOptions)\n\n onComplete({\n provider: 'macos-keychain',\n publicKeyPath: result.publicKeyPath,\n privateKeyRef: result.privateKeyRef,\n storageDescription: result.storageDescription,\n itemName: keychainItemName,\n })\n }\n\n setStep('done')\n } catch (err) {\n onError(err instanceof Error ? err : new Error('Key generation failed'))\n }\n }\n\n // Render different steps\n if (step === 'checking-providers') {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Checking available key storage providers...</Text>\n </Box>\n </Box>\n )\n }\n\n if (step === 'select-provider') {\n const options = [\n {\n label: `Local Filesystem (${getDefaultPrivateKeyPath()})`,\n value: 'filesystem',\n },\n ]\n\n if (keychainAvailable) {\n options.push({\n label: 'macOS Keychain',\n value: 'macos-keychain',\n })\n }\n\n if (opAvailable) {\n options.push({\n label: '1Password (requires op CLI)',\n value: '1password',\n })\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Where would you like to store your private key?</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleProviderSelect} />\n </Box>\n )\n }\n\n if (step === 'select-account') {\n const options = accounts.map((account) => ({\n label: account.email,\n value: account.email,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Select 1Password account:</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleAccountSelect} />\n </Box>\n )\n }\n\n if (step === 'select-vault') {\n if (vaults.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Loading vaults...</Text>\n </Box>\n </Box>\n )\n }\n\n const options = vaults.map((vault) => ({\n label: vault.name,\n value: vault.name,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Select vault for private key storage:</Text>\n <Text dimColor>{''}</Text>\n <Select options={options} onChange={handleVaultSelect} />\n </Box>\n )\n }\n\n if (step === 'enter-item-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Enter name for the key item:</Text>\n <Text dimColor>(This will be visible in your 1Password vault)</Text>\n <Text dimColor>{''}</Text>\n <TextInput defaultValue={itemName} onSubmit={handleItemNameSubmit} />\n </Box>\n )\n }\n\n if (step === 'enter-keychain-item-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Enter name for the keychain item:</Text>\n <Text dimColor>(This will be the service name in your macOS Keychain)</Text>\n <Text dimColor>{''}</Text>\n <TextInput defaultValue={keychainItemName} onSubmit={handleKeychainItemNameSubmit} />\n </Box>\n )\n }\n\n if (step === 'generating') {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Spinner />\n <Text>Generating RSA-2048 keypair...</Text>\n </Box>\n </Box>\n )\n }\n\n // Done state (component will be unmounted by parent)\n return <Box />\n}\n\n/**\n * Run the interactive keygen flow.\n *\n * @remarks\n * This function renders the KeygenInteractive component and returns a promise\n * that resolves with the keygen result or rejects if cancelled/errored.\n *\n * @param options - Keygen options\n * @returns Promise that resolves with keygen result\n * @public\n */\nexport async function runKeygenInteractive(options: {\n publicKeyPath?: string\n force?: boolean\n}): Promise<KeygenResult> {\n return new Promise((resolve, reject) => {\n // Build props, only including optional properties if defined\n const props: KeygenInteractiveProps = {\n onComplete: (result) => {\n unmount()\n resolve(result)\n },\n onCancel: () => {\n unmount()\n reject(new Error('Keygen cancelled'))\n },\n onError: (error) => {\n unmount()\n reject(error)\n },\n }\n\n if (options.publicKeyPath !== undefined) {\n props.publicKeyPath = options.publicKeyPath\n }\n if (options.force !== undefined) {\n props.force = options.force\n }\n\n const { unmount } = render(<KeygenInteractive {...props} />)\n })\n}\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n checkOpenSSL,\n generateKeyPair,\n getDefaultPrivateKeyPath,\n getDefaultPublicKeyPath,\n setKeyPermissions,\n OnePasswordKeyProvider,\n MacOSKeychainKeyProvider,\n} from '@attest-it/core'\nimport { log, success, error, warn, info } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runKeygenInteractive } from './keygen-interactive.js'\n\nexport const keygenCommand = new Command('keygen')\n .description('Generate a new RSA keypair for signing attestations')\n .option('-o, --output <path>', 'Public key output path')\n .option('-p, --private <path>', 'Private key output path (filesystem only)')\n .option(\n '--provider <type>',\n 'Key provider: filesystem, 1password, or macos-keychain (skips interactive)',\n )\n .option('--vault <name>', '1Password vault name')\n .option('--item-name <name>', '1Password/macOS Keychain item name')\n .option('--account <email>', '1Password account')\n .option('-f, --force', 'Overwrite existing keys')\n .option('--no-interactive', 'Disable interactive mode')\n .action(async (options: KeygenOptions) => {\n await runKeygen(options)\n })\n\ninterface KeygenOptions {\n output?: string\n private?: string\n provider?: string\n vault?: string\n itemName?: string\n account?: string\n force?: boolean\n interactive?: boolean\n}\n\n/**\n * Run the keygen command to generate a new cryptographic keypair.\n *\n * Generates an RSA-2048 keypair with SHA-256 signatures, which is universally\n * supported across all OpenSSL and LibreSSL versions.\n *\n * @param options - Command options\n * @param options.output - Public key output path\n * @param options.private - Private key output path (filesystem only)\n * @param options.provider - Key provider type (skips interactive)\n * @param options.vault - 1Password vault name\n * @param options.itemName - 1Password item name\n * @param options.account - 1Password account email\n * @param options.force - Overwrite existing keys without prompting\n * @param options.interactive - Enable interactive mode (default: true)\n * @public\n */\nasync function runKeygen(options: KeygenOptions): Promise<void> {\n try {\n // Use interactive mode if not explicitly disabled and provider not specified\n const useInteractive = options.interactive !== false && !options.provider\n\n if (useInteractive) {\n // Run interactive flow\n // Build options, only including properties if defined\n const interactiveOptions: { publicKeyPath?: string; force?: boolean } = {}\n if (options.output !== undefined) {\n interactiveOptions.publicKeyPath = options.output\n }\n if (options.force !== undefined) {\n interactiveOptions.force = options.force\n }\n\n const result = await runKeygenInteractive(interactiveOptions)\n\n // Show success message with next steps\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n log('')\n\n if (result.provider === '1password') {\n log('Add to your .attest-it/config.yaml:')\n log('')\n log('settings:')\n log(` publicKeyPath: ${result.publicKeyPath}`)\n log(' keyProvider:')\n log(' type: 1password')\n log(' options:')\n if (result.account) {\n log(` account: ${result.account}`)\n }\n log(` vault: ${result.vault ?? ''}`)\n log(` itemName: ${result.itemName ?? ''}`)\n log('')\n } else if (result.provider === 'macos-keychain') {\n log('Add to your .attest-it/config.yaml:')\n log('')\n log('settings:')\n log(` publicKeyPath: ${result.publicKeyPath}`)\n log(' keyProvider:')\n log(' type: macos-keychain')\n log(' options:')\n log(` itemName: ${result.itemName ?? ''}`)\n log('')\n }\n\n log('Next steps:')\n log(` 1. git add ${result.publicKeyPath}`)\n if (result.provider === '1password' || result.provider === 'macos-keychain') {\n log(' 2. Update .attest-it/config.yaml with keyProvider settings')\n } else {\n log(' 2. Update .attest-it/config.yaml publicKeyPath if needed')\n }\n log(' 3. attest-it run --suite <suite-name>')\n } else {\n // Non-interactive mode\n await runNonInteractiveKeygen(options)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Run keygen in non-interactive mode.\n * @internal\n */\nasync function runNonInteractiveKeygen(options: KeygenOptions): Promise<void> {\n // Check OpenSSL\n log('Checking OpenSSL...')\n const version = await checkOpenSSL()\n info(`OpenSSL: ${version}`)\n\n const publicPath = options.output ?? getDefaultPublicKeyPath()\n\n if (options.provider === '1password') {\n // 1Password provider mode\n if (!options.vault || !options.itemName) {\n throw new Error('--vault and --item-name are required for 1password provider')\n }\n\n // Build provider options, only including account if defined\n const providerOptions: { vault: string; itemName: string; account?: string } = {\n vault: options.vault,\n itemName: options.itemName,\n }\n if (options.account !== undefined) {\n providerOptions.account = options.account\n }\n\n const provider = new OnePasswordKeyProvider(providerOptions)\n\n log(`Generating keypair with 1Password storage...`)\n log(`Vault: ${options.vault}`)\n log(`Item: ${options.itemName}`)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath: publicPath }\n if (options.force !== undefined) {\n genOptions.force = options.force\n }\n\n const result = await provider.generateKeyPair(genOptions)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n } else if (options.provider === 'macos-keychain') {\n // macOS Keychain provider mode\n if (!options.itemName) {\n throw new Error('--item-name is required for macos-keychain provider')\n }\n\n // Check if macOS Keychain is available (synchronous check)\n const isAvailable = MacOSKeychainKeyProvider.isAvailable()\n if (!isAvailable) {\n throw new Error('macOS Keychain is not available on this platform')\n }\n\n const provider = new MacOSKeychainKeyProvider({\n itemName: options.itemName,\n })\n\n log(`Generating keypair with macOS Keychain storage...`)\n log(`Item: ${options.itemName}`)\n\n // Build generation options, only including force if defined\n const genOptions: { publicKeyPath: string; force?: boolean } = { publicKeyPath: publicPath }\n if (options.force !== undefined) {\n genOptions.force = options.force\n }\n\n const result = await provider.generateKeyPair(genOptions)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key stored in:')\n log(` ${result.storageDescription}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicKeyPath}`)\n } else {\n // Filesystem provider mode (default)\n const privatePath = options.private ?? getDefaultPrivateKeyPath()\n\n log(`Private key: ${privatePath}`)\n log(`Public key: ${publicPath}`)\n\n // Check if keys already exist\n const privateExists = fs.existsSync(privatePath)\n const publicExists = fs.existsSync(publicPath)\n\n if ((privateExists || publicExists) && !options.force) {\n if (privateExists) {\n warn(`Private key already exists: ${privatePath}`)\n }\n if (publicExists) {\n warn(`Public key already exists: ${publicPath}`)\n }\n\n const shouldOverwrite = await confirmAction({\n message: 'Overwrite existing keys?',\n default: false,\n })\n\n if (!shouldOverwrite) {\n error('Keygen cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Generate keypair\n log('\\nGenerating RSA-2048 keypair...')\n\n const result = await generateKeyPair({\n privatePath,\n publicPath,\n force: true,\n })\n\n // Set permissions on private key\n await setKeyPermissions(result.privatePath)\n\n success('Keypair generated successfully!')\n log('')\n log('Private key (KEEP SECRET):')\n log(` ${result.privatePath}`)\n log('')\n log('Public key (commit to repo):')\n log(` ${result.publicPath}`)\n }\n\n log('')\n info('Important: Back up your private key securely!')\n log('')\n log('Next steps:')\n log(` 1. git add ${publicPath}`)\n log(' 2. Update .attest-it/config.yaml publicKeyPath if needed')\n log(' 3. attest-it run --suite <suite-name>')\n}\n\nexport { runKeygen }\n","/**\n * Prune command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n loadConfig,\n readAttestations,\n writeSignedAttestations,\n computeFingerprint,\n getDefaultPrivateKeyPath,\n type Attestation,\n} from '@attest-it/core'\nimport { log, success, error, info, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const pruneCommand = new Command('prune')\n .description('Remove stale attestations')\n .option('-n, --dry-run', 'Show what would be removed without removing')\n .option('-k, --keep-days <n>', 'Keep attestations newer than n days', '30')\n .action(async (options: PruneOptions) => {\n await runPrune(options)\n })\n\ninterface PruneOptions {\n dryRun?: boolean\n keepDays: string\n}\n\n/**\n * Run the prune command to remove stale attestations.\n *\n * Removes attestations that are outdated (older than keepDays and\n * fingerprint doesn't match current code) or orphaned (suite no\n * longer exists in config). Re-signs the attestations file.\n *\n * @param options - Command options\n * @param options.dryRun - Show what would be removed without removing\n * @param options.keepDays - Keep attestations newer than n days\n * @public\n */\nasync function runPrune(options: PruneOptions): Promise<void> {\n try {\n const keepDays = parseInt(options.keepDays, 10)\n if (isNaN(keepDays) || keepDays < 1) {\n error('--keep-days must be a positive integer')\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n\n // Load config\n const config = await loadConfig()\n\n // Load attestations\n const attestationsPath = config.settings.attestationsPath\n const file = await readAttestations(attestationsPath)\n\n if (!file || file.attestations.length === 0) {\n info('No attestations to prune')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n const now = Date.now()\n const keepMs = keepDays * 24 * 60 * 60 * 1000\n\n // Identify stale attestations\n const stale: Attestation[] = []\n const keep: Attestation[] = []\n\n for (const attestation of file.attestations) {\n const attestedAt = new Date(attestation.attestedAt).getTime()\n const ageMs = now - attestedAt\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n // Check if suite still exists in config\n const suiteExists = attestation.suite in config.suites\n\n // Check if fingerprint still matches current code\n let fingerprintMatches = false\n if (suiteExists) {\n const suiteConfig = config.suites[attestation.suite]\n if (suiteConfig?.packages) {\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const result = await computeFingerprint(fingerprintOptions)\n fingerprintMatches = result.fingerprint === attestation.fingerprint\n }\n }\n\n // Keep if:\n // 1. Age is within keepDays AND fingerprint matches, OR\n // 2. Fingerprint matches current code (regardless of age)\n const isStale = !fingerprintMatches && ageMs > keepMs\n const orphaned = !suiteExists\n\n if (isStale || orphaned) {\n stale.push(attestation)\n const reason = orphaned\n ? 'suite removed'\n : !fingerprintMatches\n ? 'fingerprint changed'\n : 'expired'\n verbose(`Stale: ${attestation.suite} (${reason}, ${String(ageDays)} days old)`)\n } else {\n keep.push(attestation)\n }\n }\n\n // Report what will be pruned\n if (stale.length === 0) {\n success('No stale attestations found')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n log(`Found ${String(stale.length)} stale attestation(s):`)\n for (const attestation of stale) {\n const ageDays = Math.floor(\n (now - new Date(attestation.attestedAt).getTime()) / (1000 * 60 * 60 * 24),\n )\n log(` - ${attestation.suite} (${String(ageDays)} days old)`)\n }\n\n if (options.dryRun) {\n info('Dry run - no changes made')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n // Check for private key\n const privateKeyPath = getDefaultPrivateKeyPath()\n if (!fs.existsSync(privateKeyPath)) {\n error(`Private key not found: ${privateKeyPath}`)\n error('Cannot re-sign attestations file.')\n process.exit(ExitCode.MISSING_KEY)\n return\n }\n\n // Write updated attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: keep,\n privateKeyPath,\n })\n\n success(`Pruned ${String(stale.length)} stale attestation(s)`)\n log(`Remaining: ${String(keep.length)} attestation(s)`)\n process.exit(ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n}\n\nexport { runPrune }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyAllSeals,\n verifyGateSeal,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n warn,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const verifyCommand = new Command('verify')\n .description('Verify all gate seals (for CI)')\n .argument('[gates...]', 'Verify specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: VerifyOptions) => {\n await runVerify(gates, options)\n })\n\ninterface VerifyOptions {\n json?: boolean\n}\n\n/**\n * Run the verify command to validate gate seals.\n *\n * Verifies signature validity and checks seal status for all gates\n * or specific gates. Intended for CI/CD pipelines.\n *\n * @param gates - Array of gate IDs to verify, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runVerify(gates: string[], options: VerifyOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to verify\n const gatesToVerify = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const results =\n gates.length > 0\n ? gatesToVerify.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayResults(results)\n }\n\n // Determine exit code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER',\n )\n\n const hasStale = results.some((r) => r.state === 'STALE')\n\n if (hasInvalid) {\n process.exit(ExitCode.FAILURE)\n } else if (hasStale) {\n // Stale seals are warnings but not failures\n process.exit(ExitCode.SUCCESS)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display verification results in a formatted table.\n *\n * Shows verification state, seal metadata, and remediation steps.\n *\n * @param results - Verification results from verifyAllSeals or verifyGateSeal\n * @public\n */\nfunction displayResults(results: SealVerificationResult[]): void {\n log('')\n\n // Build table rows\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: formatFingerprint(r),\n age: formatAge(r),\n }))\n\n log(formatTable(tableRows))\n log('')\n\n // Show messages for any gates with issues\n const withIssues = results.filter(\n (r) =>\n r.state !== 'VALID' &&\n r.state !== 'STALE' && // STALE gets its own warning below\n r.message,\n )\n\n if (withIssues.length > 0) {\n for (const result of withIssues) {\n if (result.message) {\n log(`${result.gateId}: ${result.message}`)\n }\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const staleCount = results.filter((r) => r.state === 'STALE').length\n const invalidCount = results.length - validCount - staleCount\n\n if (invalidCount === 0 && staleCount === 0) {\n success('All gate seals valid')\n } else {\n if (invalidCount > 0) {\n error(`${String(invalidCount)} gate(s) have invalid or missing seals`)\n log('Run `attest-it seal` to create seals for these gates')\n }\n if (staleCount > 0) {\n warn(`${String(staleCount)} gate(s) have stale seals (exceeds maxAge)`)\n log('Run `attest-it seal --force <gate>` to update stale seals')\n }\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format fingerprint for display.\n *\n * @param result - Verification result\n * @returns Formatted fingerprint string\n */\nfunction formatFingerprint(result: SealVerificationResult): string {\n if (result.seal?.fingerprint) {\n const fp = result.seal.fingerprint\n if (fp.length > 16) {\n return fp.slice(0, 16) + '...'\n }\n return fp\n }\n return result.state === 'MISSING' ? '(none)' : '-'\n}\n\n/**\n * Format age for display.\n *\n * @param result - Verification result\n * @returns Formatted age string\n */\nfunction formatAge(result: SealVerificationResult): string {\n if (result.seal?.timestamp) {\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n if (result.state === 'STALE') {\n return `${String(ageDays)} days (stale)`\n }\n return `${String(ageDays)} days`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runVerify, displayResults }\n","/**\n * Seal command implementation for attest-it CLI.\n * Creates cryptographic seals for gates.\n */\n\nimport { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n loadLocalConfigSync,\n getActiveIdentity,\n computeFingerprintSync,\n isAuthorizedSigner,\n getGate,\n createSeal,\n readSealsSync,\n writeSealsSync,\n KeyProviderRegistry,\n type AttestItConfig,\n type Identity,\n type SealsFile,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const sealCommand = new Command('seal')\n .description('Create seals for gates')\n .argument('[gates...]', 'Gate IDs to seal (defaults to all gates without valid seals)')\n .option('--force', 'Force seal creation even if gate already has a valid seal')\n .option('--dry-run', 'Show what would be sealed without creating seals')\n .action(async (gates: string[], options: SealOptions) => {\n await runSeal(gates, options)\n })\n\ninterface SealOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ninterface SealSummary {\n sealed: string[]\n skipped: {\n gate: string\n reason: string\n }[]\n failed: {\n gate: string\n error: string\n }[]\n}\n\n/**\n * Run the seal command to create seals for gates.\n *\n * @param gates - Array of gate IDs to seal, or empty for all gates\n * @param options - Command options\n * @public\n */\nasync function runSeal(gates: string[], options: SealOptions): Promise<void> {\n try {\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n error('No local identity configuration found')\n error('Run \"attest-it keygen\" first to set up your identity')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n error(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot)\n\n // Determine which gates to seal\n const gatesToSeal = gates.length > 0 ? gates : getAllGateIds(attestItConfig)\n\n // Validate that specified gates exist\n for (const gateId of gatesToSeal) {\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Process each gate\n const summary: SealSummary = {\n sealed: [],\n skipped: [],\n failed: [],\n }\n\n for (const gateId of gatesToSeal) {\n try {\n const result = await processSingleGate(gateId, attestItConfig, identity, sealsFile, options)\n\n if (result.sealed) {\n summary.sealed.push(gateId)\n } else if (result.skipped) {\n summary.skipped.push({ gate: gateId, reason: result.reason ?? 'Unknown' })\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error'\n summary.failed.push({ gate: gateId, error: errorMsg })\n }\n }\n\n // Write seals file if not dry run and we sealed anything\n if (!options.dryRun && summary.sealed.length > 0) {\n writeSealsSync(projectRoot, sealsFile)\n }\n\n // Display summary\n displaySummary(summary, options.dryRun)\n\n // Exit with appropriate code\n if (summary.failed.length > 0) {\n process.exit(ExitCode.FAILURE)\n } else if (summary.sealed.length === 0 && summary.skipped.length === 0) {\n process.exit(ExitCode.NO_WORK)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\ninterface ProcessGateResult {\n sealed: boolean\n skipped: boolean\n reason?: string\n}\n\n/**\n * Process a single gate for sealing.\n *\n * @param gateId - Gate identifier\n * @param config - The attest-it configuration\n * @param identity - Active identity for signing\n * @param sealsFile - The seals file to update\n * @param options - Command options\n * @returns Result indicating whether gate was sealed or skipped\n */\nasync function processSingleGate(\n gateId: string,\n config: AttestItConfig,\n identity: Identity,\n sealsFile: SealsFile,\n options: SealOptions,\n): Promise<ProcessGateResult> {\n verbose(`Processing gate: ${gateId}`)\n\n // Get gate config\n const gate = getGate(config, gateId)\n if (!gate) {\n return { sealed: false, skipped: true, reason: 'Gate not found in configuration' }\n }\n\n // Check if gate already has a valid seal and --force not specified\n // eslint-disable-next-line security/detect-object-injection\n const existingSeal = sealsFile.seals[gateId]\n if (existingSeal && !options.force) {\n return {\n sealed: false,\n skipped: true,\n reason: 'Gate already has a seal (use --force to override)',\n }\n }\n\n // Compute current fingerprint\n const fingerprintResult = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n verbose(` Fingerprint: ${fingerprintResult.fingerprint}`)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(config, gateId, identity.publicKey)\n if (!authorized) {\n return {\n sealed: false,\n skipped: true,\n reason: `Not authorized to seal this gate (authorized signers: ${gate.authorizedSigners.join(', ')})`,\n }\n }\n\n // If dry-run, stop here\n if (options.dryRun) {\n log(` Would seal gate: ${gateId}`)\n return { sealed: true, skipped: false }\n }\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n\n // Get private key from provider\n const keyRef = getKeyRefFromIdentity(identity)\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal\n const seal = createSeal({\n gateId,\n fingerprint: fingerprintResult.fingerprint,\n sealedBy: identity.name,\n privateKey: privateKeyPem,\n })\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n log(` Sealed gate: ${gateId}`)\n verbose(` Sealed by: ${identity.name}`)\n verbose(` Timestamp: ${seal.timestamp}`)\n\n return { sealed: true, skipped: false }\n}\n\n/**\n * Get all gate IDs from configuration.\n *\n * @param config - The attest-it configuration\n * @returns Array of gate IDs\n */\nfunction getAllGateIds(config: AttestItConfig): string[] {\n return Object.keys(config.gates ?? {})\n}\n\n/**\n * Display summary of seal operations.\n *\n * @param summary - Summary of operations\n * @param dryRun - Whether this was a dry run\n */\nfunction displaySummary(summary: SealSummary, dryRun?: boolean): void {\n log('')\n\n const prefix = dryRun ? 'Would seal' : 'Sealed'\n\n if (summary.sealed.length > 0) {\n success(`${prefix} ${String(summary.sealed.length)} gate(s): ${summary.sealed.join(', ')}`)\n }\n\n if (summary.skipped.length > 0) {\n log('')\n warn(`Skipped ${String(summary.skipped.length)} gate(s):`)\n for (const skip of summary.skipped) {\n log(` ${skip.gate}: ${skip.reason}`)\n }\n }\n\n if (summary.failed.length > 0) {\n log('')\n error(`Failed to seal ${String(summary.failed.length)} gate(s):`)\n for (const fail of summary.failed) {\n log(` ${fail.gate}: ${fail.error}`)\n }\n }\n\n if (summary.sealed.length === 0 && summary.skipped.length === 0 && summary.failed.length === 0) {\n log('No gates to seal')\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n // MacOSKeychainKeyProvider uses 'itemName' which becomes the service name\n // The account is hardcoded to 'attest-it' in the provider\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n itemName: privateKey.service,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n // The provider uses the service name as the keyRef\n // Account is hardcoded to 'attest-it' in MacOSKeychainKeyProvider\n return privateKey.service\n case '1password':\n return privateKey.item\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List all local identities')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all configured identities.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const identities = Object.entries(config.identities)\n\n log('')\n log(theme.blue.bold()('Local Identities:'))\n log('')\n\n for (const [slug, identity] of identities) {\n const isActive = slug === config.activeIdentity\n const marker = isActive ? theme.green('★') : ' '\n const nameDisplay = isActive ? theme.green.bold()(identity.name) : identity.name\n\n // Truncate public key for display\n const keyPreview = identity.publicKey.slice(0, 12) + '...'\n\n // Determine key storage type\n let keyType: string\n switch (identity.privateKey.type) {\n case 'file':\n keyType = 'file'\n break\n case 'keychain':\n keyType = 'keychain'\n break\n case '1password':\n keyType = '1password'\n break\n }\n\n log(`${marker} ${theme.blue(slug)}`)\n log(` Name: ${nameDisplay}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n log(` Key Type: ${keyType}`)\n log('')\n }\n\n if (identities.length === 1) {\n log(`1 identity configured`)\n } else {\n log(`${identities.length.toString()} identities configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Validation utilities for identity commands.\n */\n\n/**\n * Validate an identity slug.\n *\n * @param value - The slug value to validate\n * @param existingIdentities - Optional record of existing identity slugs\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateSlug(\n value: string,\n existingIdentities?: Record<string, unknown>,\n): true | string {\n const trimmed = value.trim()\n\n if (!trimmed) {\n return 'Slug cannot be empty'\n }\n\n if (!/^[a-z0-9-]+$/.test(trimmed)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n\n if (existingIdentities?.[trimmed]) {\n return `Identity \"${trimmed}\" already exists`\n }\n\n return true\n}\n\n/**\n * Email validation regex pattern.\n * Validates basic email format: local@domain.tld\n */\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n/**\n * Validate an email address.\n *\n * @param value - The email value to validate\n * @param required - Whether the email is required (default: false)\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateEmail(value: string, required = false): true | string {\n const trimmed = value.trim()\n\n // If not required and empty, that's fine\n if (!trimmed) {\n return required ? 'Email cannot be empty' : true\n }\n\n if (!EMAIL_REGEX.test(trimmed)) {\n return 'Please enter a valid email address'\n }\n\n return true\n}\n","import { Command } from 'commander'\nimport { input, select } from '@inquirer/prompts'\nimport {\n generateEd25519KeyPair,\n loadLocalConfig,\n saveLocalConfig,\n getAttestItConfigDir,\n OnePasswordKeyProvider,\n MacOSKeychainKeyProvider,\n} from '@attest-it/core'\nimport type { Identity, LocalConfig, PrivateKeyRef } from '@attest-it/core'\nimport { log, success, error, info, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { validateSlug, validateEmail } from './validation.js'\nimport { join } from 'node:path'\nimport { writeFile, mkdir } from 'node:fs/promises'\n\nexport const createCommand = new Command('create')\n .description('Create a new identity with Ed25519 keypair')\n .action(async () => {\n await runCreate()\n })\n\n/**\n * Run the create command to interactively create a new identity.\n */\nasync function runCreate(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Create New Identity'))\n log('')\n\n // Load existing config if it exists\n const existingConfig = await loadLocalConfig()\n\n // Prompt for identity details\n const slug = (\n await input({\n message: 'Identity slug (unique identifier):',\n validate: (value) => validateSlug(value, existingConfig?.identities),\n })\n ).trim()\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = (\n await input({\n message: 'Email (optional):',\n default: '',\n validate: validateEmail,\n })\n ).trim()\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n // Check provider availability\n info('Checking available key storage providers...')\n const opAvailable = await OnePasswordKeyProvider.isInstalled()\n const keychainAvailable = MacOSKeychainKeyProvider.isAvailable()\n\n // Build choices based on availability\n const configDir = getAttestItConfigDir()\n const storageChoices: { name: string; value: string }[] = [\n { name: `File system (${join(configDir, 'keys')})`, value: 'file' },\n ]\n\n if (keychainAvailable) {\n storageChoices.push({ name: 'macOS Keychain', value: 'keychain' })\n }\n\n if (opAvailable) {\n storageChoices.push({ name: '1Password', value: '1password' })\n }\n\n // Prompt for key storage type\n const keyStorageType = await select({\n message: 'Where should the private key be stored?',\n choices: storageChoices,\n })\n\n log('')\n log('Generating Ed25519 keypair...')\n\n // Generate keypair (this is synchronous, returns KeyPair not Promise)\n const keyPair = generateEd25519KeyPair()\n\n // Build private key reference based on storage type\n let privateKeyRef: PrivateKeyRef\n let keyStorageDescription: string\n\n switch (keyStorageType) {\n case 'file': {\n // Save to filesystem (respects --home-dir override)\n const keysDir = join(getAttestItConfigDir(), 'keys')\n await mkdir(keysDir, { recursive: true })\n const keyPath = join(keysDir, `${slug}.pem`)\n await writeFile(keyPath, keyPair.privateKey, { mode: 0o600 })\n\n privateKeyRef = { type: 'file', path: keyPath }\n keyStorageDescription = keyPath\n break\n }\n case 'keychain': {\n // Check if available (using static method)\n if (!MacOSKeychainKeyProvider.isAvailable()) {\n error('macOS Keychain is not available on this system')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // List available keychains\n const keychains = await MacOSKeychainKeyProvider.listKeychains()\n\n if (keychains.length === 0) {\n throw new Error('No keychains found on this system')\n }\n\n // Format keychain display with bold name and dim path\n const formatKeychainChoice = (kc: { name: string; path: string }): string => {\n return `${theme.blue.bold()(kc.name)} ${theme.muted(`(${kc.path})`)}`\n }\n\n // Select keychain (auto-select if only one, typically \"login\")\n let selectedKeychain: { name: string; path: string }\n if (keychains.length === 1 && keychains[0]) {\n selectedKeychain = keychains[0]\n info(`Using keychain: ${formatKeychainChoice(selectedKeychain)}`)\n } else {\n const selectedPath = await select({\n message: 'Select keychain:',\n choices: keychains.map((kc) => ({\n name: formatKeychainChoice(kc),\n value: kc.path,\n })),\n })\n const foundKeychain = keychains.find((kc) => kc.path === selectedPath)\n if (!foundKeychain) {\n throw new Error('Selected keychain not found')\n }\n selectedKeychain = foundKeychain\n }\n\n // Prompt for item name\n const keychainItemName = await input({\n message: 'Keychain item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Store the private key in keychain using security command\n // Keys are stored as base64-encoded PEM strings\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n const addArgs = [\n 'add-generic-password',\n '-a',\n 'attest-it',\n '-s',\n keychainItemName,\n '-w',\n encodedKey,\n '-U',\n selectedKeychain.path,\n ]\n await execFileAsync('security', addArgs)\n } catch (err) {\n throw new Error(\n `Failed to store key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n // In the keychain, -s is the service name (item) and -a is the account (\"attest-it\")\n privateKeyRef = {\n type: 'keychain',\n service: keychainItemName,\n account: 'attest-it',\n keychain: selectedKeychain.path,\n }\n keyStorageDescription = `macOS Keychain: ${selectedKeychain.name}/${keychainItemName}`\n break\n }\n case '1password': {\n // List available 1Password accounts\n const accounts = await OnePasswordKeyProvider.listAccounts()\n\n if (accounts.length === 0) {\n throw new Error(\n '1Password CLI is installed but no accounts are signed in. Run \"op signin\" first.',\n )\n }\n\n // Fetch detailed account info (including friendly name) for each account\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n interface AccountDetails {\n url: string\n email: string\n name: string // Friendly name from `op account get`\n }\n\n const accountDetails: AccountDetails[] = await Promise.all(\n accounts.map(async (acc) => {\n try {\n // Use user_uuid for unique lookup (URL can be shared by multiple accounts)\n const { stdout } = await execFileAsync('op', [\n 'account',\n 'get',\n '--account',\n acc.user_uuid,\n '--format=json',\n ])\n const details: unknown = JSON.parse(stdout)\n // Extract name if it exists and is a string\n const name =\n details !== null &&\n typeof details === 'object' &&\n 'name' in details &&\n typeof details.name === 'string'\n ? details.name\n : acc.url\n return {\n url: acc.url,\n email: acc.email,\n name,\n }\n } catch {\n // Fallback to URL if we can't get account details\n return {\n url: acc.url,\n email: acc.email,\n name: acc.url,\n }\n }\n }),\n )\n\n // Format account display with bold name and dim domain (matching `op signin` style)\n const formatAccountChoice = (acc: AccountDetails): string => {\n return `${theme.blue.bold()(acc.name)} ${theme.muted(`(${acc.url})`)}`\n }\n\n // Select account (auto-select if only one)\n // Use URL as the account identifier (required by `op` CLI)\n let selectedAccount: string | undefined\n if (accountDetails.length === 1 && accountDetails[0]) {\n selectedAccount = accountDetails[0].url\n info(`Using 1Password account: ${formatAccountChoice(accountDetails[0])}`)\n } else {\n selectedAccount = await select({\n message: 'Select 1Password account:',\n choices: accountDetails.map((acc) => ({\n name: formatAccountChoice(acc),\n value: acc.url,\n })),\n })\n }\n\n // List vaults for selected account\n const vaults = await OnePasswordKeyProvider.listVaults(selectedAccount)\n\n if (vaults.length === 0) {\n throw new Error(`No vaults found in 1Password account: ${selectedAccount}`)\n }\n\n // Select vault\n const selectedVault = await select({\n message: 'Select vault for private key storage:',\n choices: vaults.map((v) => ({\n name: v.name,\n value: v.name,\n })),\n })\n\n // Prompt for item name\n const item = await input({\n message: '1Password item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Write the private key to a temp file, then upload to 1Password\n const { tmpdir } = await import('node:os')\n const tempDir = join(tmpdir(), `attest-it-${String(Date.now())}`)\n await mkdir(tempDir, { recursive: true })\n const tempPrivatePath = join(tempDir, 'private.pem')\n\n try {\n // Write private key to temp file for upload\n await writeFile(tempPrivatePath, keyPair.privateKey, { mode: 0o600 })\n\n // Upload to 1Password using op document create\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n const opArgs = [\n 'document',\n 'create',\n tempPrivatePath,\n '--title',\n item,\n '--vault',\n selectedVault,\n ]\n if (selectedAccount) {\n opArgs.push('--account', selectedAccount)\n }\n\n await execFileAsync('op', opArgs)\n } finally {\n // Clean up temp files\n const { rm } = await import('node:fs/promises')\n await rm(tempDir, { recursive: true, force: true }).catch(() => {\n // Ignore cleanup errors\n })\n }\n\n privateKeyRef = {\n type: '1password',\n vault: selectedVault,\n item,\n ...(selectedAccount && { account: selectedAccount }),\n }\n keyStorageDescription = `1Password (${selectedVault}/${item})`\n break\n }\n default:\n throw new Error(`Unknown key storage type: ${keyStorageType}`)\n }\n\n // Build identity object\n const identity: Identity = {\n name,\n publicKey: keyPair.publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n // Create or update config\n let newConfig: LocalConfig\n if (existingConfig) {\n // Add to existing config\n newConfig = {\n ...existingConfig,\n identities: {\n ...existingConfig.identities,\n [slug]: identity,\n },\n }\n } else {\n // Create new config with this identity as active\n newConfig = {\n activeIdentity: slug,\n identities: {\n [slug]: identity,\n },\n }\n }\n\n // Save config\n await saveLocalConfig(newConfig)\n\n log('')\n success('Identity created successfully')\n log('')\n log(` Slug: ${slug}`)\n log(` Name: ${name}`)\n if (email) {\n log(` Email: ${email}`)\n }\n if (github) {\n log(` GitHub: ${github}`)\n }\n log(` Public Key: ${keyPair.publicKey.slice(0, 32)}...`)\n log(` Private Key: ${keyStorageDescription}`)\n log('')\n\n if (!existingConfig) {\n success(`Set as active identity`)\n log('')\n } else {\n log(`To use this identity, run: attest-it identity use ${slug}`)\n log('')\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\n\nexport const useCommand = new Command('use')\n .description('Set the active identity')\n .argument('<slug>', 'Identity slug to activate')\n .action(async (slug: string) => {\n await runUse(slug)\n })\n\n/**\n * Run the use command to set the active identity.\n */\nasync function runUse(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if identity exists\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Update active identity\n const newConfig = {\n ...config,\n activeIdentity: slug,\n }\n\n await saveLocalConfig(newConfig)\n\n success(`Active identity set to: ${identity.name} (${slug})`)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const showCommand = new Command('show')\n .description('Show identity details')\n .argument('[slug]', 'Identity slug (defaults to active identity)')\n .action(async (slug?: string) => {\n await runShow(slug)\n })\n\n/**\n * Run the show command to display identity details.\n */\nasync function runShow(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to show\n let targetSlug: string\n let isActive: boolean\n\n if (slug) {\n targetSlug = slug\n isActive = slug === config.activeIdentity\n } else {\n targetSlug = config.activeIdentity\n isActive = true\n }\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Identity Details:'))\n log('')\n log(` Slug: ${theme.blue(targetSlug)}${isActive ? theme.green(' (active)') : ''}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log('')\n log(` Public Key: ${identity.publicKey}`)\n log('')\n\n // Show private key reference details\n log(' Private Key Storage:')\n switch (identity.privateKey.type) {\n case 'file':\n log(` Type: File`)\n log(` Path: ${identity.privateKey.path}`)\n break\n case 'keychain':\n log(` Type: macOS Keychain`)\n log(` Service: ${identity.privateKey.service}`)\n log(` Account: ${identity.privateKey.account}`)\n break\n case '1password':\n log(` Type: 1Password`)\n if (identity.privateKey.account) {\n log(` Account: ${identity.privateKey.account}`)\n }\n log(` Vault: ${identity.privateKey.vault}`)\n log(` Item: ${identity.privateKey.item}`)\n if (identity.privateKey.field) {\n log(` Field: ${identity.privateKey.field}`)\n }\n break\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig, generateEd25519KeyPair } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\n\nexport const editCommand = new Command('edit')\n .description('Edit identity or rotate keypair')\n .argument('<slug>', 'Identity slug to edit')\n .action(async (slug: string) => {\n await runEdit(slug)\n })\n\n/**\n * Run the edit command to modify an identity.\n */\nasync function runEdit(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Edit Identity: ${slug}`))\n log('')\n\n // Prompt for new values (show current values as defaults)\n const name = await input({\n message: 'Display name:',\n default: identity.name,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: identity.email ?? '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: identity.github ?? '',\n })\n\n // Ask about keypair rotation\n const rotateKey = await confirm({\n message: 'Rotate keypair (generate new keys)?',\n default: false,\n })\n\n let publicKey = identity.publicKey\n const privateKeyRef = identity.privateKey\n\n if (rotateKey) {\n log('')\n log('Generating new Ed25519 keypair...')\n\n // Generate new keypair\n const keyPair = generateEd25519KeyPair()\n publicKey = keyPair.publicKey\n\n // Update private key storage based on existing type\n switch (identity.privateKey.type) {\n case 'file': {\n // Update file\n await writeFile(identity.privateKey.path, keyPair.privateKey, { mode: 0o600 })\n log(` Updated private key at: ${identity.privateKey.path}`)\n break\n }\n case 'keychain': {\n // Update macOS Keychain entry\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n // Delete old entry\n await execFileAsync('security', [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ])\n\n // Add new entry\n await execFileAsync('security', [\n 'add-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n '-w',\n encodedKey,\n '-U',\n ])\n log(` Updated private key in macOS Keychain`)\n } catch (err) {\n throw new Error(\n `Failed to update key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n break\n }\n case '1password': {\n // Update 1Password item\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n // Update the item field\n const opArgs = [\n 'item',\n 'edit',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n `privateKey[password]=${keyPair.privateKey}`,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Updated private key in 1Password`)\n } catch (err) {\n throw new Error(\n `Failed to update key in 1Password: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n break\n }\n }\n }\n\n // Update identity\n const updatedIdentity = {\n name,\n publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n const newConfig = {\n ...config,\n identities: {\n ...config.identities,\n [slug]: updatedIdentity,\n },\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success('Identity updated successfully')\n log('')\n if (rotateKey) {\n log(' New Public Key: ' + publicKey.slice(0, 32) + '...')\n log('')\n log(\n theme.yellow(\n ' Warning: If this identity is used in team configurations,\\n you must update those configurations with the new public key.',\n ),\n )\n log('')\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Shared utility for formatting key storage locations.\n */\nimport type { PrivateKeyRef } from '@attest-it/core'\nimport { getTheme } from './output.js'\n\n/**\n * Format the private key storage location for display.\n */\nexport function formatKeyLocation(privateKey: PrivateKeyRef): string {\n const theme = getTheme()\n\n switch (privateKey.type) {\n case 'file':\n return `${theme.blue.bold()('File')}: ${theme.muted(privateKey.path)}`\n case 'keychain': {\n let keychainName = 'default'\n if (privateKey.keychain) {\n const filename = privateKey.keychain.split('/').pop() ?? privateKey.keychain\n keychainName = filename.replace(/\\.keychain(-db)?$/, '')\n }\n return `${theme.blue.bold()('macOS Keychain')}: ${theme.muted(`${keychainName}/${privateKey.service}`)}`\n }\n case '1password': {\n const parts = [privateKey.vault, privateKey.item]\n if (privateKey.account) {\n parts.unshift(privateKey.account)\n }\n return `${theme.blue.bold()('1Password')}: ${theme.muted(parts.join('/'))}`\n }\n default:\n return 'Unknown storage'\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { log, success, error, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { formatKeyLocation } from '../../utils/format-key-location.js'\nimport { unlink } from 'node:fs/promises'\n\nexport const removeCommand = new Command('remove')\n .description('Delete identity and optionally delete private key')\n .argument('<slug>', 'Identity slug to remove')\n .action(async (slug: string) => {\n await runRemove(slug)\n })\n\n/**\n * Run the remove command to delete an identity.\n */\nasync function runRemove(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Remove Identity: ${slug}`))\n log('')\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n log('')\n\n // Confirm deletion\n const confirmDelete = await confirm({\n message: 'Are you sure you want to delete this identity?',\n default: false,\n })\n\n if (!confirmDelete) {\n log('Cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Ask about deleting private key, showing where it's stored\n const keyLocation = formatKeyLocation(identity.privateKey)\n log(` Private key: ${keyLocation}`)\n log('')\n\n const deletePrivateKey = await confirm({\n message: 'Also delete the private key from storage?',\n default: false,\n })\n\n // Delete private key if requested\n if (deletePrivateKey) {\n switch (identity.privateKey.type) {\n case 'file': {\n try {\n await unlink(identity.privateKey.path)\n log(` Deleted private key file: ${identity.privateKey.path}`)\n } catch (err) {\n // Ignore file not found errors\n if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {\n throw err\n }\n }\n break\n }\n case 'keychain': {\n // Delete from macOS Keychain\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const deleteArgs = [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ]\n if (identity.privateKey.keychain) {\n deleteArgs.push(identity.privateKey.keychain)\n }\n await execFileAsync('security', deleteArgs)\n log(` Deleted private key from macOS Keychain`)\n } catch (err) {\n // Ignore if key doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('could not be found') &&\n !err.message.includes('does not exist')\n ) {\n throw err\n }\n }\n break\n }\n case '1password': {\n // Delete from 1Password\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const opArgs = [\n 'item',\n 'delete',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Deleted private key from 1Password`)\n } catch (err) {\n // Ignore if item doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('not found') &&\n !err.message.includes(\"doesn't exist\")\n ) {\n throw err\n }\n }\n break\n }\n }\n }\n\n // Remove from config\n const { [slug]: _removed, ...remainingIdentities } = config.identities\n\n // Check if this was the last identity\n if (Object.keys(remainingIdentities).length === 0) {\n error('Cannot remove last identity')\n log('')\n log('At least one identity must exist')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if this was the active identity\n let newActiveIdentity = config.activeIdentity\n if (slug === config.activeIdentity) {\n // Set first remaining identity as active\n const firstKey = Object.keys(remainingIdentities)[0]\n if (!firstKey) {\n throw new Error('No remaining identities after removal')\n }\n newActiveIdentity = firstKey\n log('')\n log(theme.yellow(` Removed active identity. New active identity: ${newActiveIdentity}`))\n }\n\n const newConfig = {\n activeIdentity: newActiveIdentity,\n identities: remainingIdentities,\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success(`Identity \"${slug}\" removed`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const exportCommand = new Command('export')\n .description('Export identity for team onboarding (YAML snippet)')\n .argument('[slug]', 'Identity slug to export (defaults to active identity)')\n .action(async (slug?: string) => {\n await runExport(slug)\n })\n\n/**\n * Run the export command to output a YAML snippet for team config.\n */\nasync function runExport(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to export\n const targetSlug = slug ?? config.activeIdentity\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Team Configuration YAML:'))\n log('')\n log(theme.muted('# Add this to your team config file (.attest-it/team-config.yaml)'))\n log('')\n\n // Build export object (only include fields that are present)\n const exportData: Record<string, unknown> = {\n name: identity.name,\n publicKey: identity.publicKey,\n }\n\n if (identity.email) {\n exportData.email = identity.email\n }\n\n if (identity.github) {\n exportData.github = identity.github\n }\n\n // Create YAML with slug as key\n const yamlData = {\n [targetSlug]: exportData,\n }\n\n const yamlString = stringifyYaml(yamlData)\n\n log(yamlString)\n log('')\n log(theme.muted('# The team owner can add this to the \"members:\" section'))\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { createCommand } from './create.js'\nimport { useCommand } from './use.js'\nimport { showCommand } from './show.js'\nimport { editCommand } from './edit.js'\nimport { removeCommand } from './remove.js'\nimport { exportCommand } from './export.js'\n\nexport const identityCommand = new Command('identity')\n .description('Manage local identities and keypairs')\n .addCommand(listCommand)\n .addCommand(createCommand)\n .addCommand(useCommand)\n .addCommand(showCommand)\n .addCommand(editCommand)\n .addCommand(removeCommand)\n .addCommand(exportCommand)\n","import { Command } from 'commander'\nimport { loadLocalConfig, getActiveIdentity } from '@attest-it/core'\nimport { log, error, getTheme } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { formatKeyLocation } from '../utils/format-key-location.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show the current active identity')\n .action(async () => {\n await runWhoami()\n })\n\n/**\n * Run the whoami command to display the current active identity.\n */\nasync function runWhoami(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = getActiveIdentity(config)\n\n if (!identity) {\n error('Active identity not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Active Identity'))\n log('')\n log(` Slug: ${theme.green.bold()(config.activeIdentity)}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${theme.muted(identity.email)}`)\n }\n if (identity.github) {\n log(` GitHub: ${theme.muted('@' + identity.github)}`)\n }\n log(` Public Key: ${theme.muted(identity.publicKey.slice(0, 24) + '...')}`)\n log(` Key Store: ${formatKeyLocation(identity.privateKey)}`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadConfig, toAttestItConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List team members and their authorizations')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all team members.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n if (!attestItConfig.team || Object.keys(attestItConfig.team).length === 0) {\n error('No team members configured')\n log('')\n log('Run: attest-it team add')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const teamMembers = Object.entries(attestItConfig.team)\n\n log('')\n log(theme.blue.bold()('Team Members:'))\n log('')\n\n for (const [slug, member] of teamMembers) {\n // Truncate public key for display\n const keyPreview = member.publicKey.slice(0, 12) + '...'\n\n log(theme.blue(slug))\n log(` Name: ${member.name}`)\n if (member.email) {\n log(` Email: ${member.email}`)\n }\n if (member.github) {\n log(` GitHub: ${member.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n\n // Show gate authorizations\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log(` Gates: ${authorizedGates.join(', ')}`)\n } else {\n log(` Gates: ${theme.muted('(none)')}`)\n }\n\n log('')\n }\n\n if (teamMembers.length === 1) {\n log(`1 team member configured`)\n } else {\n log(`${teamMembers.length.toString()} team members configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, checkbox } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport type { Config, TeamMember } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const addCommand = new Command('add')\n .description('Add a new team member')\n .action(async () => {\n await runAdd()\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the add command to interactively add a team member.\n */\nasync function runAdd(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Add Team Member'))\n log('')\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Prompt for member details\n const slug = await input({\n message: 'Member slug (unique identifier):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection\n if (existingTeam[value]) {\n return `Team member \"${value}\" already exists`\n }\n return true\n },\n })\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n log('')\n log('Paste the public key (from \"attest-it identity export\"):')\n const publicKey = await input({\n message: 'Public key:',\n validate: validatePublicKey,\n })\n\n // Prompt for gate authorizations\n let authorizedGates: string[] = []\n if (attestItConfig.gates && Object.keys(attestItConfig.gates).length > 0) {\n log('')\n const gateChoices = Object.entries(attestItConfig.gates).map(([gateId, gate]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n }))\n\n authorizedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n }\n\n // Build team member object\n const teamMember: TeamMember = {\n name,\n publicKey: publicKey.trim(),\n }\n\n if (email && email.trim().length > 0) {\n teamMember.email = email.trim()\n }\n\n if (github && github.trim().length > 0) {\n teamMember.github = github.trim()\n }\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: {\n ...existingTeam,\n [slug]: teamMember,\n },\n }\n\n // Update gate authorizations\n if (authorizedGates.length > 0 && updatedConfig.gates) {\n for (const gateId of authorizedGates) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = updatedConfig.gates[gateId]\n if (gate) {\n // Add to authorizedSigners if not already present\n if (!gate.authorizedSigners.includes(slug)) {\n gate.authorizedSigners.push(slug)\n }\n }\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input, confirm, checkbox } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport type { Config, TeamMember } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const editCommand = new Command('edit')\n .description('Edit a team member')\n .argument('<slug>', 'Team member slug to edit')\n .action(async (slug: string) => {\n await runEdit(slug)\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the edit command to modify an existing team member.\n */\nasync function runEdit(slug: string): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Edit Team Member: ${slug}`))\n log('')\n log(theme.muted('Leave blank to keep current value'))\n log('')\n\n // Prompt for updated details\n const name = await input({\n message: 'Display name:',\n default: existingMember.name,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: existingMember.email ?? '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: existingMember.github ?? '',\n })\n\n // Ask if they want to update the public key\n const updateKey = await confirm({\n message: 'Update public key?',\n default: false,\n })\n\n let publicKey = existingMember.publicKey\n if (updateKey) {\n log('')\n log('Paste the new public key:')\n publicKey = await input({\n message: 'Public key:',\n default: existingMember.publicKey,\n validate: validatePublicKey,\n })\n }\n\n // Get current gate authorizations\n const currentGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n currentGates.push(gateId)\n }\n }\n }\n\n // Prompt for gate authorizations\n let selectedGates: string[] = currentGates\n if (attestItConfig.gates && Object.keys(attestItConfig.gates).length > 0) {\n log('')\n const gateChoices = Object.entries(attestItConfig.gates).map(([gateId, gate]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n checked: currentGates.includes(gateId),\n }))\n\n selectedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n }\n\n // Build updated team member object\n const updatedMember: TeamMember = {\n name: name.trim(),\n publicKey: publicKey.trim(),\n }\n\n if (email && email.trim().length > 0) {\n updatedMember.email = email.trim()\n }\n\n if (github && github.trim().length > 0) {\n updatedMember.github = github.trim()\n }\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: {\n ...attestItConfig.team,\n [slug]: updatedMember,\n },\n }\n\n // Update gate authorizations\n if (updatedConfig.gates) {\n for (const [gateId, gate] of Object.entries(updatedConfig.gates)) {\n // Remove from gates that are no longer selected\n if (currentGates.includes(gateId) && !selectedGates.includes(gateId)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n\n // Add to gates that are newly selected\n if (!currentGates.includes(gateId) && selectedGates.includes(gateId)) {\n if (!gate.authorizedSigners.includes(slug)) {\n gate.authorizedSigners.push(slug)\n }\n }\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" updated successfully`)\n\n if (selectedGates.length > 0) {\n log(`Authorized for gates: ${selectedGates.join(', ')}`)\n } else {\n log('Not authorized for any gates')\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath, readSealsSync } from '@attest-it/core'\nimport type { Config } from '@attest-it/core'\nimport { log, success, error, warn } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const removeCommand = new Command('remove')\n .description('Remove a team member')\n .argument('<slug>', 'Team member slug to remove')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(async (slug: string, options: { force?: boolean }) => {\n await runRemove(slug, options)\n })\n\n/**\n * Run the remove command to delete a team member.\n */\nasync function runRemove(slug: string, options: { force?: boolean }): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Remove Team Member: ${slug}`))\n log('')\n log(`Name: ${existingMember.name}`)\n if (existingMember.email) {\n log(`Email: ${existingMember.email}`)\n }\n if (existingMember.github) {\n log(`GitHub: ${existingMember.github}`)\n }\n log('')\n\n // Check for existing seals by this member\n const projectRoot = process.cwd()\n let sealsFile\n try {\n sealsFile = readSealsSync(projectRoot)\n } catch {\n // No seals file exists yet\n sealsFile = { version: 1, seals: {} }\n }\n\n const sealsCreatedByMember: string[] = []\n for (const [gateId, seal] of Object.entries(sealsFile.seals)) {\n if (seal.sealedBy === slug) {\n sealsCreatedByMember.push(gateId)\n }\n }\n\n if (sealsCreatedByMember.length > 0) {\n warn('This member has created seals for the following gates:')\n for (const gateId of sealsCreatedByMember) {\n warn(` - ${gateId}`)\n }\n log('')\n warn('These seals will still be valid but attributed to a removed member.')\n log('')\n }\n\n // Get gates this member is authorized for\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log('This member is authorized for the following gates:')\n for (const gateId of authorizedGates) {\n log(` - ${gateId}`)\n }\n log('')\n }\n\n // Confirm removal\n if (!options.force) {\n const confirmed = await confirm({\n message: `Are you sure you want to remove \"${slug}\"?`,\n default: false,\n })\n\n if (!confirmed) {\n error('Removal cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Remove from team\n const updatedTeam = { ...attestItConfig.team }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete, security/detect-object-injection\n delete updatedTeam[slug]\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: updatedTeam,\n }\n\n // Remove from all gate authorizations\n if (updatedConfig.gates) {\n for (const gate of Object.values(updatedConfig.gates)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" removed successfully`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { addCommand } from './add.js'\nimport { editCommand } from './edit.js'\nimport { removeCommand } from './remove.js'\n\nexport const teamCommand = new Command('team')\n .description('Manage team members and authorizations')\n .addCommand(listCommand)\n .addCommand(addCommand)\n .addCommand(editCommand)\n .addCommand(removeCommand)\n","import { Command } from 'commander'\nimport tabtab from '@pnpm/tabtab'\nimport { loadLocalConfig, loadConfig } from '@attest-it/core'\nimport { success, error, log, info } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nconst PROGRAM_NAME = 'attest-it'\n\ntype SupportedShell = 'bash' | 'zsh' | 'fish'\n\n/**\n * Get completions based on the current completion context.\n */\nasync function getCompletions(env: tabtab.ParseEnvResult): Promise<void> {\n let shell: SupportedShell\n try {\n const detectedShell = tabtab.getShellFromEnv(process.env)\n // Only use bash, zsh, fish (not pwsh)\n shell = detectedShell === 'pwsh' ? 'bash' : detectedShell\n } catch {\n // If SHELL isn't set properly, default to bash-compatible output\n shell = 'bash'\n }\n\n // Top-level commands\n const commands: tabtab.CompletionItem[] = [\n { name: 'init', description: 'Initialize a new config file' },\n { name: 'status', description: 'Show status of all gates' },\n { name: 'run', description: 'Run test suites interactively' },\n { name: 'verify', description: 'Verify all seals are valid' },\n { name: 'seal', description: 'Create a seal for a gate' },\n { name: 'keygen', description: 'Generate a new keypair' },\n { name: 'prune', description: 'Remove stale attestations' },\n { name: 'identity', description: 'Manage identities' },\n { name: 'team', description: 'Manage team members' },\n { name: 'whoami', description: 'Show active identity' },\n { name: 'completion', description: 'Shell completion commands' },\n ]\n\n // Global options\n const globalOptions: tabtab.CompletionItem[] = [\n { name: '--help', description: 'Show help' },\n { name: '--version', description: 'Show version' },\n { name: '--verbose', description: 'Verbose output' },\n { name: '--quiet', description: 'Minimal output' },\n { name: '--config', description: 'Path to config file' },\n ]\n\n // Identity subcommands\n const identitySubcommands: tabtab.CompletionItem[] = [\n { name: 'create', description: 'Create a new identity' },\n { name: 'list', description: 'List all identities' },\n { name: 'use', description: 'Switch active identity' },\n { name: 'remove', description: 'Remove an identity' },\n ]\n\n // Team subcommands\n const teamSubcommands: tabtab.CompletionItem[] = [\n { name: 'add', description: 'Add yourself to the team' },\n { name: 'list', description: 'List team members' },\n { name: 'remove', description: 'Remove a team member' },\n ]\n\n // Completion subcommands\n const completionSubcommands: tabtab.CompletionItem[] = [\n { name: 'install', description: 'Install shell completion' },\n { name: 'uninstall', description: 'Uninstall shell completion' },\n ]\n\n // Parse the command line to understand context\n const words: string[] = env.line.split(/\\s+/).filter(Boolean)\n const lastWord: string = env.last\n const prevWord: string = env.prev\n\n // If completing an option value\n if (prevWord === '--config' || prevWord === '-c') {\n // Let shell handle file completion\n tabtab.logFiles()\n return\n }\n\n // If typing an option\n if (lastWord.startsWith('-')) {\n tabtab.log(globalOptions, shell, console.log)\n return\n }\n\n // Determine which command we're in\n const commandIndex = words.findIndex(\n (w: string) => !w.startsWith('-') && w !== PROGRAM_NAME && w !== 'npx',\n )\n const currentCommand: string | null = commandIndex >= 0 ? (words[commandIndex] ?? null) : null\n\n // Handle subcommand completions\n if (currentCommand === 'identity') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'use' || subcommand === 'remove') {\n // Complete with identity slugs\n const identities = await getIdentitySlugs()\n if (identities.length > 0) {\n tabtab.log(identities, shell, console.log)\n return\n }\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(identitySubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'team') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(teamSubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'completion') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'install') {\n // Complete with shell names\n tabtab.log(['bash', 'zsh', 'fish'], shell, console.log)\n return\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(completionSubcommands, shell, console.log)\n return\n }\n }\n\n // Commands that take a gate name as argument\n if (currentCommand === 'status' || currentCommand === 'verify' || currentCommand === 'seal') {\n const gates = await getGateNames()\n if (gates.length > 0) {\n tabtab.log(gates, shell, console.log)\n return\n }\n }\n\n // Commands that take a suite name as argument\n if (currentCommand === 'run') {\n const suites = await getSuiteNames()\n if (suites.length > 0) {\n tabtab.log(suites, shell, console.log)\n return\n }\n }\n\n // Default: show top-level commands\n if (!currentCommand) {\n tabtab.log([...commands, ...globalOptions], shell, console.log)\n }\n}\n\n/**\n * Get identity slugs from local config.\n */\nasync function getIdentitySlugs(): Promise<string[]> {\n try {\n const config = await loadLocalConfig()\n if (config?.identities) {\n return Object.keys(config.identities)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get gate names from project config.\n */\nasync function getGateNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n if (config.gates) {\n return Object.keys(config.gates)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get suite names from project config.\n */\nasync function getSuiteNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n return Object.keys(config.suites)\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\nexport const completionCommand = new Command('completion').description('Shell completion commands')\n\n// Install subcommand\ncompletionCommand\n .command('install [shell]')\n .description('Install shell completion (bash, zsh, or fish)')\n .action(async (shellArg?: string) => {\n try {\n // Validate and narrow shell type\n let shell: 'bash' | 'zsh' | 'fish' | 'pwsh' | undefined\n if (shellArg !== undefined) {\n if (tabtab.isShellSupported(shellArg)) {\n shell = shellArg\n } else {\n error(`Shell \"${shellArg}\" is not supported. Use bash, zsh, or fish.`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n await tabtab.install({\n name: PROGRAM_NAME,\n completer: PROGRAM_NAME,\n shell,\n })\n\n log('')\n success('Shell completion installed!')\n log('')\n info('Restart your shell or run:')\n if (shell === 'bash' || !shell) {\n log(' source ~/.bashrc')\n }\n if (shell === 'zsh' || !shell) {\n log(' source ~/.zshrc')\n }\n if (shell === 'fish' || !shell) {\n log(' source ~/.config/fish/config.fish')\n }\n log('')\n } catch (err) {\n error(`Failed to install completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Uninstall subcommand\ncompletionCommand\n .command('uninstall')\n .description('Uninstall shell completion')\n .action(async () => {\n try {\n await tabtab.uninstall({\n name: PROGRAM_NAME,\n })\n\n log('')\n success('Shell completion uninstalled!')\n log('')\n } catch (err) {\n error(`Failed to uninstall completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Hidden server subcommand (called by shell for completions)\ncompletionCommand\n .command('server', { hidden: true })\n .description('Completion server (internal)')\n .action(async () => {\n const env = tabtab.parseEnv(process.env)\n if (env.complete) {\n await getCompletions(env)\n }\n })\n","import { Command } from 'commander'\nimport { initCommand } from './commands/init.js'\nimport { statusCommand } from './commands/status.js'\nimport { runCommand } from './commands/run.js'\nimport { keygenCommand } from './commands/keygen.js'\nimport { pruneCommand } from './commands/prune.js'\nimport { verifyCommand } from './commands/verify.js'\nimport { sealCommand } from './commands/seal.js'\nimport { identityCommand } from './commands/identity/index.js'\nimport { whoamiCommand } from './commands/whoami.js'\nimport { teamCommand } from './commands/team/index.js'\nimport { completionCommand } from './commands/completion.js'\nimport { setOutputOptions, initTheme } from './utils/output.js'\nimport { setAttestItHomeDir } from '@attest-it/core'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\n// Type guard for package.json structure\nfunction hasVersion(data: unknown): data is { version: string } {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n// Lazy-load version from package.json to avoid startup latency\nlet cachedVersion: string | undefined\n\nfunction getPackageVersion(): string {\n if (cachedVersion !== undefined) {\n return cachedVersion\n }\n\n // Read version from package.json at runtime\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles for each entry point:\n // - dist/index.js (library entry) needs ../package.json\n // - dist/bin/attest-it.js (CLI entry) needs ../../package.json\n const possiblePaths = [join(__dirname, '../package.json'), join(__dirname, '../../package.json')]\n\n for (const packageJsonPath of possiblePaths) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8')\n const packageJsonData: unknown = JSON.parse(content)\n\n if (!hasVersion(packageJsonData)) {\n throw new Error(`Invalid package.json at ${packageJsonPath}: missing version field`)\n }\n\n cachedVersion = packageJsonData.version\n return cachedVersion\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find package.json')\n}\n\nconst program = new Command()\n\nprogram\n .name('attest-it')\n .description('Human-gated test attestation system')\n .option('-c, --config <path>', 'Path to config file')\n .option('-v, --verbose', 'Verbose output')\n .option('-q, --quiet', 'Minimal output')\n\n// Handle --version manually to avoid loading package.json on every invocation\nprogram.option('-V, --version', 'output the version number')\n\n// Register commands\nprogram.addCommand(initCommand)\nprogram.addCommand(statusCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(keygenCommand)\nprogram.addCommand(pruneCommand)\nprogram.addCommand(verifyCommand)\nprogram.addCommand(sealCommand)\nprogram.addCommand(identityCommand)\nprogram.addCommand(teamCommand)\nprogram.addCommand(whoamiCommand)\nprogram.addCommand(completionCommand)\n\n/**\n * Process the hidden --home-dir option before any other processing.\n * This must be done early so config loading uses the correct path.\n */\nfunction processHomeDirOption(): void {\n const homeDirIndex = process.argv.indexOf('--home-dir')\n if (homeDirIndex !== -1 && homeDirIndex + 1 < process.argv.length) {\n const homeDir = process.argv[homeDirIndex + 1]\n if (homeDir && !homeDir.startsWith('-')) {\n setAttestItHomeDir(homeDir)\n // Remove the option from argv so Commander doesn't complain\n process.argv.splice(homeDirIndex, 2)\n }\n }\n}\n\nexport async function run(): Promise<void> {\n // Process --home-dir before anything else (hidden option for testing)\n processHomeDirOption()\n\n // Check for --version flag before initializing theme or doing other work\n if (process.argv.includes('--version') || process.argv.includes('-V')) {\n console.log(getPackageVersion())\n process.exit(0)\n }\n\n // Initialize theme before any output\n await initTheme()\n\n // Parse options and set global output options\n program.parse()\n const options = program.opts<{ verbose?: boolean; quiet?: boolean }>()\n\n const outputOptions: { verbose?: boolean; quiet?: boolean } = {}\n if (options.verbose !== undefined) {\n outputOptions.verbose = options.verbose\n }\n if (options.quiet !== undefined) {\n outputOptions.quiet = options.quiet\n }\n\n setOutputOptions(outputOptions)\n}\n\nexport { program }\n","import { run } from '../src/index.js'\n\nvoid run()\n"]}
|