@docyrus/cli 0.2.0 → 0.3.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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/constants.ts","../src/utils/errors.ts","../src/auth/credential-auth.ts","../src/auth/oauth-server.ts","../src/utils/browser.ts","../src/auth/oauth-auth.ts","../src/utils/platform.ts","../src/storage/encryption.ts","../src/storage/file-storage.ts","../src/storage/keychain-storage.ts","../src/storage/cli-token-manager.ts","../src/config/config-manager.ts","../src/ui/logger.ts","../src/ui/output.ts","../src/ui/messages.ts","../src/ui/spinner.ts","../src/ui/prompts.ts","../src/ui/progress.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/utils/auth-guard.ts","../src/commands/whoami.ts","../src/utils/linter-config.ts","../src/utils/alias-config.ts","../src/utils/api-client.ts","../src/utils/ui-variant-swap.ts","../src/utils/ui-library-setup.ts","../src/utils/state-management-setup.ts","../src/commands/create.ts","../src/commands/generate.ts","../src/commands/upgrade.ts","../src/commands/completion.ts","../src/commands/info.ts","../src/commands/config.ts","../src/commands/index.ts","../src/utils/update-checker.ts","../src/cli.ts"],"names":["ApiAuthError","resolve","state","RestApiClient","randomBytes","join","chalk","ora","password","userInfo","program","readFile","writeFile","constants","mkdir","dirname","execAsync","promisify","exec","access","select","input","cp","name","homedir","existsSync","rm","readFileSync","githubToken","isLoggedIn","email","isNewerVersion"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * Environment Configuration\n * Values are injected at BUILD TIME via tsup.config.ts\n * See tsup.config.ts for default values and .env.example for configuration\n */\n\n// API Configuration (injected at build time)\nexport const DOCYRUS_API_URL = process.env.DOCYRUS_API_URL as string;\n\n// OAuth2 Configuration (injected at build time)\nexport const OAUTH_CLIENT_ID = process.env.DOCYRUS_OAUTH_CLIENT_ID as string;\nexport const OAUTH_SCOPES = (process.env.DOCYRUS_OAUTH_SCOPES as string).split(' ');\n\n// OAuth2 Endpoints (same base as API)\nexport const OAUTH_AUTHORIZE_URL = `${DOCYRUS_API_URL}/v1/oauth2/authorize`;\nexport const OAUTH_TOKEN_URL = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n// Local callback server for CLI OAuth flow\nexport const OAUTH_CALLBACK_PORT_MIN = 9876;\nexport const OAUTH_CALLBACK_PORT_MAX = 9899;\nexport const OAUTH_REDIRECT_URI = (port: number) => `http://localhost:${port}/callback`;\nexport const OAUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n// Storage Configuration\nexport const KEYCHAIN_SERVICE = 'docyrus-cli';\nexport const CONFIG_DIR = '.docyrus';\nexport const CREDENTIALS_FILE = 'credentials.enc';\nexport const CONFIG_FILE = 'config.json';\n\n// Token Keys\nexport const TOKEN_KEYS = {\n ACCESS_TOKEN: 'accessToken',\n REFRESH_TOKEN: 'refreshToken',\n USER_EMAIL: 'userEmail',\n EXPIRES_AT: 'expiresAt',\n GITHUB_TOKEN: 'githubToken' // For private template access - persists after logout\n} as const;\n\n// CLI Info\nexport const CLI_NAME = 'docyrus';\nexport const CLI_VERSION = '0.0.1';\nexport const NPM_PACKAGE_NAME = 'docyrus';\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly suggestion?: string;\n constructor(message: string, exitCode = 1, suggestion?: string) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n this.suggestion = suggestion;\n }\n}\n\nexport class AuthenticationError extends CliError {\n constructor(message = 'Authentication failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your credentials and try again.');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NotLoggedInError extends CliError {\n constructor(message = 'You are not logged in.') {\n super(message, 1, 'Run `docyrus login` to authenticate.');\n this.name = 'NotLoggedInError';\n }\n}\n\nexport class ConfigurationError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class NetworkError extends CliError {\n constructor(message = 'Network request failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your internet connection and try again.');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends CliError {\n constructor(message = 'Operation timed out') {\n super(message, 1, 'Please try again.');\n this.name = 'TimeoutError';\n }\n}\n\nexport class OAuthError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion || 'Please try again or use email/password login.');\n this.name = 'OAuthError';\n }\n}\n\nexport class TemplateError extends CliError {\n constructor(message: string) {\n super(message, 1, 'Check your internet connection and try again.');\n this.name = 'TemplateError';\n }\n}\n\nexport class ProjectExistsError extends CliError {\n constructor(projectName: string) {\n super(\n `Directory \"${projectName}\" already exists.`,\n 1,\n 'Choose a different project name or delete the existing directory.'\n );\n this.name = 'ProjectExistsError';\n }\n}\n\nexport class ConflictingFlagsError extends CliError {\n constructor(flag1: string, flag2: string) {\n super(\n `Cannot use ${flag1} and ${flag2} together.`,\n 1,\n 'Please use only one option from each group.'\n );\n this.name = 'ConflictingFlagsError';\n }\n}\n","import { RestApiClient, AuthenticationError as ApiAuthError } from '@docyrus/api-client';\n\nimport {\n type AuthCredentials, type AuthTokens, type UserInfo, type LoginResult\n} from './types.js';\n\nimport { DOCYRUS_API_URL, OAUTH_CLIENT_ID } from '../config/constants.js';\nimport { AuthenticationError, NetworkError } from '../utils/errors.js';\n\nfunction getApiClient(): RestApiClient {\n return new RestApiClient({ baseURL: DOCYRUS_API_URL });\n}\n\nexport async function loginWithCredentials(credentials: AuthCredentials): Promise<LoginResult> {\n const client = getApiClient();\n\n try {\n const response = await client.post<{\n success: boolean;\n data: {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n user?: UserInfo;\n };\n }>('/v1/auth/token', {\n email: credentials.email,\n password: credentials.password\n });\n\n const tokens: AuthTokens = {\n accessToken: response.data.access_token,\n refreshToken: response.data.refresh_token,\n expiresIn: response.data.expires_in\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return {\n tokens,\n user: response.data.user\n };\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Invalid email or password.');\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw error;\n }\n}\n\nexport async function getUserInfo(accessToken: string): Promise<UserInfo> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n const response = await client.get<{ success: boolean; data: UserInfo }>('/v1/users/me');\n\n return response.data;\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n throw error;\n }\n}\n\nexport async function refreshAccessToken(refreshToken: string): Promise<AuthTokens> {\n const tokenUrl = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: OAUTH_CLIENT_ID,\n refresh_token: refreshToken\n }).toString()\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as {\n error?: string;\n error_description?: string;\n };\n\n throw new AuthenticationError(\n errorData.error_description || 'Failed to refresh token'\n );\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n}\n","\nimport {\n createServer, type Server, type IncomingMessage, type ServerResponse\n} from 'node:http';\nimport { URL } from 'node:url';\nimport { randomBytes } from 'node:crypto';\n\nimport { type OAuthCallbackResult } from './types.js';\n\nimport { OAUTH_CALLBACK_PORT_MIN, OAUTH_CALLBACK_PORT_MAX, OAUTH_TIMEOUT_MS } from '../config/constants.js';\nimport { OAuthError, TimeoutError } from '../utils/errors.js';\n\nconst SUCCESS_HTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Successful - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this tab and return to the CLI.</p>\n </div>\n</body>\n</html>\n`;\n\nconst ERROR_HTML = (message: string) => `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fef2f2;\n border-radius: 8px;\n color: #dc2626;\n font-size: 13px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Something went wrong during authentication.</p>\n <div class=\"error-message\">${message}</div>\n </div>\n</body>\n</html>\n`;\n\nexport function generateState(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n return Buffer.from(hashBuffer).toString('base64url');\n}\n\nasync function findAvailablePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number) => {\n if (port > OAUTH_CALLBACK_PORT_MAX) {\n reject(new OAuthError('Could not find an available port for OAuth callback.'));\n\n return;\n }\n\n const server = createServer();\n\n server.listen(port, '127.0.0.1');\n\n server.once('listening', () => {\n server.close(() => resolve(port));\n });\n\n server.once('error', () => {\n tryPort(port + 1);\n });\n };\n\n tryPort(OAUTH_CALLBACK_PORT_MIN);\n });\n}\n\nexport interface CallbackServerResult {\n server: Server;\n port: number;\n resultPromise: Promise<OAuthCallbackResult>;\n cleanup: () => void;\n}\n\nexport async function startCallbackServer(expectedState: string): Promise<CallbackServerResult> {\n const port = await findAvailablePort();\n\n let resolveResult: (result: OAuthCallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const timeoutId = setTimeout(() => {\n rejectResult(new TimeoutError('OAuth authentication timed out.'));\n }, OAUTH_TIMEOUT_MS);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://127.0.0.1:${port}`);\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML(errorDescription || error));\n rejectResult(new OAuthError(errorDescription || error));\n\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Missing authorization code or state.'));\n rejectResult(new OAuthError('Missing authorization code or state.'));\n\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Invalid state parameter. Possible CSRF attack.'));\n rejectResult(new OAuthError('Invalid state parameter.'));\n\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not Found');\n }\n });\n\n server.listen(port, '127.0.0.1');\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n return {\n server,\n port,\n resultPromise,\n cleanup\n };\n}\n","import open from 'open';\n\nexport async function openBrowser(url: string): Promise<void> {\n await open(url);\n}\n","import { RestApiClient } from '@docyrus/api-client';\n\nimport {\n type AuthTokens, type OAuthConfig, type LoginResult, type UserInfo\n} from './types.js';\n\nimport {\n startCallbackServer,\n generateState,\n generateCodeVerifier,\n generateCodeChallenge\n} from './oauth-server.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { OAuthError } from '../utils/errors.js';\nimport {\n DOCYRUS_API_URL,\n OAUTH_CLIENT_ID,\n OAUTH_SCOPES,\n OAUTH_REDIRECT_URI\n} from '../config/constants.js';\n\nfunction getOAuthConfig(port: number): OAuthConfig {\n return {\n authorizationUrl: `${DOCYRUS_API_URL}/v1/oauth2/authorize`,\n tokenUrl: `${DOCYRUS_API_URL}/v1/oauth2/token`,\n clientId: OAUTH_CLIENT_ID,\n redirectUri: OAUTH_REDIRECT_URI(port),\n scopes: OAUTH_SCOPES\n };\n}\n\nfunction buildAuthorizationUrl(\n config: OAuthConfig,\n state: string,\n codeChallenge: string\n): string {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n scope: config.scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256'\n });\n\n return `${config.authorizationUrl}?${params.toString()}`;\n}\n\nasync function exchangeCodeForTokens(\n config: OAuthConfig,\n code: string,\n codeVerifier: string\n): Promise<AuthTokens> {\n const response = await fetch(config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: config.clientId,\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier\n }).toString()\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new OAuthError(`Failed to exchange authorization code: ${errorText}`);\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n}\n\nasync function getUserInfoFromToken(accessToken: string): Promise<UserInfo | undefined> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n return await client.get<UserInfo>('/v1/users/me');\n } catch {\n return undefined;\n }\n}\n\nexport interface OAuthLoginOptions {\n onOpeningBrowser?: () => void;\n onWaitingForAuth?: (url: string) => void;\n}\n\nexport async function loginWithOAuth(options: OAuthLoginOptions = {}): Promise<LoginResult> {\n // Generate PKCE values\n const state = generateState();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n\n // Start callback server\n const { port, resultPromise, cleanup } = await startCallbackServer(state);\n const config = getOAuthConfig(port);\n\n // Build authorization URL\n const authUrl = buildAuthorizationUrl(config, state, codeChallenge);\n\n try {\n // Open browser\n options.onOpeningBrowser?.();\n await openBrowser(authUrl);\n\n // Wait for callback\n options.onWaitingForAuth?.(authUrl);\n const { code } = await resultPromise;\n\n // Exchange code for tokens\n const tokens = await exchangeCodeForTokens(config, code, codeVerifier);\n\n // Get user info\n const user = await getUserInfoFromToken(tokens.accessToken);\n\n return { tokens, user };\n } finally {\n cleanup();\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { CONFIG_DIR } from '../config/constants.js';\n\nexport function isWindows(): boolean {\n return process.platform === 'win32';\n}\n\nexport function isMacOS(): boolean {\n return process.platform === 'darwin';\n}\n\nexport function isLinux(): boolean {\n return process.platform === 'linux';\n}\n\nexport function getHomeDir(): string {\n return homedir();\n}\n\nexport function getConfigDir(): string {\n return join(getHomeDir(), CONFIG_DIR);\n}\n\nexport function getPlatformName(): string {\n if (isMacOS()) return 'macOS';\n if (isWindows()) return 'Windows';\n if (isLinux()) return 'Linux';\n\n return process.platform;\n}\n","import {\n createCipheriv, createDecipheriv, randomBytes, scryptSync, createHash\n} from 'node:crypto';\nimport { hostname, userInfo } from 'node:os';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst AUTH_TAG_LENGTH = 16;\nconst SALT_LENGTH = 32;\n\nfunction getMachineId(): string {\n const parts = [\n hostname(),\n userInfo().username,\n process.platform,\n process.arch\n ];\n\n return createHash('sha256').update(parts.join('-')).digest('hex');\n}\n\nexport function deriveKey(salt: Buffer): Buffer {\n const machineId = getMachineId();\n\n return scryptSync(machineId, salt, KEY_LENGTH);\n}\n\nexport function encrypt(data: string): string {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n // Format: salt:iv:authTag:encrypted (all base64)\n return [\n salt.toString('base64'),\n iv.toString('base64'),\n authTag.toString('base64'),\n encrypted.toString('base64')\n ].join(':');\n}\n\nexport function decrypt(encryptedData: string): string {\n const parts = encryptedData.split(':');\n\n if (parts.length !== 4) {\n throw new Error('Invalid encrypted data format');\n }\n\n const [\n saltB64,\n ivB64,\n authTagB64,\n dataB64\n ] = parts;\n const salt = Buffer.from(saltB64, 'base64');\n const iv = Buffer.from(ivB64, 'base64');\n const authTag = Buffer.from(authTagB64, 'base64');\n const encrypted = Buffer.from(dataB64, 'base64');\n\n const key = deriveKey(salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString('utf8');\n}\n","import {\n readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport { getConfigDir } from '../utils/platform.js';\nimport { CREDENTIALS_FILE } from '../config/constants.js';\nimport { encrypt, decrypt } from './encryption.js';\n\nexport interface StorageData {\n [key: string]: string;\n}\n\nexport class FileStorage {\n private filePath: string;\n constructor() {\n const configDir = getConfigDir();\n\n this.filePath = join(configDir, CREDENTIALS_FILE);\n }\n private ensureConfigDir(): void {\n const configDir = getConfigDir();\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n private readData(): StorageData {\n if (!existsSync(this.filePath)) {\n return {};\n }\n\n try {\n const encrypted = readFileSync(this.filePath, 'utf8');\n const decrypted = decrypt(encrypted);\n\n return JSON.parse(decrypted);\n } catch {\n return {};\n }\n }\n private writeData(data: StorageData): void {\n this.ensureConfigDir();\n const json = JSON.stringify(data);\n const encrypted = encrypt(json);\n\n writeFileSync(this.filePath, encrypted, { mode: 0o600 });\n }\n async get(key: string): Promise<string | null> {\n const data = this.readData();\n\n return data[key] ?? null;\n }\n async set(key: string, value: string): Promise<void> {\n const data = this.readData();\n\n data[key] = value;\n this.writeData(data);\n }\n async delete(key: string): Promise<void> {\n const data = this.readData();\n\n delete data[key];\n\n if (Object.keys(data).length === 0) {\n this.clear();\n } else {\n this.writeData(data);\n }\n }\n async clear(): Promise<void> {\n if (existsSync(this.filePath)) {\n unlinkSync(this.filePath);\n }\n }\n async has(key: string): Promise<boolean> {\n const data = this.readData();\n\n return key in data;\n }\n}\n","import { KEYCHAIN_SERVICE } from '../config/constants.js';\n\nlet keytar: typeof import('keytar') | null = null;\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n if (keytar !== null) {\n return keytar;\n }\n\n try {\n keytar = await import('keytar');\n\n return keytar;\n } catch {\n keytar = null;\n\n return null;\n }\n}\n\nexport class KeychainStorage {\n private service: string;\n constructor(service = KEYCHAIN_SERVICE) {\n this.service = service;\n }\n async isAvailable(): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n // Try a simple operation to verify keychain access\n await kt.findCredentials(this.service);\n\n return true;\n } catch {\n return false;\n }\n }\n async get(key: string): Promise<string | null> {\n const kt = await getKeytar();\n\n if (!kt) return null;\n\n try {\n return await kt.getPassword(this.service, key);\n } catch {\n return null;\n }\n }\n async set(key: string, value: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n await kt.setPassword(this.service, key, value);\n\n return true;\n } catch {\n return false;\n }\n }\n async delete(key: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n return await kt.deletePassword(this.service, key);\n } catch {\n return false;\n }\n }\n async clear(): Promise<void> {\n const kt = await getKeytar();\n\n if (!kt) return;\n\n try {\n const credentials = await kt.findCredentials(this.service);\n\n for (const cred of credentials) {\n await kt.deletePassword(this.service, cred.account);\n }\n } catch {\n // Ignore errors during clear\n }\n }\n}\n","import { type TokenManager } from '@docyrus/api-client';\n\nimport { KeychainStorage } from './keychain-storage.js';\nimport { FileStorage } from './file-storage.js';\nimport { TOKEN_KEYS } from '../config/constants.js';\n\nexport class CliTokenManager implements TokenManager {\n private keychain: KeychainStorage;\n private fileStorage: FileStorage;\n private keychainAvailable: boolean | null = null;\n constructor() {\n this.keychain = new KeychainStorage();\n this.fileStorage = new FileStorage();\n }\n private async useKeychain(): Promise<boolean> {\n if (this.keychainAvailable === null) {\n this.keychainAvailable = await this.keychain.isAvailable();\n }\n\n return this.keychainAvailable;\n }\n async getToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.ACCESS_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async setToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n }\n async clearToken(): Promise<void> {\n // Clear from both storages to ensure complete cleanup\n await this.keychain.delete(TOKEN_KEYS.ACCESS_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async getRefreshToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.REFRESH_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async setRefreshToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n }\n async clearRefreshToken(): Promise<void> {\n await this.keychain.delete(TOKEN_KEYS.REFRESH_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async getUserEmail(): Promise<string | null> {\n if (await this.useKeychain()) {\n const email = await this.keychain.get(TOKEN_KEYS.USER_EMAIL);\n\n if (email) return email;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.USER_EMAIL);\n }\n async setUserEmail(email: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.USER_EMAIL, email);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.USER_EMAIL, email);\n }\n // GitHub token for private template access (persists after logout)\n async getGithubToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.GITHUB_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.GITHUB_TOKEN);\n }\n async setGithubToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n }\n async clearAll(): Promise<void> {\n // Note: GitHub token is NOT cleared on logout - it persists\n const githubToken = await this.getGithubToken();\n\n await this.keychain.clear();\n await this.fileStorage.clear();\n\n // Restore GitHub token after clearing\n if (githubToken) {\n await this.setGithubToken(githubToken);\n }\n }\n async isLoggedIn(): Promise<boolean> {\n const token = await this.getToken();\n\n return token !== null;\n }\n}\n\n// Singleton instance\nlet instance: CliTokenManager | null = null;\n\nexport function getTokenManager(): CliTokenManager {\n if (!instance) {\n instance = new CliTokenManager();\n }\n\n return instance;\n}\n","import Conf from 'conf';\n\nimport { CLI_NAME } from './constants.js';\n\nexport interface CliConfig {\n apiUrl?: string;\n lastLoginEmail?: string;\n telemetryEnabled: boolean;\n}\n\nconst defaults: CliConfig = {\n telemetryEnabled: true\n};\n\nclass ConfigManager {\n private config: Conf<CliConfig>;\n constructor() {\n this.config = new Conf<CliConfig>({\n projectName: CLI_NAME,\n defaults\n });\n }\n get<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return this.config.get(key);\n }\n set<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n this.config.set(key, value);\n }\n delete<K extends keyof CliConfig>(key: K): void {\n this.config.delete(key);\n }\n getAll(): CliConfig {\n return this.config.store;\n }\n clear(): void {\n this.config.clear();\n }\n get path(): string {\n return this.config.path;\n }\n}\n\nexport const configManager = new ConfigManager();\n","import chalk from 'chalk';\n\nexport const logger = {\n success(message: string): void {\n console.info(chalk.green('✓'), message);\n },\n\n error(message: string): void {\n console.error(chalk.red('✗'), message);\n },\n\n warn(message: string): void {\n console.warn(chalk.yellow('⚠'), message);\n },\n\n info(message: string): void {\n console.info(chalk.blue('ℹ'), message);\n },\n\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(chalk.gray('⋯'), chalk.gray(message));\n }\n },\n\n log(message: string): void {\n console.info(message);\n },\n\n newline(): void {\n console.info();\n },\n\n dim(message: string): void {\n console.info(chalk.dim(message));\n },\n\n bold(message: string): void {\n console.info(chalk.bold(message));\n },\n\n link(url: string): string {\n return chalk.cyan.underline(url);\n }\n};\n","import chalk from 'chalk';\n\nexport type OutputFormat = 'text' | 'json';\n\ninterface OutputState {\n format: OutputFormat;\n data: Record<string, unknown>;\n}\n\nconst state: OutputState = {\n format: 'text',\n data: {}\n};\n\nexport const output = {\n setFormat(format: OutputFormat): void {\n state.format = format;\n },\n\n getFormat(): OutputFormat {\n return state.format;\n },\n\n isJson(): boolean {\n return state.format === 'json';\n },\n\n // Accumulate data for JSON output\n set(key: string, value: unknown): void {\n state.data[key] = value;\n },\n\n // Clear accumulated data\n clear(): void {\n state.data = {};\n },\n\n // Print success message or accumulate for JSON\n success(message: string, data?: Record<string, unknown>): void {\n if (state.format === 'json') {\n state.data = {\n ...state.data, ...data, success: true, message\n };\n } else {\n console.info(chalk.green('✓'), message);\n }\n },\n\n // Print error message or accumulate for JSON\n error(message: string, data?: Record<string, unknown>): void {\n if (state.format === 'json') {\n state.data = {\n ...state.data, ...data, success: false, error: message\n };\n } else {\n console.error(chalk.red('✗'), message);\n }\n },\n\n // Print warning message\n warn(message: string): void {\n if (state.format === 'json') {\n state.data.warning = message;\n } else {\n console.warn(chalk.yellow('⚠'), message);\n }\n },\n\n // Print info message (only in text mode)\n info(message: string): void {\n if (state.format !== 'json') {\n console.info(chalk.blue('ℹ'), message);\n }\n },\n\n // Print dim message (only in text mode)\n dim(message: string): void {\n if (state.format !== 'json') {\n console.info(chalk.dim(message));\n }\n },\n\n // Print the final JSON output\n flush(): void {\n if (state.format === 'json' && Object.keys(state.data).length > 0) {\n console.info(JSON.stringify(state.data, null, 2));\n state.data = {};\n }\n },\n\n // Direct JSON output (for commands that return structured data)\n json(data: unknown): void {\n if (state.format === 'json') {\n console.info(JSON.stringify(data, null, 2));\n }\n }\n};\n","export const MESSAGES = {\n // Login\n LOGIN_SUCCESS: (email: string) => `Successfully logged in as ${email}`,\n LOGIN_FAILED: 'Login failed. Please check your credentials.',\n LOGIN_PROMPT_EMAIL: 'Email:',\n LOGIN_PROMPT_PASSWORD: 'Password:',\n LOGIN_AUTHENTICATING: 'Authenticating...',\n\n // SSO\n SSO_OPENING_BROWSER: 'Opening browser for authentication...',\n SSO_WAITING: 'Waiting for browser authentication...',\n SSO_SUCCESS: 'Browser authentication successful!',\n SSO_TIMEOUT: 'Authentication timed out. Please try again.',\n SSO_CANCELLED: 'Authentication cancelled.',\n\n // Logout\n LOGOUT_SUCCESS: 'Successfully logged out.',\n LOGOUT_CONFIRM: 'Are you sure you want to log out?',\n LOGOUT_IN_PROGRESS: 'Logging out...',\n\n // Whoami\n WHOAMI_NOT_LOGGED_IN: 'You are not logged in.',\n WHOAMI_SUGGESTION: 'Run `docyrus login` to authenticate.',\n WHOAMI_FETCHING: 'Fetching user info...',\n\n // General\n NOT_LOGGED_IN: 'You are not logged in.',\n NETWORK_ERROR: 'Network request failed. Please check your internet connection.',\n UNKNOWN_ERROR: 'An unexpected error occurred.',\n\n // Errors\n INVALID_CREDENTIALS: 'Invalid email or password.',\n SESSION_EXPIRED: 'Your session has expired. Please log in again.',\n SERVER_ERROR: 'Server error. Please try again later.',\n\n // Create command\n CREATE_SELECT_FRAMEWORK: 'Select a framework:',\n CREATE_SELECT_UI_LIBRARY: 'Select UI library:',\n CREATE_SELECT_LINTER: 'Select linter/formatter:',\n CREATE_PROJECT_NAME: 'Project name:',\n CREATE_SELECT_PACKAGE_MANAGER: 'Select package manager:',\n CREATE_CUSTOMIZE_ALIAS: 'Customize import alias? (default: @/)',\n CREATE_CUSTOM_ALIAS: 'Enter import alias prefix (must start with @):',\n CREATE_SETTING_UP: 'Creating project...',\n CREATE_DOWNLOADING: 'Downloading project template...',\n CREATE_COPYING_LOCAL: 'Copying local template...',\n CREATE_CONFIGURING_LINTER: (linter: string) => `Configuring ${linter}...`,\n CREATE_CONFIGURING_ALIAS: (alias: string) => `Configuring import alias (${alias}/)...`,\n CREATE_INSTALLING: 'Installing dependencies...',\n CREATE_SUCCESS: 'Project created successfully!',\n CREATE_DOWNLOAD_OPENAPI: 'Download OpenAPI spec for code generation?',\n CREATE_DOWNLOADING_OPENAPI: 'Downloading OpenAPI specification...',\n CREATE_OPENAPI_SUCCESS: (path: string) => `OpenAPI spec saved to ${path}`,\n\n // Linter Setup\n LINTER_SETUP_TITLE: 'Setting up Linter...',\n\n // State Management\n CREATE_SELECT_STATE_MANAGEMENT: 'Select state management:',\n STATE_MANAGEMENT_SETUP_TITLE: 'Setting up State Management...',\n\n // OpenAPI Setup\n OPENAPI_SETUP_TITLE: 'Setting up API...',\n\n // API Client\n API_CLIENT_DOCS: 'API Client: https://www.npmjs.com/package/@docyrus/api-client',\n\n // UI Library Setup\n UI_SETUP_TITLE: 'Setting up UI Library...',\n UI_MULTIPLE_LIBRARIES: 'Cannot use multiple UI libraries together',\n\n // Docyrus Token (for private template access)\n DOCYRUS_TOKEN_REQUIRED: 'Docyrus token required for template download',\n DOCYRUS_TOKEN_PROMPT: 'Enter Docyrus token:',\n DOCYRUS_TOKEN_SAVED: 'Docyrus token saved successfully',\n DOCYRUS_TOKEN_INVALID: 'Invalid Docyrus token. Please check and try again.'\n} as const;\n","import ora, { type Ora } from 'ora';\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n spinner: 'dots'\n });\n}\n\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n silent?: boolean;\n }\n): Promise<T> {\n // In silent mode, just run the function without spinner\n if (options?.silent) {\n return fn();\n }\n\n const spinner = createSpinner(text).start();\n\n try {\n const result = await fn();\n\n if (options?.successText) {\n spinner.succeed(options.successText);\n } else {\n spinner.stop();\n }\n\n return result;\n } catch (error) {\n if (options?.failText) {\n spinner.fail(options.failText);\n } else {\n spinner.stop();\n }\n throw error;\n }\n}\n","import {\n input, password, confirm, select\n} from '@inquirer/prompts';\n\nimport { MESSAGES } from './messages.js';\n\nexport async function promptEmail(defaultValue?: string): Promise<string> {\n return input({\n message: MESSAGES.LOGIN_PROMPT_EMAIL,\n default: defaultValue,\n validate: (value: string) => {\n if (!value || !value.includes('@')) {\n return 'Please enter a valid email address.';\n }\n\n return true;\n }\n });\n}\n\nexport async function promptPassword(): Promise<string> {\n return password({\n message: MESSAGES.LOGIN_PROMPT_PASSWORD,\n mask: '*',\n validate: (value: string) => {\n if (!value || value.length < 1) {\n return 'Please enter your password.';\n }\n\n return true;\n }\n });\n}\n\nexport async function promptConfirm(message: string, defaultValue = false): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue\n });\n}\n\nexport async function promptSelect<T extends string>(\n message: string,\n choices: Array<{ name: string; value: T }>\n): Promise<T> {\n return select({\n message,\n choices\n });\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\n\nexport interface ProgressStep {\n label: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\n error?: string;\n}\n\nexport interface MultiStepProgress {\n start: (stepIndex: number) => void;\n complete: (stepIndex: number) => void;\n fail: (stepIndex: number, error: string) => void;\n update: (stepIndex: number, message: string) => void;\n finish: () => void;\n}\n\nconst SYMBOLS = {\n pending: chalk.dim('○'),\n in_progress: chalk.cyan('◐'),\n completed: chalk.green('✓'),\n failed: chalk.red('✗')\n};\n\n/**\n * Create a multi-step progress display for UI library setup\n */\nexport function createMultiStepProgress(title: string, stepLabels: string[]): MultiStepProgress {\n const steps: ProgressStep[] = stepLabels.map(label => ({\n label,\n status: 'pending'\n }));\n\n let spinner: Ora | null = null;\n let currentStep = -1;\n\n const render = () => {\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(chalk.bold(title));\n // eslint-disable-next-line no-console\n console.log();\n\n for (const step of steps) {\n const symbol = SYMBOLS[step.status];\n const text = step.status === 'in_progress' ? chalk.cyan(step.label) : step.status === 'completed' ? chalk.green(step.label) : step.status === 'failed' ? chalk.red(step.label) : chalk.dim(step.label);\n\n // eslint-disable-next-line no-console\n console.log(` ${symbol} ${text}`);\n\n if (step.status === 'failed' && step.error) {\n // eslint-disable-next-line no-console\n console.log(` ${chalk.red(step.error)}`);\n }\n }\n\n // eslint-disable-next-line no-console\n console.log();\n };\n\n return {\n start(stepIndex: number) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner) {\n spinner.stop();\n }\n\n currentStep = stepIndex;\n steps[stepIndex].status = 'in_progress';\n\n spinner = ora({\n text: steps[stepIndex].label,\n color: 'cyan'\n }).start();\n },\n\n complete(stepIndex: number) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner && currentStep === stepIndex) {\n spinner.succeed(chalk.green(steps[stepIndex].label));\n spinner = null;\n }\n\n steps[stepIndex].status = 'completed';\n },\n\n fail(stepIndex: number, error: string) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner && currentStep === stepIndex) {\n spinner.fail(chalk.red(steps[stepIndex].label));\n spinner = null;\n }\n\n steps[stepIndex].status = 'failed';\n steps[stepIndex].error = error;\n },\n\n update(stepIndex: number, message: string) {\n if (spinner && currentStep === stepIndex) {\n spinner.text = message;\n }\n },\n\n finish() {\n if (spinner) {\n spinner.stop();\n spinner = null;\n }\n\n render();\n }\n };\n}\n\n/**\n * Simple progress callback that uses ora spinner\n */\nexport function createSimpleProgress(): (step: string, current?: number, total?: number) => void {\n let spinner: Ora | null = null;\n\n return (step: string, current?: number, total?: number) => {\n if (spinner) {\n spinner.succeed();\n spinner = null;\n }\n\n const text = current && total ? `${step} (${current}/${total})` : step;\n\n spinner = ora({\n text,\n color: 'cyan'\n }).start();\n\n if (current && total && current === total) {\n spinner.succeed();\n spinner = null;\n }\n };\n}\n\n/**\n * Wrap an async operation with progress display\n */\nexport async function withProgress<T>(\n label: string,\n operation: () => Promise<T>\n): Promise<T> {\n const spinner = ora({\n text: label,\n color: 'cyan'\n }).start();\n\n try {\n const result = await operation();\n\n spinner.succeed(chalk.green(label));\n\n return result;\n } catch (error) {\n spinner.fail(chalk.red(label));\n throw error;\n }\n}\n","import { type Command } from 'commander';\n\nimport { loginWithCredentials, loginWithOAuth, getUserInfo } from '../auth/index.js';\nimport { getTokenManager } from '../storage/index.js';\nimport { configManager } from '../config/index.js';\nimport {\n logger, output, MESSAGES, promptEmail, promptPassword, withSpinner\n} from '../ui/index.js';\nimport { AuthenticationError } from '../utils/errors.js';\n\ninterface LoginOptions {\n email?: boolean | string;\n}\n\nasync function handleCredentialLogin(email?: string): Promise<void> {\n // Get email from option, last login, or prompt\n const lastEmail = configManager.get('lastLoginEmail');\n const userEmail = email || await promptEmail(lastEmail);\n\n // Prompt for password\n const password = await promptPassword();\n\n // Authenticate\n const result = await withSpinner(\n MESSAGES.LOGIN_AUTHENTICATING,\n () => loginWithCredentials({ email: userEmail, password })\n );\n\n // Store tokens\n const tokenManager = getTokenManager();\n\n await tokenManager.setToken(result.tokens.accessToken);\n\n if (result.tokens.refreshToken) {\n await tokenManager.setRefreshToken(result.tokens.refreshToken);\n }\n\n // Store user email\n const finalEmail = result.user?.email || userEmail;\n\n await tokenManager.setUserEmail(finalEmail);\n configManager.set('lastLoginEmail', finalEmail);\n\n output.success(MESSAGES.LOGIN_SUCCESS(finalEmail), { email: finalEmail });\n}\n\nasync function handleSsoLogin(): Promise<void> {\n const result = await loginWithOAuth({\n onOpeningBrowser: () => {\n logger.info(MESSAGES.SSO_OPENING_BROWSER);\n },\n onWaitingForAuth: (url) => {\n logger.dim(` ${url}`);\n logger.info(MESSAGES.SSO_WAITING);\n }\n });\n\n // Store tokens\n const tokenManager = getTokenManager();\n\n await tokenManager.setToken(result.tokens.accessToken);\n\n if (result.tokens.refreshToken) {\n await tokenManager.setRefreshToken(result.tokens.refreshToken);\n }\n\n // Get user info if not provided\n let email = result.user?.email;\n\n if (!email && result.tokens.accessToken) {\n try {\n const userInfo = await getUserInfo(result.tokens.accessToken);\n\n ({ email } = userInfo);\n } catch {\n // Ignore error, email is optional\n }\n }\n\n if (email) {\n await tokenManager.setUserEmail(email);\n configManager.set('lastLoginEmail', email);\n output.success(MESSAGES.LOGIN_SUCCESS(email), { email });\n } else {\n output.success('Successfully logged in.');\n }\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Log in to Docyrus (uses browser-based SSO by default)')\n .option('-e, --email [email]', 'Log in with email/password instead of SSO')\n .action(async (options: LoginOptions) => {\n try {\n // Check if already logged in\n const tokenManager = getTokenManager();\n\n if (await tokenManager.isLoggedIn()) {\n const email = await tokenManager.getUserEmail();\n\n output.warn(`Already logged in${email ? ` as ${email}` : ''}. Run \\`docyrus logout\\` first to log in as a different user.`);\n\n return;\n }\n\n /*\n * If --email flag is used, use credential login\n * email can be true (flag without value) or a string (flag with value)\n */\n if (options.email !== undefined) {\n const emailValue = typeof options.email === 'string' ? options.email : undefined;\n\n await handleCredentialLogin(emailValue);\n } else {\n // Default: SSO login\n await handleSsoLogin();\n }\n } catch (error) {\n if (error instanceof AuthenticationError) {\n output.error(error.message);\n if (error.suggestion && !output.isJson()) {\n logger.dim(error.suggestion);\n }\n process.exit(error.exitCode);\n }\n throw error;\n }\n });\n}\n","import { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/index.js';\nimport {\n logger, output, MESSAGES, withSpinner\n} from '../ui/index.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from Docyrus')\n .action(async () => {\n const tokenManager = getTokenManager();\n\n // Check if logged in\n if (!(await tokenManager.isLoggedIn())) {\n output.warn(MESSAGES.WHOAMI_NOT_LOGGED_IN);\n\n return;\n }\n\n // Get current email for confirmation message\n const email = await tokenManager.getUserEmail();\n\n // Clear all tokens\n await withSpinner(\n MESSAGES.LOGOUT_IN_PROGRESS,\n async () => {\n await tokenManager.clearAll();\n },\n { silent: output.isJson() }\n );\n\n output.success(MESSAGES.LOGOUT_SUCCESS, email ? { email } : undefined);\n if (email && !output.isJson()) {\n logger.dim(`Logged out from ${email}`);\n }\n });\n}\n","import { getTokenManager } from '../storage/index.js';\nimport { refreshAccessToken } from '../auth/index.js';\nimport { NotLoggedInError, AuthenticationError } from './errors.js';\n\n/**\n * Decodes a JWT token payload without verification.\n * Used only for checking expiration time.\n */\nfunction decodeJwtPayload(token: string): { exp?: number; iat?: number } | null {\n try {\n const parts = token.split('.');\n\n if (parts.length !== 3) return null;\n\n const payload = Buffer.from(parts[1], 'base64url').toString('utf8');\n\n return JSON.parse(payload);\n } catch {\n return null;\n }\n}\n\n/**\n * Checks if a JWT token is expired.\n * Returns true if expired or if expiration cannot be determined.\n */\nfunction isTokenExpired(token: string): boolean {\n const payload = decodeJwtPayload(token);\n\n if (!payload?.exp) return false; // No expiration claim, assume valid\n\n // Add 30 second buffer to account for clock skew\n const expirationTime = payload.exp * 1000;\n const now = Date.now();\n\n return now >= expirationTime - 30000;\n}\n\n/**\n * Ensures the user is logged in before proceeding.\n * Automatically refreshes expired tokens if a refresh token is available.\n * Throws NotLoggedInError if the user is not authenticated.\n *\n * @returns The current access token\n * @throws NotLoggedInError if the user is not logged in\n */\nexport async function requireAuth(): Promise<string> {\n const tokenManager = getTokenManager();\n\n if (!(await tokenManager.isLoggedIn())) {\n throw new NotLoggedInError();\n }\n\n let token = await tokenManager.getToken();\n\n if (!token) {\n throw new NotLoggedInError();\n }\n\n // Check if token is expired\n if (isTokenExpired(token)) {\n const refreshToken = await tokenManager.getRefreshToken();\n\n if (!refreshToken) {\n // No refresh token available, user needs to log in again\n await tokenManager.clearAll();\n throw new NotLoggedInError('Your session has expired. Please log in again.');\n }\n\n try {\n // Attempt to refresh the token\n const newTokens = await refreshAccessToken(refreshToken);\n\n // Store the new tokens\n await tokenManager.setToken(newTokens.accessToken);\n\n if (newTokens.refreshToken) {\n await tokenManager.setRefreshToken(newTokens.refreshToken);\n }\n\n token = newTokens.accessToken;\n } catch (error) {\n // Refresh failed, clear tokens and require re-login\n await tokenManager.clearAll();\n\n if (error instanceof AuthenticationError) {\n throw new NotLoggedInError('Your session has expired. Please log in again.');\n }\n\n throw error;\n }\n }\n\n return token;\n}\n","import { type Command } from 'commander';\n\nimport { getUserInfo } from '../auth/index.js';\nimport { getTokenManager } from '../storage/index.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport {\n logger, output, MESSAGES, withSpinner\n} from '../ui/index.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Display the current logged-in user')\n .action(async () => {\n const tokenManager = getTokenManager();\n\n // Get valid token (will auto-refresh if expired)\n const token = await requireAuth();\n\n try {\n const user = await withSpinner(\n MESSAGES.WHOAMI_FETCHING,\n () => getUserInfo(token),\n { silent: output.isJson() }\n );\n\n if (output.isJson()) {\n output.set('user', {\n email: user.email,\n firstname: user.firstname,\n lastname: user.lastname\n });\n } else {\n logger.newline();\n logger.log(`Email: ${user.email}`);\n if (user.firstname || user.lastname) {\n const fullName = [user.firstname, user.lastname].filter(Boolean).join(' ');\n\n logger.log(`Name: ${fullName}`);\n }\n logger.newline();\n }\n } catch (error) {\n // If API call fails, try to show cached email\n const cachedEmail = await tokenManager.getUserEmail();\n\n if (cachedEmail) {\n if (output.isJson()) {\n output.set('user', { email: cachedEmail, cached: true });\n } else {\n logger.newline();\n logger.log(`Email: ${cachedEmail}`);\n logger.dim('(Unable to fetch full profile from server)');\n logger.newline();\n }\n } else {\n throw error;\n }\n }\n });\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type ProgressCallback } from './ui-library-setup.js';\n\nexport type Framework = 'nextjs' | 'react' | 'vue' | 'electron';\nexport type Linter = 'eslint' | 'biome' | 'none';\n\nconst ESLINT_CONFIGS: Record<Framework, { imports: string[]; configs: string[] }> = {\n react: {\n imports: ['baseConfig', 'reactConfig'],\n configs: ['...baseConfig', '...reactConfig']\n },\n nextjs: {\n imports: [\n 'baseConfig',\n 'reactConfig',\n 'nextjsConfig'\n ],\n configs: [\n '...baseConfig',\n '...reactConfig',\n '...nextjsConfig'\n ]\n },\n vue: {\n imports: ['baseConfig', 'vueConfig'],\n configs: ['...baseConfig', '...vueConfig']\n },\n electron: {\n imports: ['baseConfig', 'electronConfig'],\n configs: ['...baseConfig', '...electronConfig']\n }\n};\n\nfunction generateEslintConfig(framework: Framework): string {\n const { imports, configs } = ESLINT_CONFIGS[framework];\n\n return `import { ${imports.join(', ')} } from '@docyrus/rules/eslint';\\n\\nexport default [${configs.join(', ')}];\\n`;\n}\n\nfunction generateBiomeConfig(framework: Framework): string {\n return `${JSON.stringify({ extends: [`@docyrus/rules/biome/${framework}`] }, null, 2)}\\n`;\n}\n\n/**\n * Applies linter configuration to a project.\n * Programmatically generates config files that use @docyrus/rules.\n *\n * @param targetDir - The target project directory\n * @param framework - The framework type (nextjs, react, vue, or electron)\n * @param linter - The linter choice (eslint, biome, or none)\n * @param onProgress - Progress callback for step-by-step display\n */\nexport async function applyLinterConfig(\n targetDir: string,\n framework: Framework,\n linter: Linter,\n onProgress: ProgressCallback\n): Promise<void> {\n if (linter === 'none') return;\n\n const linterName = linter === 'eslint' ? 'ESLint' : 'Biome';\n\n // Step 1: Generate and write config file\n onProgress(`Generating ${linterName} config...`, 1, 2);\n\n if (linter === 'eslint') {\n await writeFile(join(targetDir, 'eslint.config.mjs'), generateEslintConfig(framework));\n } else {\n await writeFile(join(targetDir, 'biome.json'), generateBiomeConfig(framework));\n }\n\n // Step 2: Update target package.json with dependencies and scripts\n onProgress('Updating package.json...', 2, 2);\n\n const targetPkgPath = join(targetDir, 'package.json');\n const targetPkg = JSON.parse(await readFile(targetPkgPath, 'utf-8'));\n\n let devDependencies: Record<string, string>;\n let scripts: Record<string, string>;\n\n if (linter === 'eslint') {\n devDependencies = { '@docyrus/rules': 'latest', eslint: 'latest' };\n scripts = { lint: 'eslint .', format: 'eslint --fix .' };\n } else {\n devDependencies = { '@docyrus/rules': 'latest', '@biomejs/biome': 'latest' };\n scripts = { lint: 'biome check .', format: 'biome check --fix .' };\n }\n\n targetPkg.devDependencies = {\n ...targetPkg.devDependencies,\n ...devDependencies\n };\n\n targetPkg.scripts = {\n ...targetPkg.scripts,\n ...scripts\n };\n\n await writeFile(targetPkgPath, JSON.stringify(targetPkg, null, 2));\n}\n","import { readFile, writeFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type Framework } from './linter-config.js';\n\nexport type AliasPrefix = string; // Must start with '@'\n\ninterface AliasConfig {\n prefix: AliasPrefix;\n pattern: string;\n replacement: string;\n}\n\n/**\n * Applies custom alias configuration to a project.\n * Updates tsconfig.json, vite.config.ts (for React/Vue), and all import paths.\n */\nexport async function applyAliasConfig(\n targetDir: string,\n framework: Framework,\n aliasPrefix: AliasPrefix\n): Promise<void> {\n // Default '@' or '@/' - no changes needed\n if (aliasPrefix === '@' || aliasPrefix === '@/') return;\n\n const config: AliasConfig = {\n prefix: aliasPrefix,\n pattern: `${aliasPrefix}/*`,\n replacement: './src/*'\n };\n\n // 1. Update tsconfig.json\n await updateTsConfig(targetDir, config);\n\n // 2. Update vite.config.ts (React, Vue, and Electron templates)\n if (framework === 'react' || framework === 'vue' || framework === 'electron') {\n await updateViteConfig(targetDir, config);\n }\n\n // 3. Update all import paths in source files\n await updateImports(targetDir, aliasPrefix, framework);\n}\n\nasync function updateTsConfig(targetDir: string, config: AliasConfig): Promise<void> {\n const tsconfigPath = join(targetDir, 'tsconfig.json');\n const tsconfig = JSON.parse(await readFile(tsconfigPath, 'utf-8'));\n\n // Remove old @/* path and add new one\n if (tsconfig.compilerOptions?.paths) {\n delete tsconfig.compilerOptions.paths['@/*'];\n tsconfig.compilerOptions.paths[config.pattern] = [config.replacement];\n }\n\n await writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2));\n}\n\nasync function updateViteConfig(targetDir: string, config: AliasConfig): Promise<void> {\n const vitePath = join(targetDir, 'vite.config.ts');\n\n try {\n let content = await readFile(vitePath, 'utf-8');\n\n // Replace '@': resolve(...) with new alias\n content = content.replace(\n /'@':\\s*resolve\\(/g,\n `'${config.prefix}': resolve(`\n );\n\n await writeFile(vitePath, content);\n } catch {\n // vite.config.ts might not exist for Next.js templates\n }\n}\n\nasync function updateImports(targetDir: string, newPrefix: AliasPrefix, framework: Framework): Promise<void> {\n const srcDir = join(targetDir, 'src');\n\n try {\n await updateImportsRecursive(srcDir, newPrefix, framework);\n } catch {\n // src directory might not exist\n }\n}\n\nfunction getFileExtensions(framework: Framework): string[] {\n switch (framework) {\n case 'vue':\n return [\n '.ts',\n '.tsx',\n '.vue'\n ];\n\n default:\n return ['.ts', '.tsx'];\n }\n}\n\nasync function updateImportsRecursive(dir: string, newPrefix: AliasPrefix, framework: Framework): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n const extensions = getFileExtensions(framework);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await updateImportsRecursive(fullPath, newPrefix, framework);\n } else if (extensions.some(ext => entry.name.endsWith(ext))) {\n const content = await readFile(fullPath, 'utf-8');\n\n // Replace import paths: from '@/...' → from '@app/...'\n const updatedContent = content.replace(\n /from\\s+['\"]@\\//g,\n `from '${newPrefix}/`\n );\n\n if (updatedContent !== content) {\n await writeFile(fullPath, updatedContent);\n }\n }\n }\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { RestApiClient } from '@docyrus/api-client';\n\nimport { configManager } from '../config/config-manager.js';\nimport { DOCYRUS_API_URL } from '../config/constants.js';\n\n/**\n * Creates an authenticated REST API client using the provided access token.\n */\nexport function createAuthenticatedClient(accessToken: string): RestApiClient {\n const apiUrl = configManager.get('apiUrl') || DOCYRUS_API_URL;\n const client = new RestApiClient({ baseURL: apiUrl });\n\n client.setAccessToken(accessToken);\n\n return client;\n}\n\n/**\n * Downloads the OpenAPI specification and saves it to the target directory.\n *\n * @param accessToken - The user's access token\n * @param targetDir - The target project directory\n * @param filename - The filename to save as (default: openapi.json)\n * @returns The path to the saved file\n */\nexport async function downloadOpenApiSpec(\n accessToken: string,\n targetDir: string,\n filename = 'openapi.json'\n): Promise<string> {\n const client = createAuthenticatedClient(accessToken);\n\n // Fetch the OpenAPI spec\n const spec = await client.get<Record<string, unknown>>('/v1/api/openapi.json');\n\n // Ensure the target directory exists\n const targetPath = join(targetDir, filename);\n const targetDirPath = dirname(targetPath);\n\n await mkdir(targetDirPath, { recursive: true });\n\n // Write the spec to file\n await writeFile(targetPath, JSON.stringify(spec, null, 2));\n\n return targetPath;\n}\n","\nimport { cp, rm, access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { constants } from 'node:fs';\n\nimport { type UILibrary } from './ui-library-setup.js';\n\n/**\n * Applies UI library-specific page variants after template download and UI library setup.\n *\n * Templates contain a `__ui-variants__/{library}/` directory that mirrors the project\n * structure. When a UI library is selected, the matching variant files are copied over\n * the default pages. The `__ui-variants__/` directory is always cleaned up afterward.\n */\nexport async function applyUIVariants(\n targetDir: string,\n uiLibrary: UILibrary\n): Promise<void> {\n const variantsDir = join(targetDir, '__ui-variants__');\n\n try {\n await access(variantsDir, constants.F_OK);\n } catch {\n return;\n }\n\n if (uiLibrary !== 'none') {\n const libraryDir = join(variantsDir, uiLibrary);\n\n try {\n await access(libraryDir, constants.F_OK);\n await cp(libraryDir, targetDir, { recursive: true, force: true });\n } catch {\n // No variant for this library, use defaults\n }\n }\n\n await rm(variantsDir, { recursive: true, force: true });\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst execAsync = promisify(exec);\n\n/**\n * Configuration from .env.shared (single source of truth)\n * Values are injected at build time via tsup.config.ts\n */\nfunction parseEnvArray(value: string | undefined): readonly string[] {\n if (!value) {\n throw new Error('Missing environment variable');\n }\n\n return value.split(',').map(s => s.trim());\n}\n\nexport const SHADCN_BASE_COLORS = parseEnvArray(process.env.SHADCN_BASE_COLORS) as readonly (\n | 'zinc'\n | 'slate'\n | 'neutral'\n | 'stone'\n | 'gray'\n)[];\n\nexport const SHADCN_STYLES = parseEnvArray(process.env.SHADCN_STYLES) as readonly (\n | 'vega'\n | 'nova'\n | 'maia'\n | 'lyra'\n | 'mira'\n)[];\n\nexport const DICEUI_COMPONENTS = parseEnvArray(process.env.DICEUI_COMPONENTS);\n\nexport type ShadcnBaseColor = (typeof SHADCN_BASE_COLORS)[number];\nexport type ShadcnStyle = (typeof SHADCN_STYLES)[number];\nexport type UILibrary = 'shadcn' | 'diceui' | 'shadcn-vue' | 'heroui' | 'none';\nexport type UIFramework = 'nextjs' | 'react' | 'vue' | 'electron';\n\n// UIFramework-UI Library compatibility matrix\nconst UI_LIBRARY_COMPATIBILITY: Record<UIFramework, UILibrary[]> = {\n nextjs: [\n 'shadcn',\n 'diceui',\n 'heroui',\n 'none'\n ],\n react: [\n 'shadcn',\n 'diceui',\n 'heroui',\n 'none'\n ],\n vue: ['shadcn-vue', 'none'],\n electron: [\n 'shadcn',\n 'diceui',\n 'none'\n ]\n};\n\nexport function isUILibraryCompatible(framework: UIFramework, uiLibrary: UILibrary): boolean {\n return UI_LIBRARY_COMPATIBILITY[framework].includes(uiLibrary);\n}\n\nexport function getCompatibleUILibraries(framework: UIFramework): UILibrary[] {\n return UI_LIBRARY_COMPATIBILITY[framework];\n}\n\nexport function getUILibraryErrorMessage(framework: UIFramework, uiLibrary: UILibrary): string {\n switch (uiLibrary) {\n case 'heroui':\n if (framework === 'electron') {\n return 'HeroUI is not supported with Electron due to framer-motion compatibility issues. Use --shadcn or --diceui instead';\n }\n\n return `HeroUI only supports Next.js and React frameworks. Current: ${framework}`;\n\n case 'shadcn':\n\n case 'diceui':\n if (framework === 'vue') {\n return 'Use --shadcn-vue for Vue projects instead of --shadcn or --diceui';\n }\n\n return `shadcn/ui is not supported with ${framework}`;\n\n case 'shadcn-vue':\n return `shadcn-vue is only for Vue projects. Use --shadcn or --diceui for ${framework}`;\n\n default:\n return `${uiLibrary} is not compatible with ${framework}`;\n }\n}\n\nexport interface ProgressCallback {\n (step: string, current?: number, total?: number): void;\n}\n\n/**\n * Setup shadcn/ui for React-based frameworks via npx.\n * Uses init (Base UI) → update style → migrate radix → add all components\n */\nexport async function setupShadcn(\n targetDir: string,\n packageManager: string,\n style: ShadcnStyle,\n baseColor: ShadcnBaseColor,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn/ui with Base UI\n onProgress('Initializing shadcn/ui (Base UI)...', 1, 4);\n await execAsync(`${dlx} shadcn@latest init --yes --defaults -b ${baseColor}`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 2: Migrate to Radix UI\n onProgress('Migrating to Radix UI...', 2, 4);\n await execAsync(`${dlx} shadcn@latest migrate radix --yes`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 3: Update components.json style field to radix-{style}\n onProgress('Updating style configuration...', 3, 4);\n const componentsJsonPath = join(targetDir, 'components.json');\n const componentsJson = JSON.parse(await readFile(componentsJsonPath, 'utf-8'));\n\n componentsJson.style = `radix-${style}`;\n await writeFile(componentsJsonPath, JSON.stringify(componentsJson, null, 2));\n\n // Step 4: Add all components\n onProgress('Installing shadcn components...', 4, 4);\n await execAsync(`${dlx} shadcn@latest add --all --yes --overwrite`, {\n cwd: targetDir,\n timeout: 300000\n });\n}\n\n/**\n * Setup DiceUI for React-based frameworks via npx.\n * DiceUI uses shadcn as a base, then adds DiceUI-specific components\n */\nexport async function setupDiceUI(\n targetDir: string,\n packageManager: string,\n style: ShadcnStyle,\n baseColor: ShadcnBaseColor,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn/ui with Base UI\n onProgress('Initializing shadcn/ui (Base UI)...', 1, 5);\n await execAsync(`${dlx} shadcn@latest init --yes --defaults -b ${baseColor}`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 2: Migrate to Radix UI\n onProgress('Migrating to Radix UI...', 2, 5);\n await execAsync(`${dlx} shadcn@latest migrate radix --yes`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 3: Update components.json style field to radix-{style}\n onProgress('Updating style configuration...', 3, 5);\n const componentsJsonPath = join(targetDir, 'components.json');\n const componentsJson = JSON.parse(await readFile(componentsJsonPath, 'utf-8'));\n\n componentsJson.style = `radix-${style}`;\n await writeFile(componentsJsonPath, JSON.stringify(componentsJson, null, 2));\n\n // Step 4: Add all shadcn components\n onProgress('Installing shadcn components...', 4, 5);\n await execAsync(`${dlx} shadcn@latest add --all --yes --overwrite`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 5: Add DiceUI-specific components (including utilities)\n onProgress('Installing DiceUI components...', 5, 5);\n for (const component of DICEUI_COMPONENTS) {\n await execAsync(`${dlx} shadcn@latest add https://shadcn-extension.vercel.app/r/diceui/${component}.json --yes --overwrite`, {\n cwd: targetDir,\n timeout: 60000\n });\n }\n}\n\n/**\n * Setup shadcn-vue for Vue\n */\nexport async function setupShadcnVue(\n targetDir: string,\n packageManager: string,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn-vue\n onProgress('Initializing shadcn-vue...', 1, 2);\n await execAsync(`${dlx} shadcn-vue@latest init -y -d`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 2: Add all components\n onProgress('Installing shadcn-vue components...', 2, 2);\n await execAsync(`${dlx} shadcn-vue@latest add -a -y -o`, {\n cwd: targetDir,\n timeout: 300000\n });\n}\n\n/**\n * Setup HeroUI for Next.js and React (not supported on Electron due to framer-motion issues)\n */\nexport async function setupHeroUI(\n targetDir: string,\n framework: 'nextjs' | 'react',\n packageManager: string,\n onProgress: ProgressCallback\n): Promise<void> {\n // Step 1: Add dependencies\n onProgress('Adding HeroUI dependencies...', 1, 3);\n const installCmd = getInstallCommand(packageManager);\n\n await execAsync(`${installCmd} @heroui/react framer-motion`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 2: Write HeroUI styles\n onProgress('Configuring styles...', 2, 3);\n await writeHeroUIStyles(targetDir);\n\n // Step 3: Add HeroUIProvider\n onProgress('Adding HeroUIProvider...', 3, 3);\n await addHeroUIProvider(targetDir, framework);\n}\n\n/**\n * Main setup function that routes to the appropriate setup\n */\nexport async function setupUILibrary(\n targetDir: string,\n framework: UIFramework,\n uiLibrary: UILibrary,\n packageManager: string,\n onProgress: ProgressCallback,\n style?: ShadcnStyle,\n baseColor?: ShadcnBaseColor\n): Promise<void> {\n if (uiLibrary === 'none') {\n return;\n }\n\n if (!isUILibraryCompatible(framework, uiLibrary)) {\n throw new Error(getUILibraryErrorMessage(framework, uiLibrary));\n }\n\n switch (uiLibrary) {\n case 'shadcn':\n await setupShadcn(\n targetDir,\n packageManager,\n style ?? 'vega',\n baseColor ?? 'zinc',\n onProgress\n );\n break;\n\n case 'diceui':\n await setupDiceUI(\n targetDir,\n packageManager,\n style ?? 'vega',\n baseColor ?? 'zinc',\n onProgress\n );\n break;\n\n case 'shadcn-vue':\n await setupShadcnVue(targetDir, packageManager, onProgress);\n break;\n\n case 'heroui':\n await setupHeroUI(targetDir, framework as 'nextjs' | 'react', packageManager, onProgress);\n break;\n }\n}\n\n// Helper functions\n\nfunction getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'pnpm':\n return 'pnpx';\n\n case 'yarn':\n return 'yarn dlx';\n\n case 'bun':\n return 'bunx';\n\n default:\n return 'npx';\n }\n}\n\nfunction getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'pnpm':\n return 'pnpm add';\n\n case 'yarn':\n return 'yarn add';\n\n case 'bun':\n return 'bun add';\n\n default:\n return 'npm install';\n }\n}\n\n/**\n * Overwrites the project's CSS file with HeroUI-specific imports.\n * HeroUI provides its own theme via its Tailwind plugin — no :root CSS vars needed.\n */\nasync function writeHeroUIStyles(targetDir: string): Promise<void> {\n const possibleCssPaths = [join(targetDir, 'src/styles/globals.css'), join(targetDir, 'src/styles/global.css')];\n\n const css = `@import \"tailwindcss\";\n@plugin \"@heroui/react/tailwind\";\n`;\n\n for (const cssPath of possibleCssPaths) {\n try {\n await readFile(cssPath, 'utf-8');\n await writeFile(cssPath, css, 'utf-8');\n\n return;\n } catch {\n // File doesn't exist, try next\n }\n }\n}\n\nasync function addHeroUIProvider(targetDir: string, framework: 'nextjs' | 'react'): Promise<void> {\n if (framework === 'nextjs') {\n await addHeroUIProviderNextjs(targetDir);\n } else {\n await addHeroUIProviderReact(targetDir);\n }\n}\n\nasync function addHeroUIProviderNextjs(targetDir: string): Promise<void> {\n // Create providers.tsx file\n const providersPath = join(targetDir, 'src/app/providers.tsx');\n const providersContent = `'use client';\n\nimport { HeroUIProvider } from '@heroui/react';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n return <HeroUIProvider>{children}</HeroUIProvider>;\n}\n`;\n\n await writeFile(providersPath, providersContent, 'utf-8');\n\n // Update layout.tsx to use providers\n const layoutPath = join(targetDir, 'src/app/layout.tsx');\n\n try {\n let layoutContent = await readFile(layoutPath, 'utf-8');\n\n // Add import if not present\n if (!layoutContent.includes('Providers')) {\n layoutContent = layoutContent.replace(\n /^(import.*\\n)+/m,\n match => `${match}import { Providers } from './providers';\\n`\n );\n\n // Wrap children with Providers\n layoutContent = layoutContent.replace(\n /(<body[^>]*>)([\\s\\S]*?)({children})([\\s\\S]*?)(<\\/body>)/,\n '$1$2<Providers>$3</Providers>$4$5'\n );\n\n await writeFile(layoutPath, layoutContent, 'utf-8');\n }\n } catch {\n // Layout file doesn't exist or couldn't be read\n }\n}\n\nasync function addHeroUIProviderReact(targetDir: string): Promise<void> {\n const mainPath = join(targetDir, 'src/main.tsx');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n // Add HeroUIProvider import\n if (!content.includes('HeroUIProvider')) {\n content = content.replace(\n /^(import.*\\n)+/m,\n match => `${match}import { HeroUIProvider } from '@heroui/react';\\n`\n );\n\n // Wrap App with HeroUIProvider\n content = content.replace(\n /(<App\\s*\\/>)/,\n '<HeroUIProvider>\\n $1\\n </HeroUIProvider>'\n );\n\n await writeFile(mainPath, content, 'utf-8');\n }\n } catch {\n // Main file doesn't exist or couldn't be read\n }\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { type ProgressCallback } from './ui-library-setup.js';\n\nexport type StateManagement\n = | 'zustand'\n | 'tanstack-query'\n | 'tanstack-vue-query'\n | 'none';\n\ntype UIFramework = 'nextjs' | 'react' | 'vue' | 'electron';\n\nconst STATE_MANAGEMENT_VERSIONS: Record<Exclude<StateManagement, 'none'>, { name: string; version: string }> = {\n zustand: { name: 'zustand', version: '5.0.11' },\n 'tanstack-query': { name: '@tanstack/react-query', version: '5.90.20' },\n 'tanstack-vue-query': { name: '@tanstack/vue-query', version: '5.92.9' }\n};\n\n/**\n * Returns compatible state management options for a given framework.\n */\nexport function getCompatibleStateManagement(framework: UIFramework): StateManagement[] {\n switch (framework) {\n case 'react':\n\n case 'nextjs':\n\n case 'electron':\n return [\n 'zustand',\n 'tanstack-query',\n 'none'\n ];\n\n case 'vue':\n return ['tanstack-vue-query', 'none'];\n\n default:\n return [];\n }\n}\n\n/**\n * Sets up state management for the project.\n * Runs BEFORE pnpm install — adds dependency to package.json + creates config files + wraps providers.\n */\nexport async function setupStateManagement(\n targetDir: string,\n framework: UIFramework,\n stateManagement: StateManagement,\n onProgress: ProgressCallback\n): Promise<void> {\n if (stateManagement === 'none') return;\n\n const totalSteps = stateManagement === 'zustand' ? 2 : 3;\n\n // Step 1: Add dependency to package.json\n onProgress('Adding dependency...', 1, totalSteps);\n const pkg = STATE_MANAGEMENT_VERSIONS[stateManagement];\n\n await addDependencyToPackageJson(targetDir, pkg.name, pkg.version);\n\n // Step 2: Create config file\n onProgress('Creating configuration...', 2, totalSteps);\n\n switch (stateManagement) {\n case 'zustand':\n await createZustandStore(targetDir);\n break;\n\n case 'tanstack-query':\n await createReactQueryClient(targetDir);\n break;\n\n case 'tanstack-vue-query':\n await createVueQueryConfig(targetDir);\n break;\n }\n\n // Step 3: Wrap provider (not needed for Zustand)\n if (stateManagement !== 'zustand') {\n onProgress('Configuring provider...', 3, totalSteps);\n\n if (stateManagement === 'tanstack-query') {\n await wrapReactQueryProvider(targetDir, framework);\n } else if (stateManagement === 'tanstack-vue-query') {\n await wrapVueQueryPlugin(targetDir);\n }\n }\n}\n\n// --- Helper functions ---\n\nasync function addDependencyToPackageJson(targetDir: string, name: string, version: string): Promise<void> {\n const pkgPath = join(targetDir, 'package.json');\n const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));\n\n pkg.dependencies = pkg.dependencies ?? {};\n pkg.dependencies[name] = version;\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2), 'utf-8');\n}\n\nasync function createZustandStore(targetDir: string): Promise<void> {\n const storePath = join(targetDir, 'src/store/app-store.ts');\n\n await mkdir(dirname(storePath), { recursive: true });\n await writeFile(storePath, `import { create } from 'zustand';\n\ninterface AppState {\n count: number;\n increment: () => void;\n decrement: () => void;\n}\n\nexport const useAppStore = create<AppState>((set) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n decrement: () => set((state) => ({ count: state.count - 1 }))\n}));\n`, 'utf-8');\n}\n\nasync function createReactQueryClient(targetDir: string): Promise<void> {\n const clientPath = join(targetDir, 'src/lib/query-client.ts');\n\n await mkdir(dirname(clientPath), { recursive: true });\n await writeFile(clientPath, `import { QueryClient } from '@tanstack/react-query';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1\n }\n }\n});\n`, 'utf-8');\n}\n\nasync function createVueQueryConfig(targetDir: string): Promise<void> {\n const configPath = join(targetDir, 'src/lib/query-client.ts');\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, `import type { VueQueryPluginOptions } from '@tanstack/vue-query';\n\nexport const vueQueryOptions: VueQueryPluginOptions = {\n queryClientConfig: {\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1\n }\n }\n }\n};\n`, 'utf-8');\n}\n\nasync function wrapReactQueryProvider(targetDir: string, framework: UIFramework): Promise<void> {\n if (framework === 'nextjs') {\n await wrapNextjsQueryProvider(targetDir);\n } else {\n await wrapReactEntryQueryProvider(targetDir, framework);\n }\n}\n\nasync function wrapNextjsQueryProvider(targetDir: string): Promise<void> {\n // Create providers.tsx\n const providersPath = join(targetDir, 'src/app/providers.tsx');\n\n await writeFile(providersPath, `'use client';\n\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { queryClient } from '@/lib/query-client';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n}\n`, 'utf-8');\n\n // Update layout.tsx to wrap children with Providers\n const layoutPath = join(targetDir, 'src/app/layout.tsx');\n\n try {\n let content = await readFile(layoutPath, 'utf-8');\n\n if (!content.includes('Providers')) {\n // Add import after existing imports\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { Providers } from './providers';\\n`\n );\n\n // Wrap {children} with <Providers>\n content = content.replace(\n /\\{children\\}/,\n '<Providers>{children}</Providers>'\n );\n\n await writeFile(layoutPath, content, 'utf-8');\n }\n } catch {\n // Layout file not found\n }\n}\n\nasync function wrapReactEntryQueryProvider(targetDir: string, framework: UIFramework): Promise<void> {\n const mainPath = join(targetDir, 'src/main.tsx');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n if (content.includes('QueryClientProvider')) return;\n\n // Add imports\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { QueryClientProvider } from '@tanstack/react-query';\\nimport { queryClient } from './lib/query-client';\\n`\n );\n\n if (framework === 'electron') {\n // Electron: wrap around BrowserRouter\n content = content.replace(\n /(<BrowserRouter>)/,\n '<QueryClientProvider client={queryClient}>\\n $1'\n );\n content = content.replace(\n /(<\\/BrowserRouter>)/,\n '$1\\n </QueryClientProvider>'\n );\n } else {\n // React: wrap around App\n content = content.replace(\n /(<App\\s*\\/>)/,\n '<QueryClientProvider client={queryClient}>\\n $1\\n </QueryClientProvider>'\n );\n }\n\n await writeFile(mainPath, content, 'utf-8');\n } catch {\n // Main file not found\n }\n}\n\nasync function wrapVueQueryPlugin(targetDir: string): Promise<void> {\n const mainPath = join(targetDir, 'src/main.ts');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n if (content.includes('VueQueryPlugin')) return;\n\n // Add import at the top (after existing imports)\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { VueQueryPlugin } from '@tanstack/vue-query';\\nimport { vueQueryOptions } from './lib/query-client';\\n`\n );\n\n // Add app.use(VueQueryPlugin, vueQueryOptions) before app.use(router)\n content = content.replace(\n /app\\.use\\(router\\)/,\n 'app.use(VueQueryPlugin, vueQueryOptions);\\napp.use(router)'\n );\n\n await writeFile(mainPath, content, 'utf-8');\n } catch {\n // Main file not found\n }\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport {\n access,\n constants,\n cp,\n readFile,\n rm,\n writeFile\n} from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { downloadTemplate } from 'giget';\nimport { select, input, password } from '@inquirer/prompts';\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/cli-token-manager.js';\n\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { applyLinterConfig, type Framework, type Linter } from '../utils/linter-config.js';\nimport { applyAliasConfig } from '../utils/alias-config.js';\nimport { downloadOpenApiSpec } from '../utils/api-client.js';\nimport { applyUIVariants } from '../utils/ui-variant-swap.js';\nimport {\n setupUILibrary,\n isUILibraryCompatible,\n getUILibraryErrorMessage,\n SHADCN_BASE_COLORS,\n type UILibrary,\n type UIFramework,\n type ShadcnBaseColor,\n type ShadcnStyle\n} from '../utils/ui-library-setup.js';\nimport {\n setupStateManagement,\n getCompatibleStateManagement,\n type StateManagement\n} from '../utils/state-management-setup.js';\nimport { ConflictingFlagsError, ProjectExistsError, TemplateError } from '../utils/errors.js';\nimport { logger } from '../ui/logger.js';\nimport { withSpinner } from '../ui/spinner.js';\nimport { createSimpleProgress } from '../ui/progress.js';\nimport { MESSAGES } from '../ui/messages.js';\n\nconst execAsync = promisify(exec);\n\ninterface CreateOptions {\n path?: string;\n // Framework flags\n nextjs?: boolean;\n react?: boolean;\n vue?: boolean;\n electron?: boolean;\n // UI library flags\n shadcn?: boolean;\n diceui?: boolean;\n shadcnVue?: boolean;\n heroui?: boolean;\n // State management flags\n zustand?: boolean;\n tanstackQuery?: boolean;\n tanstackVueQuery?: boolean;\n // Linter flags\n eslint?: boolean;\n biome?: boolean;\n noLinter?: boolean;\n // Base color flag (for shadcn)\n baseColor?: string;\n // Alias flag\n alias?: string;\n // Package manager flags\n pnpm?: boolean;\n npm?: boolean;\n yarn?: boolean;\n bun?: boolean;\n // Development flags\n local?: boolean;\n}\n\ntype FrameworkType = 'nextjs' | 'react' | 'vue' | 'electron';\ntype LinterType = 'eslint' | 'biome' | 'none';\ntype PackageManagerType = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nfunction validateConflictingFlags(options: CreateOptions): void {\n // Framework conflicts - only one framework can be selected\n const frameworkFlags = [\n options.nextjs,\n options.react,\n options.vue,\n options.electron\n ].filter(Boolean);\n\n if (frameworkFlags.length > 1) {\n throw new ConflictingFlagsError('--nextjs, --react, --vue, --electron', '(multiple frameworks)');\n }\n\n // UI library conflicts - only one can be selected\n const uiLibraryFlags = [\n options.shadcn,\n options.diceui,\n options.shadcnVue,\n options.heroui\n ].filter(Boolean);\n\n if (uiLibraryFlags.length > 1) {\n throw new ConflictingFlagsError(\n '--shadcn, --diceui, --shadcn-vue, --heroui',\n MESSAGES.UI_MULTIPLE_LIBRARIES\n );\n }\n\n // State management conflicts\n const stateFlags = [\n options.zustand,\n options.tanstackQuery,\n options.tanstackVueQuery\n ].filter(Boolean);\n\n if (stateFlags.length > 1) {\n throw new ConflictingFlagsError('--zustand, --tanstack-query, --tanstack-vue-query', '(multiple state management options)');\n }\n\n // Linter conflicts\n const linterFlags = [\n options.eslint,\n options.biome,\n options.noLinter\n ].filter(Boolean);\n\n if (linterFlags.length > 1) {\n throw new ConflictingFlagsError('--eslint, --biome, --no-linter', '(multiple linter options)');\n }\n\n // Package manager conflicts\n const pmFlags = [\n options.pnpm,\n options.npm,\n options.yarn,\n options.bun\n ].filter(Boolean);\n\n if (pmFlags.length > 1) {\n throw new ConflictingFlagsError('--pnpm, --npm, --yarn, --bun', '(multiple package managers)');\n }\n}\n\nfunction validateFrameworkUILibrary(framework: FrameworkType, uiLibrary: UILibrary): void {\n if (uiLibrary === 'none') return;\n\n if (!isUILibraryCompatible(framework, uiLibrary)) {\n throw new ConflictingFlagsError(\n `--${framework}`,\n getUILibraryErrorMessage(framework, uiLibrary)\n );\n }\n}\n\nfunction getFrameworkFromFlags(options: CreateOptions): FrameworkType | undefined {\n if (options.nextjs) return 'nextjs';\n if (options.react) return 'react';\n if (options.vue) return 'vue';\n if (options.electron) return 'electron';\n\n return undefined;\n}\n\nfunction getUiLibraryFromFlags(options: CreateOptions): UILibrary | undefined {\n if (options.shadcn) return 'shadcn';\n if (options.diceui) return 'diceui';\n if (options.shadcnVue) return 'shadcn-vue';\n if (options.heroui) return 'heroui';\n\n return undefined;\n}\n\nfunction getLinterFromFlags(options: CreateOptions): LinterType | undefined {\n if (options.eslint) return 'eslint';\n if (options.biome) return 'biome';\n if (options.noLinter) return 'none';\n\n return undefined;\n}\n\nfunction getPackageManagerFromFlags(options: CreateOptions): PackageManagerType | undefined {\n if (options.pnpm) return 'pnpm';\n if (options.npm) return 'npm';\n if (options.yarn) return 'yarn';\n if (options.bun) return 'bun';\n\n return undefined;\n}\n\nfunction getStateManagementFromFlags(options: CreateOptions): StateManagement | undefined {\n if (options.zustand) return 'zustand';\n if (options.tanstackQuery) return 'tanstack-query';\n if (options.tanstackVueQuery) return 'tanstack-vue-query';\n\n return undefined;\n}\n\nconst FRAMEWORKS = [\n { name: 'nextjs', label: 'Next.js (App Router)', description: 'Next.js 16+, TypeScript, Tailwind v4' },\n { name: 'react', label: 'React + Vite', description: 'React 19+, Vite, TypeScript, Tailwind v4' },\n { name: 'vue', label: 'Vue + Vite', description: 'Vue 3.5+, Vite, TypeScript, Tailwind v4' },\n { name: 'electron', label: 'Electron + React', description: 'Desktop app, React 19+, Vite, Tailwind v4' }\n] as const;\n\n// UI libraries available per framework\nconst UI_LIBRARIES_NEXTJS = [\n { name: 'shadcn', label: 'shadcn/ui (Recommended)', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'heroui', label: 'HeroUI', description: 'Modern React UI library' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nconst UI_LIBRARIES_REACT = [\n { name: 'shadcn', label: 'shadcn/ui (Recommended)', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'heroui', label: 'HeroUI', description: 'Modern React UI library' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nconst UI_LIBRARIES_VUE = [{ name: 'shadcn-vue', label: 'shadcn-vue (Recommended)', description: 'Vue port of shadcn/ui' }, { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }] as const;\n\nconst UI_LIBRARIES_ELECTRON = [\n { name: 'shadcn', label: 'shadcn/ui', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nfunction getUiLibrariesForFramework(framework: FrameworkType) {\n switch (framework) {\n case 'nextjs':\n return UI_LIBRARIES_NEXTJS;\n\n case 'react':\n return UI_LIBRARIES_REACT;\n\n case 'vue':\n return UI_LIBRARIES_VUE;\n\n case 'electron':\n return UI_LIBRARIES_ELECTRON;\n\n default:\n return UI_LIBRARIES_REACT;\n }\n}\n\n// State management options per framework\nconst STATE_MGMT_REACT = [\n { name: 'zustand', label: 'Zustand (Recommended)', description: 'Lightweight client state' },\n { name: 'tanstack-query', label: 'TanStack Query', description: 'Server state & data fetching' },\n { name: 'none', label: 'None', description: 'No state management' }\n] as const;\n\nconst STATE_MGMT_VUE = [{ name: 'tanstack-vue-query', label: 'TanStack Vue Query (Recommended)', description: 'Server state & data fetching' }, { name: 'none', label: 'None', description: 'No state management' }] as const;\n\nfunction getStateManagementForFramework(framework: FrameworkType) {\n switch (framework) {\n case 'vue':\n return STATE_MGMT_VUE;\n\n default:\n return STATE_MGMT_REACT;\n }\n}\n\nconst SHADCN_STYLE_CHOICES = [\n { name: 'vega', label: 'Vega (Recommended)', description: 'Classic shadcn/ui design' },\n { name: 'nova', label: 'Nova', description: 'Compact layouts' },\n { name: 'maia', label: 'Maia', description: 'Soft and rounded' },\n { name: 'lyra', label: 'Lyra', description: 'Boxy and sharp' },\n { name: 'mira', label: 'Mira', description: 'Dense interfaces' }\n] as const;\n\nconst SHADCN_BASE_COLOR_CHOICES = [\n { name: 'zinc', label: 'Zinc (Default)', description: 'Cool neutral gray' },\n { name: 'slate', label: 'Slate', description: 'Blue-tinted gray' },\n { name: 'neutral', label: 'Neutral', description: 'Pure gray' },\n { name: 'stone', label: 'Stone', description: 'Warm gray' },\n { name: 'gray', label: 'Gray', description: 'Balanced gray' }\n] as const;\n\nconst LINTERS = [\n { name: 'eslint', label: 'ESLint (Recommended)', description: 'Industry standard, widely supported' },\n { name: 'biome', label: 'Biome', description: 'Fast, all-in-one linter and formatter' },\n { name: 'none', label: 'None', description: 'No linter, configure your own later' }\n] as const;\n\nconst PACKAGE_MANAGERS = [\n { name: 'pnpm', label: 'pnpm (Recommended)', description: 'Fast, disk space efficient' },\n { name: 'npm', label: 'npm', description: 'Node.js default package manager' },\n { name: 'yarn', label: 'yarn', description: 'Fast, reliable, and secure' },\n { name: 'bun', label: 'bun', description: 'All-in-one JavaScript runtime' }\n] as const;\n\nconst TEMPLATE_REPO_BASE = 'Docyrus/docyrus-devkit/packages/cli-templates';\n\n// Now we only download the base framework template\nfunction getTemplateRepo(framework: string): string {\n return `${TEMPLATE_REPO_BASE}/${framework}`;\n}\n\nasync function directoryExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create [name]')\n .description('Create a new Docyrus project from template')\n .option('-p, --path <path>', 'Target directory path')\n // Framework flags\n .option('--nextjs', 'Use Next.js framework')\n .option('--react', 'Use React + Vite framework')\n .option('--vue', 'Use Vue + Vite framework')\n .option('--electron', 'Use Electron + React framework (desktop app)')\n // UI library flags (optional - defaults to plain Tailwind if not specified)\n .option('--shadcn', 'Use shadcn/ui (Next.js, React, Electron)')\n .option('--diceui', 'Use DiceUI (Next.js, React, Electron)')\n .option('--shadcn-vue', 'Use shadcn-vue (Vue)')\n .option('--heroui', 'Use HeroUI (Next.js, React)')\n // State management flags\n .option('--zustand', 'Use Zustand for state management (React, Next.js, Electron)')\n .option('--tanstack-query', 'Use TanStack Query for state management (React, Next.js, Electron)')\n .option('--tanstack-vue-query', 'Use TanStack Vue Query for state management (Vue)')\n // Base color flag\n .option('--base-color <color>', 'Base color theme for shadcn (zinc, slate, neutral, stone, gray)')\n // Linter flags\n .option('--eslint', 'Use ESLint for linting')\n .option('--biome', 'Use Biome for linting')\n .option('--no-linter', 'Skip linter configuration')\n // Alias flag\n .option('--alias <prefix>', 'Custom import alias prefix (must start with @)')\n // Package manager flags\n .option('--pnpm', 'Use pnpm package manager')\n .option('--npm', 'Use npm package manager')\n .option('--yarn', 'Use yarn package manager')\n .option('--bun', 'Use bun package manager')\n // Development flags\n .option('--local', 'Use local templates instead of downloading from GitHub (development only)')\n .addHelpText('after', `\nUI Library Compatibility:\n Next.js → shadcn, diceui, heroui\n React → shadcn, diceui, heroui\n Vue → shadcn-vue\n Electron → shadcn, diceui\n\nState Management:\n React / Next.js / Electron → zustand, tanstack-query\n Vue → tanstack-vue-query\n\nExamples:\n $ docyrus create my-app Interactive mode\n $ docyrus create my-app --nextjs Next.js + plain Tailwind\n $ docyrus create my-app --nextjs --shadcn Next.js + shadcn/ui\n $ docyrus create my-app --react --shadcn --zustand React + shadcn + Zustand\n $ docyrus create my-app --react --tanstack-query React + TanStack Query\n $ docyrus create my-app --vue --shadcn-vue Vue + shadcn-vue\n $ docyrus create my-app --vue --tanstack-vue-query Vue + TanStack Vue Query\n $ docyrus create my-app --electron --shadcn --zustand Electron + shadcn + Zustand\n`)\n .action(async (name?: string, options?: CreateOptions) => {\n // Auth check - user must be logged in\n const accessToken = await requireAuth();\n\n // Validate conflicting flags\n if (options) {\n validateConflictingFlags(options);\n }\n\n // Get values from flags or prompt user\n const frameworkFromFlags = options ? getFrameworkFromFlags(options) : undefined;\n const uiLibraryFromFlags = options ? getUiLibraryFromFlags(options) : undefined;\n const linterFromFlags = options ? getLinterFromFlags(options) : undefined;\n const packageManagerFromFlags = options ? getPackageManagerFromFlags(options) : undefined;\n const aliasFromFlags = options?.alias;\n\n // Step 1: Select framework (skip if provided via flag)\n const framework = frameworkFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_FRAMEWORK,\n choices: FRAMEWORKS.map(f => ({\n name: f.label,\n value: f.name\n }))\n }) as FrameworkType;\n\n // Step 2: Select UI library (skip if provided via flag, default to 'none' if framework was specified)\n let uiLibrary: UILibrary;\n const availableUiLibraries = getUiLibrariesForFramework(framework);\n\n if (uiLibraryFromFlags) {\n // Validate framework-UI library compatibility\n validateFrameworkUILibrary(framework, uiLibraryFromFlags);\n uiLibrary = uiLibraryFromFlags;\n } else if (frameworkFromFlags) {\n // Framework specified via flag but no UI library → default to plain Tailwind\n uiLibrary = 'none';\n } else {\n // Interactive mode → prompt user with framework-specific options\n uiLibrary = await select({\n message: MESSAGES.CREATE_SELECT_UI_LIBRARY,\n choices: availableUiLibraries.map(u => ({\n name: u.label,\n value: u.name\n }))\n }) as UILibrary;\n }\n\n // Step 2.5: Select style and base color for shadcn/diceui\n let shadcnStyle: ShadcnStyle = 'vega';\n let baseColor: ShadcnBaseColor = 'zinc';\n\n if (uiLibrary === 'shadcn' || uiLibrary === 'diceui') {\n if (!frameworkFromFlags) {\n // Prompt for style\n shadcnStyle = await select({\n message: 'Select component style:',\n choices: SHADCN_STYLE_CHOICES.map(c => ({\n name: c.label,\n value: c.name,\n description: c.description\n }))\n }) as ShadcnStyle;\n\n // Prompt for base color\n baseColor = await select({\n message: 'Select base color:',\n choices: SHADCN_BASE_COLOR_CHOICES.map(c => ({\n name: c.label,\n value: c.name,\n description: c.description\n }))\n }) as ShadcnBaseColor;\n } else {\n // Use defaults if flags were provided\n const validColors: readonly string[] = SHADCN_BASE_COLORS;\n\n if (options?.baseColor) {\n if (!validColors.includes(options.baseColor)) {\n throw new ConflictingFlagsError('--base-color', `must be one of: ${validColors.join(', ')}`);\n }\n baseColor = options.baseColor as ShadcnBaseColor;\n }\n }\n }\n\n // Step 3: Select state management (skip if provided via flag)\n const stateManagementFromFlags = options ? getStateManagementFromFlags(options) : undefined;\n const stateMgmtChoices = getStateManagementForFramework(framework);\n let stateManagement: StateManagement = 'none';\n\n if (stateMgmtChoices) {\n if (stateManagementFromFlags) {\n // Validate compatibility\n const compatible = getCompatibleStateManagement(framework);\n\n if (!compatible.includes(stateManagementFromFlags)) {\n throw new ConflictingFlagsError(\n `--${stateManagementFromFlags}`,\n `not compatible with ${framework}`\n );\n }\n stateManagement = stateManagementFromFlags;\n } else if (!frameworkFromFlags) {\n // Interactive mode → prompt user\n stateManagement = await select({\n message: MESSAGES.CREATE_SELECT_STATE_MANAGEMENT,\n choices: stateMgmtChoices.map(s => ({\n name: s.label,\n value: s.name,\n description: s.description\n }))\n }) as StateManagement;\n }\n }\n\n // Step 4: Select linter/formatter (skip if provided via flag)\n const linter = linterFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_LINTER,\n choices: LINTERS.map(l => ({\n name: l.label,\n value: l.name\n }))\n });\n\n // Step 5: Project name\n let projectName = name;\n\n if (!projectName) {\n projectName = await input({\n message: MESSAGES.CREATE_PROJECT_NAME,\n default: `my-${framework}-app`,\n validate: (value) => {\n if (!value.trim()) return 'Project name is required';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Only lowercase letters, numbers and hyphens allowed';\n\n return true;\n }\n });\n }\n\n // Step 6: Handle alias (from flag or prompt)\n let aliasPrefix = '@';\n\n if (aliasFromFlags) {\n // Validate alias from flag\n if (!aliasFromFlags.startsWith('@')) {\n throw new ConflictingFlagsError('--alias', 'value must start with @');\n }\n if (!/^@[a-zA-Z0-9]*$/.test(aliasFromFlags)) {\n throw new ConflictingFlagsError('--alias', 'only @, @app, @src format allowed');\n }\n aliasPrefix = aliasFromFlags;\n } else {\n const customizeAlias = await select({\n message: MESSAGES.CREATE_CUSTOMIZE_ALIAS,\n choices: [{ name: 'No, use @/ (Recommended)', value: false }, { name: 'Yes, customize', value: true }]\n });\n\n if (customizeAlias) {\n aliasPrefix = await input({\n message: MESSAGES.CREATE_CUSTOM_ALIAS,\n default: '@',\n validate: (value) => {\n if (!value.trim()) return 'Alias prefix is required';\n if (!value.startsWith('@')) return 'Alias must start with @';\n if (!/^@[a-zA-Z0-9]*$/.test(value)) return 'Only @, @app, @src format allowed';\n\n return true;\n }\n });\n }\n }\n\n // Step 7: Package manager (skip if provided via flag)\n const packageManager = packageManagerFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_PACKAGE_MANAGER,\n choices: PACKAGE_MANAGERS.map(pm => ({\n name: pm.label,\n value: pm.name\n }))\n });\n\n // Determine target directory\n const targetDir = options?.path ? join(options.path, projectName) : projectName;\n\n // Check if directory already exists\n if (await directoryExists(targetDir)) {\n throw new ProjectExistsError(projectName);\n }\n\n // Download or copy base framework template (no UI library baked in)\n const isLocalMode = options?.local === true;\n const templateRepo = getTemplateRepo(framework);\n\n logger.newline();\n logger.log(MESSAGES.CREATE_SETTING_UP);\n logger.newline();\n\n if (isLocalMode) {\n // Local mode: copy from monorepo's cli-templates directory\n await withSpinner(\n MESSAGES.CREATE_COPYING_LOCAL,\n async () => {\n const cliPackageDir = dirname(dirname(fileURLToPath(import.meta.url)));\n const localTemplateDir = resolve(cliPackageDir, '..', 'cli-templates', framework);\n\n try {\n await access(localTemplateDir, constants.F_OK);\n } catch {\n throw new TemplateError(\n `Local template not found at: ${localTemplateDir}\\n--local requires running from the monorepo development environment.`\n );\n }\n\n await cp(localTemplateDir, targetDir, { recursive: true });\n\n // Replace @docyrus/* \"latest\" dependencies with file: paths to local packages\n const pkgJsonPath = join(targetDir, 'package.json');\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n const packagesDir = resolve(cliPackageDir, '..');\n\n for (const depType of ['dependencies', 'devDependencies'] as const) {\n const deps = pkgJson[depType];\n\n if (!deps) continue;\n\n for (const [name, version] of Object.entries(deps)) {\n if (name.startsWith('@docyrus/') && version === 'latest') {\n const pkgName = name.replace('@docyrus/', '');\n const localPkgDir = resolve(packagesDir, pkgName);\n\n try {\n await access(localPkgDir, constants.F_OK);\n deps[name] = `file:${localPkgDir}`;\n } catch {\n // Package not found locally — keep \"latest\"\n logger.warn(`Local package not found for ${name}, keeping \"latest\"`);\n }\n }\n }\n }\n\n await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n );\n } else {\n /*\n * Remote mode: download from GitHub via giget\n * Get or prompt for GitHub token (required for private template repo)\n */\n const tokenManager = getTokenManager();\n let githubToken = await tokenManager.getGithubToken();\n\n if (!githubToken) {\n logger.log(MESSAGES.DOCYRUS_TOKEN_REQUIRED);\n githubToken = await password({\n message: MESSAGES.DOCYRUS_TOKEN_PROMPT,\n mask: '*'\n });\n\n // Save token for future use\n await tokenManager.setGithubToken(githubToken);\n logger.success(MESSAGES.DOCYRUS_TOKEN_SAVED);\n }\n\n await withSpinner(\n MESSAGES.CREATE_DOWNLOADING,\n async () => {\n // Clear giget cache to prevent silent fallback to stale tarballs on auth errors\n const gigetCachePath = resolve(homedir(), '.cache/giget/gh/Docyrus-docyrus-devkit');\n\n if (existsSync(gigetCachePath)) {\n await rm(gigetCachePath, { recursive: true, force: true });\n }\n\n try {\n await downloadTemplate(`gh:${templateRepo}`, {\n dir: targetDir,\n install: false,\n auth: githubToken\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // 401/403 = Token invalid or unauthorized - clear token\n if (errorMessage.includes('401') || errorMessage.includes('403')) {\n await tokenManager.setGithubToken(''); // Clear invalid token\n throw new TemplateError(\n `${MESSAGES.DOCYRUS_TOKEN_INVALID}\\n${errorMessage}`\n );\n }\n\n // 404 = Repo not found or no access - token might be valid but lacks repo access\n if (errorMessage.includes('404')) {\n throw new TemplateError(\n `Template repository not found or token lacks access.\\nEnsure your Docyrus token has correct permissions.\\n${errorMessage}`\n );\n }\n\n throw new TemplateError(`Failed to download template: ${errorMessage}`);\n }\n\n // Verify template was actually downloaded (giget may silently produce empty directories)\n try {\n await access(join(targetDir, 'package.json'), constants.F_OK);\n } catch {\n throw new TemplateError(\n 'Template download failed — no files were downloaded.\\nThis usually means your Docyrus token is expired or invalid.\\nRun: docyrus config --token'\n );\n }\n }\n );\n }\n\n // Apply alias configuration (if custom alias selected)\n if (aliasPrefix !== '@' && aliasPrefix !== '@/') {\n await withSpinner(\n MESSAGES.CREATE_CONFIGURING_ALIAS(aliasPrefix),\n async () => {\n await applyAliasConfig(targetDir, framework as Framework, aliasPrefix);\n }\n );\n }\n\n // Apply linter configuration\n if (linter !== 'none') {\n logger.newline();\n logger.log(MESSAGES.LINTER_SETUP_TITLE);\n\n const linterProgress = createSimpleProgress();\n\n try {\n await applyLinterConfig(targetDir, framework as Framework, linter as Linter, linterProgress);\n } catch (error) {\n throw new TemplateError(\n `Failed to configure linter: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Setup state management (adds dependency + config files + provider wrapping BEFORE install)\n if (stateManagement !== 'none') {\n logger.newline();\n logger.log(MESSAGES.STATE_MANAGEMENT_SETUP_TITLE);\n\n const stateProgress = createSimpleProgress();\n\n try {\n await setupStateManagement(\n targetDir,\n framework as UIFramework,\n stateManagement,\n stateProgress\n );\n } catch (error) {\n throw new TemplateError(\n `Failed to setup state management: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Install dependencies (required for UI library setup)\n await withSpinner(\n MESSAGES.CREATE_INSTALLING,\n async () => {\n try {\n await execAsync(`${packageManager} install`, { cwd: targetDir });\n } catch (error) {\n throw new TemplateError(\n `Failed to install dependencies: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n );\n\n // Setup UI Library (install deps + write styles)\n if (uiLibrary !== 'none') {\n logger.newline();\n logger.log(MESSAGES.UI_SETUP_TITLE);\n\n const progressCallback = createSimpleProgress();\n\n try {\n await setupUILibrary(\n targetDir,\n framework as UIFramework,\n uiLibrary,\n packageManager,\n progressCallback,\n shadcnStyle,\n baseColor\n );\n } catch (error) {\n throw new TemplateError(\n `Failed to setup UI library: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Apply UI-specific page variants (swap in pages that use the selected UI library's components)\n await withSpinner(\n 'Applying page variants...',\n async () => applyUIVariants(targetDir, uiLibrary)\n );\n\n // Download OpenAPI spec automatically\n logger.newline();\n logger.log(MESSAGES.OPENAPI_SETUP_TITLE);\n\n try {\n const savedPath = await withSpinner(\n 'Downloading OpenAPI spec...',\n async () => downloadOpenApiSpec(accessToken, targetDir, 'openapi-spec.json'),\n { successText: 'OpenAPI spec downloaded' }\n );\n\n logger.dim(MESSAGES.CREATE_OPENAPI_SUCCESS(savedPath));\n } catch (error) {\n // Don't fail the entire create process if OpenAPI download fails\n logger.warn(`Failed to download OpenAPI spec: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n\n // Success message\n logger.newline();\n logger.success(MESSAGES.CREATE_SUCCESS);\n logger.newline();\n logger.log(` cd ${projectName}`);\n logger.log(` ${packageManager} run dev`);\n logger.newline();\n logger.dim(MESSAGES.API_CLIENT_DOCS);\n });\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve, dirname, join } from 'path';\n\nimport { type Command } from 'commander';\n\nimport { generateFromOpenAPI } from '@docyrus/tanstack-db-generator';\n\nimport { logger, output, withSpinner } from '../ui/index.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { downloadOpenApiSpec } from '../utils/api-client.js';\n\ninterface GenerateDbOptions {\n output?: string;\n watch?: boolean;\n}\n\nexport function registerGenerateCommand(program: Command): void {\n const generate = program\n .command('generate')\n .description('Code generation commands');\n\n // Subcommand: generate api-spec\n generate\n .command('api-spec')\n .description('Download OpenAPI specification from Docyrus API')\n .option('-o, --output <path>', 'Output file path', 'openapi.json')\n .action(async (options: { output: string }) => {\n const token = await requireAuth();\n\n const outputPath = resolve(options.output);\n\n if (!output.isJson()) {\n logger.info('Downloading OpenAPI specification...');\n }\n\n try {\n const savedPath = await withSpinner(\n 'Fetching OpenAPI spec from API...',\n async () => downloadOpenApiSpec(token, dirname(outputPath), outputPath.split('/').pop()),\n { silent: output.isJson() }\n );\n\n output.success('OpenAPI specification downloaded!', { path: savedPath });\n\n if (!output.isJson()) {\n logger.dim(`Saved to: ${savedPath}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Failed to download OpenAPI spec: ${message}`);\n process.exit(1);\n }\n });\n\n // Subcommand: generate db\n generate\n .command('db')\n .description('Generate TanStack Query collections from OpenAPI spec')\n .argument('[spec]', 'Path to OpenAPI specification file (JSON)')\n .option('-o, --output <dir>', 'Output directory (defaults to src in same folder as spec)')\n .option('-w, --watch', 'Watch for changes in the spec file')\n .action(async (specPath: string | undefined, options: GenerateDbOptions) => {\n // If no spec path provided, look for common locations\n const resolvedPath = findSpecFile(specPath);\n\n if (!resolvedPath) {\n output.error('OpenAPI spec file not found.');\n if (!output.isJson()) {\n logger.dim('Provide a path: docyrus generate db <spec-file>');\n logger.dim('Or create one of: openapi.json, api.json, spec.json');\n }\n process.exit(1);\n }\n\n if (!existsSync(resolvedPath)) {\n output.error(`OpenAPI spec file not found: ${resolvedPath}`);\n process.exit(1);\n }\n\n // Determine output directory\n const outputDir = options.output || join(dirname(resolvedPath), 'src');\n\n if (!output.isJson()) {\n logger.info('TanStack DB Generator');\n logger.dim(` Spec: ${resolvedPath}`);\n logger.dim(` Output: ${outputDir}`);\n logger.newline();\n }\n\n try {\n // Read and parse spec\n const specContent = readFileSync(resolvedPath, 'utf-8');\n const spec = JSON.parse(specContent);\n\n // Generate\n await withSpinner(\n 'Generating TanStack Query collections...',\n async () => {\n await generateFromOpenAPI(spec, outputDir);\n },\n {\n silent: output.isJson(),\n successText: 'Generation completed!'\n }\n );\n\n output.success('TanStack Query collections generated successfully!', {\n spec: resolvedPath,\n output: outputDir\n });\n\n if (options.watch) {\n if (!output.isJson()) {\n logger.info('Watch mode is not yet implemented.');\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Generation failed: ${message}`);\n process.exit(1);\n }\n });\n}\n\nfunction findSpecFile(specPath?: string): string | null {\n if (specPath) {\n return resolve(specPath);\n }\n\n // Look for default spec file in current directory\n const defaultSpec = resolve('openapi.json');\n\n if (existsSync(defaultSpec)) {\n return defaultSpec;\n }\n\n return null;\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\n\nimport { type Command } from 'commander';\n\nimport { logger, output, withSpinner } from '../ui/index.js';\nimport { CLI_VERSION, NPM_PACKAGE_NAME } from '../config/constants.js';\n\nconst execAsync = promisify(exec);\n\ninterface NpmRegistryResponse {\n 'dist-tags': {\n latest: string;\n };\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE_NAME}`);\n\n if (!response.ok) return null;\n\n const data = await response.json() as NpmRegistryResponse;\n\n return data['dist-tags']?.latest || null;\n } catch {\n return null;\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.replace(/^v/, '').split('.').map(Number);\n const latestParts = latest.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const curr = currentParts[i] || 0;\n const lat = latestParts[i] || 0;\n\n if (lat > curr) return true;\n if (lat < curr) return false;\n }\n\n return false;\n}\n\nasync function detectPackageManager(): Promise<'npm' | 'pnpm' | 'yarn' | 'bun'> {\n // Check if running via specific package manager\n const npmExecpath = process.env.npm_execpath || '';\n\n if (npmExecpath.includes('pnpm')) return 'pnpm';\n if (npmExecpath.includes('yarn')) return 'yarn';\n if (npmExecpath.includes('bun')) return 'bun';\n\n // Try to detect installed package managers\n try {\n await execAsync('pnpm --version');\n\n return 'pnpm';\n } catch {\n // pnpm not found\n }\n\n try {\n await execAsync('yarn --version');\n\n return 'yarn';\n } catch {\n // yarn not found\n }\n\n return 'npm';\n}\n\nexport function registerUpgradeCommand(program: Command): void {\n program\n .command('upgrade')\n .description('Upgrade Docyrus CLI to the latest version')\n .action(async () => {\n // Check latest version\n const latestVersion = await withSpinner(\n 'Checking for updates...',\n getLatestVersion,\n { silent: output.isJson() }\n );\n\n if (!latestVersion) {\n output.error('Failed to check for updates. Please try again later.');\n process.exit(1);\n }\n\n if (!isNewerVersion(CLI_VERSION, latestVersion)) {\n output.success(`You're already on the latest version (${CLI_VERSION})`);\n\n return;\n }\n\n if (!output.isJson()) {\n logger.info(`New version available: ${CLI_VERSION} → ${latestVersion}`);\n logger.newline();\n }\n\n // Detect package manager\n const pm = await detectPackageManager();\n\n const commands: Record<string, string> = {\n npm: `npm install -g ${NPM_PACKAGE_NAME}@latest`,\n pnpm: `pnpm add -g ${NPM_PACKAGE_NAME}@latest`,\n yarn: `yarn global add ${NPM_PACKAGE_NAME}@latest`,\n bun: `bun add -g ${NPM_PACKAGE_NAME}@latest`\n };\n\n const command = commands[pm];\n\n try {\n await withSpinner(\n `Upgrading via ${pm}...`,\n async () => {\n await execAsync(command);\n },\n {\n silent: output.isJson(),\n successText: 'Upgrade completed!'\n }\n );\n\n output.success(`Successfully upgraded to v${latestVersion}`, {\n previousVersion: CLI_VERSION,\n newVersion: latestVersion,\n packageManager: pm\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Upgrade failed: ${message}`);\n if (!output.isJson()) {\n logger.dim(`Try manually: ${command}`);\n }\n process.exit(1);\n }\n });\n}\n","import { type Command } from 'commander';\n\nimport { logger, output } from '../ui/index.js';\nimport { CLI_NAME } from '../config/constants.js';\n\nconst BASH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\n_${CLI_NAME}_completions() {\n local cur_word args type_list\n cur_word=\"\\${COMP_WORDS[COMP_CWORD]}\"\n args=(\"\\${COMP_WORDS[@]}\")\n\n # Commands\n type_list=\"login logout whoami create generate upgrade completion info help\"\n\n # Subcommands for generate\n if [[ \\${args[1]} == \"generate\" ]]; then\n type_list=\"db\"\n fi\n\n COMPREPLY=($(compgen -W \"\\${type_list}\" -- \\${cur_word}))\n return 0\n}\ncomplete -F _${CLI_NAME}_completions ${CLI_NAME}\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nconst ZSH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\n_${CLI_NAME}() {\n local -a commands\n commands=(\n 'login:Log in to Docyrus'\n 'logout:Log out from Docyrus'\n 'whoami:Display the current logged-in user'\n 'create:Create a new Docyrus project from template'\n 'generate:Code generation commands'\n 'upgrade:Upgrade Docyrus CLI to the latest version'\n 'completion:Generate shell completion script'\n 'info:Display CLI and environment information'\n 'help:Display help for command'\n )\n\n local -a generate_commands\n generate_commands=(\n 'db:Generate TanStack Query collections from OpenAPI spec'\n )\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n command)\n _describe 'command' commands\n ;;\n args)\n case $words[1] in\n generate)\n _describe 'subcommand' generate_commands\n ;;\n esac\n ;;\n esac\n}\ncompdef _${CLI_NAME} ${CLI_NAME}\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nconst FISH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\ncomplete -c ${CLI_NAME} -f\n\n# Commands\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"login\" -d \"Log in to Docyrus\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"logout\" -d \"Log out from Docyrus\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"whoami\" -d \"Display the current logged-in user\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"create\" -d \"Create a new Docyrus project\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"generate\" -d \"Code generation commands\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"upgrade\" -d \"Upgrade Docyrus CLI\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate shell completion\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"info\" -d \"Display CLI and environment information\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"help\" -d \"Display help\"\n\n# generate subcommands\ncomplete -c ${CLI_NAME} -n \"__fish_seen_subcommand_from generate\" -a \"db\" -d \"Generate TanStack Query collections\"\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nexport function registerCompletionCommand(program: Command): void {\n program\n .command('completion')\n .description('Generate shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n const shellLower = shell.toLowerCase();\n\n let script: string;\n let instructions: string;\n\n switch (shellLower) {\n case 'bash':\n script = BASH_COMPLETION;\n instructions = `Add to ~/.bashrc:\\n eval \"$(${CLI_NAME} completion bash)\"`;\n break;\n\n case 'zsh':\n script = ZSH_COMPLETION;\n instructions = `Add to ~/.zshrc:\\n eval \"$(${CLI_NAME} completion zsh)\"`;\n break;\n\n case 'fish':\n script = FISH_COMPLETION;\n instructions = `Save to ~/.config/fish/completions/${CLI_NAME}.fish:\\n ${CLI_NAME} completion fish > ~/.config/fish/completions/${CLI_NAME}.fish`;\n break;\n\n default:\n output.error(`Unknown shell: ${shell}`);\n if (!output.isJson()) {\n logger.dim('Supported shells: bash, zsh, fish');\n }\n process.exit(1);\n }\n\n if (output.isJson()) {\n output.set('shell', shellLower);\n output.set('script', script);\n output.set('instructions', instructions);\n } else {\n console.warn(script);\n logger.dim(instructions);\n }\n });\n}\n","import {\n platform, release, arch, homedir\n} from 'os';\nimport { join } from 'path';\n\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/index.js';\nimport { logger, output } from '../ui/index.js';\nimport { CLI_NAME, CLI_VERSION, DOCYRUS_API_URL } from '../config/constants.js';\n\ninterface SystemInfo {\n cli: {\n name: string;\n version: string;\n };\n node: {\n version: string;\n };\n os: {\n platform: string;\n release: string;\n arch: string;\n };\n environment: {\n apiUrl: string;\n configDir: string;\n };\n auth: {\n loggedIn: boolean;\n email?: string;\n };\n}\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Display CLI and environment information')\n .action(async () => {\n const tokenManager = getTokenManager();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = isLoggedIn ? await tokenManager.getUserEmail() : undefined;\n\n const info: SystemInfo = {\n cli: {\n name: CLI_NAME,\n version: CLI_VERSION\n },\n node: {\n version: process.version\n },\n os: {\n platform: platform(),\n release: release(),\n arch: arch()\n },\n environment: {\n apiUrl: DOCYRUS_API_URL,\n configDir: join(homedir(), '.docyrus')\n },\n auth: {\n loggedIn: isLoggedIn,\n ...(email && { email })\n }\n };\n\n if (output.isJson()) {\n output.set('info', info);\n } else {\n logger.bold(`${CLI_NAME} v${CLI_VERSION}`);\n logger.newline();\n\n logger.log('System:');\n logger.dim(` Node.js: ${info.node.version}`);\n logger.dim(` OS: ${info.os.platform} ${info.os.release} (${info.os.arch})`);\n logger.newline();\n\n logger.log('Environment:');\n logger.dim(` API URL: ${info.environment.apiUrl}`);\n logger.dim(` Config: ${info.environment.configDir}`);\n logger.newline();\n\n logger.log('Authentication:');\n if (info.auth.loggedIn) {\n logger.dim(` Status: Logged in`);\n if (info.auth.email) {\n logger.dim(` Email: ${info.auth.email}`);\n }\n } else {\n logger.dim(` Status: Not logged in`);\n }\n }\n });\n}\n","import { password } from '@inquirer/prompts';\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/cli-token-manager.js';\nimport { logger } from '../ui/logger.js';\nimport { MESSAGES } from '../ui/messages.js';\n\ninterface ConfigOptions {\n token?: boolean;\n show?: boolean;\n}\n\nexport function registerConfigCommand(program: Command): void {\n program\n .command('config')\n .description('Manage CLI configuration')\n .option('--token', 'Update Docyrus token for private template access')\n .option('--show', 'Show current configuration')\n .action(async (options: ConfigOptions) => {\n const tokenManager = getTokenManager();\n\n if (options.show) {\n // Show current config\n const githubToken = await tokenManager.getGithubToken();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = await tokenManager.getUserEmail();\n\n logger.log('Current configuration:');\n logger.newline();\n logger.log(` Docyrus Login: ${isLoggedIn ? `✓ ${email}` : '✗ Not logged in'}`);\n logger.log(` Docyrus Token: ${githubToken ? '✓ Configured' : '✗ Not configured'}`);\n logger.newline();\n\n return;\n }\n\n if (options.token) {\n // Update Docyrus token\n const currentToken = await tokenManager.getGithubToken();\n\n if (currentToken) {\n logger.log('Current Docyrus token will be replaced.');\n }\n\n const newToken = await password({\n message: MESSAGES.DOCYRUS_TOKEN_PROMPT,\n mask: '*'\n });\n\n if (newToken) {\n await tokenManager.setGithubToken(newToken);\n logger.success(MESSAGES.DOCYRUS_TOKEN_SAVED);\n } else {\n logger.warn('No token provided. Token not updated.');\n }\n\n return;\n }\n\n // No option provided - show config by default\n const githubToken = await tokenManager.getGithubToken();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = await tokenManager.getUserEmail();\n\n logger.log('Current configuration:');\n logger.newline();\n logger.log(` Docyrus Login: ${isLoggedIn ? `✓ ${email}` : '✗ Not logged in'}`);\n logger.log(` Docyrus Token: ${githubToken ? '✓ Configured' : '✗ Not configured'}`);\n logger.newline();\n logger.log('To update token: docyrus config --token');\n });\n}\n","import { type Command } from 'commander';\n\nimport { registerLoginCommand } from './login.js';\nimport { registerLogoutCommand } from './logout.js';\nimport { registerWhoamiCommand } from './whoami.js';\nimport { registerCreateCommand } from './create.js';\nimport { registerGenerateCommand } from './generate.js';\nimport { registerUpgradeCommand } from './upgrade.js';\nimport { registerCompletionCommand } from './completion.js';\nimport { registerInfoCommand } from './info.js';\nimport { registerConfigCommand } from './config.js';\n\nexport function registerCommands(program: Command): void {\n registerLoginCommand(program);\n registerLogoutCommand(program);\n registerWhoamiCommand(program);\n registerCreateCommand(program);\n registerGenerateCommand(program);\n registerUpgradeCommand(program);\n registerCompletionCommand(program);\n registerInfoCommand(program);\n registerConfigCommand(program);\n}\n\nexport { registerLoginCommand } from './login.js';\nexport { registerLogoutCommand } from './logout.js';\nexport { registerWhoamiCommand } from './whoami.js';\nexport { registerCreateCommand } from './create.js';\nexport { registerGenerateCommand } from './generate.js';\nexport { registerUpgradeCommand } from './upgrade.js';\nexport { registerCompletionCommand } from './completion.js';\nexport { registerInfoCommand } from './info.js';\nexport { registerConfigCommand } from './config.js';\n","import chalk from 'chalk';\n\ninterface NpmRegistryResponse {\n 'dist-tags': {\n latest: string;\n };\n}\n\n/**\n * Compare two semver versions\n * Returns true if latest > current\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.replace(/^v/, '').split('.').map(Number);\n const latestParts = latest.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const curr = currentParts[i] || 0;\n const lat = latestParts[i] || 0;\n\n if (lat > curr) return true;\n if (lat < curr) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for newer version and print update notice\n */\nexport async function checkForUpdates(packageName: string, currentVersion: string): Promise<void> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`https://registry.npmjs.org/${packageName}`, {\n signal: controller.signal,\n headers: { Accept: 'application/json' }\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return;\n\n const data = await response.json() as NpmRegistryResponse;\n const latestVersion = data['dist-tags']?.latest;\n\n if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {\n console.info();\n console.info(chalk.yellow('┌────────────────────────────────────────────┐'));\n console.info(chalk.yellow('│') + chalk.bold(' Update available! ') + chalk.dim(`${currentVersion} → `) + chalk.green(latestVersion) + chalk.yellow(' │'));\n console.info(chalk.yellow('│') + chalk.dim(` Run `) + chalk.cyan(`npm i -g ${packageName}`) + chalk.dim(' to update') + chalk.yellow(' │'));\n console.info(chalk.yellow('└────────────────────────────────────────────┘'));\n console.info();\n }\n } catch {\n // Silently ignore errors (network issues, timeouts, etc.)\n }\n}\n","import { Command } from 'commander';\n\nimport { registerCommands } from './commands/index.js';\nimport { logger, output } from './ui/index.js';\nimport { CliError } from './utils/errors.js';\nimport { CLI_NAME, CLI_VERSION, NPM_PACKAGE_NAME } from './config/constants.js';\nimport { checkForUpdates } from './utils/update-checker.js';\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description('Docyrus CLI - Authentication and project management tools')\n .version(CLI_VERSION, '-v, --version', 'Display version number')\n .option('--json', 'Output results in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n if (opts.json) {\n output.setFormat('json');\n }\n })\n .hook('postAction', () => {\n // Flush JSON output if in JSON mode\n output.flush();\n });\n\n// Register all commands\nregisterCommands(program);\n\n// Handle help output without throwing\nprogram.configureOutput({\n outputError: (str, write) => write(str)\n});\n\n// Parse arguments\nasync function main(): Promise<void> {\n try {\n // Check for updates (non-blocking, only in text mode)\n if (!process.argv.includes('--json')) {\n checkForUpdates(NPM_PACKAGE_NAME, CLI_VERSION).catch(() => {\n // Silently ignore update check errors\n });\n }\n\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof CliError) {\n output.error(error.message);\n if (error.suggestion && !output.isJson()) {\n logger.dim(error.suggestion);\n }\n output.flush();\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n output.error(error.message);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n output.flush();\n process.exit(1);\n }\n\n output.error('An unexpected error occurred.');\n output.flush();\n process.exit(1);\n }\n}\n\nmain();\n"]}
1
+ {"version":3,"sources":["../src/config/constants.ts","../src/utils/errors.ts","../src/auth/credential-auth.ts","../src/auth/oauth-server.ts","../src/utils/browser.ts","../src/auth/oauth-auth.ts","../src/utils/platform.ts","../src/storage/encryption.ts","../src/storage/file-storage.ts","../src/storage/keychain-storage.ts","../src/storage/cli-token-manager.ts","../src/config/config-manager.ts","../src/ui/logger.ts","../src/ui/output.ts","../src/ui/messages.ts","../src/ui/spinner.ts","../src/ui/prompts.ts","../src/ui/progress.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/utils/auth-guard.ts","../src/commands/whoami.ts","../src/utils/linter-config.ts","../src/utils/alias-config.ts","../src/utils/api-client.ts","../src/utils/ui-variant-swap.ts","../src/utils/ui-library-setup.ts","../src/utils/state-management-setup.ts","../src/commands/create.ts","../src/commands/generate.ts","../src/commands/upgrade.ts","../src/commands/completion.ts","../src/commands/info.ts","../src/commands/config.ts","../src/commands/index.ts","../src/utils/update-checker.ts","../src/cli.ts"],"names":["ApiAuthError","resolve","state","RestApiClient","randomBytes","join","chalk","ora","password","userInfo","program","readFile","writeFile","constants","mkdir","dirname","execAsync","promisify","exec","access","select","input","cp","name","homedir","existsSync","rm","confirm","readFileSync","githubToken","isLoggedIn","email","isNewerVersion"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,eAAA,GAAkB,yBAAA;AAGxB,IAAM,eAAA,GAAkB,sCAAA;AACxB,IAAM,YAAA,GAAgB,+DAAA,CAAgD,KAAA,CAAM,GAAG,CAAA;AAO/E,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAAiB,CAAA,iBAAA,EAAoB,IAAI,CAAA,SAAA,CAAA;AACrE,IAAM,gBAAA,GAAmB,IAAI,EAAA,GAAK,GAAA;AAGlC,IAAM,gBAAA,GAAmB,aAAA;AACzB,IAAM,UAAA,GAAa,UAAA;AACnB,IAAM,gBAAA,GAAmB,iBAAA;AAIzB,IAAM,UAAA,GAAa;AAAA,EACxB,YAAA,EAAc,aAAA;AAAA,EACd,aAAA,EAAe,cAAA;AAAA,EACf,UAAA,EAAY,WAAA;AAAA,EAEZ,YAAA,EAAc;AAAA;AAChB,CAAA;AAGO,IAAM,QAAA,GAAW,SAAA;AACjB,IAAM,WAAA,GAAc,OAAA;AACpB,IAAM,gBAAA,GAAmB,SAAA;;;ACzCzB,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClB,QAAA;AAAA,EACA,UAAA;AAAA,EAChB,WAAA,CAAY,OAAA,EAAiB,QAAA,GAAW,CAAA,EAAG,UAAA,EAAqB;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AACF,CAAA;AAEO,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAA,EAChD,WAAA,CAAY,OAAA,GAAU,uBAAA,EAAyB,UAAA,EAAqB;AAClE,IAAA,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,UAAA,IAAc,8CAA8C,CAAA;AAC9E,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,gBAAA,GAAN,cAA+B,QAAA,CAAS;AAAA,EAC7C,WAAA,CAAY,UAAU,wBAAA,EAA0B;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAG,sCAAsC,CAAA;AACxD,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AASO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACzC,WAAA,CAAY,OAAA,GAAU,wBAAA,EAA0B,UAAA,EAAqB;AACnE,IAAA,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,UAAA,IAAc,sDAAsD,CAAA;AACtF,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACzC,WAAA,CAAY,UAAU,qBAAA,EAAuB;AAC3C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAG,mBAAmB,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,UAAA,GAAN,cAAyB,QAAA,CAAS;AAAA,EACvC,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,UAAA,IAAc,+CAA+C,CAAA;AAC/E,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAA,EAAS,GAAG,+CAA+C,CAAA;AACjE,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAA,EAC/C,YAAY,WAAA,EAAqB;AAC/B,IAAA,KAAA;AAAA,MACE,cAAc,WAAW,CAAA,iBAAA,CAAA;AAAA,MACzB,CAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,qBAAA,GAAN,cAAoC,QAAA,CAAS;AAAA,EAClD,WAAA,CAAY,OAAe,KAAA,EAAe;AACxC,IAAA,KAAA;AAAA,MACE,CAAA,WAAA,EAAc,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,UAAA,CAAA;AAAA,MAChC,CAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF,CAAA;;;ACvEA,SAAS,YAAA,GAA8B;AACrC,EAAA,OAAO,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,iBAAiB,CAAA;AACvD;AAEA,eAAsB,qBAAqB,WAAA,EAAoD;AAC7F,EAAA,MAAM,SAAS,YAAA,EAAa;AAE5B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAQ3B,gBAAA,EAAkB;AAAA,MACnB,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,UAAU,WAAA,CAAY;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,WAAA,EAAa,SAAS,IAAA,CAAK,YAAA;AAAA,MAC3B,YAAA,EAAc,SAAS,IAAA,CAAK,aAAA;AAAA,MAC5B,SAAA,EAAW,SAAS,IAAA,CAAK;AAAA,KAC3B;AAEA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAO,SAAA,GAAY,GAAA;AAAA,IACrD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA,EAAM,SAAS,IAAA,CAAK;AAAA,KACtB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiBA,qBAAA,EAAc;AACjC,MAAA,MAAM,IAAI,oBAAoB,4BAA4B,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,YAAA,EAAa;AAAA,IACzB;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAsB,YAAY,WAAA,EAAwC;AACxE,EAAA,MAAM,SAAS,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAE7D,EAAA,MAAM,MAAA,CAAO,eAAe,WAAW,CAAA;AAEvC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA0C,cAAc,CAAA;AAEtF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiBA,qBAAA,EAAc;AACjC,MAAA,MAAM,IAAI,oBAAoB,uCAAuC,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAsB,mBAAmB,YAAA,EAA2C;AAClF,EAAA,MAAM,QAAA,GAAW,GAAG,eAAe,CAAA,gBAAA,CAAA;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,MACrC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAI,eAAA,CAAgB;AAAA,QACxB,UAAA,EAAY,eAAA;AAAA,QACZ,SAAA,EAAW,eAAA;AAAA,QACX,aAAA,EAAe;AAAA,OAChB,EAAE,QAAA;AAAS,KACb,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAKxD,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,UAAU,iBAAA,IAAqB;AAAA,OACjC;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAOjC,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,YAAA,EAAc,KAAK,aAAA,IAAiB,YAAA;AAAA,MACpC,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KAClB;AAEA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAO,SAAA,GAAY,GAAA;AAAA,IACrD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,mBAAA,EAAqB;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,YAAA,EAAa;AAAA,IACzB;AAEA,IAAA,MAAM,IAAI,oBAAoB,uCAAuC,CAAA;AAAA,EACvE;AACF;ACvHA,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAkErB,IAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAqEP,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMjC,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,WAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACvC;AAEO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,WAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA;AAC7C;AAEA,eAAsB,sBAAsB,QAAA,EAAmC;AAC7E,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAE7D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,WAAW,CAAA;AACrD;AAEA,eAAe,iBAAA,GAAqC;AAClD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB;AAChC,MAAA,IAAI,OAAO,uBAAA,EAAyB;AAClC,QAAA,MAAA,CAAO,IAAI,UAAA,CAAW,sDAAsD,CAAC,CAAA;AAE7E,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,YAAA,EAAa;AAE5B,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,WAAW,CAAA;AAE/B,MAAA,MAAA,CAAO,IAAA,CAAK,aAAa,MAAM;AAC7B,QAAA,MAAA,CAAO,KAAA,CAAM,MAAMA,QAAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MAClC,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM;AACzB,QAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAA,CAAQ,uBAAuB,CAAA;AAAA,EACjC,CAAC,CAAA;AACH;AASA,eAAsB,oBAAoB,aAAA,EAAsD;AAC9F,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AAErC,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,YAAA;AAEJ,EAAA,MAAM,aAAA,GAAgB,IAAI,OAAA,CAA6B,CAACA,UAAS,MAAA,KAAW;AAC1E,IAAA,aAAA,GAAgBA,QAAAA;AAChB,IAAA,YAAA,GAAe,MAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,IAAA,YAAA,CAAa,IAAI,YAAA,CAAa,iCAAiC,CAAC,CAAA;AAAA,EAClE,GAAG,gBAAgB,CAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,GAAA,EAAsB,GAAA,KAAwB;AACzE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,OAAO,GAAA,EAAK,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAE9D,IAAA,IAAI,GAAA,CAAI,aAAa,WAAA,EAAa;AAChC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACxC,MAAA,MAAMC,MAAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,MAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,mBAAmB,CAAA;AAEjE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,QAAA,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,gBAAA,IAAoB,KAAK,CAAC,CAAA;AAC7C,QAAA,YAAA,CAAa,IAAI,UAAA,CAAW,gBAAA,IAAoB,KAAK,CAAC,CAAA;AAEtD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,CAACA,MAAAA,EAAO;AACnB,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,QAAA,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,sCAAsC,CAAC,CAAA;AAC1D,QAAA,YAAA,CAAa,IAAI,UAAA,CAAW,sCAAsC,CAAC,CAAA;AAEnE,QAAA;AAAA,MACF;AAEA,MAAA,IAAIA,WAAU,aAAA,EAAe;AAC3B,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,QAAA,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,gDAAgD,CAAC,CAAA;AACpE,QAAA,YAAA,CAAa,IAAI,UAAA,CAAW,0BAA0B,CAAC,CAAA;AAEvD,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,MAAA,GAAA,CAAI,IAAI,YAAY,CAAA;AACpB,MAAA,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAAA,MAAAA,EAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,IAAI,WAAW,CAAA;AAAA,IACrB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,WAAW,CAAA;AAE/B,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AC9QA,eAAsB,YAAY,GAAA,EAA4B;AAC5D,EAAA,MAAM,KAAK,GAAG,CAAA;AAChB;;;ACiBA,SAAS,eAAe,IAAA,EAA2B;AACjD,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,GAAG,eAAe,CAAA,oBAAA,CAAA;AAAA,IACpC,QAAA,EAAU,GAAG,eAAe,CAAA,gBAAA,CAAA;AAAA,IAC5B,QAAA,EAAU,eAAA;AAAA,IACV,WAAA,EAAa,mBAAmB,IAAI,CAAA;AAAA,IACpC,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,SAAS,qBAAA,CACP,MAAA,EACAA,MAAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IACjC,aAAA,EAAe,MAAA;AAAA,IACf,WAAW,MAAA,CAAO,QAAA;AAAA,IAClB,cAAc,MAAA,CAAO,WAAA;AAAA,IACrB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,IAC7B,KAAA,EAAAA,MAAAA;AAAA,IACA,cAAA,EAAgB,aAAA;AAAA,IAChB,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAED,EAAA,OAAO,GAAG,MAAA,CAAO,gBAAgB,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AACxD;AAEA,eAAe,qBAAA,CACb,MAAA,EACA,IAAA,EACA,YAAA,EACqB;AACrB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAAA,IAC5C,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAI,eAAA,CAAgB;AAAA,MACxB,UAAA,EAAY,oBAAA;AAAA,MACZ,WAAW,MAAA,CAAO,QAAA;AAAA,MAClB,IAAA;AAAA,MACA,cAAc,MAAA,CAAO,WAAA;AAAA,MACrB,aAAA,EAAe;AAAA,KAChB,EAAE,QAAA;AAAS,GACb,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AAEtC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAOjC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,aAAa,IAAA,CAAK,YAAA;AAAA,IAClB,cAAc,IAAA,CAAK,aAAA;AAAA,IACnB,WAAW,IAAA,CAAK,UAAA;AAAA,IAChB,WAAW,IAAA,CAAK;AAAA,GAClB;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAO,SAAA,GAAY,GAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,qBAAqB,WAAA,EAAoD;AACtF,EAAA,MAAM,SAAS,IAAIC,aAAAA,CAAc,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAE7D,EAAA,MAAM,MAAA,CAAO,eAAe,WAAW,CAAA;AAEvC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAc,cAAc,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAOA,eAAsB,cAAA,CAAe,OAAA,GAA6B,EAAC,EAAyB;AAE1F,EAAA,MAAMD,SAAQ,aAAA,EAAc;AAC5B,EAAA,MAAM,eAAe,oBAAA,EAAqB;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAM,qBAAA,CAAsB,YAAY,CAAA;AAG9D,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,SAAQ,GAAI,MAAM,oBAAoBA,MAAK,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAGlC,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAQA,MAAAA,EAAO,aAAa,CAAA;AAElE,EAAA,IAAI;AAEF,IAAA,OAAA,CAAQ,gBAAA,IAAmB;AAC3B,IAAA,MAAM,YAAY,OAAO,CAAA;AAGzB,IAAA,OAAA,CAAQ,mBAAmB,OAAO,CAAA;AAClC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,aAAA;AAGvB,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,MAAA,EAAQ,MAAM,YAAY,CAAA;AAGrE,IAAA,MAAM,IAAA,GAAO,MAAM,oBAAA,CAAqB,MAAA,CAAO,WAAW,CAAA;AAE1D,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB,CAAA,SAAE;AACA,IAAA,OAAA,EAAQ;AAAA,EACV;AACF;AC/HO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,OAAA,EAAQ;AACjB;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,IAAA,CAAK,UAAA,EAAW,EAAG,UAAU,CAAA;AACtC;AClBA,IAAM,SAAA,GAAY,aAAA;AAClB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,WAAA,GAAc,EAAA;AAEpB,SAAS,YAAA,GAAuB;AAC9B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,QAAA,EAAS;AAAA,IACT,UAAS,CAAE,QAAA;AAAA,IACX,OAAA,CAAQ,QAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,KAAK,GAAG,CAAC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAClE;AAEO,SAAS,UAAU,IAAA,EAAsB;AAC9C,EAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,EAAA,OAAO,UAAA,CAAW,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAC/C;AAEO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAOE,YAAY,WAAW,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAKA,YAAY,SAAS,CAAA;AAEhC,EAAA,MAAM,MAAA,GAAS,eAAe,SAAA,EAAW,GAAA,EAAK,IAAI,EAAE,aAAA,EAAe,iBAAiB,CAAA;AACpF,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAGlC,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACtB,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,IACpB,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,IACzB,SAAA,CAAU,SAAS,QAAQ;AAAA,GAC7B,CAAE,KAAK,GAAG,CAAA;AACZ;AAEO,SAAS,QAAQ,aAAA,EAA+B;AACrD,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AAErC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAC1C,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAE/C,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,iBAAiB,SAAA,EAAW,GAAA,EAAK,IAAI,EAAE,aAAA,EAAe,iBAAiB,CAAA;AAExF,EAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAE3B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA;AAE9E,EAAA,OAAO,SAAA,CAAU,SAAS,MAAM,CAAA;AAClC;;;AC5DO,IAAM,cAAN,MAAkB;AAAA,EACf,QAAA;AAAA,EACR,WAAA,GAAc;AACZ,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAA,CAAK,QAAA,GAAWC,IAAAA,CAAK,SAAA,EAAW,gBAAgB,CAAA;AAAA,EAClD;AAAA,EACQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,SAAA,CAAU,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EACQ,QAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACpD,MAAA,MAAM,SAAA,GAAY,QAAQ,SAAS,CAAA;AAEnC,MAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EACQ,UAAU,IAAA,EAAyB;AACzC,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAE9B,IAAA,aAAA,CAAc,KAAK,QAAA,EAAU,SAAA,EAAW,EAAE,IAAA,EAAM,KAAO,CAAA;AAAA,EACzD;AAAA,EACA,MAAM,IAAI,GAAA,EAAqC;AAC7C,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAE3B,IAAA,OAAO,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA;AAAA,EACtB;AAAA,EACA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAA8B;AACnD,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAE3B,IAAA,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AACZ,IAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EACrB;AAAA,EACA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAE3B,IAAA,OAAO,KAAK,GAAG,CAAA;AAEf,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7B,MAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAE3B,IAAA,OAAO,GAAA,IAAO,IAAA;AAAA,EAChB;AACF,CAAA;;;AC9EA,IAAI,MAAA,GAAyC,IAAA;AAE7C,eAAe,SAAA,GAAqD;AAClE,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AAE9B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,IAAA;AAET,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACnB,OAAA;AAAA,EACR,WAAA,CAAY,UAAU,gBAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EACA,MAAM,WAAA,GAAgC;AACpC,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAE3B,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,IAAA,IAAI;AAEF,MAAA,MAAM,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAErC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,IAAI,GAAA,EAAqC;AAC7C,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAE3B,IAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAEhB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAAiC;AACtD,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAE3B,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAE7C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAE3B,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAE3B,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,eAAA,CAAgB,KAAK,OAAO,CAAA;AAEzD,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,MAAM,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,MACpD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAA;;;ACnFO,IAAM,kBAAN,MAA8C;AAAA,EAC3C,QAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA,GAAoC,IAAA;AAAA,EAC5C,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,EAAY;AAAA,EACrC;AAAA,EACA,MAAc,WAAA,GAAgC;AAC5C,IAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACnC,MAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAAA,IAC3D;AAEA,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA,EACA,MAAM,QAAA,GAAmC;AACvC,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,YAAY,CAAA;AAE7D,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,YAAY,CAAA;AAAA,EAC3D;AAAA,EACA,MAAM,SAAS,KAAA,EAA8B;AAC3C,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,CAAW,cAAc,KAAK,CAAA;AAEtE,MAAA,IAAI,OAAA,EAAS;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,cAAc,KAAK,CAAA;AAAA,EAC3D;AAAA,EACA,MAAM,UAAA,GAA4B;AAEhC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAAA,EACvD;AAAA,EACA,MAAM,eAAA,GAA0C;AAC9C,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,aAAa,CAAA;AAE9D,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EAC5D;AAAA,EACA,MAAM,gBAAgB,KAAA,EAA8B;AAClD,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,CAAW,eAAe,KAAK,CAAA;AAEvE,MAAA,IAAI,OAAA,EAAS;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,eAAe,KAAK,CAAA;AAAA,EAC5D;AAAA,EACA,MAAM,iBAAA,GAAmC;AACvC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA;AACnD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA;AAAA,EACxD;AAAA,EACA,MAAM,YAAA,GAAuC;AAC3C,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,UAAU,CAAA;AAE3D,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,EACzD;AAAA,EACA,MAAM,aAAa,KAAA,EAA8B;AAC/C,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,CAAW,YAAY,KAAK,CAAA;AAEpE,MAAA,IAAI,OAAA,EAAS;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,YAAY,KAAK,CAAA;AAAA,EACzD;AAAA;AAAA,EAEA,MAAM,cAAA,GAAyC;AAC7C,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,YAAY,CAAA;AAE7D,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,YAAY,CAAA;AAAA,EAC3D;AAAA,EACA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,CAAW,cAAc,KAAK,CAAA;AAEtE,MAAA,IAAI,OAAA,EAAS;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,cAAc,KAAK,CAAA;AAAA,EAC3D;AAAA,EACA,MAAM,QAAA,GAA0B;AAE9B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAE9C,IAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAC1B,IAAA,MAAM,IAAA,CAAK,YAAY,KAAA,EAAM;AAG7B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,CAAK,eAAe,WAAW,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EACA,MAAM,UAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAElC,IAAA,OAAO,KAAA,KAAU,IAAA;AAAA,EACnB;AACF,CAAA;AAGA,IAAI,QAAA,GAAmC,IAAA;AAEhC,SAAS,eAAA,GAAmC;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,eAAA,EAAgB;AAAA,EACjC;AAEA,EAAA,OAAO,QAAA;AACT;ACzHA,IAAM,QAAA,GAAsB;AAAA,EAC1B,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EACV,MAAA;AAAA,EACR,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAgB;AAAA,MAChC,WAAA,EAAa,QAAA;AAAA,MACb;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EACA,IAA+B,GAAA,EAAsB;AACnD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B;AAAA,EACA,GAAA,CAA+B,KAAQ,KAAA,EAA2B;AAChE,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC5B;AAAA,EACA,OAAkC,GAAA,EAAc;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,EACxB;AAAA,EACA,MAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA,EACA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AAAA,EACA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AACF,CAAA;AAEO,IAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;ACxCxC,IAAM,MAAA,GAAS;AAAA,EACpB,QAAQ,OAAA,EAAuB;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAKC,MAAA,CAAM,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACxC,CAAA;AAAA,EAEA,MAAM,OAAA,EAAuB;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAMA,MAAA,CAAM,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAAA,EAEA,KAAK,OAAA,EAAuB;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAKA,MAAA,CAAM,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACzC,CAAA;AAAA,EAEA,KAAK,OAAA,EAAuB;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAKA,MAAA,CAAM,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAAA,EAEA,MAAM,OAAA,EAAuB;AAC3B,IAAA,IAAI,OAAA,CAAQ,IAAI,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,OAAM,IAAA,CAAK,QAAG,GAAGA,MAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACpD;AAAA,EACF,CAAA;AAAA,EAEA,IAAI,OAAA,EAAuB;AACzB,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB,CAAA;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf,CAAA;AAAA,EAEA,IAAI,OAAA,EAAuB;AACzB,IAAA,OAAA,CAAQ,IAAA,CAAKA,MAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,EACjC,CAAA;AAAA,EAEA,KAAK,OAAA,EAAuB;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAKA,MAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAClC,CAAA;AAAA,EAEA,KAAK,GAAA,EAAqB;AACxB,IAAA,OAAOA,MAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,EACjC;AACF,CAAA;ACnCA,IAAM,KAAA,GAAqB;AAAA,EACzB,MAAA,EAAQ,MAAA;AAAA,EACR,MAAM;AACR,CAAA;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,UAAU,MAAA,EAA4B;AACpC,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,EACjB,CAAA;AAAA,EAEA,SAAA,GAA0B;AACxB,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf,CAAA;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAAA,EAC1B,CAAA;AAAA;AAAA,EAGA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACrC,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,EACpB,CAAA;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,KAAA,CAAM,OAAO,EAAC;AAAA,EAChB,CAAA;AAAA;AAAA,EAGA,OAAA,CAAQ,SAAiB,IAAA,EAAsC;AAC7D,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,KAAA,CAAM,IAAA,GAAO;AAAA,QACX,GAAG,KAAA,CAAM,IAAA;AAAA,QAAM,GAAG,IAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM;AAAA,OACzC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAKA,MAAAA,CAAM,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,IACxC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,IAAA,EAAsC;AAC3D,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,KAAA,CAAM,IAAA,GAAO;AAAA,QACX,GAAG,KAAA,CAAM,IAAA;AAAA,QAAM,GAAG,IAAA;AAAA,QAAM,OAAA,EAAS,KAAA;AAAA,QAAO,KAAA,EAAO;AAAA,OACjD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAAA,IACvC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,KAAA,CAAM,KAAK,OAAA,GAAU,OAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAKA,MAAAA,CAAM,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,IACzC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAKA,MAAAA,CAAM,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,IACvC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,IAAI,OAAA,EAAuB;AACzB,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAKA,MAAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IACjC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,IAAU,MAAA,CAAO,KAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACjE,MAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAChD,MAAA,KAAA,CAAM,OAAO,EAAC;AAAA,IAChB;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,KAAK,IAAA,EAAqB;AACxB,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC5C;AAAA,EACF;AACF,CAAA;;;AChGO,IAAM,QAAA,GAAW;AAAA;AAAA,EAEtB,aAAA,EAAe,CAAC,KAAA,KAAkB,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAA;AAAA,EACpE,YAAA,EAAc,8CAAA;AAAA,EACd,kBAAA,EAAoB,QAAA;AAAA,EACpB,qBAAA,EAAuB,WAAA;AAAA,EACvB,oBAAA,EAAsB,mBAAA;AAAA;AAAA,EAGtB,mBAAA,EAAqB,uCAAA;AAAA,EACrB,WAAA,EAAa,uCAAA;AAAA,EACb,WAAA,EAAa,oCAAA;AAAA,EACb,WAAA,EAAa,6CAAA;AAAA,EACb,aAAA,EAAe,2BAAA;AAAA;AAAA,EAGf,cAAA,EAAgB,0BAAA;AAAA,EAChB,cAAA,EAAgB,mCAAA;AAAA,EAChB,kBAAA,EAAoB,gBAAA;AAAA;AAAA,EAGpB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,iBAAA,EAAmB,sCAAA;AAAA,EACnB,eAAA,EAAiB,uBAAA;AAAA;AAAA,EAGjB,aAAA,EAAe,wBAAA;AAAA,EACf,aAAA,EAAe,gEAAA;AAAA,EACf,aAAA,EAAe,+BAAA;AAAA;AAAA,EAGf,mBAAA,EAAqB,4BAAA;AAAA,EACrB,eAAA,EAAiB,gDAAA;AAAA,EACjB,YAAA,EAAc,uCAAA;AAAA;AAAA,EAGd,uBAAA,EAAyB,qBAAA;AAAA,EACzB,wBAAA,EAA0B,oBAAA;AAAA,EAC1B,oBAAA,EAAsB,0BAAA;AAAA,EACtB,mBAAA,EAAqB,eAAA;AAAA,EACrB,6BAAA,EAA+B,yBAAA;AAAA,EAC/B,sBAAA,EAAwB,uCAAA;AAAA,EACxB,mBAAA,EAAqB,gDAAA;AAAA,EACrB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,kBAAA,EAAoB,iCAAA;AAAA,EACpB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,yBAAA,EAA2B,CAAC,MAAA,KAAmB,CAAA,YAAA,EAAe,MAAM,CAAA,GAAA,CAAA;AAAA,EACpE,wBAAA,EAA0B,CAAC,KAAA,KAAkB,CAAA,0BAAA,EAA6B,KAAK,CAAA,KAAA,CAAA;AAAA,EAC/E,iBAAA,EAAmB,4BAAA;AAAA,EACnB,cAAA,EAAgB,+BAAA;AAAA,EAChB,uBAAA,EAAyB,4CAAA;AAAA,EACzB,0BAAA,EAA4B,sCAAA;AAAA,EAC5B,sBAAA,EAAwB,CAAC,IAAA,KAAiB,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAA;AAAA;AAAA,EAGvE,yBAAA,EAA2B,wDAAA;AAAA,EAC3B,0BAAA,EAA4B,0CAAA;AAAA,EAC5B,0BAAA,EAA4B,sCAAA;AAAA,EAC5B,yBAAA,EAA2B,+CAAA;AAAA;AAAA,EAG3B,kBAAA,EAAoB,sBAAA;AAAA;AAAA,EAGpB,8BAAA,EAAgC,0BAAA;AAAA,EAChC,4BAAA,EAA8B,gCAAA;AAAA;AAAA,EAG9B,mBAAA,EAAqB,mBAAA;AAAA;AAAA,EAGrB,eAAA,EAAiB,+DAAA;AAAA;AAAA,EAGjB,cAAA,EAAgB,0BAAA;AAAA,EAChB,qBAAA,EAAuB,2CAAA;AAAA;AAAA,EAGvB,sBAAA,EAAwB,8CAAA;AAAA,EACxB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,mBAAA,EAAqB,kCAAA;AAAA,EACrB,qBAAA,EAAuB;AACzB,CAAA;AChFO,SAAS,cAAc,IAAA,EAAmB;AAC/C,EAAA,OAAO,GAAA,CAAI;AAAA,IACT,IAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,WAAA,CACpB,IAAA,EACA,EAAA,EACA,OAAA,EAKY;AAEZ,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAEA,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAI,CAAA,CAAE,KAAA,EAAM;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AAExB,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,QAAQ,WAAW,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,IACf;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,IACf;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;ACrCA,eAAsB,YAAY,YAAA,EAAwC;AACxE,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,SAAS,QAAA,CAAS,kBAAA;AAAA,IAClB,OAAA,EAAS,YAAA;AAAA,IACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,QAAA,OAAO,qCAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AAEA,eAAsB,cAAA,GAAkC;AACtD,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,SAAS,QAAA,CAAS,qBAAA;AAAA,IAClB,IAAA,EAAM,GAAA;AAAA,IACN,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,OAAO,6BAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;CCfgB;AAAA,EACd,OAAA,EAASA,MAAAA,CAAM,GAAA,CAAI,QAAG,CAAA;AAAA,EACtB,WAAA,EAAaA,MAAAA,CAAM,IAAA,CAAK,QAAG,CAAA;AAAA,EAC3B,SAAA,EAAWA,MAAAA,CAAM,KAAA,CAAM,QAAG,CAAA;AAAA,EAC1B,MAAA,EAAQA,MAAAA,CAAM,GAAA,CAAI,QAAG;AACvB;AAmGO,SAAS,oBAAA,GAAiF;AAC/F,EAAA,IAAI,OAAA,GAAsB,IAAA;AAE1B,EAAA,OAAO,CAAC,IAAA,EAAc,OAAA,EAAkB,KAAA,KAAmB;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAEA,IAAA,MAAM,IAAA,GAAO,WAAW,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AAElE,IAAA,OAAA,GAAUC,GAAAA,CAAI;AAAA,MACZ,IAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,EAAE,KAAA,EAAM;AAET,IAAA,IAAI,OAAA,IAAW,KAAA,IAAS,OAAA,KAAY,KAAA,EAAO;AACzC,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;;;AChIA,eAAe,sBAAsB,KAAA,EAA+B;AAElE,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,gBAAgB,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,KAAA,IAAS,MAAM,WAAA,CAAY,SAAS,CAAA;AAGtD,EAAA,MAAMC,SAAAA,GAAW,MAAM,cAAA,EAAe;AAGtC,EAAA,MAAM,SAAS,MAAM,WAAA;AAAA,IACnB,QAAA,CAAS,oBAAA;AAAA,IACT,MAAM,oBAAA,CAAqB,EAAE,OAAO,SAAA,EAAW,QAAA,EAAAA,WAAU;AAAA,GAC3D;AAGA,EAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,EAAA,MAAM,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAErD,EAAA,IAAI,MAAA,CAAO,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,EAAM,KAAA,IAAS,SAAA;AAEzC,EAAA,MAAM,YAAA,CAAa,aAAa,UAAU,CAAA;AAC1C,EAAA,aAAA,CAAc,GAAA,CAAI,kBAAkB,UAAU,CAAA;AAE9C,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,aAAA,CAAc,UAAU,GAAG,EAAE,KAAA,EAAO,YAAY,CAAA;AAC1E;AAEA,eAAe,cAAA,GAAgC;AAC7C,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,IAClC,kBAAkB,MAAM;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,mBAAmB,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,IAClC;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,EAAA,MAAM,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAErD,EAAA,IAAI,MAAA,CAAO,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA;AAAA,EAC/D;AAGA,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,KAAA;AAEzB,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AACvC,IAAA,IAAI;AACF,MAAA,MAAMC,SAAAA,GAAW,MAAM,WAAA,CAAY,MAAA,CAAO,OAAO,WAAW,CAAA;AAE5D,MAAA,CAAC,EAAE,OAAM,GAAIA,SAAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,YAAA,CAAa,aAAa,KAAK,CAAA;AACrC,IAAA,aAAA,CAAc,GAAA,CAAI,kBAAkB,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,EAAG,EAAE,OAAO,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,QAAQ,yBAAyB,CAAA;AAAA,EAC1C;AACF;AAEO,SAAS,qBAAqBC,QAAAA,EAAwB;AAC3D,EAAAA,QAAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,uDAAuD,CAAA,CACnE,MAAA,CAAO,qBAAA,EAAuB,2CAA2C,CAAA,CACzE,MAAA,CAAO,OAAO,OAAA,KAA0B;AACvC,IAAA,IAAI;AAEF,MAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,MAAA,IAAI,MAAM,YAAA,CAAa,UAAA,EAAW,EAAG;AACnC,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,YAAA,EAAa;AAE9C,QAAA,MAAA,CAAO,KAAK,CAAA,iBAAA,EAAoB,KAAA,GAAQ,OAAO,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,6DAAA,CAA+D,CAAA;AAE1H,QAAA;AAAA,MACF;AAMA,MAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,CAAA,EAAW;AAC/B,QAAA,MAAM,aAAa,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,GAAQ,KAAA,CAAA;AAEvE,QAAA,MAAM,sBAAsB,UAAU,CAAA;AAAA,MACxC,CAAA,MAAO;AAEL,QAAA,MAAM,cAAA,EAAe;AAAA,MACvB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,mBAAA,EAAqB;AACxC,QAAA,MAAA,CAAO,KAAA,CAAM,MAAM,OAAO,CAAA;AAC1B,QAAA,IAAI,KAAA,CAAM,UAAA,IAAc,CAAC,MAAA,CAAO,QAAO,EAAG;AACxC,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,UAAU,CAAA;AAAA,QAC7B;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC7B;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AACL;;;AC1HO,SAAS,sBAAsBA,QAAAA,EAAwB;AAC5D,EAAAA,QAAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,sBAAsB,CAAA,CAClC,OAAO,YAAY;AAClB,IAAA,MAAM,eAAe,eAAA,EAAgB;AAGrC,IAAA,IAAI,CAAE,MAAM,YAAA,CAAa,UAAA,EAAW,EAAI;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,oBAAoB,CAAA;AAEzC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,YAAA,EAAa;AAG9C,IAAA,MAAM,WAAA;AAAA,MACJ,QAAA,CAAS,kBAAA;AAAA,MACT,YAAY;AACV,QAAA,MAAM,aAAa,QAAA,EAAS;AAAA,MAC9B,CAAA;AAAA,MACA,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAAE,KAC5B;AAEA,IAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,cAAA,EAAgB,QAAQ,EAAE,KAAA,KAAU,MAAS,CAAA;AACrE,IAAA,IAAI,KAAA,IAAS,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AAC7B,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF,CAAC,CAAA;AACL;;;AC9BA,SAAS,iBAAiB,KAAA,EAAsD;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAE7B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,WAAW,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA;AAElE,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAA,EAAS,GAAA,EAAK,OAAO,KAAA;AAG1B,EAAA,MAAM,cAAA,GAAiB,QAAQ,GAAA,GAAM,GAAA;AACrC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,EAAA,OAAO,OAAO,cAAA,GAAiB,GAAA;AACjC;AAUA,eAAsB,WAAA,GAA+B;AACnD,EAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,EAAA,IAAI,CAAE,MAAM,YAAA,CAAa,UAAA,EAAW,EAAI;AACtC,IAAA,MAAM,IAAI,gBAAA,EAAiB;AAAA,EAC7B;AAEA,EAAA,IAAI,KAAA,GAAQ,MAAM,YAAA,CAAa,QAAA,EAAS;AAExC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,gBAAA,EAAiB;AAAA,EAC7B;AAGA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,EAAgB;AAExD,IAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,MAAA,MAAM,aAAa,QAAA,EAAS;AAC5B,MAAA,MAAM,IAAI,iBAAiB,gDAAgD,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,YAAY,CAAA;AAGvD,MAAA,MAAM,YAAA,CAAa,QAAA,CAAS,SAAA,CAAU,WAAW,CAAA;AAEjD,MAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,QAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,SAAA,CAAU,YAAY,CAAA;AAAA,MAC3D;AAEA,MAAA,KAAA,GAAQ,SAAA,CAAU,WAAA;AAAA,IACpB,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,aAAa,QAAA,EAAS;AAE5B,MAAA,IAAI,iBAAiB,mBAAA,EAAqB;AACxC,QAAA,MAAM,IAAI,iBAAiB,gDAAgD,CAAA;AAAA,MAC7E;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;ACrFO,SAAS,sBAAsBA,QAAAA,EAAwB;AAC5D,EAAAA,QAAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,oCAAoC,CAAA,CAChD,OAAO,YAAY;AAClB,IAAA,MAAM,eAAe,eAAA,EAAgB;AAGrC,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,WAAA;AAAA,QACjB,QAAA,CAAS,eAAA;AAAA,QACT,MAAM,YAAY,KAAK,CAAA;AAAA,QACvB,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAAE,OAC5B;AAEA,MAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACnB,QAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AAAA,UACjB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,EAAU;AACnC,UAAA,MAAM,QAAA,GAAW,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEzE,UAAA,MAAA,CAAO,GAAA,CAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AAAA,QACjC;AACA,QAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,MACjB;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,YAAA,EAAa;AAEpD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACnB,UAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,EAAE,OAAO,WAAA,EAAa,MAAA,EAAQ,MAAM,CAAA;AAAA,QACzD,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,OAAA,EAAQ;AACf,UAAA,MAAA,CAAO,GAAA,CAAI,CAAA,OAAA,EAAU,WAAW,CAAA,CAAE,CAAA;AAClC,UAAA,MAAA,CAAO,IAAI,4CAA4C,CAAA;AACvD,UAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,QACjB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACL;ACpDA,IAAM,cAAA,GAA8E;AAAA,EAClF,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,CAAC,YAAA,EAAc,aAAa,CAAA;AAAA,IACrC,OAAA,EAAS,CAAC,eAAA,EAAiB,gBAAgB;AAAA,GAC7C;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS;AAAA,MACP,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,eAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAC,YAAA,EAAc,WAAW,CAAA;AAAA,IACnC,OAAA,EAAS,CAAC,eAAA,EAAiB,cAAc;AAAA,GAC3C;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,CAAC,YAAA,EAAc,gBAAgB,CAAA;AAAA,IACxC,OAAA,EAAS,CAAC,eAAA,EAAiB,mBAAmB;AAAA;AAElD,CAAA;AAEA,SAAS,qBAAqB,SAAA,EAA8B;AAC1D,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,eAAe,SAAS,CAAA;AAErD,EAAA,OAAO,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;;AAAA,gBAAA,EAAuD,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,CAAA;AAChH;AAEA,SAAS,oBAAoB,SAAA,EAA8B;AACzD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,CAAC,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAE,CAAA,EAAE,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AACvF;AAWA,eAAsB,iBAAA,CACpB,SAAA,EACA,SAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,WAAW,MAAA,EAAQ;AAEvB,EAAA,MAAM,UAAA,GAAa,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW,OAAA;AAGpD,EAAA,UAAA,CAAW,CAAA,WAAA,EAAc,UAAU,CAAA,UAAA,CAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAErD,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,MAAM,UAAUL,IAAAA,CAAK,SAAA,EAAW,mBAAmB,CAAA,EAAG,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAAA,EACvF,CAAA,MAAO;AACL,IAAA,MAAM,UAAUA,IAAAA,CAAK,SAAA,EAAW,YAAY,CAAA,EAAG,mBAAA,CAAoB,SAAS,CAAC,CAAA;AAAA,EAC/E;AAGA,EAAA,UAAA,CAAW,0BAAA,EAA4B,GAAG,CAAC,CAAA;AAE3C,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AACpD,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,MAAM,QAAA,CAAS,aAAA,EAAe,OAAO,CAAC,CAAA;AAEnE,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,eAAA,GAAkB,EAAE,gBAAA,EAAkB,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS;AACjE,IAAA,OAAA,GAAU,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,gBAAA,EAAiB;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,eAAA,GAAkB,EAAE,gBAAA,EAAkB,QAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS;AAC3E,IAAA,OAAA,GAAU,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,qBAAA,EAAsB;AAAA,EACnE;AAEA,EAAA,SAAA,CAAU,eAAA,GAAkB;AAAA,IAC1B,GAAG,SAAA,CAAU,eAAA;AAAA,IACb,GAAG;AAAA,GACL;AAEA,EAAA,SAAA,CAAU,OAAA,GAAU;AAAA,IAClB,GAAG,SAAA,CAAU,OAAA;AAAA,IACb,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,UAAU,aAAA,EAAe,IAAA,CAAK,UAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAC,CAAA;AACnE;ACpFA,eAAsB,gBAAA,CACpB,SAAA,EACA,SAAA,EACA,WAAA,EACe;AAEf,EAAA,IAAI,WAAA,KAAgB,GAAA,IAAO,WAAA,KAAgB,IAAA,EAAM;AAEjD,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,MAAA,EAAQ,WAAA;AAAA,IACR,OAAA,EAAS,GAAG,WAAW,CAAA,EAAA,CAAA;AAAA,IACvB,WAAA,EAAa;AAAA,GACf;AAGA,EAAA,MAAM,cAAA,CAAe,WAAW,MAAM,CAAA;AAGtC,EAAA,IAAI,SAAA,KAAc,OAAA,IAAW,SAAA,KAAc,KAAA,IAAS,cAAc,UAAA,EAAY;AAC5E,IAAA,MAAM,gBAAA,CAAiB,WAAW,MAAM,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,aAAA,CAAc,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA;AACvD;AAEA,eAAe,cAAA,CAAe,WAAmB,MAAA,EAAoC;AACnF,EAAA,MAAM,YAAA,GAAeA,IAAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AACpD,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,MAAMM,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAC,CAAA;AAGjE,EAAA,IAAI,QAAA,CAAS,iBAAiB,KAAA,EAAO;AACnC,IAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA;AAC3C,IAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,GAAI,CAAC,OAAO,WAAW,CAAA;AAAA,EACtE;AAEA,EAAA,MAAMC,UAAU,YAAA,EAAc,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AACjE;AAEA,eAAe,gBAAA,CAAiB,WAAmB,MAAA,EAAoC;AACrF,EAAA,MAAM,QAAA,GAAWP,IAAAA,CAAK,SAAA,EAAW,gBAAgB,CAAA;AAEjD,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,MAAMM,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAG9C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,mBAAA;AAAA,MACA,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,WAAA;AAAA,KACnB;AAEA,IAAA,MAAMC,SAAAA,CAAU,UAAU,OAAO,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,aAAA,CAAc,SAAA,EAAmB,SAAA,EAAwB,SAAA,EAAqC;AAC3G,EAAA,MAAM,MAAA,GAASP,IAAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,sBAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,kBAAkB,SAAA,EAAgC;AACzD,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IAEF;AACE,MAAA,OAAO,CAAC,OAAO,MAAM,CAAA;AAAA;AAE3B;AAEA,eAAe,sBAAA,CAAuB,GAAA,EAAa,SAAA,EAAwB,SAAA,EAAqC;AAC9G,EAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,kBAAkB,SAAS,CAAA;AAE9C,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAErC,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,MAAM,sBAAA,CAAuB,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA;AAAA,IAC7D,CAAA,MAAA,IAAW,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AAC3D,MAAA,MAAM,OAAA,GAAU,MAAMM,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAGhD,MAAA,MAAM,iBAAiB,OAAA,CAAQ,OAAA;AAAA,QAC7B,iBAAA;AAAA,QACA,SAAS,SAAS,CAAA,CAAA;AAAA,OACpB;AAEA,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,MAAMC,SAAAA,CAAU,UAAU,cAAc,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AC9GO,SAAS,0BAA0B,WAAA,EAAoC;AAC5E,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,eAAA;AAC9C,EAAA,MAAM,SAAS,IAAIT,aAAAA,CAAc,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEpD,EAAA,MAAA,CAAO,eAAe,WAAW,CAAA;AAEjC,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,mBAAA,CACpB,WAAA,EACA,SAAA,EACA,QAAA,GAAW,cAAA,EACM;AACjB,EAAA,MAAM,MAAA,GAAS,0BAA0B,WAAW,CAAA;AAGpD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,GAAA,CAA6B,sBAAsB,CAAA;AAG7E,EAAA,MAAM,UAAA,GAAaE,IAAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,QAAQ,UAAU,CAAA;AAExC,EAAA,MAAM,KAAA,CAAM,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAG9C,EAAA,MAAMO,UAAU,UAAA,EAAY,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAEzD,EAAA,OAAO,UAAA;AACT;AClCA,eAAsB,eAAA,CACpB,WACA,SAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAcP,IAAAA,CAAK,SAAA,EAAW,iBAAiB,CAAA;AAErD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,WAAA,EAAaQ,WAAA,CAAU,IAAI,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,MAAM,UAAA,GAAaR,IAAAA,CAAK,WAAA,EAAa,SAAS,CAAA;AAE9C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,UAAA,EAAYQ,WAAA,CAAU,IAAI,CAAA;AACvC,MAAA,MAAM,EAAA,CAAG,YAAY,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,GAAG,WAAA,EAAa,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACxD;ACjCA,IAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAKhC,IAAM,iBAAA,GAAoB,mZAAA,CAAsB,KAAA,CAAM,GAAG,CAAA;AAMzD,IAAM,wBAAA,GAA6D;AAAA,EACjE,MAAA,EAAQ;AAAA,IACN,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,GAAA,EAAK,CAAC,YAAA,EAAc,MAAM,CAAA;AAAA,EAC1B,QAAA,EAAU;AAAA,IACR,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA;AAEJ,CAAA;AAEO,SAAS,qBAAA,CAAsB,WAAwB,SAAA,EAA+B;AAC3F,EAAA,OAAO,wBAAA,CAAyB,SAAS,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA;AAC/D;AAMO,SAAS,wBAAA,CAAyB,WAAwB,SAAA,EAA8B;AAC7F,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,QAAA;AACH,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,OAAO,mHAAA;AAAA,MACT;AAEA,MAAA,OAAO,+DAA+D,SAAS,CAAA,CAAA;AAAA,IAEjF,KAAK,QAAA;AAAA,IAEL,KAAK,QAAA;AACH,MAAA,IAAI,cAAc,KAAA,EAAO;AACvB,QAAA,OAAO,mEAAA;AAAA,MACT;AAEA,MAAA,OAAO,mCAAmC,SAAS,CAAA,CAAA;AAAA,IAErD,KAAK,YAAA;AACH,MAAA,OAAO,qEAAqE,SAAS,CAAA,CAAA;AAAA,IAEvF;AACE,MAAA,OAAO,CAAA,EAAG,SAAS,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA;AAAA;AAE7D;AAUA,eAAsB,WAAA,CACpB,SAAA,EACA,cAAA,EACA,KAAA,EACA,WACA,UAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAc,cAAc,CAAA;AAGxC,EAAA,UAAA,CAAW,qCAAA,EAAuC,GAAG,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,wCAAA,EAA2C,SAAS,CAAA,CAAA,EAAI;AAAA,IAC5E,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,0BAAA,EAA4B,GAAG,CAAC,CAAA;AAC3C,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,kCAAA,CAAA,EAAsC;AAAA,IAC1D,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,iCAAA,EAAmC,GAAG,CAAC,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqBR,IAAAA,CAAK,SAAA,EAAW,iBAAiB,CAAA;AAC5D,EAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,MAAMM,QAAAA,CAAS,kBAAA,EAAoB,OAAO,CAAC,CAAA;AAE7E,EAAA,cAAA,CAAe,KAAA,GAAQ,SAAS,KAAK,CAAA,CAAA;AACrC,EAAA,MAAMC,UAAU,kBAAA,EAAoB,IAAA,CAAK,UAAU,cAAA,EAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAG3E,EAAA,UAAA,CAAW,iCAAA,EAAmC,GAAG,CAAC,CAAA;AAClD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,0CAAA,CAAA,EAA8C;AAAA,IAClE,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAMA,eAAsB,WAAA,CACpB,SAAA,EACA,cAAA,EACA,KAAA,EACA,WACA,UAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAc,cAAc,CAAA;AAGxC,EAAA,UAAA,CAAW,qCAAA,EAAuC,GAAG,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,wCAAA,EAA2C,SAAS,CAAA,CAAA,EAAI;AAAA,IAC5E,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,0BAAA,EAA4B,GAAG,CAAC,CAAA;AAC3C,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,kCAAA,CAAA,EAAsC;AAAA,IAC1D,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,iCAAA,EAAmC,GAAG,CAAC,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqBP,IAAAA,CAAK,SAAA,EAAW,iBAAiB,CAAA;AAC5D,EAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,MAAMM,QAAAA,CAAS,kBAAA,EAAoB,OAAO,CAAC,CAAA;AAE7E,EAAA,cAAA,CAAe,KAAA,GAAQ,SAAS,KAAK,CAAA,CAAA;AACrC,EAAA,MAAMC,UAAU,kBAAA,EAAoB,IAAA,CAAK,UAAU,cAAA,EAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAG3E,EAAA,UAAA,CAAW,iCAAA,EAAmC,GAAG,CAAC,CAAA;AAClD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,0CAAA,CAAA,EAA8C;AAAA,IAClE,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,iCAAA,EAAmC,GAAG,CAAC,CAAA;AAClD,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,IAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,gEAAA,EAAmE,SAAS,CAAA,uBAAA,CAAA,EAA2B;AAAA,MAC3H,GAAA,EAAK,SAAA;AAAA,MACL,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;AAKA,eAAsB,cAAA,CACpB,SAAA,EACA,cAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAc,cAAc,CAAA;AAGxC,EAAA,UAAA,CAAW,4BAAA,EAA8B,GAAG,CAAC,CAAA;AAC7C,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,6BAAA,CAAA,EAAiC;AAAA,IACrD,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,qCAAA,EAAuC,GAAG,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,+BAAA,CAAA,EAAmC;AAAA,IACvD,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAKA,eAAsB,WAAA,CACpB,SAAA,EACA,SAAA,EACA,cAAA,EACA,UAAA,EACe;AAEf,EAAA,UAAA,CAAW,+BAAA,EAAiC,GAAG,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,kBAAkB,cAAc,CAAA;AAEnD,EAAA,MAAM,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA,4BAAA,CAAA,EAAgC;AAAA,IAC3D,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,UAAA,CAAW,uBAAA,EAAyB,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,kBAAkB,SAAS,CAAA;AAGjC,EAAA,UAAA,CAAW,0BAAA,EAA4B,GAAG,CAAC,CAAA;AAC3C,EAAA,MAAM,iBAAA,CAAkB,WAAW,SAAS,CAAA;AAC9C;AAKA,eAAsB,eACpB,SAAA,EACA,SAAA,EACA,WACA,cAAA,EACA,UAAA,EACA,OACA,SAAA,EACe;AACf,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,qBAAA,CAAsB,SAAA,EAAW,SAAS,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,KAAA,CAAM,wBAAA,CAAyB,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EAChE;AAEA,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,QAAA;AACH,MAAA,MAAM,WAAA;AAAA,QACJ,SAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,IAAS,MAAA;AAAA,QACT,SAAA,IAAa,MAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,MAAM,WAAA;AAAA,QACJ,SAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,IAAS,MAAA;AAAA,QACT,SAAA,IAAa,MAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,MAAM,cAAA,CAAe,SAAA,EAAW,cAAA,EAAgB,UAAU,CAAA;AAC1D,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,MAAM,WAAA,CAAY,SAAA,EAAW,SAAA,EAAiC,cAAA,EAAgB,UAAU,CAAA;AACxF,MAAA;AAAA;AAEN;AAIA,SAAS,cAAc,cAAA,EAAgC;AACrD,EAAA,QAAQ,cAAA;AAAgB,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IAET,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IAET;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,kBAAkB,cAAA,EAAgC;AACzD,EAAA,QAAQ,cAAA;AAAgB,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IAET,KAAK,KAAA;AACH,MAAA,OAAO,SAAA;AAAA,IAET;AACE,MAAA,OAAO,aAAA;AAAA;AAEb;AAMA,eAAe,kBAAkB,SAAA,EAAkC;AACjE,EAAA,MAAM,gBAAA,GAAmB,CAACP,IAAAA,CAAK,SAAA,EAAW,wBAAwB,CAAA,EAAGA,IAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA;AAE7G,EAAA,MAAM,GAAA,GAAM,CAAA;AAAA;AAAA,CAAA;AAIZ,EAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,IAAA,IAAI;AACF,MAAA,MAAMM,QAAAA,CAAS,SAAS,OAAO,CAAA;AAC/B,MAAA,MAAMC,SAAAA,CAAU,OAAA,EAAS,GAAA,EAAK,OAAO,CAAA;AAErC,MAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,eAAe,iBAAA,CAAkB,WAAmB,SAAA,EAA8C;AAChG,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,MAAM,wBAAwB,SAAS,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,MAAM,uBAAuB,SAAS,CAAA;AAAA,EACxC;AACF;AAEA,eAAe,wBAAwB,SAAA,EAAkC;AAEvE,EAAA,MAAM,aAAA,GAAgBP,IAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AASzB,EAAA,MAAMO,SAAAA,CAAU,aAAA,EAAe,gBAAA,EAAkB,OAAO,CAAA;AAGxD,EAAA,MAAM,UAAA,GAAaP,IAAAA,CAAK,SAAA,EAAW,oBAAoB,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,IAAI,aAAA,GAAgB,MAAMM,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAGtD,IAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,WAAW,CAAA,EAAG;AACxC,MAAA,aAAA,GAAgB,aAAA,CAAc,OAAA;AAAA,QAC5B,iBAAA;AAAA,QACA,CAAA,KAAA,KAAS,GAAG,KAAK,CAAA;AAAA;AAAA,OACnB;AAGA,MAAA,aAAA,GAAgB,aAAA,CAAc,OAAA;AAAA,QAC5B,yDAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAMC,SAAAA,CAAU,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,uBAAuB,SAAA,EAAkC;AACtE,EAAA,MAAM,QAAA,GAAWP,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,MAAMM,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAG9C,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,iBAAA;AAAA,QACA,CAAA,KAAA,KAAS,GAAG,KAAK,CAAA;AAAA;AAAA,OACnB;AAGA,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAMC,SAAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;ACrYA,IAAM,yBAAA,GAAyG;AAAA,EAC7G,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,QAAA,EAAS;AAAA,EAC9C,gBAAA,EAAkB,EAAE,IAAA,EAAM,uBAAA,EAAyB,SAAS,SAAA,EAAU;AAAA,EACtE,oBAAA,EAAsB,EAAE,IAAA,EAAM,qBAAA,EAAuB,SAAS,QAAA;AAChE,CAAA;AAKO,SAAS,6BAA6B,SAAA,EAA2C;AACtF,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,OAAA;AAAA,IAEL,KAAK,QAAA;AAAA,IAEL,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACF;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,sBAAsB,MAAM,CAAA;AAAA,IAEtC;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;AAMA,eAAsB,oBAAA,CACpB,SAAA,EACA,SAAA,EACA,eAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,oBAAoB,MAAA,EAAQ;AAEhC,EAAA,MAAM,UAAA,GAAa,eAAA,KAAoB,SAAA,GAAY,CAAA,GAAI,CAAA;AAGvD,EAAA,UAAA,CAAW,sBAAA,EAAwB,GAAG,UAAU,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,0BAA0B,eAAe,CAAA;AAErD,EAAA,MAAM,0BAAA,CAA2B,SAAA,EAAW,GAAA,CAAI,IAAA,EAAM,IAAI,OAAO,CAAA;AAGjE,EAAA,UAAA,CAAW,2BAAA,EAA6B,GAAG,UAAU,CAAA;AAErD,EAAA,QAAQ,eAAA;AAAiB,IACvB,KAAK,SAAA;AACH,MAAA,MAAM,mBAAmB,SAAS,CAAA;AAClC,MAAA;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,MAAM,uBAAuB,SAAS,CAAA;AACtC,MAAA;AAAA,IAEF,KAAK,oBAAA;AACH,MAAA,MAAM,qBAAqB,SAAS,CAAA;AACpC,MAAA;AAAA;AAIJ,EAAA,IAAI,oBAAoB,SAAA,EAAW;AACjC,IAAA,UAAA,CAAW,yBAAA,EAA2B,GAAG,UAAU,CAAA;AAEnD,IAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,MAAA,MAAM,sBAAA,CAAuB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,oBAAoB,oBAAA,EAAsB;AACnD,MAAA,MAAM,mBAAmB,SAAS,CAAA;AAAA,IACpC;AAAA,EACF;AACF;AAIA,eAAe,0BAAA,CAA2B,SAAA,EAAmB,IAAA,EAAc,OAAA,EAAgC;AACzG,EAAA,MAAM,OAAA,GAAUP,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAC9C,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,MAAMM,QAAAA,CAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAEvD,EAAA,GAAA,CAAI,YAAA,GAAe,GAAA,CAAI,YAAA,IAAgB,EAAC;AACxC,EAAA,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,GAAI,OAAA;AAEzB,EAAA,MAAMC,SAAAA,CAAU,SAAS,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAChE;AAEA,eAAe,mBAAmB,SAAA,EAAkC;AAClE,EAAA,MAAM,SAAA,GAAYP,IAAAA,CAAK,SAAA,EAAW,wBAAwB,CAAA;AAE1D,EAAA,MAAMS,MAAMC,OAAAA,CAAQ,SAAS,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,EAAA,MAAMH,UAAU,SAAA,EAAW,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAa1B,OAAO,CAAA;AACV;AAEA,eAAe,uBAAuB,SAAA,EAAkC;AACtE,EAAA,MAAM,UAAA,GAAaP,IAAAA,CAAK,SAAA,EAAW,yBAAyB,CAAA;AAE5D,EAAA,MAAMS,MAAMC,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAMH,UAAU,UAAA,EAAY,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAU3B,OAAO,CAAA;AACV;AAEA,eAAe,qBAAqB,SAAA,EAAkC;AACpE,EAAA,MAAM,UAAA,GAAaP,IAAAA,CAAK,SAAA,EAAW,yBAAyB,CAAA;AAE5D,EAAA,MAAMS,MAAMC,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAMH,UAAU,UAAA,EAAY,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAY3B,OAAO,CAAA;AACV;AAEA,eAAe,sBAAA,CAAuB,WAAmB,SAAA,EAAuC;AAC9F,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,MAAM,wBAAwB,SAAS,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,MAAM,2BAAA,CAA4B,WAAW,SAAS,CAAA;AAAA,EACxD;AACF;AAEA,eAAe,wBAAwB,SAAA,EAAkC;AAEvE,EAAA,MAAM,aAAA,GAAgBP,IAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAE7D,EAAA,MAAMO,UAAU,aAAA,EAAe,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA,EAS9B,OAAO,CAAA;AAGR,EAAA,MAAM,UAAA,GAAaP,IAAAA,CAAK,SAAA,EAAW,oBAAoB,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,MAAMM,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAEhD,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAElC,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,mBAAA;AAAA,QACA,CAAA,KAAA,KAAS,GAAG,KAAK,CAAA;AAAA;AAAA,OACnB;AAGA,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAMC,SAAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,2BAAA,CAA4B,WAAmB,SAAA,EAAuC;AACnG,EAAA,MAAM,QAAA,GAAWP,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,MAAMM,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAE9C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAG7C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,mBAAA;AAAA,MACA,CAAA,KAAA,KAAS,GAAG,KAAK,CAAA;AAAA;AAAA;AAAA,KACnB;AAEA,IAAA,IAAI,cAAc,UAAA,EAAY;AAE5B,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,mBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAMC,SAAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,mBAAmB,SAAA,EAAkC;AAClE,EAAA,MAAM,QAAA,GAAWP,IAAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,MAAMM,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAE9C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAGxC,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,mBAAA;AAAA,MACA,CAAA,KAAA,KAAS,GAAG,KAAK,CAAA;AAAA;AAAA;AAAA,KACnB;AAGA,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,oBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAMC,SAAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACjOA,IAAMI,UAAAA,GAAYC,UAAUC,IAAI,CAAA;AAKhC,IAAM,kBAAA,GAAqB,+BAAA,CAAuB,KAAA,CAAM,GAAG,CAAA;AAuC3D,SAAS,yBAAyB,OAAA,EAA8B;AAE9D,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,KAAA;AAAA,IACR,OAAA,CAAQ,GAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,qBAAA,CAAsB,sCAAA,EAAwC,uBAAuB,CAAA;AAAA,EACjG;AAGA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,SAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,4CAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,aAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,qBAAA,CAAsB,mDAAA,EAAqD,qCAAqC,CAAA;AAAA,EAC5H;AAGA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,KAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,qBAAA,CAAsB,gCAAA,EAAkC,2BAA2B,CAAA;AAAA,EAC/F;AAGA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,GAAA;AAAA,IACR,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,qBAAA,CAAsB,8BAAA,EAAgC,6BAA6B,CAAA;AAAA,EAC/F;AACF;AAEA,SAAS,0BAAA,CAA2B,WAA0B,SAAA,EAA4B;AACxF,EAAA,IAAI,cAAc,MAAA,EAAQ;AAE1B,EAAA,IAAI,CAAC,qBAAA,CAAsB,SAAA,EAAW,SAAS,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,KAAK,SAAS,CAAA,CAAA;AAAA,MACd,wBAAA,CAAyB,WAAW,SAAS;AAAA,KAC/C;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,OAAA,EAAmD;AAChF,EAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,QAAA;AAC3B,EAAA,IAAI,OAAA,CAAQ,OAAO,OAAO,OAAA;AAC1B,EAAA,IAAI,OAAA,CAAQ,KAAK,OAAO,KAAA;AACxB,EAAA,IAAI,OAAA,CAAQ,UAAU,OAAO,UAAA;AAE7B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,sBAAsB,OAAA,EAA+C;AAC5E,EAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,QAAA;AAC3B,EAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,QAAA;AAC3B,EAAA,IAAI,OAAA,CAAQ,WAAW,OAAO,YAAA;AAC9B,EAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,QAAA;AAE3B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,OAAA,EAAgD;AAC1E,EAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,QAAA;AAC3B,EAAA,IAAI,OAAA,CAAQ,OAAO,OAAO,OAAA;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAU,OAAO,MAAA;AAE7B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,2BAA2B,OAAA,EAAwD;AAC1F,EAAA,IAAI,OAAA,CAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,IAAI,OAAA,CAAQ,KAAK,OAAO,KAAA;AACxB,EAAA,IAAI,OAAA,CAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,IAAI,OAAA,CAAQ,KAAK,OAAO,KAAA;AAExB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,4BAA4B,OAAA,EAAqD;AACxF,EAAA,IAAI,OAAA,CAAQ,SAAS,OAAO,SAAA;AAC5B,EAAA,IAAI,OAAA,CAAQ,eAAe,OAAO,gBAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,kBAAkB,OAAO,oBAAA;AAErC,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,sBAAA,EAAwB,aAAa,sCAAA,EAAuC;AAAA,EACrG,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAA,EAAgB,aAAa,0CAAA,EAA2C;AAAA,EAChG,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,aAAa,yCAAA,EAA0C;AAAA,EAC3F,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,kBAAA,EAAoB,aAAa,2CAAA;AAC9D,CAAA;AAGA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,yBAAA,EAA2B,aAAa,6CAAA,EAA8C;AAAA,EAC/G,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,EACnF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,EAC1E,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,uBAAA,EAAyB,aAAa,yCAAA;AAC/D,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA,EACzB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,yBAAA,EAA2B,aAAa,6CAAA,EAA8C;AAAA,EAC/G,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,EACnF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,EAC1E,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,uBAAA,EAAyB,aAAa,yCAAA;AAC/D,CAAA;AAEA,IAAM,mBAAmB,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,0BAAA,EAA4B,WAAA,EAAa,uBAAA,EAAwB,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,uBAAA,EAAyB,WAAA,EAAa,2CAA2C,CAAA;AAEnO,IAAM,qBAAA,GAAwB;AAAA,EAC5B,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,aAAa,6CAAA,EAA8C;AAAA,EACjG,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,EACnF,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,uBAAA,EAAyB,aAAa,yCAAA;AAC/D,CAAA;AAEA,SAAS,2BAA2B,SAAA,EAA0B;AAC5D,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IAET,KAAK,OAAA;AACH,MAAA,OAAO,kBAAA;AAAA,IAET,KAAK,KAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IAET,KAAK,UAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IAET;AACE,MAAA,OAAO,kBAAA;AAAA;AAEb;AAGA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,8BAAA,EAAgC,aAAa,8BAAA,EAA+B;AAAA,EAC7G,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,aAAa,0BAAA,EAA2B;AAAA,EAC7E,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,qBAAA;AAC9C,CAAA;AAEA,IAAM,iBAAiB,CAAC,EAAE,IAAA,EAAM,oBAAA,EAAsB,OAAO,kCAAA,EAAoC,WAAA,EAAa,8BAAA,EAA+B,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAQ,WAAA,EAAa,uBAAuB,CAAA;AAEnN,SAAS,+BAA+B,SAAA,EAA0B;AAChE,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,cAAA;AAAA,IAET;AACE,MAAA,OAAO,gBAAA;AAAA;AAEb;AAEA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,oBAAA,EAAsB,aAAa,0BAAA,EAA2B;AAAA,EACrF,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,iBAAA,EAAkB;AAAA,EAC9D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,kBAAA,EAAmB;AAAA,EAC/D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,gBAAA,EAAiB;AAAA,EAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,kBAAA;AAC9C,CAAA;AAEA,IAAM,yBAAA,GAA4B;AAAA,EAChC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAkB,aAAa,mBAAA,EAAoB;AAAA,EAC1E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,aAAa,kBAAA,EAAmB;AAAA,EACjE,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,aAAa,WAAA,EAAY;AAAA,EAC9D,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,aAAa,WAAA,EAAY;AAAA,EAC1D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,eAAA;AAC9C,CAAA;AAEA,IAAM,OAAA,GAAU;AAAA,EACd,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,sBAAA,EAAwB,aAAa,qCAAA,EAAsC;AAAA,EACpG,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,aAAa,uCAAA,EAAwC;AAAA,EACtF,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,qCAAA;AAC9C,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,oBAAA,EAAsB,aAAa,4BAAA,EAA6B;AAAA,EACvF,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,aAAa,iCAAA,EAAkC;AAAA,EAC5E,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,4BAAA,EAA6B;AAAA,EACzE,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,aAAa,+BAAA;AAC5C,CAAA;AAEA,IAAM,kBAAA,GAAqB,kCAAA;AAG3B,SAAS,gBAAgB,SAAA,EAA2B;AAClD,EAAA,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC3C;AAEA,eAAe,gBAAgB,IAAA,EAAgC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAMC,MAAAA,CAAO,IAAA,EAAMN,SAAAA,CAAU,IAAI,CAAA;AAEjC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,sBAAsBH,QAAAA,EAAwB;AAC5D,EAAAA,QAAAA,CACG,QAAQ,eAAe,CAAA,CACvB,YAAY,4CAA4C,CAAA,CACxD,OAAO,mBAAA,EAAqB,uBAAuB,EAEnD,MAAA,CAAO,UAAA,EAAY,uBAAuB,CAAA,CAC1C,MAAA,CAAO,WAAW,4BAA4B,CAAA,CAC9C,MAAA,CAAO,OAAA,EAAS,0BAA0B,CAAA,CAC1C,OAAO,YAAA,EAAc,8CAA8C,EAEnE,MAAA,CAAO,UAAA,EAAY,0CAA0C,CAAA,CAC7D,MAAA,CAAO,YAAY,uCAAuC,CAAA,CAC1D,OAAO,cAAA,EAAgB,sBAAsB,EAC7C,MAAA,CAAO,UAAA,EAAY,6BAA6B,CAAA,CAEhD,MAAA,CAAO,WAAA,EAAa,6DAA6D,CAAA,CACjF,MAAA,CAAO,oBAAoB,oEAAoE,CAAA,CAC/F,OAAO,sBAAA,EAAwB,mDAAmD,EAElF,MAAA,CAAO,sBAAA,EAAwB,iEAAiE,CAAA,CAEhG,MAAA,CAAO,YAAY,wBAAwB,CAAA,CAC3C,OAAO,SAAA,EAAW,uBAAuB,EACzC,MAAA,CAAO,aAAA,EAAe,2BAA2B,CAAA,CAEjD,MAAA,CAAO,kBAAA,EAAoB,gDAAgD,CAAA,CAE3E,MAAA,CAAO,UAAU,0BAA0B,CAAA,CAC3C,OAAO,OAAA,EAAS,yBAAyB,EACzC,MAAA,CAAO,QAAA,EAAU,0BAA0B,CAAA,CAC3C,MAAA,CAAO,SAAS,yBAAyB,CAAA,CAEzC,OAAO,SAAA,EAAW,2EAA2E,CAAA,CAC7F,WAAA,CAAY,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoBzB,CAAA,CACI,MAAA,CAAO,OAAO,IAAA,EAAe,OAAA,KAA4B;AAExD,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,EAAY;AAGtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,wBAAA,CAAyB,OAAO,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,kBAAA,GAAqB,OAAA,GAAU,qBAAA,CAAsB,OAAO,CAAA,GAAI,MAAA;AACtE,IAAA,MAAM,kBAAA,GAAqB,OAAA,GAAU,qBAAA,CAAsB,OAAO,CAAA,GAAI,MAAA;AACtE,IAAA,MAAM,eAAA,GAAkB,OAAA,GAAU,kBAAA,CAAmB,OAAO,CAAA,GAAI,MAAA;AAChE,IAAA,MAAM,uBAAA,GAA0B,OAAA,GAAU,0BAAA,CAA2B,OAAO,CAAA,GAAI,MAAA;AAChF,IAAA,MAAM,iBAAiB,OAAA,EAAS,KAAA;AAGhC,IAAA,MAAM,SAAA,GAAY,kBAAA,IAAsB,MAAMU,MAAAA,CAAO;AAAA,MACnD,SAAS,QAAA,CAAS,uBAAA;AAAA,MAClB,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC5B,MAAM,CAAA,CAAE,KAAA;AAAA,QACR,OAAO,CAAA,CAAE;AAAA,OACX,CAAE;AAAA,KACH,CAAA;AAGD,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,oBAAA,GAAuB,2BAA2B,SAAS,CAAA;AAEjE,IAAA,IAAI,kBAAA,EAAoB;AAEtB,MAAA,0BAAA,CAA2B,WAAW,kBAAkB,CAAA;AACxD,MAAA,SAAA,GAAY,kBAAA;AAAA,IACd,WAAW,kBAAA,EAAoB;AAE7B,MAAA,SAAA,GAAY,MAAA;AAAA,IACd,CAAA,MAAO;AAEL,MAAA,SAAA,GAAY,MAAMA,MAAAA,CAAO;AAAA,QACvB,SAAS,QAAA,CAAS,wBAAA;AAAA,QAClB,OAAA,EAAS,oBAAA,CAAqB,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACtC,MAAM,CAAA,CAAE,KAAA;AAAA,UACR,OAAO,CAAA,CAAE;AAAA,SACX,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,WAAA,GAAc,MAAA;AAClB,IAAA,IAAI,SAAA,GAAY,MAAA;AAEhB,IAAA,IAAI,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,QAAA,EAAU;AACpD,MAAA,IAAI,CAAC,kBAAA,EAAoB;AAEvB,QAAA,WAAA,GAAc,MAAMA,MAAAA,CAAO;AAAA,UACzB,OAAA,EAAS,yBAAA;AAAA,UACT,OAAA,EAAS,oBAAA,CAAqB,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YACtC,MAAM,CAAA,CAAE,KAAA;AAAA,YACR,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,aAAa,CAAA,CAAE;AAAA,WACjB,CAAE;AAAA,SACH,CAAA;AAGD,QAAA,SAAA,GAAY,MAAMA,MAAAA,CAAO;AAAA,UACvB,OAAA,EAAS,oBAAA;AAAA,UACT,OAAA,EAAS,yBAAA,CAA0B,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YAC3C,MAAM,CAAA,CAAE,KAAA;AAAA,YACR,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,aAAa,CAAA,CAAE;AAAA,WACjB,CAAE;AAAA,SACH,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,IAAI,CAAC,kBAAA,CAAmB,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnD,YAAA,MAAM,IAAI,sBAAsB,cAAA,EAAgB,CAAA,gBAAA,EAAmB,mBAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UACpG;AACA,UAAA,CAAC,EAAE,WAAU,GAAI,OAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,wBAAA,GAA2B,OAAA,GAAU,2BAAA,CAA4B,OAAO,CAAA,GAAI,MAAA;AAClF,IAAA,MAAM,gBAAA,GAAmB,+BAA+B,SAAS,CAAA;AACjE,IAAA,IAAI,eAAA,GAAmC,MAAA;AAEvC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,IAAI,wBAAA,EAA0B;AAE5B,QAAA,MAAM,UAAA,GAAa,6BAA6B,SAAS,CAAA;AAEzD,QAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,wBAAwB,CAAA,EAAG;AAClD,UAAA,MAAM,IAAI,qBAAA;AAAA,YACR,KAAK,wBAAwB,CAAA,CAAA;AAAA,YAC7B,uBAAuB,SAAS,CAAA;AAAA,WAClC;AAAA,QACF;AACA,QAAA,eAAA,GAAkB,wBAAA;AAAA,MACpB,CAAA,MAAA,IAAW,CAAC,kBAAA,EAAoB;AAE9B,QAAA,eAAA,GAAkB,MAAMA,MAAAA,CAAO;AAAA,UAC7B,SAAS,QAAA,CAAS,8BAAA;AAAA,UAClB,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YAClC,MAAM,CAAA,CAAE,KAAA;AAAA,YACR,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,aAAa,CAAA,CAAE;AAAA,WACjB,CAAE;AAAA,SACH,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,eAAA,IAAmB,MAAMA,MAAAA,CAAO;AAAA,MAC7C,SAAS,QAAA,CAAS,oBAAA;AAAA,MAClB,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACzB,MAAM,CAAA,CAAE,KAAA;AAAA,QACR,OAAO,CAAA,CAAE;AAAA,OACX,CAAE;AAAA,KACH,CAAA;AAGD,IAAA,IAAI,WAAA,GAAc,IAAA;AAElB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc,MAAMC,KAAAA,CAAM;AAAA,QACxB,SAAS,QAAA,CAAS,mBAAA;AAAA,QAClB,OAAA,EAAS,MAAM,SAAS,CAAA,IAAA,CAAA;AAAA,QACxB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,0BAAA;AAC1B,UAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,KAAK,GAAG,OAAO,qDAAA;AAExC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,WAAA,GAAc,GAAA;AAElB,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,IAAI,CAAC,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,qBAAA,CAAsB,SAAA,EAAW,yBAAyB,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,cAAc,CAAA,EAAG;AAC3C,QAAA,MAAM,IAAI,qBAAA,CAAsB,SAAA,EAAW,mCAAmC,CAAA;AAAA,MAChF;AACA,MAAA,WAAA,GAAc,cAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,MAAM,cAAA,GAAiB,MAAMD,MAAAA,CAAO;AAAA,QAClC,SAAS,QAAA,CAAS,sBAAA;AAAA,QAClB,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,0BAAA,EAA4B,KAAA,EAAO,KAAA,EAAM,EAAG,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,MAAM;AAAA,OACtG,CAAA;AAED,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,WAAA,GAAc,MAAMC,KAAAA,CAAM;AAAA,UACxB,SAAS,QAAA,CAAS,mBAAA;AAAA,UAClB,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,0BAAA;AAC1B,YAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,GAAG,OAAO,yBAAA;AACnC,YAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,KAAK,GAAG,OAAO,mCAAA;AAE3C,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,uBAAA,IAA2B,MAAMD,MAAAA,CAAO;AAAA,MAC7D,SAAS,QAAA,CAAS,6BAAA;AAAA,MAClB,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,QACnC,MAAM,EAAA,CAAG,KAAA;AAAA,QACT,OAAO,EAAA,CAAG;AAAA,OACZ,CAAE;AAAA,KACH,CAAA;AAGD,IAAA,MAAM,YAAY,OAAA,EAAS,IAAA,GAAOf,KAAK,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,GAAI,WAAA;AAGpE,IAAA,IAAI,MAAM,eAAA,CAAgB,SAAS,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,mBAAmB,WAAW,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,WAAA,GAAc,SAAS,KAAA,KAAU,IAAA;AACvC,IAAA,MAAM,YAAA,GAAe,gBAAgB,SAAS,CAAA;AAE9C,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,iBAAiB,CAAA;AACrC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,MAAM,WAAA;AAAA,QACJ,QAAA,CAAS,oBAAA;AAAA,QACT,YAAY;AACV,UAAA,MAAM,gBAAgBU,OAAAA,CAAQA,OAAAA,CAAQ,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAC,CAAA;AACrE,UAAA,MAAM,mBAAmB,OAAA,CAAQ,aAAA,EAAe,IAAA,EAAM,IAAA,EAAM,aAAa,SAAS,CAAA;AAElF,UAAA,IAAI;AACF,YAAA,MAAMI,MAAAA,CAAO,gBAAA,EAAkBN,SAAAA,CAAU,IAAI,CAAA;AAAA,UAC/C,CAAA,CAAA,MAAQ;AACN,YAAA,MAAM,IAAI,aAAA;AAAA,cACR,gCAAgC,gBAAgB;AAAA,mEAAA;AAAA,aAClD;AAAA,UACF;AAEA,UAAA,MAAMS,GAAG,gBAAA,EAAkB,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAGzD,UAAA,MAAM,WAAA,GAAcjB,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAClD,UAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,MAAMM,QAAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAC/D,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAA;AAE/C,UAAA,KAAA,MAAW,OAAA,IAAW,CAAC,cAAA,EAAgB,iBAAiB,CAAA,EAAY;AAClE,YAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAE5B,YAAA,IAAI,CAAC,IAAA,EAAM;AAEX,YAAA,KAAA,MAAW,CAACY,KAAAA,EAAM,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClD,cAAA,IAAIA,KAAAA,CAAK,UAAA,CAAW,WAAW,CAAA,IAAK,YAAY,QAAA,EAAU;AACxD,gBAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC5C,gBAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAEhD,gBAAA,IAAI;AACF,kBAAA,MAAMJ,MAAAA,CAAO,WAAA,EAAaN,SAAAA,CAAU,IAAI,CAAA;AACxC,kBAAA,IAAA,CAAKU,KAAI,CAAA,GAAI,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,gBAClC,CAAA,CAAA,MAAQ;AAEN,kBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+BA,KAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,gBACrE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAMX,SAAAA,CAAU,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AAAA,QACtE;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAKL,MAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,MAAA,IAAI,WAAA,GAAc,MAAM,YAAA,CAAa,cAAA,EAAe;AAEpD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,GAAA,CAAI,SAAS,sBAAsB,CAAA;AAC1C,QAAA,WAAA,GAAc,MAAMJ,QAAAA,CAAS;AAAA,UAC3B,SAAS,QAAA,CAAS,oBAAA;AAAA,UAClB,IAAA,EAAM;AAAA,SACP,CAAA;AAGD,QAAA,MAAM,YAAA,CAAa,eAAe,WAAW,CAAA;AAC7C,QAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,mBAAmB,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,WAAA;AAAA,QACJ,QAAA,CAAS,kBAAA;AAAA,QACT,YAAY;AAEV,UAAA,MAAM,cAAA,GAAiB,OAAA,CAAQgB,OAAAA,EAAQ,EAAG,wCAAwC,CAAA;AAElF,UAAA,IAAIC,UAAAA,CAAW,cAAc,CAAA,EAAG;AAC9B,YAAA,MAAMC,GAAG,cAAA,EAAgB,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,UAC3D;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,CAAiB,CAAA,GAAA,EAAM,YAAY,CAAA,CAAA,EAAI;AAAA,cAC3C,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAG9D,YAAA,IAAI,aAAa,QAAA,CAAS,KAAK,KAAK,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AAChE,cAAA,MAAM,YAAA,CAAa,eAAe,EAAE,CAAA;AACpC,cAAA,MAAM,IAAI,aAAA;AAAA,gBACR,CAAA,EAAG,SAAS,qBAAqB;AAAA,EAAK,YAAY,CAAA;AAAA,eACpD;AAAA,YACF;AAGA,YAAA,IAAI,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,cAAA,MAAM,IAAI,aAAA;AAAA,gBACR,CAAA;AAAA;AAAA,EAA6G,YAAY,CAAA;AAAA,eAC3H;AAAA,YACF;AAEA,YAAA,MAAM,IAAI,aAAA,CAAc,CAAA,6BAAA,EAAgC,YAAY,CAAA,CAAE,CAAA;AAAA,UACxE;AAGA,UAAA,IAAI;AACF,YAAA,MAAMP,OAAOd,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAA,EAAGQ,UAAU,IAAI,CAAA;AAAA,UAC9D,CAAA,CAAA,MAAQ;AACN,YAAA,MAAM,IAAI,aAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,KAAgB,GAAA,IAAO,WAAA,KAAgB,IAAA,EAAM;AAC/C,MAAA,MAAM,WAAA;AAAA,QACJ,QAAA,CAAS,yBAAyB,WAAW,CAAA;AAAA,QAC7C,YAAY;AACV,UAAA,MAAM,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAwB,WAAW,CAAA;AAAA,QACvE;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,kBAAkB,CAAA;AAEtC,MAAA,MAAM,iBAAiB,oBAAA,EAAqB;AAE5C,MAAA,IAAI;AACF,QAAA,MAAM,iBAAA,CAAkB,SAAA,EAAW,SAAA,EAAwB,MAAA,EAAkB,cAAc,CAAA;AAAA,MAC7F,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,oBAAoB,MAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,4BAA4B,CAAA;AAEhD,MAAA,MAAM,gBAAgB,oBAAA,EAAqB;AAE3C,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA;AAAA,UACJ,SAAA;AAAA,UACA,SAAA;AAAA,UACA,eAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,kCAAA,EAAqC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SAC/F;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAA;AAAA,MACJ,QAAA,CAAS,iBAAA;AAAA,MACT,YAAY;AACV,QAAA,IAAI;AACF,UAAA,MAAMG,WAAU,CAAA,EAAG,cAAc,YAAY,EAAE,GAAA,EAAK,WAAW,CAAA;AAAA,QACjE,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,CAAA,gCAAA,EAAmC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,WAC7F;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAGA,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,cAAc,CAAA;AAElC,MAAA,MAAM,mBAAmB,oBAAA,EAAqB;AAE9C,MAAA,IAAI;AACF,QAAA,MAAM,cAAA;AAAA,UACJ,SAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAA;AAAA,MACJ,2BAAA;AAAA,MACA,YAAY,eAAA,CAAgB,SAAA,EAAW,SAAS;AAAA,KAClD;AAGA,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,mBAAmB,CAAA;AAEvC,IAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,MAAM,WAAA;AAAA,QACtB,6BAAA;AAAA,QACA,YAAY,mBAAA,CAAoB,WAAA,EAAa,SAAA,EAAW,mBAAmB,CAAA;AAAA,QAC3E,EAAE,aAAa,yBAAA;AAA0B,OAC3C;AAEA,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,sBAAA,CAAuB,SAAS,CAAC,CAAA;AACrD,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AAEd,MAAA,MAAA,CAAO,KAAK,CAAA,iCAAA,EAAoC,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC5G;AAGA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,QAAA,MAAM,YAAA,GAAe,MAAMW,OAAAA,CAAQ;AAAA,UACjC,SAAS,QAAA,CAAS,yBAAA;AAAA,UAClB,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,WAAA;AAAA,YACJ,QAAA,CAAS,0BAAA;AAAA,YACT,YAAYX,UAAAA,CAAU,sDAAA,EAAwD,EAAE,GAAA,EAAK,WAAW,CAAA;AAAA,YAChG,EAAE,WAAA,EAAa,QAAA,CAAS,0BAAA;AAA2B,WACrD;AAAA,QACF;AAAA,MACF,SAAS,QAAA,EAAU;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAA,CAAS,yBAAyB,CAAA,EAAA,EAAK,oBAAoB,KAAA,GAAQ,QAAA,CAAS,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,MACxH;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,cAAc,CAAA;AACtC,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAE,CAAA;AAChC,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,EAAK,cAAc,CAAA,QAAA,CAAU,CAAA;AACxC,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,eAAe,CAAA;AAAA,EACrC,CAAC,CAAA;AACL;AC9yBO,SAAS,wBAAwBN,QAAAA,EAAwB;AAC9D,EAAA,MAAM,WAAWA,QAAAA,CACd,OAAA,CAAQ,UAAU,CAAA,CAClB,YAAY,0BAA0B,CAAA;AAGzC,EAAA,QAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,iDAAiD,CAAA,CAC7D,MAAA,CAAO,qBAAA,EAAuB,kBAAA,EAAoB,cAAc,CAAA,CAChE,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,IAAA,MAAM,UAAA,GAAaT,OAAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAEzC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,MAAA,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,MAAM,WAAA;AAAA,QACtB,mCAAA;AAAA,QACA,YAAY,mBAAA,CAAoB,KAAA,EAAOc,OAAAA,CAAQ,UAAU,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAK,CAAA;AAAA,QACvF,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAAE,OAC5B;AAEA,MAAA,MAAA,CAAO,OAAA,CAAQ,mCAAA,EAAqC,EAAE,IAAA,EAAM,WAAW,CAAA;AAEvE,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,MACrC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAEzD,MAAA,MAAA,CAAO,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,CAAE,CAAA;AAC1D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,QAAA,CACG,OAAA,CAAQ,IAAI,CAAA,CACZ,WAAA,CAAY,uDAAuD,CAAA,CACnE,QAAA,CAAS,UAAU,2CAA2C,CAAA,CAC9D,OAAO,oBAAA,EAAsB,2DAA2D,EACxF,MAAA,CAAO,aAAA,EAAe,oCAAoC,CAAA,CAC1D,MAAA,CAAO,OAAO,QAAA,EAA8B,OAAA,KAA+B;AAE1E,IAAA,MAAM,YAAA,GAAe,aAAa,QAAQ,CAAA;AAE1C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAA,CAAO,MAAM,8BAA8B,CAAA;AAC3C,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,QAAA,MAAA,CAAO,IAAI,iDAAiD,CAAA;AAC5D,QAAA,MAAA,CAAO,IAAI,qDAAqD,CAAA;AAAA,MAClE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,CAACU,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,YAAY,CAAA,CAAE,CAAA;AAC3D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,IAAUpB,KAAKU,OAAAA,CAAQ,YAAY,GAAG,KAAK,CAAA;AAErE,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,MAAA,MAAA,CAAO,KAAK,uBAAuB,CAAA;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,CAAA;AACpC,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AACnC,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAca,YAAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAGnC,MAAA,MAAM,WAAA;AAAA,QACJ,0CAAA;AAAA,QACA,YAAY;AACV,UAAA,MAAM,mBAAA,CAAoB,MAAM,SAAS,CAAA;AAAA,QAC3C,CAAA;AAAA,QACA;AAAA,UACE,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACtB,WAAA,EAAa;AAAA;AACf,OACF;AAEA,MAAA,MAAA,CAAO,QAAQ,oDAAA,EAAsD;AAAA,QACnE,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,UAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAAA,QAClD;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAEzD,MAAA,MAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,aAAa,QAAA,EAAkC;AACtD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO3B,QAAQ,QAAQ,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,WAAA,GAAcA,QAAQ,cAAc,CAAA;AAE1C,EAAA,IAAIwB,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;ACnIA,IAAMT,UAAAA,GAAYC,UAAUC,IAAI,CAAA;AAQhC,eAAe,gBAAA,GAA2C;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,2BAAA,EAA8B,gBAAgB,CAAA,CAAE,CAAA;AAE7E,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,OAAO,IAAA,CAAK,WAAW,CAAA,EAAG,MAAA,IAAU,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,cAAA,CAAe,SAAiB,MAAA,EAAyB;AAChE,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACpE,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,EAAE,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAElE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAE9B,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,IAAA;AACvB,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,KAAA;AAAA,EACzB;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,oBAAA,GAAiE;AAE9E,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,EAAA;AAEhD,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACzC,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACzC,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAGxC,EAAA,IAAI;AACF,IAAA,MAAMF,WAAU,gBAAgB,CAAA;AAEhC,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI;AACF,IAAA,MAAMA,WAAU,gBAAgB,CAAA;AAEhC,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuBN,QAAAA,EAAwB;AAC7D,EAAAA,QAAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,2CAA2C,CAAA,CACvD,OAAO,YAAY;AAElB,IAAA,MAAM,gBAAgB,MAAM,WAAA;AAAA,MAC1B,yBAAA;AAAA,MACA,gBAAA;AAAA,MACA,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAAE,KAC5B;AAEA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAA,CAAO,MAAM,sDAAsD,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,CAAC,cAAA,CAAe,WAAA,EAAa,aAAa,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,sCAAA,EAAyC,WAAW,CAAA,CAAA,CAAG,CAAA;AAEtE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,WAAW,CAAA,QAAA,EAAM,aAAa,CAAA,CAAE,CAAA;AACtE,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAGA,IAAA,MAAM,EAAA,GAAK,MAAM,oBAAA,EAAqB;AAEtC,IAAA,MAAM,QAAA,GAAmC;AAAA,MACvC,GAAA,EAAK,kBAAkB,gBAAgB,CAAA,OAAA,CAAA;AAAA,MACvC,IAAA,EAAM,eAAe,gBAAgB,CAAA,OAAA,CAAA;AAAA,MACrC,IAAA,EAAM,mBAAmB,gBAAgB,CAAA,OAAA,CAAA;AAAA,MACzC,GAAA,EAAK,cAAc,gBAAgB,CAAA,OAAA;AAAA,KACrC;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,WAAA;AAAA,QACJ,iBAAiB,EAAE,CAAA,GAAA,CAAA;AAAA,QACnB,YAAY;AACV,UAAA,MAAMM,WAAU,OAAO,CAAA;AAAA,QACzB,CAAA;AAAA,QACA;AAAA,UACE,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACtB,WAAA,EAAa;AAAA;AACf,OACF;AAEA,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,0BAAA,EAA6B,aAAa,CAAA,CAAA,EAAI;AAAA,QAC3D,eAAA,EAAiB,WAAA;AAAA,QACjB,UAAA,EAAY,aAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAEzD,MAAA,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAE,CAAA;AACzC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AAAA,MACvC;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;;;ACvIA,IAAM,eAAA,GAAkB;AAAA,UAAA,EACZ,QAAQ,CAAA;AAAA,CAAA,EACjB,QAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,aAAA,EAgBI,QAAQ,gBAAgB,QAAQ;AAAA,QAAA,EACrC,QAAQ,CAAA;AAAA,CAAA,CAChB,IAAA,EAAK;AAEP,IAAM,cAAA,GAAiB;AAAA,UAAA,EACX,QAAQ,CAAA;AAAA,CAAA,EACjB,QAAQ,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;AAAA;AAAA,SAAA,EAoCA,QAAQ,IAAI,QAAQ;AAAA,QAAA,EACrB,QAAQ,CAAA;AAAA,CAAA,CAChB,IAAA,EAAK;AAEP,IAAM,eAAA,GAAkB;AAAA,UAAA,EACZ,QAAQ,CAAA;AAAA,YAAA,EACN,QAAQ,CAAA;;AAAA;AAAA,YAAA,EAGR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;AAAA,YAAA,EACR,QAAQ,CAAA;;AAAA;AAAA,YAAA,EAGR,QAAQ,CAAA;AAAA,QAAA,EACZ,QAAQ,CAAA;AAAA,CAAA,CAChB,IAAA,EAAK;AAEA,SAAS,0BAA0BN,QAAAA,EAAwB;AAChE,EAAAA,QAAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,kCAAkC,CAAA,CAC9C,QAAA,CAAS,SAAA,EAAW,gCAAgC,CAAA,CACpD,MAAA,CAAO,CAAC,KAAA,KAAkB;AACzB,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,eAAA;AACT,QAAA,YAAA,GAAe,CAAA;AAAA,UAAA,EAAgC,QAAQ,CAAA,kBAAA,CAAA;AACvD,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,cAAA;AACT,QAAA,YAAA,GAAe,CAAA;AAAA,UAAA,EAA+B,QAAQ,CAAA,iBAAA,CAAA;AACtD,QAAA;AAAA,MAEF,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,eAAA;AACT,QAAA,YAAA,GAAe,sCAAsC,QAAQ,CAAA;AAAA,EAAA,EAAa,QAAQ,iDAAiD,QAAQ,CAAA,KAAA,CAAA;AAC3I,QAAA;AAAA,MAEF;AACE,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AACtC,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAO,EAAG;AACpB,UAAA,MAAA,CAAO,IAAI,mCAAmC,CAAA;AAAA,QAChD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGlB,IAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACnB,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,UAAU,CAAA;AAC9B,MAAA,MAAA,CAAO,GAAA,CAAI,UAAU,MAAM,CAAA;AAC3B,MAAA,MAAA,CAAO,GAAA,CAAI,gBAAgB,YAAY,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA,MAAA,CAAO,IAAI,YAAY,CAAA;AAAA,IACzB;AAAA,EACF,CAAC,CAAA;AACL;ACnGO,SAAS,oBAAoBA,QAAAA,EAAwB;AAC1D,EAAAA,QAAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,yCAAyC,CAAA,CACrD,OAAO,YAAY;AAClB,IAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,UAAA,EAAW;AACjD,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,MAAM,YAAA,CAAa,cAAa,GAAI,MAAA;AAE/D,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,SAAS,OAAA,CAAQ;AAAA,OACnB;AAAA,MACA,EAAA,EAAI;AAAA,QACF,UAAU,QAAA,EAAS;AAAA,QACnB,SAAS,OAAA,EAAQ;AAAA,QACjB,MAAM,IAAA;AAAK,OACb;AAAA,MACA,WAAA,EAAa;AAAA,QACX,MAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAWL,IAAAA,CAAKmB,OAAAA,EAAQ,EAAG,UAAU;AAAA,OACvC;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,UAAA;AAAA,QACV,GAAI,KAAA,IAAS,EAAE,KAAA;AAAM;AACvB,KACF;AAEA,IAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACnB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,WAAW,CAAA,CAAE,CAAA;AACzC,MAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,MAAA,MAAA,CAAO,IAAI,SAAS,CAAA;AACpB,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,YAAA,EAAe,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC7C,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,YAAA,EAAe,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,CAAA,CAAG,CAAA;AACjF,MAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,MAAA,MAAA,CAAO,IAAI,cAAc,CAAA;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,YAAA,EAAe,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,YAAA,EAAe,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AACtD,MAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,MAAA,MAAA,CAAO,IAAI,iBAAiB,CAAA;AAC5B,MAAA,IAAI,IAAA,CAAK,KAAK,QAAA,EAAU;AACtB,QAAA,MAAA,CAAO,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,KAAK,KAAA,EAAO;AACnB,UAAA,MAAA,CAAO,GAAA,CAAI,CAAA,YAAA,EAAe,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACL;ACjFO,SAAS,sBAAsBd,QAAAA,EAAwB;AAC5D,EAAAA,SACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,SAAA,EAAW,kDAAkD,EACpE,MAAA,CAAO,QAAA,EAAU,4BAA4B,CAAA,CAC7C,MAAA,CAAO,OAAO,OAAA,KAA2B;AACxC,IAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAEhB,MAAA,MAAMmB,YAAAA,GAAc,MAAM,YAAA,CAAa,cAAA,EAAe;AACtD,MAAA,MAAMC,WAAAA,GAAa,MAAM,YAAA,CAAa,UAAA,EAAW;AACjD,MAAA,MAAMC,MAAAA,GAAQ,MAAM,YAAA,CAAa,YAAA,EAAa;AAE9C,MAAA,MAAA,CAAO,IAAI,wBAAwB,CAAA;AACnC,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,IAAI,CAAA,iBAAA,EAAoBD,WAAAA,GAAa,UAAKC,MAAK,CAAA,CAAA,GAAK,sBAAiB,CAAA,CAAE,CAAA;AAC9E,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,iBAAA,EAAoBF,YAAAA,GAAc,mBAAA,GAAiB,uBAAkB,CAAA,CAAE,CAAA;AAClF,MAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,cAAA,EAAe;AAEvD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAA,CAAO,IAAI,yCAAyC,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,QAAA,GAAW,MAAMrB,QAAAA,CAAS;AAAA,QAC9B,SAAS,QAAA,CAAS,oBAAA;AAAA,QAClB,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,YAAA,CAAa,eAAe,QAAQ,CAAA;AAC1C,QAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,mBAAmB,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,uCAAuC,CAAA;AAAA,MACrD;AAEA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,cAAA,EAAe;AACtD,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,UAAA,EAAW;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,YAAA,EAAa;AAE9C,IAAA,MAAA,CAAO,IAAI,wBAAwB,CAAA;AACnC,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,IAAI,CAAA,iBAAA,EAAoB,UAAA,GAAa,UAAK,KAAK,CAAA,CAAA,GAAK,sBAAiB,CAAA,CAAE,CAAA;AAC9E,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,iBAAA,EAAoB,WAAA,GAAc,mBAAA,GAAiB,uBAAkB,CAAA,CAAE,CAAA;AAClF,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,IAAI,yCAAyC,CAAA;AAAA,EACtD,CAAC,CAAA;AACL;;;AC3DO,SAAS,iBAAiBE,QAAAA,EAAwB;AACvD,EAAA,oBAAA,CAAqBA,QAAO,CAAA;AAC5B,EAAA,qBAAA,CAAsBA,QAAO,CAAA;AAC7B,EAAA,qBAAA,CAAsBA,QAAO,CAAA;AAC7B,EAAA,qBAAA,CAAsBA,QAAO,CAAA;AAC7B,EAAA,uBAAA,CAAwBA,QAAO,CAAA;AAC/B,EAAA,sBAAA,CAAuBA,QAAO,CAAA;AAC9B,EAAA,yBAAA,CAA0BA,QAAO,CAAA;AACjC,EAAA,mBAAA,CAAoBA,QAAO,CAAA;AAC3B,EAAA,qBAAA,CAAsBA,QAAO,CAAA;AAC/B;ACVA,SAASsB,eAAAA,CAAe,SAAiB,MAAA,EAAyB;AAChE,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACpE,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,EAAE,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAElE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAE9B,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,IAAA;AACvB,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,KAAA;AAAA,EACzB;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,eAAA,CAAgB,aAAqB,cAAA,EAAuC;AAChG,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,GAAI,CAAA;AAEzD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,2BAAA,EAA8B,WAAW,CAAA,CAAA,EAAI;AAAA,MACxE,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB,KACvC,CAAA;AAED,IAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAElB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAW,CAAA,EAAG,MAAA;AAEzC,IAAA,IAAI,aAAA,IAAiBA,eAAAA,CAAe,cAAA,EAAgB,aAAa,CAAA,EAAG;AAClE,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,OAAA,CAAQ,IAAA,CAAK1B,MAAAA,CAAM,MAAA,CAAO,sRAAgD,CAAC,CAAA;AAC3E,MAAA,OAAA,CAAQ,IAAA,CAAKA,OAAM,MAAA,CAAO,QAAG,IAAIA,MAAAA,CAAM,IAAA,CAAK,sBAAsB,CAAA,GAAIA,MAAAA,CAAM,GAAA,CAAI,GAAG,cAAc,CAAA,QAAA,CAAK,IAAIA,MAAAA,CAAM,KAAA,CAAM,aAAa,CAAA,GAAIA,MAAAA,CAAM,MAAA,CAAO,gBAAW,CAAC,CAAA;AAChK,MAAA,OAAA,CAAQ,IAAA,CAAKA,OAAM,MAAA,CAAO,QAAG,IAAIA,MAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,CAAQ,CAAA,GAAIA,MAAAA,CAAM,IAAA,CAAK,YAAY,WAAW,CAAA,CAAE,IAAIA,MAAAA,CAAM,GAAA,CAAI,YAAY,CAAA,GAAIA,MAAAA,CAAM,MAAA,CAAO,WAAM,CAAC,CAAA;AAC7I,MAAA,OAAA,CAAQ,IAAA,CAAKA,MAAAA,CAAM,MAAA,CAAO,sRAAgD,CAAC,CAAA;AAC3E,MAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,IACf;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AClDA,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,QAAQ,CAAA,CACb,YAAY,2DAA2D,CAAA,CACvE,QAAQ,WAAA,EAAa,eAAA,EAAiB,wBAAwB,CAAA,CAC9D,OAAO,QAAA,EAAU,+BAA+B,EAChD,IAAA,CAAK,WAAA,EAAa,CAAC,WAAA,KAAgB;AAClC,EAAA,MAAM,IAAA,GAAO,YAAY,IAAA,EAAK;AAE9B,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,EACzB;AACF,CAAC,CAAA,CACA,IAAA,CAAK,YAAA,EAAc,MAAM;AAExB,EAAA,MAAA,CAAO,KAAA,EAAM;AACf,CAAC,CAAA;AAGH,gBAAA,CAAiB,OAAO,CAAA;AAGxB,OAAA,CAAQ,eAAA,CAAgB;AAAA,EACtB,WAAA,EAAa,CAAC,GAAA,EAAK,KAAA,KAAU,MAAM,GAAG;AACxC,CAAC,CAAA;AAGD,eAAe,IAAA,GAAsB;AACnC,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AACpC,MAAA,eAAA,CAAgB,gBAAA,EAAkB,WAAW,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAE3D,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,MAAA,CAAO,KAAA,CAAM,MAAM,OAAO,CAAA;AAC1B,MAAA,IAAI,KAAA,CAAM,UAAA,IAAc,CAAC,MAAA,CAAO,QAAO,EAAG;AACxC,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,UAAU,CAAA;AAAA,MAC7B;AACA,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,MAAA,CAAO,KAAA,CAAM,MAAM,OAAO,CAAA;AAC1B,MAAA,IAAI,OAAA,CAAQ,IAAI,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,MAC3B;AACA,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAA,CAAO,MAAM,+BAA+B,CAAA;AAC5C,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,IAAA,EAAK","file":"cli.js","sourcesContent":["/**\n * Environment Configuration\n * Values are injected at BUILD TIME via tsup.config.ts\n * See tsup.config.ts for default values and .env.example for configuration\n */\n\n// API Configuration (injected at build time)\nexport const DOCYRUS_API_URL = process.env.CLI_DOCYRUS_API_URL as string;\n\n// OAuth2 Configuration (injected at build time)\nexport const OAUTH_CLIENT_ID = process.env.CLI_DOCYRUS_CLIENT_ID as string;\nexport const OAUTH_SCOPES = (process.env.CLI_DOCYRUS_OAUTH_SCOPES as string).split(' ');\n\n// OAuth2 Endpoints (same base as API)\nexport const OAUTH_AUTHORIZE_URL = `${DOCYRUS_API_URL}/v1/oauth2/authorize`;\nexport const OAUTH_TOKEN_URL = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n// Local callback server for CLI OAuth flow\nexport const OAUTH_CALLBACK_PORT_MIN = 9876;\nexport const OAUTH_CALLBACK_PORT_MAX = 9899;\nexport const OAUTH_REDIRECT_URI = (port: number) => `http://localhost:${port}/callback`;\nexport const OAUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n// Storage Configuration\nexport const KEYCHAIN_SERVICE = 'docyrus-cli';\nexport const CONFIG_DIR = '.docyrus';\nexport const CREDENTIALS_FILE = 'credentials.enc';\nexport const CONFIG_FILE = 'config.json';\n\n// Token Keys\nexport const TOKEN_KEYS = {\n ACCESS_TOKEN: 'accessToken',\n REFRESH_TOKEN: 'refreshToken',\n USER_EMAIL: 'userEmail',\n EXPIRES_AT: 'expiresAt',\n GITHUB_TOKEN: 'githubToken' // For private template access - persists after logout\n} as const;\n\n// CLI Info\nexport const CLI_NAME = 'docyrus';\nexport const CLI_VERSION = '0.0.1';\nexport const NPM_PACKAGE_NAME = 'docyrus';\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly suggestion?: string;\n constructor(message: string, exitCode = 1, suggestion?: string) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n this.suggestion = suggestion;\n }\n}\n\nexport class AuthenticationError extends CliError {\n constructor(message = 'Authentication failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your credentials and try again.');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NotLoggedInError extends CliError {\n constructor(message = 'You are not logged in.') {\n super(message, 1, 'Run `docyrus login` to authenticate.');\n this.name = 'NotLoggedInError';\n }\n}\n\nexport class ConfigurationError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class NetworkError extends CliError {\n constructor(message = 'Network request failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your internet connection and try again.');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends CliError {\n constructor(message = 'Operation timed out') {\n super(message, 1, 'Please try again.');\n this.name = 'TimeoutError';\n }\n}\n\nexport class OAuthError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion || 'Please try again or use email/password login.');\n this.name = 'OAuthError';\n }\n}\n\nexport class TemplateError extends CliError {\n constructor(message: string) {\n super(message, 1, 'Check your internet connection and try again.');\n this.name = 'TemplateError';\n }\n}\n\nexport class ProjectExistsError extends CliError {\n constructor(projectName: string) {\n super(\n `Directory \"${projectName}\" already exists.`,\n 1,\n 'Choose a different project name or delete the existing directory.'\n );\n this.name = 'ProjectExistsError';\n }\n}\n\nexport class ConflictingFlagsError extends CliError {\n constructor(flag1: string, flag2: string) {\n super(\n `Cannot use ${flag1} and ${flag2} together.`,\n 1,\n 'Please use only one option from each group.'\n );\n this.name = 'ConflictingFlagsError';\n }\n}\n","import { RestApiClient, AuthenticationError as ApiAuthError } from '@docyrus/api-client';\n\nimport {\n type AuthCredentials, type AuthTokens, type UserInfo, type LoginResult\n} from './types.js';\n\nimport { DOCYRUS_API_URL, OAUTH_CLIENT_ID } from '../config/constants.js';\nimport { AuthenticationError, NetworkError } from '../utils/errors.js';\n\nfunction getApiClient(): RestApiClient {\n return new RestApiClient({ baseURL: DOCYRUS_API_URL });\n}\n\nexport async function loginWithCredentials(credentials: AuthCredentials): Promise<LoginResult> {\n const client = getApiClient();\n\n try {\n const response = await client.post<{\n success: boolean;\n data: {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n user?: UserInfo;\n };\n }>('/v1/auth/token', {\n email: credentials.email,\n password: credentials.password\n });\n\n const tokens: AuthTokens = {\n accessToken: response.data.access_token,\n refreshToken: response.data.refresh_token,\n expiresIn: response.data.expires_in\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return {\n tokens,\n user: response.data.user\n };\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Invalid email or password.');\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw error;\n }\n}\n\nexport async function getUserInfo(accessToken: string): Promise<UserInfo> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n const response = await client.get<{ success: boolean; data: UserInfo }>('/v1/users/me');\n\n return response.data;\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n throw error;\n }\n}\n\nexport async function refreshAccessToken(refreshToken: string): Promise<AuthTokens> {\n const tokenUrl = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: OAUTH_CLIENT_ID,\n refresh_token: refreshToken\n }).toString()\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as {\n error?: string;\n error_description?: string;\n };\n\n throw new AuthenticationError(\n errorData.error_description || 'Failed to refresh token'\n );\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n}\n","\nimport {\n createServer, type Server, type IncomingMessage, type ServerResponse\n} from 'node:http';\nimport { URL } from 'node:url';\nimport { randomBytes } from 'node:crypto';\n\nimport { type OAuthCallbackResult } from './types.js';\n\nimport { OAUTH_CALLBACK_PORT_MIN, OAUTH_CALLBACK_PORT_MAX, OAUTH_TIMEOUT_MS } from '../config/constants.js';\nimport { OAuthError, TimeoutError } from '../utils/errors.js';\n\nconst SUCCESS_HTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Successful - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this tab and return to the CLI.</p>\n </div>\n</body>\n</html>\n`;\n\nconst ERROR_HTML = (message: string) => `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fef2f2;\n border-radius: 8px;\n color: #dc2626;\n font-size: 13px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Something went wrong during authentication.</p>\n <div class=\"error-message\">${message}</div>\n </div>\n</body>\n</html>\n`;\n\nexport function generateState(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n return Buffer.from(hashBuffer).toString('base64url');\n}\n\nasync function findAvailablePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number) => {\n if (port > OAUTH_CALLBACK_PORT_MAX) {\n reject(new OAuthError('Could not find an available port for OAuth callback.'));\n\n return;\n }\n\n const server = createServer();\n\n server.listen(port, '127.0.0.1');\n\n server.once('listening', () => {\n server.close(() => resolve(port));\n });\n\n server.once('error', () => {\n tryPort(port + 1);\n });\n };\n\n tryPort(OAUTH_CALLBACK_PORT_MIN);\n });\n}\n\nexport interface CallbackServerResult {\n server: Server;\n port: number;\n resultPromise: Promise<OAuthCallbackResult>;\n cleanup: () => void;\n}\n\nexport async function startCallbackServer(expectedState: string): Promise<CallbackServerResult> {\n const port = await findAvailablePort();\n\n let resolveResult: (result: OAuthCallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const timeoutId = setTimeout(() => {\n rejectResult(new TimeoutError('OAuth authentication timed out.'));\n }, OAUTH_TIMEOUT_MS);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://127.0.0.1:${port}`);\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML(errorDescription || error));\n rejectResult(new OAuthError(errorDescription || error));\n\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Missing authorization code or state.'));\n rejectResult(new OAuthError('Missing authorization code or state.'));\n\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Invalid state parameter. Possible CSRF attack.'));\n rejectResult(new OAuthError('Invalid state parameter.'));\n\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not Found');\n }\n });\n\n server.listen(port, '127.0.0.1');\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n return {\n server,\n port,\n resultPromise,\n cleanup\n };\n}\n","import open from 'open';\n\nexport async function openBrowser(url: string): Promise<void> {\n await open(url);\n}\n","import { RestApiClient } from '@docyrus/api-client';\n\nimport {\n type AuthTokens, type OAuthConfig, type LoginResult, type UserInfo\n} from './types.js';\n\nimport {\n startCallbackServer,\n generateState,\n generateCodeVerifier,\n generateCodeChallenge\n} from './oauth-server.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { OAuthError } from '../utils/errors.js';\nimport {\n DOCYRUS_API_URL,\n OAUTH_CLIENT_ID,\n OAUTH_SCOPES,\n OAUTH_REDIRECT_URI\n} from '../config/constants.js';\n\nfunction getOAuthConfig(port: number): OAuthConfig {\n return {\n authorizationUrl: `${DOCYRUS_API_URL}/v1/oauth2/authorize`,\n tokenUrl: `${DOCYRUS_API_URL}/v1/oauth2/token`,\n clientId: OAUTH_CLIENT_ID,\n redirectUri: OAUTH_REDIRECT_URI(port),\n scopes: OAUTH_SCOPES\n };\n}\n\nfunction buildAuthorizationUrl(\n config: OAuthConfig,\n state: string,\n codeChallenge: string\n): string {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n scope: config.scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256'\n });\n\n return `${config.authorizationUrl}?${params.toString()}`;\n}\n\nasync function exchangeCodeForTokens(\n config: OAuthConfig,\n code: string,\n codeVerifier: string\n): Promise<AuthTokens> {\n const response = await fetch(config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: config.clientId,\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier\n }).toString()\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new OAuthError(`Failed to exchange authorization code: ${errorText}`);\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n}\n\nasync function getUserInfoFromToken(accessToken: string): Promise<UserInfo | undefined> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n return await client.get<UserInfo>('/v1/users/me');\n } catch {\n return undefined;\n }\n}\n\nexport interface OAuthLoginOptions {\n onOpeningBrowser?: () => void;\n onWaitingForAuth?: (url: string) => void;\n}\n\nexport async function loginWithOAuth(options: OAuthLoginOptions = {}): Promise<LoginResult> {\n // Generate PKCE values\n const state = generateState();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n\n // Start callback server\n const { port, resultPromise, cleanup } = await startCallbackServer(state);\n const config = getOAuthConfig(port);\n\n // Build authorization URL\n const authUrl = buildAuthorizationUrl(config, state, codeChallenge);\n\n try {\n // Open browser\n options.onOpeningBrowser?.();\n await openBrowser(authUrl);\n\n // Wait for callback\n options.onWaitingForAuth?.(authUrl);\n const { code } = await resultPromise;\n\n // Exchange code for tokens\n const tokens = await exchangeCodeForTokens(config, code, codeVerifier);\n\n // Get user info\n const user = await getUserInfoFromToken(tokens.accessToken);\n\n return { tokens, user };\n } finally {\n cleanup();\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { CONFIG_DIR } from '../config/constants.js';\n\nexport function isWindows(): boolean {\n return process.platform === 'win32';\n}\n\nexport function isMacOS(): boolean {\n return process.platform === 'darwin';\n}\n\nexport function isLinux(): boolean {\n return process.platform === 'linux';\n}\n\nexport function getHomeDir(): string {\n return homedir();\n}\n\nexport function getConfigDir(): string {\n return join(getHomeDir(), CONFIG_DIR);\n}\n\nexport function getPlatformName(): string {\n if (isMacOS()) return 'macOS';\n if (isWindows()) return 'Windows';\n if (isLinux()) return 'Linux';\n\n return process.platform;\n}\n","import {\n createCipheriv, createDecipheriv, randomBytes, scryptSync, createHash\n} from 'node:crypto';\nimport { hostname, userInfo } from 'node:os';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst AUTH_TAG_LENGTH = 16;\nconst SALT_LENGTH = 32;\n\nfunction getMachineId(): string {\n const parts = [\n hostname(),\n userInfo().username,\n process.platform,\n process.arch\n ];\n\n return createHash('sha256').update(parts.join('-')).digest('hex');\n}\n\nexport function deriveKey(salt: Buffer): Buffer {\n const machineId = getMachineId();\n\n return scryptSync(machineId, salt, KEY_LENGTH);\n}\n\nexport function encrypt(data: string): string {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n // Format: salt:iv:authTag:encrypted (all base64)\n return [\n salt.toString('base64'),\n iv.toString('base64'),\n authTag.toString('base64'),\n encrypted.toString('base64')\n ].join(':');\n}\n\nexport function decrypt(encryptedData: string): string {\n const parts = encryptedData.split(':');\n\n if (parts.length !== 4) {\n throw new Error('Invalid encrypted data format');\n }\n\n const [\n saltB64,\n ivB64,\n authTagB64,\n dataB64\n ] = parts;\n const salt = Buffer.from(saltB64, 'base64');\n const iv = Buffer.from(ivB64, 'base64');\n const authTag = Buffer.from(authTagB64, 'base64');\n const encrypted = Buffer.from(dataB64, 'base64');\n\n const key = deriveKey(salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString('utf8');\n}\n","import {\n readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport { getConfigDir } from '../utils/platform.js';\nimport { CREDENTIALS_FILE } from '../config/constants.js';\nimport { encrypt, decrypt } from './encryption.js';\n\nexport interface StorageData {\n [key: string]: string;\n}\n\nexport class FileStorage {\n private filePath: string;\n constructor() {\n const configDir = getConfigDir();\n\n this.filePath = join(configDir, CREDENTIALS_FILE);\n }\n private ensureConfigDir(): void {\n const configDir = getConfigDir();\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n private readData(): StorageData {\n if (!existsSync(this.filePath)) {\n return {};\n }\n\n try {\n const encrypted = readFileSync(this.filePath, 'utf8');\n const decrypted = decrypt(encrypted);\n\n return JSON.parse(decrypted);\n } catch {\n return {};\n }\n }\n private writeData(data: StorageData): void {\n this.ensureConfigDir();\n const json = JSON.stringify(data);\n const encrypted = encrypt(json);\n\n writeFileSync(this.filePath, encrypted, { mode: 0o600 });\n }\n async get(key: string): Promise<string | null> {\n const data = this.readData();\n\n return data[key] ?? null;\n }\n async set(key: string, value: string): Promise<void> {\n const data = this.readData();\n\n data[key] = value;\n this.writeData(data);\n }\n async delete(key: string): Promise<void> {\n const data = this.readData();\n\n delete data[key];\n\n if (Object.keys(data).length === 0) {\n this.clear();\n } else {\n this.writeData(data);\n }\n }\n async clear(): Promise<void> {\n if (existsSync(this.filePath)) {\n unlinkSync(this.filePath);\n }\n }\n async has(key: string): Promise<boolean> {\n const data = this.readData();\n\n return key in data;\n }\n}\n","import { KEYCHAIN_SERVICE } from '../config/constants.js';\n\nlet keytar: typeof import('keytar') | null = null;\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n if (keytar !== null) {\n return keytar;\n }\n\n try {\n keytar = await import('keytar');\n\n return keytar;\n } catch {\n keytar = null;\n\n return null;\n }\n}\n\nexport class KeychainStorage {\n private service: string;\n constructor(service = KEYCHAIN_SERVICE) {\n this.service = service;\n }\n async isAvailable(): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n // Try a simple operation to verify keychain access\n await kt.findCredentials(this.service);\n\n return true;\n } catch {\n return false;\n }\n }\n async get(key: string): Promise<string | null> {\n const kt = await getKeytar();\n\n if (!kt) return null;\n\n try {\n return await kt.getPassword(this.service, key);\n } catch {\n return null;\n }\n }\n async set(key: string, value: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n await kt.setPassword(this.service, key, value);\n\n return true;\n } catch {\n return false;\n }\n }\n async delete(key: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n return await kt.deletePassword(this.service, key);\n } catch {\n return false;\n }\n }\n async clear(): Promise<void> {\n const kt = await getKeytar();\n\n if (!kt) return;\n\n try {\n const credentials = await kt.findCredentials(this.service);\n\n for (const cred of credentials) {\n await kt.deletePassword(this.service, cred.account);\n }\n } catch {\n // Ignore errors during clear\n }\n }\n}\n","import { type TokenManager } from '@docyrus/api-client';\n\nimport { KeychainStorage } from './keychain-storage.js';\nimport { FileStorage } from './file-storage.js';\nimport { TOKEN_KEYS } from '../config/constants.js';\n\nexport class CliTokenManager implements TokenManager {\n private keychain: KeychainStorage;\n private fileStorage: FileStorage;\n private keychainAvailable: boolean | null = null;\n constructor() {\n this.keychain = new KeychainStorage();\n this.fileStorage = new FileStorage();\n }\n private async useKeychain(): Promise<boolean> {\n if (this.keychainAvailable === null) {\n this.keychainAvailable = await this.keychain.isAvailable();\n }\n\n return this.keychainAvailable;\n }\n async getToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.ACCESS_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async setToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n }\n async clearToken(): Promise<void> {\n // Clear from both storages to ensure complete cleanup\n await this.keychain.delete(TOKEN_KEYS.ACCESS_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async getRefreshToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.REFRESH_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async setRefreshToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n }\n async clearRefreshToken(): Promise<void> {\n await this.keychain.delete(TOKEN_KEYS.REFRESH_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async getUserEmail(): Promise<string | null> {\n if (await this.useKeychain()) {\n const email = await this.keychain.get(TOKEN_KEYS.USER_EMAIL);\n\n if (email) return email;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.USER_EMAIL);\n }\n async setUserEmail(email: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.USER_EMAIL, email);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.USER_EMAIL, email);\n }\n // GitHub token for private template access (persists after logout)\n async getGithubToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.GITHUB_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.GITHUB_TOKEN);\n }\n async setGithubToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n }\n async clearAll(): Promise<void> {\n // Note: GitHub token is NOT cleared on logout - it persists\n const githubToken = await this.getGithubToken();\n\n await this.keychain.clear();\n await this.fileStorage.clear();\n\n // Restore GitHub token after clearing\n if (githubToken) {\n await this.setGithubToken(githubToken);\n }\n }\n async isLoggedIn(): Promise<boolean> {\n const token = await this.getToken();\n\n return token !== null;\n }\n}\n\n// Singleton instance\nlet instance: CliTokenManager | null = null;\n\nexport function getTokenManager(): CliTokenManager {\n if (!instance) {\n instance = new CliTokenManager();\n }\n\n return instance;\n}\n","import Conf from 'conf';\n\nimport { CLI_NAME } from './constants.js';\n\nexport interface CliConfig {\n apiUrl?: string;\n lastLoginEmail?: string;\n telemetryEnabled: boolean;\n}\n\nconst defaults: CliConfig = {\n telemetryEnabled: true\n};\n\nclass ConfigManager {\n private config: Conf<CliConfig>;\n constructor() {\n this.config = new Conf<CliConfig>({\n projectName: CLI_NAME,\n defaults\n });\n }\n get<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return this.config.get(key);\n }\n set<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n this.config.set(key, value);\n }\n delete<K extends keyof CliConfig>(key: K): void {\n this.config.delete(key);\n }\n getAll(): CliConfig {\n return this.config.store;\n }\n clear(): void {\n this.config.clear();\n }\n get path(): string {\n return this.config.path;\n }\n}\n\nexport const configManager = new ConfigManager();\n","import chalk from 'chalk';\n\nexport const logger = {\n success(message: string): void {\n console.info(chalk.green('✓'), message);\n },\n\n error(message: string): void {\n console.error(chalk.red('✗'), message);\n },\n\n warn(message: string): void {\n console.warn(chalk.yellow('⚠'), message);\n },\n\n info(message: string): void {\n console.info(chalk.blue('ℹ'), message);\n },\n\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(chalk.gray('⋯'), chalk.gray(message));\n }\n },\n\n log(message: string): void {\n console.info(message);\n },\n\n newline(): void {\n console.info();\n },\n\n dim(message: string): void {\n console.info(chalk.dim(message));\n },\n\n bold(message: string): void {\n console.info(chalk.bold(message));\n },\n\n link(url: string): string {\n return chalk.cyan.underline(url);\n }\n};\n","import chalk from 'chalk';\n\nexport type OutputFormat = 'text' | 'json';\n\ninterface OutputState {\n format: OutputFormat;\n data: Record<string, unknown>;\n}\n\nconst state: OutputState = {\n format: 'text',\n data: {}\n};\n\nexport const output = {\n setFormat(format: OutputFormat): void {\n state.format = format;\n },\n\n getFormat(): OutputFormat {\n return state.format;\n },\n\n isJson(): boolean {\n return state.format === 'json';\n },\n\n // Accumulate data for JSON output\n set(key: string, value: unknown): void {\n state.data[key] = value;\n },\n\n // Clear accumulated data\n clear(): void {\n state.data = {};\n },\n\n // Print success message or accumulate for JSON\n success(message: string, data?: Record<string, unknown>): void {\n if (state.format === 'json') {\n state.data = {\n ...state.data, ...data, success: true, message\n };\n } else {\n console.info(chalk.green('✓'), message);\n }\n },\n\n // Print error message or accumulate for JSON\n error(message: string, data?: Record<string, unknown>): void {\n if (state.format === 'json') {\n state.data = {\n ...state.data, ...data, success: false, error: message\n };\n } else {\n console.error(chalk.red('✗'), message);\n }\n },\n\n // Print warning message\n warn(message: string): void {\n if (state.format === 'json') {\n state.data.warning = message;\n } else {\n console.warn(chalk.yellow('⚠'), message);\n }\n },\n\n // Print info message (only in text mode)\n info(message: string): void {\n if (state.format !== 'json') {\n console.info(chalk.blue('ℹ'), message);\n }\n },\n\n // Print dim message (only in text mode)\n dim(message: string): void {\n if (state.format !== 'json') {\n console.info(chalk.dim(message));\n }\n },\n\n // Print the final JSON output\n flush(): void {\n if (state.format === 'json' && Object.keys(state.data).length > 0) {\n console.info(JSON.stringify(state.data, null, 2));\n state.data = {};\n }\n },\n\n // Direct JSON output (for commands that return structured data)\n json(data: unknown): void {\n if (state.format === 'json') {\n console.info(JSON.stringify(data, null, 2));\n }\n }\n};\n","export const MESSAGES = {\n // Login\n LOGIN_SUCCESS: (email: string) => `Successfully logged in as ${email}`,\n LOGIN_FAILED: 'Login failed. Please check your credentials.',\n LOGIN_PROMPT_EMAIL: 'Email:',\n LOGIN_PROMPT_PASSWORD: 'Password:',\n LOGIN_AUTHENTICATING: 'Authenticating...',\n\n // SSO\n SSO_OPENING_BROWSER: 'Opening browser for authentication...',\n SSO_WAITING: 'Waiting for browser authentication...',\n SSO_SUCCESS: 'Browser authentication successful!',\n SSO_TIMEOUT: 'Authentication timed out. Please try again.',\n SSO_CANCELLED: 'Authentication cancelled.',\n\n // Logout\n LOGOUT_SUCCESS: 'Successfully logged out.',\n LOGOUT_CONFIRM: 'Are you sure you want to log out?',\n LOGOUT_IN_PROGRESS: 'Logging out...',\n\n // Whoami\n WHOAMI_NOT_LOGGED_IN: 'You are not logged in.',\n WHOAMI_SUGGESTION: 'Run `docyrus login` to authenticate.',\n WHOAMI_FETCHING: 'Fetching user info...',\n\n // General\n NOT_LOGGED_IN: 'You are not logged in.',\n NETWORK_ERROR: 'Network request failed. Please check your internet connection.',\n UNKNOWN_ERROR: 'An unexpected error occurred.',\n\n // Errors\n INVALID_CREDENTIALS: 'Invalid email or password.',\n SESSION_EXPIRED: 'Your session has expired. Please log in again.',\n SERVER_ERROR: 'Server error. Please try again later.',\n\n // Create command\n CREATE_SELECT_FRAMEWORK: 'Select a framework:',\n CREATE_SELECT_UI_LIBRARY: 'Select UI library:',\n CREATE_SELECT_LINTER: 'Select linter/formatter:',\n CREATE_PROJECT_NAME: 'Project name:',\n CREATE_SELECT_PACKAGE_MANAGER: 'Select package manager:',\n CREATE_CUSTOMIZE_ALIAS: 'Customize import alias? (default: @/)',\n CREATE_CUSTOM_ALIAS: 'Enter import alias prefix (must start with @):',\n CREATE_SETTING_UP: 'Creating project...',\n CREATE_DOWNLOADING: 'Downloading project template...',\n CREATE_COPYING_LOCAL: 'Copying local template...',\n CREATE_CONFIGURING_LINTER: (linter: string) => `Configuring ${linter}...`,\n CREATE_CONFIGURING_ALIAS: (alias: string) => `Configuring import alias (${alias}/)...`,\n CREATE_INSTALLING: 'Installing dependencies...',\n CREATE_SUCCESS: 'Project created successfully!',\n CREATE_DOWNLOAD_OPENAPI: 'Download OpenAPI spec for code generation?',\n CREATE_DOWNLOADING_OPENAPI: 'Downloading OpenAPI specification...',\n CREATE_OPENAPI_SUCCESS: (path: string) => `OpenAPI spec saved to ${path}`,\n\n // TanStack DB Generator\n TANSTACK_GENERATOR_PROMPT: 'Generate TanStack Query collections from OpenAPI spec?',\n TANSTACK_GENERATOR_RUNNING: 'Generating TanStack Query collections...',\n TANSTACK_GENERATOR_SUCCESS: 'TanStack Query collections generated',\n TANSTACK_GENERATOR_FAILED: 'Failed to generate TanStack Query collections',\n\n // Linter Setup\n LINTER_SETUP_TITLE: 'Setting up Linter...',\n\n // State Management\n CREATE_SELECT_STATE_MANAGEMENT: 'Select state management:',\n STATE_MANAGEMENT_SETUP_TITLE: 'Setting up State Management...',\n\n // OpenAPI Setup\n OPENAPI_SETUP_TITLE: 'Setting up API...',\n\n // API Client\n API_CLIENT_DOCS: 'API Client: https://www.npmjs.com/package/@docyrus/api-client',\n\n // UI Library Setup\n UI_SETUP_TITLE: 'Setting up UI Library...',\n UI_MULTIPLE_LIBRARIES: 'Cannot use multiple UI libraries together',\n\n // Docyrus Token (for private template access)\n DOCYRUS_TOKEN_REQUIRED: 'Docyrus token required for template download',\n DOCYRUS_TOKEN_PROMPT: 'Enter Docyrus token:',\n DOCYRUS_TOKEN_SAVED: 'Docyrus token saved successfully',\n DOCYRUS_TOKEN_INVALID: 'Invalid Docyrus token. Please check and try again.'\n} as const;\n","import ora, { type Ora } from 'ora';\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n spinner: 'dots'\n });\n}\n\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n silent?: boolean;\n }\n): Promise<T> {\n // In silent mode, just run the function without spinner\n if (options?.silent) {\n return fn();\n }\n\n const spinner = createSpinner(text).start();\n\n try {\n const result = await fn();\n\n if (options?.successText) {\n spinner.succeed(options.successText);\n } else {\n spinner.stop();\n }\n\n return result;\n } catch (error) {\n if (options?.failText) {\n spinner.fail(options.failText);\n } else {\n spinner.stop();\n }\n throw error;\n }\n}\n","import {\n input, password, confirm, select\n} from '@inquirer/prompts';\n\nimport { MESSAGES } from './messages.js';\n\nexport async function promptEmail(defaultValue?: string): Promise<string> {\n return input({\n message: MESSAGES.LOGIN_PROMPT_EMAIL,\n default: defaultValue,\n validate: (value: string) => {\n if (!value || !value.includes('@')) {\n return 'Please enter a valid email address.';\n }\n\n return true;\n }\n });\n}\n\nexport async function promptPassword(): Promise<string> {\n return password({\n message: MESSAGES.LOGIN_PROMPT_PASSWORD,\n mask: '*',\n validate: (value: string) => {\n if (!value || value.length < 1) {\n return 'Please enter your password.';\n }\n\n return true;\n }\n });\n}\n\nexport async function promptConfirm(message: string, defaultValue = false): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue\n });\n}\n\nexport async function promptSelect<T extends string>(\n message: string,\n choices: Array<{ name: string; value: T }>\n): Promise<T> {\n return select({\n message,\n choices\n });\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\n\nexport interface ProgressStep {\n label: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\n error?: string;\n}\n\nexport interface MultiStepProgress {\n start: (stepIndex: number) => void;\n complete: (stepIndex: number) => void;\n fail: (stepIndex: number, error: string) => void;\n update: (stepIndex: number, message: string) => void;\n finish: () => void;\n}\n\nconst SYMBOLS = {\n pending: chalk.dim('○'),\n in_progress: chalk.cyan('◐'),\n completed: chalk.green('✓'),\n failed: chalk.red('✗')\n};\n\n/**\n * Create a multi-step progress display for UI library setup\n */\nexport function createMultiStepProgress(title: string, stepLabels: string[]): MultiStepProgress {\n const steps: ProgressStep[] = stepLabels.map(label => ({\n label,\n status: 'pending'\n }));\n\n let spinner: Ora | null = null;\n let currentStep = -1;\n\n const render = () => {\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(chalk.bold(title));\n // eslint-disable-next-line no-console\n console.log();\n\n for (const step of steps) {\n const symbol = SYMBOLS[step.status];\n const text = step.status === 'in_progress' ? chalk.cyan(step.label) : step.status === 'completed' ? chalk.green(step.label) : step.status === 'failed' ? chalk.red(step.label) : chalk.dim(step.label);\n\n // eslint-disable-next-line no-console\n console.log(` ${symbol} ${text}`);\n\n if (step.status === 'failed' && step.error) {\n // eslint-disable-next-line no-console\n console.log(` ${chalk.red(step.error)}`);\n }\n }\n\n // eslint-disable-next-line no-console\n console.log();\n };\n\n return {\n start(stepIndex: number) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner) {\n spinner.stop();\n }\n\n currentStep = stepIndex;\n steps[stepIndex].status = 'in_progress';\n\n spinner = ora({\n text: steps[stepIndex].label,\n color: 'cyan'\n }).start();\n },\n\n complete(stepIndex: number) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner && currentStep === stepIndex) {\n spinner.succeed(chalk.green(steps[stepIndex].label));\n spinner = null;\n }\n\n steps[stepIndex].status = 'completed';\n },\n\n fail(stepIndex: number, error: string) {\n if (stepIndex < 0 || stepIndex >= steps.length) return;\n\n if (spinner && currentStep === stepIndex) {\n spinner.fail(chalk.red(steps[stepIndex].label));\n spinner = null;\n }\n\n steps[stepIndex].status = 'failed';\n steps[stepIndex].error = error;\n },\n\n update(stepIndex: number, message: string) {\n if (spinner && currentStep === stepIndex) {\n spinner.text = message;\n }\n },\n\n finish() {\n if (spinner) {\n spinner.stop();\n spinner = null;\n }\n\n render();\n }\n };\n}\n\n/**\n * Simple progress callback that uses ora spinner\n */\nexport function createSimpleProgress(): (step: string, current?: number, total?: number) => void {\n let spinner: Ora | null = null;\n\n return (step: string, current?: number, total?: number) => {\n if (spinner) {\n spinner.succeed();\n spinner = null;\n }\n\n const text = current && total ? `${step} (${current}/${total})` : step;\n\n spinner = ora({\n text,\n color: 'cyan'\n }).start();\n\n if (current && total && current === total) {\n spinner.succeed();\n spinner = null;\n }\n };\n}\n\n/**\n * Wrap an async operation with progress display\n */\nexport async function withProgress<T>(\n label: string,\n operation: () => Promise<T>\n): Promise<T> {\n const spinner = ora({\n text: label,\n color: 'cyan'\n }).start();\n\n try {\n const result = await operation();\n\n spinner.succeed(chalk.green(label));\n\n return result;\n } catch (error) {\n spinner.fail(chalk.red(label));\n throw error;\n }\n}\n","import { type Command } from 'commander';\n\nimport { loginWithCredentials, loginWithOAuth, getUserInfo } from '../auth/index.js';\nimport { getTokenManager } from '../storage/index.js';\nimport { configManager } from '../config/index.js';\nimport {\n logger, output, MESSAGES, promptEmail, promptPassword, withSpinner\n} from '../ui/index.js';\nimport { AuthenticationError } from '../utils/errors.js';\n\ninterface LoginOptions {\n email?: boolean | string;\n}\n\nasync function handleCredentialLogin(email?: string): Promise<void> {\n // Get email from option, last login, or prompt\n const lastEmail = configManager.get('lastLoginEmail');\n const userEmail = email || await promptEmail(lastEmail);\n\n // Prompt for password\n const password = await promptPassword();\n\n // Authenticate\n const result = await withSpinner(\n MESSAGES.LOGIN_AUTHENTICATING,\n () => loginWithCredentials({ email: userEmail, password })\n );\n\n // Store tokens\n const tokenManager = getTokenManager();\n\n await tokenManager.setToken(result.tokens.accessToken);\n\n if (result.tokens.refreshToken) {\n await tokenManager.setRefreshToken(result.tokens.refreshToken);\n }\n\n // Store user email\n const finalEmail = result.user?.email || userEmail;\n\n await tokenManager.setUserEmail(finalEmail);\n configManager.set('lastLoginEmail', finalEmail);\n\n output.success(MESSAGES.LOGIN_SUCCESS(finalEmail), { email: finalEmail });\n}\n\nasync function handleSsoLogin(): Promise<void> {\n const result = await loginWithOAuth({\n onOpeningBrowser: () => {\n logger.info(MESSAGES.SSO_OPENING_BROWSER);\n },\n onWaitingForAuth: (url) => {\n logger.dim(` ${url}`);\n logger.info(MESSAGES.SSO_WAITING);\n }\n });\n\n // Store tokens\n const tokenManager = getTokenManager();\n\n await tokenManager.setToken(result.tokens.accessToken);\n\n if (result.tokens.refreshToken) {\n await tokenManager.setRefreshToken(result.tokens.refreshToken);\n }\n\n // Get user info if not provided\n let email = result.user?.email;\n\n if (!email && result.tokens.accessToken) {\n try {\n const userInfo = await getUserInfo(result.tokens.accessToken);\n\n ({ email } = userInfo);\n } catch {\n // Ignore error, email is optional\n }\n }\n\n if (email) {\n await tokenManager.setUserEmail(email);\n configManager.set('lastLoginEmail', email);\n output.success(MESSAGES.LOGIN_SUCCESS(email), { email });\n } else {\n output.success('Successfully logged in.');\n }\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Log in to Docyrus (uses browser-based SSO by default)')\n .option('-e, --email [email]', 'Log in with email/password instead of SSO')\n .action(async (options: LoginOptions) => {\n try {\n // Check if already logged in\n const tokenManager = getTokenManager();\n\n if (await tokenManager.isLoggedIn()) {\n const email = await tokenManager.getUserEmail();\n\n output.warn(`Already logged in${email ? ` as ${email}` : ''}. Run \\`docyrus logout\\` first to log in as a different user.`);\n\n return;\n }\n\n /*\n * If --email flag is used, use credential login\n * email can be true (flag without value) or a string (flag with value)\n */\n if (options.email !== undefined) {\n const emailValue = typeof options.email === 'string' ? options.email : undefined;\n\n await handleCredentialLogin(emailValue);\n } else {\n // Default: SSO login\n await handleSsoLogin();\n }\n } catch (error) {\n if (error instanceof AuthenticationError) {\n output.error(error.message);\n if (error.suggestion && !output.isJson()) {\n logger.dim(error.suggestion);\n }\n process.exit(error.exitCode);\n }\n throw error;\n }\n });\n}\n","import { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/index.js';\nimport {\n logger, output, MESSAGES, withSpinner\n} from '../ui/index.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from Docyrus')\n .action(async () => {\n const tokenManager = getTokenManager();\n\n // Check if logged in\n if (!(await tokenManager.isLoggedIn())) {\n output.warn(MESSAGES.WHOAMI_NOT_LOGGED_IN);\n\n return;\n }\n\n // Get current email for confirmation message\n const email = await tokenManager.getUserEmail();\n\n // Clear all tokens\n await withSpinner(\n MESSAGES.LOGOUT_IN_PROGRESS,\n async () => {\n await tokenManager.clearAll();\n },\n { silent: output.isJson() }\n );\n\n output.success(MESSAGES.LOGOUT_SUCCESS, email ? { email } : undefined);\n if (email && !output.isJson()) {\n logger.dim(`Logged out from ${email}`);\n }\n });\n}\n","import { getTokenManager } from '../storage/index.js';\nimport { refreshAccessToken } from '../auth/index.js';\nimport { NotLoggedInError, AuthenticationError } from './errors.js';\n\n/**\n * Decodes a JWT token payload without verification.\n * Used only for checking expiration time.\n */\nfunction decodeJwtPayload(token: string): { exp?: number; iat?: number } | null {\n try {\n const parts = token.split('.');\n\n if (parts.length !== 3) return null;\n\n const payload = Buffer.from(parts[1], 'base64url').toString('utf8');\n\n return JSON.parse(payload);\n } catch {\n return null;\n }\n}\n\n/**\n * Checks if a JWT token is expired.\n * Returns true if expired or if expiration cannot be determined.\n */\nfunction isTokenExpired(token: string): boolean {\n const payload = decodeJwtPayload(token);\n\n if (!payload?.exp) return false; // No expiration claim, assume valid\n\n // Add 30 second buffer to account for clock skew\n const expirationTime = payload.exp * 1000;\n const now = Date.now();\n\n return now >= expirationTime - 30000;\n}\n\n/**\n * Ensures the user is logged in before proceeding.\n * Automatically refreshes expired tokens if a refresh token is available.\n * Throws NotLoggedInError if the user is not authenticated.\n *\n * @returns The current access token\n * @throws NotLoggedInError if the user is not logged in\n */\nexport async function requireAuth(): Promise<string> {\n const tokenManager = getTokenManager();\n\n if (!(await tokenManager.isLoggedIn())) {\n throw new NotLoggedInError();\n }\n\n let token = await tokenManager.getToken();\n\n if (!token) {\n throw new NotLoggedInError();\n }\n\n // Check if token is expired\n if (isTokenExpired(token)) {\n const refreshToken = await tokenManager.getRefreshToken();\n\n if (!refreshToken) {\n // No refresh token available, user needs to log in again\n await tokenManager.clearAll();\n throw new NotLoggedInError('Your session has expired. Please log in again.');\n }\n\n try {\n // Attempt to refresh the token\n const newTokens = await refreshAccessToken(refreshToken);\n\n // Store the new tokens\n await tokenManager.setToken(newTokens.accessToken);\n\n if (newTokens.refreshToken) {\n await tokenManager.setRefreshToken(newTokens.refreshToken);\n }\n\n token = newTokens.accessToken;\n } catch (error) {\n // Refresh failed, clear tokens and require re-login\n await tokenManager.clearAll();\n\n if (error instanceof AuthenticationError) {\n throw new NotLoggedInError('Your session has expired. Please log in again.');\n }\n\n throw error;\n }\n }\n\n return token;\n}\n","import { type Command } from 'commander';\n\nimport { getUserInfo } from '../auth/index.js';\nimport { getTokenManager } from '../storage/index.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport {\n logger, output, MESSAGES, withSpinner\n} from '../ui/index.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Display the current logged-in user')\n .action(async () => {\n const tokenManager = getTokenManager();\n\n // Get valid token (will auto-refresh if expired)\n const token = await requireAuth();\n\n try {\n const user = await withSpinner(\n MESSAGES.WHOAMI_FETCHING,\n () => getUserInfo(token),\n { silent: output.isJson() }\n );\n\n if (output.isJson()) {\n output.set('user', {\n email: user.email,\n firstname: user.firstname,\n lastname: user.lastname\n });\n } else {\n logger.newline();\n logger.log(`Email: ${user.email}`);\n if (user.firstname || user.lastname) {\n const fullName = [user.firstname, user.lastname].filter(Boolean).join(' ');\n\n logger.log(`Name: ${fullName}`);\n }\n logger.newline();\n }\n } catch (error) {\n // If API call fails, try to show cached email\n const cachedEmail = await tokenManager.getUserEmail();\n\n if (cachedEmail) {\n if (output.isJson()) {\n output.set('user', { email: cachedEmail, cached: true });\n } else {\n logger.newline();\n logger.log(`Email: ${cachedEmail}`);\n logger.dim('(Unable to fetch full profile from server)');\n logger.newline();\n }\n } else {\n throw error;\n }\n }\n });\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type ProgressCallback } from './ui-library-setup.js';\n\nexport type Framework = 'nextjs' | 'react' | 'vue' | 'electron';\nexport type Linter = 'eslint' | 'biome' | 'none';\n\nconst ESLINT_CONFIGS: Record<Framework, { imports: string[]; configs: string[] }> = {\n react: {\n imports: ['baseConfig', 'reactConfig'],\n configs: ['...baseConfig', '...reactConfig']\n },\n nextjs: {\n imports: [\n 'baseConfig',\n 'reactConfig',\n 'nextjsConfig'\n ],\n configs: [\n '...baseConfig',\n '...reactConfig',\n '...nextjsConfig'\n ]\n },\n vue: {\n imports: ['baseConfig', 'vueConfig'],\n configs: ['...baseConfig', '...vueConfig']\n },\n electron: {\n imports: ['baseConfig', 'electronConfig'],\n configs: ['...baseConfig', '...electronConfig']\n }\n};\n\nfunction generateEslintConfig(framework: Framework): string {\n const { imports, configs } = ESLINT_CONFIGS[framework];\n\n return `import { ${imports.join(', ')} } from '@docyrus/rules/eslint';\\n\\nexport default [${configs.join(', ')}];\\n`;\n}\n\nfunction generateBiomeConfig(framework: Framework): string {\n return `${JSON.stringify({ extends: [`@docyrus/rules/biome/${framework}`] }, null, 2)}\\n`;\n}\n\n/**\n * Applies linter configuration to a project.\n * Programmatically generates config files that use @docyrus/rules.\n *\n * @param targetDir - The target project directory\n * @param framework - The framework type (nextjs, react, vue, or electron)\n * @param linter - The linter choice (eslint, biome, or none)\n * @param onProgress - Progress callback for step-by-step display\n */\nexport async function applyLinterConfig(\n targetDir: string,\n framework: Framework,\n linter: Linter,\n onProgress: ProgressCallback\n): Promise<void> {\n if (linter === 'none') return;\n\n const linterName = linter === 'eslint' ? 'ESLint' : 'Biome';\n\n // Step 1: Generate and write config file\n onProgress(`Generating ${linterName} config...`, 1, 2);\n\n if (linter === 'eslint') {\n await writeFile(join(targetDir, 'eslint.config.mjs'), generateEslintConfig(framework));\n } else {\n await writeFile(join(targetDir, 'biome.json'), generateBiomeConfig(framework));\n }\n\n // Step 2: Update target package.json with dependencies and scripts\n onProgress('Updating package.json...', 2, 2);\n\n const targetPkgPath = join(targetDir, 'package.json');\n const targetPkg = JSON.parse(await readFile(targetPkgPath, 'utf-8'));\n\n let devDependencies: Record<string, string>;\n let scripts: Record<string, string>;\n\n if (linter === 'eslint') {\n devDependencies = { '@docyrus/rules': 'latest', eslint: 'latest' };\n scripts = { lint: 'eslint .', format: 'eslint --fix .' };\n } else {\n devDependencies = { '@docyrus/rules': 'latest', '@biomejs/biome': 'latest' };\n scripts = { lint: 'biome check .', format: 'biome check --fix .' };\n }\n\n targetPkg.devDependencies = {\n ...targetPkg.devDependencies,\n ...devDependencies\n };\n\n targetPkg.scripts = {\n ...targetPkg.scripts,\n ...scripts\n };\n\n await writeFile(targetPkgPath, JSON.stringify(targetPkg, null, 2));\n}\n","import { readFile, writeFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type Framework } from './linter-config.js';\n\nexport type AliasPrefix = string; // Must start with '@'\n\ninterface AliasConfig {\n prefix: AliasPrefix;\n pattern: string;\n replacement: string;\n}\n\n/**\n * Applies custom alias configuration to a project.\n * Updates tsconfig.json, vite.config.ts (for React/Vue), and all import paths.\n */\nexport async function applyAliasConfig(\n targetDir: string,\n framework: Framework,\n aliasPrefix: AliasPrefix\n): Promise<void> {\n // Default '@' or '@/' - no changes needed\n if (aliasPrefix === '@' || aliasPrefix === '@/') return;\n\n const config: AliasConfig = {\n prefix: aliasPrefix,\n pattern: `${aliasPrefix}/*`,\n replacement: './src/*'\n };\n\n // 1. Update tsconfig.json\n await updateTsConfig(targetDir, config);\n\n // 2. Update vite.config.ts (React, Vue, and Electron templates)\n if (framework === 'react' || framework === 'vue' || framework === 'electron') {\n await updateViteConfig(targetDir, config);\n }\n\n // 3. Update all import paths in source files\n await updateImports(targetDir, aliasPrefix, framework);\n}\n\nasync function updateTsConfig(targetDir: string, config: AliasConfig): Promise<void> {\n const tsconfigPath = join(targetDir, 'tsconfig.json');\n const tsconfig = JSON.parse(await readFile(tsconfigPath, 'utf-8'));\n\n // Remove old @/* path and add new one\n if (tsconfig.compilerOptions?.paths) {\n delete tsconfig.compilerOptions.paths['@/*'];\n tsconfig.compilerOptions.paths[config.pattern] = [config.replacement];\n }\n\n await writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2));\n}\n\nasync function updateViteConfig(targetDir: string, config: AliasConfig): Promise<void> {\n const vitePath = join(targetDir, 'vite.config.ts');\n\n try {\n let content = await readFile(vitePath, 'utf-8');\n\n // Replace '@': resolve(...) with new alias\n content = content.replace(\n /'@':\\s*resolve\\(/g,\n `'${config.prefix}': resolve(`\n );\n\n await writeFile(vitePath, content);\n } catch {\n // vite.config.ts might not exist for Next.js templates\n }\n}\n\nasync function updateImports(targetDir: string, newPrefix: AliasPrefix, framework: Framework): Promise<void> {\n const srcDir = join(targetDir, 'src');\n\n try {\n await updateImportsRecursive(srcDir, newPrefix, framework);\n } catch {\n // src directory might not exist\n }\n}\n\nfunction getFileExtensions(framework: Framework): string[] {\n switch (framework) {\n case 'vue':\n return [\n '.ts',\n '.tsx',\n '.vue'\n ];\n\n default:\n return ['.ts', '.tsx'];\n }\n}\n\nasync function updateImportsRecursive(dir: string, newPrefix: AliasPrefix, framework: Framework): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n const extensions = getFileExtensions(framework);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await updateImportsRecursive(fullPath, newPrefix, framework);\n } else if (extensions.some(ext => entry.name.endsWith(ext))) {\n const content = await readFile(fullPath, 'utf-8');\n\n // Replace import paths: from '@/...' → from '@app/...'\n const updatedContent = content.replace(\n /from\\s+['\"]@\\//g,\n `from '${newPrefix}/`\n );\n\n if (updatedContent !== content) {\n await writeFile(fullPath, updatedContent);\n }\n }\n }\n}\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { RestApiClient } from '@docyrus/api-client';\n\nimport { configManager } from '../config/config-manager.js';\nimport { DOCYRUS_API_URL } from '../config/constants.js';\n\n/**\n * Creates an authenticated REST API client using the provided access token.\n */\nexport function createAuthenticatedClient(accessToken: string): RestApiClient {\n const apiUrl = configManager.get('apiUrl') || DOCYRUS_API_URL;\n const client = new RestApiClient({ baseURL: apiUrl });\n\n client.setAccessToken(accessToken);\n\n return client;\n}\n\n/**\n * Downloads the OpenAPI specification and saves it to the target directory.\n *\n * @param accessToken - The user's access token\n * @param targetDir - The target project directory\n * @param filename - The filename to save as (default: openapi.json)\n * @returns The path to the saved file\n */\nexport async function downloadOpenApiSpec(\n accessToken: string,\n targetDir: string,\n filename = 'openapi.json'\n): Promise<string> {\n const client = createAuthenticatedClient(accessToken);\n\n // Fetch the OpenAPI spec\n const spec = await client.get<Record<string, unknown>>('/v1/api/openapi.json');\n\n // Ensure the target directory exists\n const targetPath = join(targetDir, filename);\n const targetDirPath = dirname(targetPath);\n\n await mkdir(targetDirPath, { recursive: true });\n\n // Write the spec to file\n await writeFile(targetPath, JSON.stringify(spec, null, 2));\n\n return targetPath;\n}\n","\nimport { cp, rm, access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { constants } from 'node:fs';\n\nimport { type UILibrary } from './ui-library-setup.js';\n\n/**\n * Applies UI library-specific page variants after template download and UI library setup.\n *\n * Templates contain a `__ui-variants__/{library}/` directory that mirrors the project\n * structure. When a UI library is selected, the matching variant files are copied over\n * the default pages. The `__ui-variants__/` directory is always cleaned up afterward.\n */\nexport async function applyUIVariants(\n targetDir: string,\n uiLibrary: UILibrary\n): Promise<void> {\n const variantsDir = join(targetDir, '__ui-variants__');\n\n try {\n await access(variantsDir, constants.F_OK);\n } catch {\n return;\n }\n\n if (uiLibrary !== 'none') {\n const libraryDir = join(variantsDir, uiLibrary);\n\n try {\n await access(libraryDir, constants.F_OK);\n await cp(libraryDir, targetDir, { recursive: true, force: true });\n } catch {\n // No variant for this library, use defaults\n }\n }\n\n await rm(variantsDir, { recursive: true, force: true });\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst execAsync = promisify(exec);\n\n// Build-time injected from .env.shared via tsup define (single source of truth)\ndeclare const __DICEUI_COMPONENTS__: string;\n\nconst DICEUI_COMPONENTS = __DICEUI_COMPONENTS__.split(',');\n\nexport type UILibrary = 'shadcn' | 'diceui' | 'shadcn-vue' | 'heroui' | 'none';\nexport type UIFramework = 'nextjs' | 'react' | 'vue' | 'electron';\n\n// UIFramework-UI Library compatibility matrix\nconst UI_LIBRARY_COMPATIBILITY: Record<UIFramework, UILibrary[]> = {\n nextjs: [\n 'shadcn',\n 'diceui',\n 'heroui',\n 'none'\n ],\n react: [\n 'shadcn',\n 'diceui',\n 'heroui',\n 'none'\n ],\n vue: ['shadcn-vue', 'none'],\n electron: [\n 'shadcn',\n 'diceui',\n 'none'\n ]\n};\n\nexport function isUILibraryCompatible(framework: UIFramework, uiLibrary: UILibrary): boolean {\n return UI_LIBRARY_COMPATIBILITY[framework].includes(uiLibrary);\n}\n\nexport function getCompatibleUILibraries(framework: UIFramework): UILibrary[] {\n return UI_LIBRARY_COMPATIBILITY[framework];\n}\n\nexport function getUILibraryErrorMessage(framework: UIFramework, uiLibrary: UILibrary): string {\n switch (uiLibrary) {\n case 'heroui':\n if (framework === 'electron') {\n return 'HeroUI is not supported with Electron due to framer-motion compatibility issues. Use --shadcn or --diceui instead';\n }\n\n return `HeroUI only supports Next.js and React frameworks. Current: ${framework}`;\n\n case 'shadcn':\n\n case 'diceui':\n if (framework === 'vue') {\n return 'Use --shadcn-vue for Vue projects instead of --shadcn or --diceui';\n }\n\n return `shadcn/ui is not supported with ${framework}`;\n\n case 'shadcn-vue':\n return `shadcn-vue is only for Vue projects. Use --shadcn or --diceui for ${framework}`;\n\n default:\n return `${uiLibrary} is not compatible with ${framework}`;\n }\n}\n\nexport interface ProgressCallback {\n (step: string, current?: number, total?: number): void;\n}\n\n/**\n * Setup shadcn/ui for React-based frameworks via npx.\n * Uses init (Base UI) → update style → migrate radix → add all components\n */\nexport async function setupShadcn(\n targetDir: string,\n packageManager: string,\n style: string,\n baseColor: string,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn/ui with Base UI\n onProgress('Initializing shadcn/ui (Base UI)...', 1, 4);\n await execAsync(`${dlx} shadcn@latest init --yes --defaults -b ${baseColor}`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 2: Migrate to Radix UI\n onProgress('Migrating to Radix UI...', 2, 4);\n await execAsync(`${dlx} shadcn@latest migrate radix --yes`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 3: Update components.json style field to radix-{style}\n onProgress('Updating style configuration...', 3, 4);\n const componentsJsonPath = join(targetDir, 'components.json');\n const componentsJson = JSON.parse(await readFile(componentsJsonPath, 'utf-8'));\n\n componentsJson.style = `radix-${style}`;\n await writeFile(componentsJsonPath, JSON.stringify(componentsJson, null, 2));\n\n // Step 4: Add all components\n onProgress('Installing shadcn components...', 4, 4);\n await execAsync(`${dlx} shadcn@latest add --all --yes --overwrite`, {\n cwd: targetDir,\n timeout: 300000\n });\n}\n\n/**\n * Setup DiceUI for React-based frameworks via npx.\n * DiceUI uses shadcn as a base, then adds DiceUI-specific components\n */\nexport async function setupDiceUI(\n targetDir: string,\n packageManager: string,\n style: string,\n baseColor: string,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn/ui with Base UI\n onProgress('Initializing shadcn/ui (Base UI)...', 1, 5);\n await execAsync(`${dlx} shadcn@latest init --yes --defaults -b ${baseColor}`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 2: Migrate to Radix UI\n onProgress('Migrating to Radix UI...', 2, 5);\n await execAsync(`${dlx} shadcn@latest migrate radix --yes`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 3: Update components.json style field to radix-{style}\n onProgress('Updating style configuration...', 3, 5);\n const componentsJsonPath = join(targetDir, 'components.json');\n const componentsJson = JSON.parse(await readFile(componentsJsonPath, 'utf-8'));\n\n componentsJson.style = `radix-${style}`;\n await writeFile(componentsJsonPath, JSON.stringify(componentsJson, null, 2));\n\n // Step 4: Add all shadcn components\n onProgress('Installing shadcn components...', 4, 5);\n await execAsync(`${dlx} shadcn@latest add --all --yes --overwrite`, {\n cwd: targetDir,\n timeout: 300000\n });\n\n // Step 5: Add DiceUI-specific components (including utilities)\n onProgress('Installing DiceUI components...', 5, 5);\n for (const component of DICEUI_COMPONENTS) {\n await execAsync(`${dlx} shadcn@latest add https://shadcn-extension.vercel.app/r/diceui/${component}.json --yes --overwrite`, {\n cwd: targetDir,\n timeout: 60000\n });\n }\n}\n\n/**\n * Setup shadcn-vue for Vue\n */\nexport async function setupShadcnVue(\n targetDir: string,\n packageManager: string,\n onProgress: ProgressCallback\n): Promise<void> {\n const dlx = getDlxCommand(packageManager);\n\n // Step 1: Initialize shadcn-vue\n onProgress('Initializing shadcn-vue...', 1, 2);\n await execAsync(`${dlx} shadcn-vue@latest init -y -d`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 2: Add all components\n onProgress('Installing shadcn-vue components...', 2, 2);\n await execAsync(`${dlx} shadcn-vue@latest add -a -y -o`, {\n cwd: targetDir,\n timeout: 300000\n });\n}\n\n/**\n * Setup HeroUI for Next.js and React (not supported on Electron due to framer-motion issues)\n */\nexport async function setupHeroUI(\n targetDir: string,\n framework: 'nextjs' | 'react',\n packageManager: string,\n onProgress: ProgressCallback\n): Promise<void> {\n // Step 1: Add dependencies\n onProgress('Adding HeroUI dependencies...', 1, 3);\n const installCmd = getInstallCommand(packageManager);\n\n await execAsync(`${installCmd} @heroui/react framer-motion`, {\n cwd: targetDir,\n timeout: 120000\n });\n\n // Step 2: Write HeroUI styles\n onProgress('Configuring styles...', 2, 3);\n await writeHeroUIStyles(targetDir);\n\n // Step 3: Add HeroUIProvider\n onProgress('Adding HeroUIProvider...', 3, 3);\n await addHeroUIProvider(targetDir, framework);\n}\n\n/**\n * Main setup function that routes to the appropriate setup\n */\nexport async function setupUILibrary(\n targetDir: string,\n framework: UIFramework,\n uiLibrary: UILibrary,\n packageManager: string,\n onProgress: ProgressCallback,\n style?: string,\n baseColor?: string\n): Promise<void> {\n if (uiLibrary === 'none') {\n return;\n }\n\n if (!isUILibraryCompatible(framework, uiLibrary)) {\n throw new Error(getUILibraryErrorMessage(framework, uiLibrary));\n }\n\n switch (uiLibrary) {\n case 'shadcn':\n await setupShadcn(\n targetDir,\n packageManager,\n style ?? 'vega',\n baseColor ?? 'zinc',\n onProgress\n );\n break;\n\n case 'diceui':\n await setupDiceUI(\n targetDir,\n packageManager,\n style ?? 'vega',\n baseColor ?? 'zinc',\n onProgress\n );\n break;\n\n case 'shadcn-vue':\n await setupShadcnVue(targetDir, packageManager, onProgress);\n break;\n\n case 'heroui':\n await setupHeroUI(targetDir, framework as 'nextjs' | 'react', packageManager, onProgress);\n break;\n }\n}\n\n// Helper functions\n\nfunction getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'pnpm':\n return 'pnpx';\n\n case 'yarn':\n return 'yarn dlx';\n\n case 'bun':\n return 'bunx';\n\n default:\n return 'npx';\n }\n}\n\nfunction getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'pnpm':\n return 'pnpm add';\n\n case 'yarn':\n return 'yarn add';\n\n case 'bun':\n return 'bun add';\n\n default:\n return 'npm install';\n }\n}\n\n/**\n * Overwrites the project's CSS file with HeroUI-specific imports.\n * HeroUI provides its own theme via its Tailwind plugin — no :root CSS vars needed.\n */\nasync function writeHeroUIStyles(targetDir: string): Promise<void> {\n const possibleCssPaths = [join(targetDir, 'src/styles/globals.css'), join(targetDir, 'src/styles/global.css')];\n\n const css = `@import \"tailwindcss\";\n@plugin \"@heroui/react/tailwind\";\n`;\n\n for (const cssPath of possibleCssPaths) {\n try {\n await readFile(cssPath, 'utf-8');\n await writeFile(cssPath, css, 'utf-8');\n\n return;\n } catch {\n // File doesn't exist, try next\n }\n }\n}\n\nasync function addHeroUIProvider(targetDir: string, framework: 'nextjs' | 'react'): Promise<void> {\n if (framework === 'nextjs') {\n await addHeroUIProviderNextjs(targetDir);\n } else {\n await addHeroUIProviderReact(targetDir);\n }\n}\n\nasync function addHeroUIProviderNextjs(targetDir: string): Promise<void> {\n // Create providers.tsx file\n const providersPath = join(targetDir, 'src/app/providers.tsx');\n const providersContent = `'use client';\n\nimport { HeroUIProvider } from '@heroui/react';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n return <HeroUIProvider>{children}</HeroUIProvider>;\n}\n`;\n\n await writeFile(providersPath, providersContent, 'utf-8');\n\n // Update layout.tsx to use providers\n const layoutPath = join(targetDir, 'src/app/layout.tsx');\n\n try {\n let layoutContent = await readFile(layoutPath, 'utf-8');\n\n // Add import if not present\n if (!layoutContent.includes('Providers')) {\n layoutContent = layoutContent.replace(\n /^(import.*\\n)+/m,\n match => `${match}import { Providers } from './providers';\\n`\n );\n\n // Wrap children with Providers\n layoutContent = layoutContent.replace(\n /(<body[^>]*>)([\\s\\S]*?)({children})([\\s\\S]*?)(<\\/body>)/,\n '$1$2<Providers>$3</Providers>$4$5'\n );\n\n await writeFile(layoutPath, layoutContent, 'utf-8');\n }\n } catch {\n // Layout file doesn't exist or couldn't be read\n }\n}\n\nasync function addHeroUIProviderReact(targetDir: string): Promise<void> {\n const mainPath = join(targetDir, 'src/main.tsx');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n // Add HeroUIProvider import\n if (!content.includes('HeroUIProvider')) {\n content = content.replace(\n /^(import.*\\n)+/m,\n match => `${match}import { HeroUIProvider } from '@heroui/react';\\n`\n );\n\n // Wrap App with HeroUIProvider\n content = content.replace(\n /(<App\\s*\\/>)/,\n '<HeroUIProvider>\\n $1\\n </HeroUIProvider>'\n );\n\n await writeFile(mainPath, content, 'utf-8');\n }\n } catch {\n // Main file doesn't exist or couldn't be read\n }\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { type ProgressCallback } from './ui-library-setup.js';\n\nexport type StateManagement\n = | 'zustand'\n | 'tanstack-query'\n | 'tanstack-vue-query'\n | 'none';\n\ntype UIFramework = 'nextjs' | 'react' | 'vue' | 'electron';\n\nconst STATE_MANAGEMENT_VERSIONS: Record<Exclude<StateManagement, 'none'>, { name: string; version: string }> = {\n zustand: { name: 'zustand', version: '5.0.11' },\n 'tanstack-query': { name: '@tanstack/react-query', version: '5.90.20' },\n 'tanstack-vue-query': { name: '@tanstack/vue-query', version: '5.92.9' }\n};\n\n/**\n * Returns compatible state management options for a given framework.\n */\nexport function getCompatibleStateManagement(framework: UIFramework): StateManagement[] {\n switch (framework) {\n case 'react':\n\n case 'nextjs':\n\n case 'electron':\n return [\n 'zustand',\n 'tanstack-query',\n 'none'\n ];\n\n case 'vue':\n return ['tanstack-vue-query', 'none'];\n\n default:\n return [];\n }\n}\n\n/**\n * Sets up state management for the project.\n * Runs BEFORE pnpm install — adds dependency to package.json + creates config files + wraps providers.\n */\nexport async function setupStateManagement(\n targetDir: string,\n framework: UIFramework,\n stateManagement: StateManagement,\n onProgress: ProgressCallback\n): Promise<void> {\n if (stateManagement === 'none') return;\n\n const totalSteps = stateManagement === 'zustand' ? 2 : 3;\n\n // Step 1: Add dependency to package.json\n onProgress('Adding dependency...', 1, totalSteps);\n const pkg = STATE_MANAGEMENT_VERSIONS[stateManagement];\n\n await addDependencyToPackageJson(targetDir, pkg.name, pkg.version);\n\n // Step 2: Create config file\n onProgress('Creating configuration...', 2, totalSteps);\n\n switch (stateManagement) {\n case 'zustand':\n await createZustandStore(targetDir);\n break;\n\n case 'tanstack-query':\n await createReactQueryClient(targetDir);\n break;\n\n case 'tanstack-vue-query':\n await createVueQueryConfig(targetDir);\n break;\n }\n\n // Step 3: Wrap provider (not needed for Zustand)\n if (stateManagement !== 'zustand') {\n onProgress('Configuring provider...', 3, totalSteps);\n\n if (stateManagement === 'tanstack-query') {\n await wrapReactQueryProvider(targetDir, framework);\n } else if (stateManagement === 'tanstack-vue-query') {\n await wrapVueQueryPlugin(targetDir);\n }\n }\n}\n\n// --- Helper functions ---\n\nasync function addDependencyToPackageJson(targetDir: string, name: string, version: string): Promise<void> {\n const pkgPath = join(targetDir, 'package.json');\n const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));\n\n pkg.dependencies = pkg.dependencies ?? {};\n pkg.dependencies[name] = version;\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2), 'utf-8');\n}\n\nasync function createZustandStore(targetDir: string): Promise<void> {\n const storePath = join(targetDir, 'src/store/app-store.ts');\n\n await mkdir(dirname(storePath), { recursive: true });\n await writeFile(storePath, `import { create } from 'zustand';\n\ninterface AppState {\n count: number;\n increment: () => void;\n decrement: () => void;\n}\n\nexport const useAppStore = create<AppState>((set) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n decrement: () => set((state) => ({ count: state.count - 1 }))\n}));\n`, 'utf-8');\n}\n\nasync function createReactQueryClient(targetDir: string): Promise<void> {\n const clientPath = join(targetDir, 'src/lib/query-client.ts');\n\n await mkdir(dirname(clientPath), { recursive: true });\n await writeFile(clientPath, `import { QueryClient } from '@tanstack/react-query';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1\n }\n }\n});\n`, 'utf-8');\n}\n\nasync function createVueQueryConfig(targetDir: string): Promise<void> {\n const configPath = join(targetDir, 'src/lib/query-client.ts');\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, `import type { VueQueryPluginOptions } from '@tanstack/vue-query';\n\nexport const vueQueryOptions: VueQueryPluginOptions = {\n queryClientConfig: {\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1\n }\n }\n }\n};\n`, 'utf-8');\n}\n\nasync function wrapReactQueryProvider(targetDir: string, framework: UIFramework): Promise<void> {\n if (framework === 'nextjs') {\n await wrapNextjsQueryProvider(targetDir);\n } else {\n await wrapReactEntryQueryProvider(targetDir, framework);\n }\n}\n\nasync function wrapNextjsQueryProvider(targetDir: string): Promise<void> {\n // Create providers.tsx\n const providersPath = join(targetDir, 'src/app/providers.tsx');\n\n await writeFile(providersPath, `'use client';\n\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { queryClient } from '@/lib/query-client';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n}\n`, 'utf-8');\n\n // Update layout.tsx to wrap children with Providers\n const layoutPath = join(targetDir, 'src/app/layout.tsx');\n\n try {\n let content = await readFile(layoutPath, 'utf-8');\n\n if (!content.includes('Providers')) {\n // Add import after existing imports\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { Providers } from './providers';\\n`\n );\n\n // Wrap {children} with <Providers>\n content = content.replace(\n /\\{children\\}/,\n '<Providers>{children}</Providers>'\n );\n\n await writeFile(layoutPath, content, 'utf-8');\n }\n } catch {\n // Layout file not found\n }\n}\n\nasync function wrapReactEntryQueryProvider(targetDir: string, framework: UIFramework): Promise<void> {\n const mainPath = join(targetDir, 'src/main.tsx');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n if (content.includes('QueryClientProvider')) return;\n\n // Add imports\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { QueryClientProvider } from '@tanstack/react-query';\\nimport { queryClient } from './lib/query-client';\\n`\n );\n\n if (framework === 'electron') {\n // Electron: wrap around BrowserRouter\n content = content.replace(\n /(<BrowserRouter>)/,\n '<QueryClientProvider client={queryClient}>\\n $1'\n );\n content = content.replace(\n /(<\\/BrowserRouter>)/,\n '$1\\n </QueryClientProvider>'\n );\n } else {\n // React: wrap around App\n content = content.replace(\n /(<App\\s*\\/>)/,\n '<QueryClientProvider client={queryClient}>\\n $1\\n </QueryClientProvider>'\n );\n }\n\n await writeFile(mainPath, content, 'utf-8');\n } catch {\n // Main file not found\n }\n}\n\nasync function wrapVueQueryPlugin(targetDir: string): Promise<void> {\n const mainPath = join(targetDir, 'src/main.ts');\n\n try {\n let content = await readFile(mainPath, 'utf-8');\n\n if (content.includes('VueQueryPlugin')) return;\n\n // Add import at the top (after existing imports)\n content = content.replace(\n /^(import\\s.*\\n)+/m,\n match => `${match}import { VueQueryPlugin } from '@tanstack/vue-query';\\nimport { vueQueryOptions } from './lib/query-client';\\n`\n );\n\n // Add app.use(VueQueryPlugin, vueQueryOptions) before app.use(router)\n content = content.replace(\n /app\\.use\\(router\\)/,\n 'app.use(VueQueryPlugin, vueQueryOptions);\\napp.use(router)'\n );\n\n await writeFile(mainPath, content, 'utf-8');\n } catch {\n // Main file not found\n }\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport {\n access,\n constants,\n cp,\n readFile,\n rm,\n writeFile\n} from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { downloadTemplate } from 'giget';\nimport {\n select, input, password, confirm\n} from '@inquirer/prompts';\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/cli-token-manager.js';\n\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { applyLinterConfig, type Framework, type Linter } from '../utils/linter-config.js';\nimport { applyAliasConfig } from '../utils/alias-config.js';\nimport { downloadOpenApiSpec } from '../utils/api-client.js';\nimport { applyUIVariants } from '../utils/ui-variant-swap.js';\nimport {\n setupUILibrary,\n isUILibraryCompatible,\n getUILibraryErrorMessage,\n type UILibrary,\n type UIFramework\n} from '../utils/ui-library-setup.js';\nimport {\n setupStateManagement,\n getCompatibleStateManagement,\n type StateManagement\n} from '../utils/state-management-setup.js';\nimport { ConflictingFlagsError, ProjectExistsError, TemplateError } from '../utils/errors.js';\nimport { logger } from '../ui/logger.js';\nimport { withSpinner } from '../ui/spinner.js';\nimport { createSimpleProgress } from '../ui/progress.js';\nimport { MESSAGES } from '../ui/messages.js';\n\nconst execAsync = promisify(exec);\n\n// Build-time injected from .env.shared via tsup define (single source of truth)\ndeclare const __SHADCN_BASE_COLORS__: string;\n\nconst SHADCN_BASE_COLORS = __SHADCN_BASE_COLORS__.split(',');\n\ninterface CreateOptions {\n path?: string;\n // Framework flags\n nextjs?: boolean;\n react?: boolean;\n vue?: boolean;\n electron?: boolean;\n // UI library flags\n shadcn?: boolean;\n diceui?: boolean;\n shadcnVue?: boolean;\n heroui?: boolean;\n // State management flags\n zustand?: boolean;\n tanstackQuery?: boolean;\n tanstackVueQuery?: boolean;\n // Linter flags\n eslint?: boolean;\n biome?: boolean;\n noLinter?: boolean;\n // Base color flag (for shadcn)\n baseColor?: string;\n // Alias flag\n alias?: string;\n // Package manager flags\n pnpm?: boolean;\n npm?: boolean;\n yarn?: boolean;\n bun?: boolean;\n // Development flags\n local?: boolean;\n}\n\ntype FrameworkType = 'nextjs' | 'react' | 'vue' | 'electron';\ntype LinterType = 'eslint' | 'biome' | 'none';\ntype PackageManagerType = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nfunction validateConflictingFlags(options: CreateOptions): void {\n // Framework conflicts - only one framework can be selected\n const frameworkFlags = [\n options.nextjs,\n options.react,\n options.vue,\n options.electron\n ].filter(Boolean);\n\n if (frameworkFlags.length > 1) {\n throw new ConflictingFlagsError('--nextjs, --react, --vue, --electron', '(multiple frameworks)');\n }\n\n // UI library conflicts - only one can be selected\n const uiLibraryFlags = [\n options.shadcn,\n options.diceui,\n options.shadcnVue,\n options.heroui\n ].filter(Boolean);\n\n if (uiLibraryFlags.length > 1) {\n throw new ConflictingFlagsError(\n '--shadcn, --diceui, --shadcn-vue, --heroui',\n MESSAGES.UI_MULTIPLE_LIBRARIES\n );\n }\n\n // State management conflicts\n const stateFlags = [\n options.zustand,\n options.tanstackQuery,\n options.tanstackVueQuery\n ].filter(Boolean);\n\n if (stateFlags.length > 1) {\n throw new ConflictingFlagsError('--zustand, --tanstack-query, --tanstack-vue-query', '(multiple state management options)');\n }\n\n // Linter conflicts\n const linterFlags = [\n options.eslint,\n options.biome,\n options.noLinter\n ].filter(Boolean);\n\n if (linterFlags.length > 1) {\n throw new ConflictingFlagsError('--eslint, --biome, --no-linter', '(multiple linter options)');\n }\n\n // Package manager conflicts\n const pmFlags = [\n options.pnpm,\n options.npm,\n options.yarn,\n options.bun\n ].filter(Boolean);\n\n if (pmFlags.length > 1) {\n throw new ConflictingFlagsError('--pnpm, --npm, --yarn, --bun', '(multiple package managers)');\n }\n}\n\nfunction validateFrameworkUILibrary(framework: FrameworkType, uiLibrary: UILibrary): void {\n if (uiLibrary === 'none') return;\n\n if (!isUILibraryCompatible(framework, uiLibrary)) {\n throw new ConflictingFlagsError(\n `--${framework}`,\n getUILibraryErrorMessage(framework, uiLibrary)\n );\n }\n}\n\nfunction getFrameworkFromFlags(options: CreateOptions): FrameworkType | undefined {\n if (options.nextjs) return 'nextjs';\n if (options.react) return 'react';\n if (options.vue) return 'vue';\n if (options.electron) return 'electron';\n\n return undefined;\n}\n\nfunction getUiLibraryFromFlags(options: CreateOptions): UILibrary | undefined {\n if (options.shadcn) return 'shadcn';\n if (options.diceui) return 'diceui';\n if (options.shadcnVue) return 'shadcn-vue';\n if (options.heroui) return 'heroui';\n\n return undefined;\n}\n\nfunction getLinterFromFlags(options: CreateOptions): LinterType | undefined {\n if (options.eslint) return 'eslint';\n if (options.biome) return 'biome';\n if (options.noLinter) return 'none';\n\n return undefined;\n}\n\nfunction getPackageManagerFromFlags(options: CreateOptions): PackageManagerType | undefined {\n if (options.pnpm) return 'pnpm';\n if (options.npm) return 'npm';\n if (options.yarn) return 'yarn';\n if (options.bun) return 'bun';\n\n return undefined;\n}\n\nfunction getStateManagementFromFlags(options: CreateOptions): StateManagement | undefined {\n if (options.zustand) return 'zustand';\n if (options.tanstackQuery) return 'tanstack-query';\n if (options.tanstackVueQuery) return 'tanstack-vue-query';\n\n return undefined;\n}\n\nconst FRAMEWORKS = [\n { name: 'nextjs', label: 'Next.js (App Router)', description: 'Next.js 16+, TypeScript, Tailwind v4' },\n { name: 'react', label: 'React + Vite', description: 'React 19+, Vite, TypeScript, Tailwind v4' },\n { name: 'vue', label: 'Vue + Vite', description: 'Vue 3.5+, Vite, TypeScript, Tailwind v4' },\n { name: 'electron', label: 'Electron + React', description: 'Desktop app, React 19+, Vite, Tailwind v4' }\n] as const;\n\n// UI libraries available per framework\nconst UI_LIBRARIES_NEXTJS = [\n { name: 'shadcn', label: 'shadcn/ui (Recommended)', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'heroui', label: 'HeroUI', description: 'Modern React UI library' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nconst UI_LIBRARIES_REACT = [\n { name: 'shadcn', label: 'shadcn/ui (Recommended)', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'heroui', label: 'HeroUI', description: 'Modern React UI library' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nconst UI_LIBRARIES_VUE = [{ name: 'shadcn-vue', label: 'shadcn-vue (Recommended)', description: 'Vue port of shadcn/ui' }, { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }] as const;\n\nconst UI_LIBRARIES_ELECTRON = [\n { name: 'shadcn', label: 'shadcn/ui', description: 'Beautifully designed components from shadcn' },\n { name: 'diceui', label: 'DiceUI', description: 'shadcn/ui + 5 premium components' },\n { name: 'none', label: 'None (Plain Tailwind)', description: 'Just Tailwind CSS, no component library' }\n] as const;\n\nfunction getUiLibrariesForFramework(framework: FrameworkType) {\n switch (framework) {\n case 'nextjs':\n return UI_LIBRARIES_NEXTJS;\n\n case 'react':\n return UI_LIBRARIES_REACT;\n\n case 'vue':\n return UI_LIBRARIES_VUE;\n\n case 'electron':\n return UI_LIBRARIES_ELECTRON;\n\n default:\n return UI_LIBRARIES_REACT;\n }\n}\n\n// State management options per framework\nconst STATE_MGMT_REACT = [\n { name: 'tanstack-query', label: 'TanStack Query (Recommended)', description: 'Server state & data fetching' },\n { name: 'zustand', label: 'Zustand', description: 'Lightweight client state' },\n { name: 'none', label: 'None', description: 'No state management' }\n] as const;\n\nconst STATE_MGMT_VUE = [{ name: 'tanstack-vue-query', label: 'TanStack Vue Query (Recommended)', description: 'Server state & data fetching' }, { name: 'none', label: 'None', description: 'No state management' }] as const;\n\nfunction getStateManagementForFramework(framework: FrameworkType) {\n switch (framework) {\n case 'vue':\n return STATE_MGMT_VUE;\n\n default:\n return STATE_MGMT_REACT;\n }\n}\n\nconst SHADCN_STYLE_CHOICES = [\n { name: 'vega', label: 'Vega (Recommended)', description: 'Classic shadcn/ui design' },\n { name: 'nova', label: 'Nova', description: 'Compact layouts' },\n { name: 'maia', label: 'Maia', description: 'Soft and rounded' },\n { name: 'lyra', label: 'Lyra', description: 'Boxy and sharp' },\n { name: 'mira', label: 'Mira', description: 'Dense interfaces' }\n] as const;\n\nconst SHADCN_BASE_COLOR_CHOICES = [\n { name: 'zinc', label: 'Zinc (Default)', description: 'Cool neutral gray' },\n { name: 'slate', label: 'Slate', description: 'Blue-tinted gray' },\n { name: 'neutral', label: 'Neutral', description: 'Pure gray' },\n { name: 'stone', label: 'Stone', description: 'Warm gray' },\n { name: 'gray', label: 'Gray', description: 'Balanced gray' }\n] as const;\n\nconst LINTERS = [\n { name: 'eslint', label: 'ESLint (Recommended)', description: 'Industry standard, widely supported' },\n { name: 'biome', label: 'Biome', description: 'Fast, all-in-one linter and formatter' },\n { name: 'none', label: 'None', description: 'No linter, configure your own later' }\n] as const;\n\nconst PACKAGE_MANAGERS = [\n { name: 'pnpm', label: 'pnpm (Recommended)', description: 'Fast, disk space efficient' },\n { name: 'npm', label: 'npm', description: 'Node.js default package manager' },\n { name: 'yarn', label: 'yarn', description: 'Fast, reliable, and secure' },\n { name: 'bun', label: 'bun', description: 'All-in-one JavaScript runtime' }\n] as const;\n\nconst TEMPLATE_REPO_BASE = 'Docyrus/docyrus-devkit/templates';\n\n// Now we only download the base framework template\nfunction getTemplateRepo(framework: string): string {\n return `${TEMPLATE_REPO_BASE}/${framework}`;\n}\n\nasync function directoryExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create [name]')\n .description('Create a new Docyrus project from template')\n .option('-p, --path <path>', 'Target directory path')\n // Framework flags\n .option('--nextjs', 'Use Next.js framework')\n .option('--react', 'Use React + Vite framework')\n .option('--vue', 'Use Vue + Vite framework')\n .option('--electron', 'Use Electron + React framework (desktop app)')\n // UI library flags (optional - defaults to plain Tailwind if not specified)\n .option('--shadcn', 'Use shadcn/ui (Next.js, React, Electron)')\n .option('--diceui', 'Use DiceUI (Next.js, React, Electron)')\n .option('--shadcn-vue', 'Use shadcn-vue (Vue)')\n .option('--heroui', 'Use HeroUI (Next.js, React)')\n // State management flags\n .option('--zustand', 'Use Zustand for state management (React, Next.js, Electron)')\n .option('--tanstack-query', 'Use TanStack Query for state management (React, Next.js, Electron)')\n .option('--tanstack-vue-query', 'Use TanStack Vue Query for state management (Vue)')\n // Base color flag\n .option('--base-color <color>', 'Base color theme for shadcn (zinc, slate, neutral, stone, gray)')\n // Linter flags\n .option('--eslint', 'Use ESLint for linting')\n .option('--biome', 'Use Biome for linting')\n .option('--no-linter', 'Skip linter configuration')\n // Alias flag\n .option('--alias <prefix>', 'Custom import alias prefix (must start with @)')\n // Package manager flags\n .option('--pnpm', 'Use pnpm package manager')\n .option('--npm', 'Use npm package manager')\n .option('--yarn', 'Use yarn package manager')\n .option('--bun', 'Use bun package manager')\n // Development flags\n .option('--local', 'Use local templates instead of downloading from GitHub (development only)')\n .addHelpText('after', `\nUI Library Compatibility:\n Next.js → shadcn, diceui, heroui\n React → shadcn, diceui, heroui\n Vue → shadcn-vue\n Electron → shadcn, diceui\n\nState Management:\n React / Next.js / Electron → zustand, tanstack-query\n Vue → tanstack-vue-query\n\nExamples:\n $ docyrus create my-app Interactive mode\n $ docyrus create my-app --nextjs Next.js + plain Tailwind\n $ docyrus create my-app --nextjs --shadcn Next.js + shadcn/ui\n $ docyrus create my-app --react --shadcn --zustand React + shadcn + Zustand\n $ docyrus create my-app --react --tanstack-query React + TanStack Query\n $ docyrus create my-app --vue --shadcn-vue Vue + shadcn-vue\n $ docyrus create my-app --vue --tanstack-vue-query Vue + TanStack Vue Query\n $ docyrus create my-app --electron --shadcn --zustand Electron + shadcn + Zustand\n`)\n .action(async (name?: string, options?: CreateOptions) => {\n // Auth check - user must be logged in\n const accessToken = await requireAuth();\n\n // Validate conflicting flags\n if (options) {\n validateConflictingFlags(options);\n }\n\n // Get values from flags or prompt user\n const frameworkFromFlags = options ? getFrameworkFromFlags(options) : undefined;\n const uiLibraryFromFlags = options ? getUiLibraryFromFlags(options) : undefined;\n const linterFromFlags = options ? getLinterFromFlags(options) : undefined;\n const packageManagerFromFlags = options ? getPackageManagerFromFlags(options) : undefined;\n const aliasFromFlags = options?.alias;\n\n // Step 1: Select framework (skip if provided via flag)\n const framework = frameworkFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_FRAMEWORK,\n choices: FRAMEWORKS.map(f => ({\n name: f.label,\n value: f.name\n }))\n }) as FrameworkType;\n\n // Step 2: Select UI library (skip if provided via flag, default to 'none' if framework was specified)\n let uiLibrary: UILibrary;\n const availableUiLibraries = getUiLibrariesForFramework(framework);\n\n if (uiLibraryFromFlags) {\n // Validate framework-UI library compatibility\n validateFrameworkUILibrary(framework, uiLibraryFromFlags);\n uiLibrary = uiLibraryFromFlags;\n } else if (frameworkFromFlags) {\n // Framework specified via flag but no UI library → default to plain Tailwind\n uiLibrary = 'none';\n } else {\n // Interactive mode → prompt user with framework-specific options\n uiLibrary = await select({\n message: MESSAGES.CREATE_SELECT_UI_LIBRARY,\n choices: availableUiLibraries.map(u => ({\n name: u.label,\n value: u.name\n }))\n }) as UILibrary;\n }\n\n // Step 2.5: Select style and base color for shadcn/diceui\n let shadcnStyle = 'vega';\n let baseColor = 'zinc';\n\n if (uiLibrary === 'shadcn' || uiLibrary === 'diceui') {\n if (!frameworkFromFlags) {\n // Prompt for style\n shadcnStyle = await select({\n message: 'Select component style:',\n choices: SHADCN_STYLE_CHOICES.map(c => ({\n name: c.label,\n value: c.name,\n description: c.description\n }))\n }) as string;\n\n // Prompt for base color\n baseColor = await select({\n message: 'Select base color:',\n choices: SHADCN_BASE_COLOR_CHOICES.map(c => ({\n name: c.label,\n value: c.name,\n description: c.description\n }))\n }) as string;\n } else {\n // Use defaults if flags were provided\n if (options?.baseColor) {\n if (!SHADCN_BASE_COLORS.includes(options.baseColor)) {\n throw new ConflictingFlagsError('--base-color', `must be one of: ${SHADCN_BASE_COLORS.join(', ')}`);\n }\n ({ baseColor } = options);\n }\n }\n }\n\n // Step 3: Select state management (skip if provided via flag)\n const stateManagementFromFlags = options ? getStateManagementFromFlags(options) : undefined;\n const stateMgmtChoices = getStateManagementForFramework(framework);\n let stateManagement: StateManagement = 'none';\n\n if (stateMgmtChoices) {\n if (stateManagementFromFlags) {\n // Validate compatibility\n const compatible = getCompatibleStateManagement(framework);\n\n if (!compatible.includes(stateManagementFromFlags)) {\n throw new ConflictingFlagsError(\n `--${stateManagementFromFlags}`,\n `not compatible with ${framework}`\n );\n }\n stateManagement = stateManagementFromFlags;\n } else if (!frameworkFromFlags) {\n // Interactive mode → prompt user\n stateManagement = await select({\n message: MESSAGES.CREATE_SELECT_STATE_MANAGEMENT,\n choices: stateMgmtChoices.map(s => ({\n name: s.label,\n value: s.name,\n description: s.description\n }))\n }) as StateManagement;\n }\n }\n\n // Step 4: Select linter/formatter (skip if provided via flag)\n const linter = linterFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_LINTER,\n choices: LINTERS.map(l => ({\n name: l.label,\n value: l.name\n }))\n });\n\n // Step 5: Project name\n let projectName = name;\n\n if (!projectName) {\n projectName = await input({\n message: MESSAGES.CREATE_PROJECT_NAME,\n default: `my-${framework}-app`,\n validate: (value) => {\n if (!value.trim()) return 'Project name is required';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Only lowercase letters, numbers and hyphens allowed';\n\n return true;\n }\n });\n }\n\n // Step 6: Handle alias (from flag or prompt)\n let aliasPrefix = '@';\n\n if (aliasFromFlags) {\n // Validate alias from flag\n if (!aliasFromFlags.startsWith('@')) {\n throw new ConflictingFlagsError('--alias', 'value must start with @');\n }\n if (!/^@[a-zA-Z0-9]*$/.test(aliasFromFlags)) {\n throw new ConflictingFlagsError('--alias', 'only @, @app, @src format allowed');\n }\n aliasPrefix = aliasFromFlags;\n } else {\n const customizeAlias = await select({\n message: MESSAGES.CREATE_CUSTOMIZE_ALIAS,\n choices: [{ name: 'No, use @/ (Recommended)', value: false }, { name: 'Yes, customize', value: true }]\n });\n\n if (customizeAlias) {\n aliasPrefix = await input({\n message: MESSAGES.CREATE_CUSTOM_ALIAS,\n default: '@',\n validate: (value) => {\n if (!value.trim()) return 'Alias prefix is required';\n if (!value.startsWith('@')) return 'Alias must start with @';\n if (!/^@[a-zA-Z0-9]*$/.test(value)) return 'Only @, @app, @src format allowed';\n\n return true;\n }\n });\n }\n }\n\n // Step 7: Package manager (skip if provided via flag)\n const packageManager = packageManagerFromFlags ?? await select({\n message: MESSAGES.CREATE_SELECT_PACKAGE_MANAGER,\n choices: PACKAGE_MANAGERS.map(pm => ({\n name: pm.label,\n value: pm.name\n }))\n });\n\n // Determine target directory\n const targetDir = options?.path ? join(options.path, projectName) : projectName;\n\n // Check if directory already exists\n if (await directoryExists(targetDir)) {\n throw new ProjectExistsError(projectName);\n }\n\n // Download or copy base framework template (no UI library baked in)\n const isLocalMode = options?.local === true;\n const templateRepo = getTemplateRepo(framework);\n\n logger.newline();\n logger.log(MESSAGES.CREATE_SETTING_UP);\n logger.newline();\n\n if (isLocalMode) {\n // Local mode: copy from monorepo's templates directory\n await withSpinner(\n MESSAGES.CREATE_COPYING_LOCAL,\n async () => {\n const cliPackageDir = dirname(dirname(fileURLToPath(import.meta.url)));\n const localTemplateDir = resolve(cliPackageDir, '..', '..', 'templates', framework);\n\n try {\n await access(localTemplateDir, constants.F_OK);\n } catch {\n throw new TemplateError(\n `Local template not found at: ${localTemplateDir}\\n--local requires running from the monorepo development environment.`\n );\n }\n\n await cp(localTemplateDir, targetDir, { recursive: true });\n\n // Replace @docyrus/* \"latest\" dependencies with file: paths to local packages\n const pkgJsonPath = join(targetDir, 'package.json');\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n const packagesDir = resolve(cliPackageDir, '..');\n\n for (const depType of ['dependencies', 'devDependencies'] as const) {\n const deps = pkgJson[depType];\n\n if (!deps) continue;\n\n for (const [name, version] of Object.entries(deps)) {\n if (name.startsWith('@docyrus/') && version === 'latest') {\n const pkgName = name.replace('@docyrus/', '');\n const localPkgDir = resolve(packagesDir, pkgName);\n\n try {\n await access(localPkgDir, constants.F_OK);\n deps[name] = `file:${localPkgDir}`;\n } catch {\n // Package not found locally — keep \"latest\"\n logger.warn(`Local package not found for ${name}, keeping \"latest\"`);\n }\n }\n }\n }\n\n await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n );\n } else {\n /*\n * Remote mode: download from GitHub via giget\n * Get or prompt for GitHub token (required for private template repo)\n */\n const tokenManager = getTokenManager();\n let githubToken = await tokenManager.getGithubToken();\n\n if (!githubToken) {\n logger.log(MESSAGES.DOCYRUS_TOKEN_REQUIRED);\n githubToken = await password({\n message: MESSAGES.DOCYRUS_TOKEN_PROMPT,\n mask: '*'\n });\n\n // Save token for future use\n await tokenManager.setGithubToken(githubToken);\n logger.success(MESSAGES.DOCYRUS_TOKEN_SAVED);\n }\n\n await withSpinner(\n MESSAGES.CREATE_DOWNLOADING,\n async () => {\n // Clear giget cache to prevent silent fallback to stale tarballs on auth errors\n const gigetCachePath = resolve(homedir(), '.cache/giget/gh/Docyrus-docyrus-devkit');\n\n if (existsSync(gigetCachePath)) {\n await rm(gigetCachePath, { recursive: true, force: true });\n }\n\n try {\n await downloadTemplate(`gh:${templateRepo}`, {\n dir: targetDir,\n install: false,\n auth: githubToken\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // 401/403 = Token invalid or unauthorized - clear token\n if (errorMessage.includes('401') || errorMessage.includes('403')) {\n await tokenManager.setGithubToken(''); // Clear invalid token\n throw new TemplateError(\n `${MESSAGES.DOCYRUS_TOKEN_INVALID}\\n${errorMessage}`\n );\n }\n\n // 404 = Repo not found or no access - token might be valid but lacks repo access\n if (errorMessage.includes('404')) {\n throw new TemplateError(\n `Template repository not found or token lacks access.\\nEnsure your Docyrus token has correct permissions.\\n${errorMessage}`\n );\n }\n\n throw new TemplateError(`Failed to download template: ${errorMessage}`);\n }\n\n // Verify template was actually downloaded (giget may silently produce empty directories)\n try {\n await access(join(targetDir, 'package.json'), constants.F_OK);\n } catch {\n throw new TemplateError(\n 'Template download failed — no files were downloaded.\\nThis usually means your Docyrus token is expired or invalid.\\nRun: docyrus config --token'\n );\n }\n }\n );\n }\n\n // Apply alias configuration (if custom alias selected)\n if (aliasPrefix !== '@' && aliasPrefix !== '@/') {\n await withSpinner(\n MESSAGES.CREATE_CONFIGURING_ALIAS(aliasPrefix),\n async () => {\n await applyAliasConfig(targetDir, framework as Framework, aliasPrefix);\n }\n );\n }\n\n // Apply linter configuration\n if (linter !== 'none') {\n logger.newline();\n logger.log(MESSAGES.LINTER_SETUP_TITLE);\n\n const linterProgress = createSimpleProgress();\n\n try {\n await applyLinterConfig(targetDir, framework as Framework, linter as Linter, linterProgress);\n } catch (error) {\n throw new TemplateError(\n `Failed to configure linter: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Setup state management (adds dependency + config files + provider wrapping BEFORE install)\n if (stateManagement !== 'none') {\n logger.newline();\n logger.log(MESSAGES.STATE_MANAGEMENT_SETUP_TITLE);\n\n const stateProgress = createSimpleProgress();\n\n try {\n await setupStateManagement(\n targetDir,\n framework as UIFramework,\n stateManagement,\n stateProgress\n );\n } catch (error) {\n throw new TemplateError(\n `Failed to setup state management: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Install dependencies (required for UI library setup)\n await withSpinner(\n MESSAGES.CREATE_INSTALLING,\n async () => {\n try {\n await execAsync(`${packageManager} install`, { cwd: targetDir });\n } catch (error) {\n throw new TemplateError(\n `Failed to install dependencies: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n );\n\n // Setup UI Library (install deps + write styles)\n if (uiLibrary !== 'none') {\n logger.newline();\n logger.log(MESSAGES.UI_SETUP_TITLE);\n\n const progressCallback = createSimpleProgress();\n\n try {\n await setupUILibrary(\n targetDir,\n framework as UIFramework,\n uiLibrary,\n packageManager,\n progressCallback,\n shadcnStyle,\n baseColor\n );\n } catch (error) {\n throw new TemplateError(\n `Failed to setup UI library: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Apply UI-specific page variants (swap in pages that use the selected UI library's components)\n await withSpinner(\n 'Applying page variants...',\n async () => applyUIVariants(targetDir, uiLibrary)\n );\n\n // Download OpenAPI spec automatically\n logger.newline();\n logger.log(MESSAGES.OPENAPI_SETUP_TITLE);\n\n let openApiDownloaded = false;\n\n try {\n const savedPath = await withSpinner(\n 'Downloading OpenAPI spec...',\n async () => downloadOpenApiSpec(accessToken, targetDir, 'openapi-spec.json'),\n { successText: 'OpenAPI spec downloaded' }\n );\n\n logger.dim(MESSAGES.CREATE_OPENAPI_SUCCESS(savedPath));\n openApiDownloaded = true;\n } catch (error) {\n // Don't fail the entire create process if OpenAPI download fails\n logger.warn(`Failed to download OpenAPI spec: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n\n // Ask if user wants to generate TanStack DB collections from the spec\n if (openApiDownloaded) {\n try {\n logger.newline();\n\n const runGenerator = await confirm({\n message: MESSAGES.TANSTACK_GENERATOR_PROMPT,\n default: true\n });\n\n if (runGenerator) {\n await withSpinner(\n MESSAGES.TANSTACK_GENERATOR_RUNNING,\n async () => execAsync('npx @docyrus/tanstack-db-generator openapi-spec.json', { cwd: targetDir }),\n { successText: MESSAGES.TANSTACK_GENERATOR_SUCCESS }\n );\n }\n } catch (genError) {\n logger.warn(`${MESSAGES.TANSTACK_GENERATOR_FAILED}: ${genError instanceof Error ? genError.message : 'Unknown error'}`);\n }\n }\n\n // Success message\n logger.newline();\n logger.success(MESSAGES.CREATE_SUCCESS);\n logger.newline();\n logger.log(` cd ${projectName}`);\n logger.log(` ${packageManager} run dev`);\n logger.newline();\n logger.dim(MESSAGES.API_CLIENT_DOCS);\n });\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve, dirname, join } from 'path';\n\nimport { type Command } from 'commander';\n\nimport { generateFromOpenAPI } from '@docyrus/tanstack-db-generator';\n\nimport { logger, output, withSpinner } from '../ui/index.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { downloadOpenApiSpec } from '../utils/api-client.js';\n\ninterface GenerateDbOptions {\n output?: string;\n watch?: boolean;\n}\n\nexport function registerGenerateCommand(program: Command): void {\n const generate = program\n .command('generate')\n .description('Code generation commands');\n\n // Subcommand: generate api-spec\n generate\n .command('api-spec')\n .description('Download OpenAPI specification from Docyrus API')\n .option('-o, --output <path>', 'Output file path', 'openapi.json')\n .action(async (options: { output: string }) => {\n const token = await requireAuth();\n\n const outputPath = resolve(options.output);\n\n if (!output.isJson()) {\n logger.info('Downloading OpenAPI specification...');\n }\n\n try {\n const savedPath = await withSpinner(\n 'Fetching OpenAPI spec from API...',\n async () => downloadOpenApiSpec(token, dirname(outputPath), outputPath.split('/').pop()),\n { silent: output.isJson() }\n );\n\n output.success('OpenAPI specification downloaded!', { path: savedPath });\n\n if (!output.isJson()) {\n logger.dim(`Saved to: ${savedPath}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Failed to download OpenAPI spec: ${message}`);\n process.exit(1);\n }\n });\n\n // Subcommand: generate db\n generate\n .command('db')\n .description('Generate TanStack Query collections from OpenAPI spec')\n .argument('[spec]', 'Path to OpenAPI specification file (JSON)')\n .option('-o, --output <dir>', 'Output directory (defaults to src in same folder as spec)')\n .option('-w, --watch', 'Watch for changes in the spec file')\n .action(async (specPath: string | undefined, options: GenerateDbOptions) => {\n // If no spec path provided, look for common locations\n const resolvedPath = findSpecFile(specPath);\n\n if (!resolvedPath) {\n output.error('OpenAPI spec file not found.');\n if (!output.isJson()) {\n logger.dim('Provide a path: docyrus generate db <spec-file>');\n logger.dim('Or create one of: openapi.json, api.json, spec.json');\n }\n process.exit(1);\n }\n\n if (!existsSync(resolvedPath)) {\n output.error(`OpenAPI spec file not found: ${resolvedPath}`);\n process.exit(1);\n }\n\n // Determine output directory\n const outputDir = options.output || join(dirname(resolvedPath), 'src');\n\n if (!output.isJson()) {\n logger.info('TanStack DB Generator');\n logger.dim(` Spec: ${resolvedPath}`);\n logger.dim(` Output: ${outputDir}`);\n logger.newline();\n }\n\n try {\n // Read and parse spec\n const specContent = readFileSync(resolvedPath, 'utf-8');\n const spec = JSON.parse(specContent);\n\n // Generate\n await withSpinner(\n 'Generating TanStack Query collections...',\n async () => {\n await generateFromOpenAPI(spec, outputDir);\n },\n {\n silent: output.isJson(),\n successText: 'Generation completed!'\n }\n );\n\n output.success('TanStack Query collections generated successfully!', {\n spec: resolvedPath,\n output: outputDir\n });\n\n if (options.watch) {\n if (!output.isJson()) {\n logger.info('Watch mode is not yet implemented.');\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Generation failed: ${message}`);\n process.exit(1);\n }\n });\n}\n\nfunction findSpecFile(specPath?: string): string | null {\n if (specPath) {\n return resolve(specPath);\n }\n\n // Look for default spec file in current directory\n const defaultSpec = resolve('openapi.json');\n\n if (existsSync(defaultSpec)) {\n return defaultSpec;\n }\n\n return null;\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\n\nimport { type Command } from 'commander';\n\nimport { logger, output, withSpinner } from '../ui/index.js';\nimport { CLI_VERSION, NPM_PACKAGE_NAME } from '../config/constants.js';\n\nconst execAsync = promisify(exec);\n\ninterface NpmRegistryResponse {\n 'dist-tags': {\n latest: string;\n };\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE_NAME}`);\n\n if (!response.ok) return null;\n\n const data = await response.json() as NpmRegistryResponse;\n\n return data['dist-tags']?.latest || null;\n } catch {\n return null;\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.replace(/^v/, '').split('.').map(Number);\n const latestParts = latest.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const curr = currentParts[i] || 0;\n const lat = latestParts[i] || 0;\n\n if (lat > curr) return true;\n if (lat < curr) return false;\n }\n\n return false;\n}\n\nasync function detectPackageManager(): Promise<'npm' | 'pnpm' | 'yarn' | 'bun'> {\n // Check if running via specific package manager\n const npmExecpath = process.env.npm_execpath || '';\n\n if (npmExecpath.includes('pnpm')) return 'pnpm';\n if (npmExecpath.includes('yarn')) return 'yarn';\n if (npmExecpath.includes('bun')) return 'bun';\n\n // Try to detect installed package managers\n try {\n await execAsync('pnpm --version');\n\n return 'pnpm';\n } catch {\n // pnpm not found\n }\n\n try {\n await execAsync('yarn --version');\n\n return 'yarn';\n } catch {\n // yarn not found\n }\n\n return 'npm';\n}\n\nexport function registerUpgradeCommand(program: Command): void {\n program\n .command('upgrade')\n .description('Upgrade Docyrus CLI to the latest version')\n .action(async () => {\n // Check latest version\n const latestVersion = await withSpinner(\n 'Checking for updates...',\n getLatestVersion,\n { silent: output.isJson() }\n );\n\n if (!latestVersion) {\n output.error('Failed to check for updates. Please try again later.');\n process.exit(1);\n }\n\n if (!isNewerVersion(CLI_VERSION, latestVersion)) {\n output.success(`You're already on the latest version (${CLI_VERSION})`);\n\n return;\n }\n\n if (!output.isJson()) {\n logger.info(`New version available: ${CLI_VERSION} → ${latestVersion}`);\n logger.newline();\n }\n\n // Detect package manager\n const pm = await detectPackageManager();\n\n const commands: Record<string, string> = {\n npm: `npm install -g ${NPM_PACKAGE_NAME}@latest`,\n pnpm: `pnpm add -g ${NPM_PACKAGE_NAME}@latest`,\n yarn: `yarn global add ${NPM_PACKAGE_NAME}@latest`,\n bun: `bun add -g ${NPM_PACKAGE_NAME}@latest`\n };\n\n const command = commands[pm];\n\n try {\n await withSpinner(\n `Upgrading via ${pm}...`,\n async () => {\n await execAsync(command);\n },\n {\n silent: output.isJson(),\n successText: 'Upgrade completed!'\n }\n );\n\n output.success(`Successfully upgraded to v${latestVersion}`, {\n previousVersion: CLI_VERSION,\n newVersion: latestVersion,\n packageManager: pm\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n output.error(`Upgrade failed: ${message}`);\n if (!output.isJson()) {\n logger.dim(`Try manually: ${command}`);\n }\n process.exit(1);\n }\n });\n}\n","import { type Command } from 'commander';\n\nimport { logger, output } from '../ui/index.js';\nimport { CLI_NAME } from '../config/constants.js';\n\nconst BASH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\n_${CLI_NAME}_completions() {\n local cur_word args type_list\n cur_word=\"\\${COMP_WORDS[COMP_CWORD]}\"\n args=(\"\\${COMP_WORDS[@]}\")\n\n # Commands\n type_list=\"login logout whoami create generate upgrade completion info help\"\n\n # Subcommands for generate\n if [[ \\${args[1]} == \"generate\" ]]; then\n type_list=\"db\"\n fi\n\n COMPREPLY=($(compgen -W \"\\${type_list}\" -- \\${cur_word}))\n return 0\n}\ncomplete -F _${CLI_NAME}_completions ${CLI_NAME}\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nconst ZSH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\n_${CLI_NAME}() {\n local -a commands\n commands=(\n 'login:Log in to Docyrus'\n 'logout:Log out from Docyrus'\n 'whoami:Display the current logged-in user'\n 'create:Create a new Docyrus project from template'\n 'generate:Code generation commands'\n 'upgrade:Upgrade Docyrus CLI to the latest version'\n 'completion:Generate shell completion script'\n 'info:Display CLI and environment information'\n 'help:Display help for command'\n )\n\n local -a generate_commands\n generate_commands=(\n 'db:Generate TanStack Query collections from OpenAPI spec'\n )\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n command)\n _describe 'command' commands\n ;;\n args)\n case $words[1] in\n generate)\n _describe 'subcommand' generate_commands\n ;;\n esac\n ;;\n esac\n}\ncompdef _${CLI_NAME} ${CLI_NAME}\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nconst FISH_COMPLETION = `\n###-begin-${CLI_NAME}-completions-###\ncomplete -c ${CLI_NAME} -f\n\n# Commands\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"login\" -d \"Log in to Docyrus\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"logout\" -d \"Log out from Docyrus\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"whoami\" -d \"Display the current logged-in user\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"create\" -d \"Create a new Docyrus project\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"generate\" -d \"Code generation commands\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"upgrade\" -d \"Upgrade Docyrus CLI\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate shell completion\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"info\" -d \"Display CLI and environment information\"\ncomplete -c ${CLI_NAME} -n \"__fish_use_subcommand\" -a \"help\" -d \"Display help\"\n\n# generate subcommands\ncomplete -c ${CLI_NAME} -n \"__fish_seen_subcommand_from generate\" -a \"db\" -d \"Generate TanStack Query collections\"\n###-end-${CLI_NAME}-completions-###\n`.trim();\n\nexport function registerCompletionCommand(program: Command): void {\n program\n .command('completion')\n .description('Generate shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n const shellLower = shell.toLowerCase();\n\n let script: string;\n let instructions: string;\n\n switch (shellLower) {\n case 'bash':\n script = BASH_COMPLETION;\n instructions = `Add to ~/.bashrc:\\n eval \"$(${CLI_NAME} completion bash)\"`;\n break;\n\n case 'zsh':\n script = ZSH_COMPLETION;\n instructions = `Add to ~/.zshrc:\\n eval \"$(${CLI_NAME} completion zsh)\"`;\n break;\n\n case 'fish':\n script = FISH_COMPLETION;\n instructions = `Save to ~/.config/fish/completions/${CLI_NAME}.fish:\\n ${CLI_NAME} completion fish > ~/.config/fish/completions/${CLI_NAME}.fish`;\n break;\n\n default:\n output.error(`Unknown shell: ${shell}`);\n if (!output.isJson()) {\n logger.dim('Supported shells: bash, zsh, fish');\n }\n process.exit(1);\n }\n\n if (output.isJson()) {\n output.set('shell', shellLower);\n output.set('script', script);\n output.set('instructions', instructions);\n } else {\n console.warn(script);\n logger.dim(instructions);\n }\n });\n}\n","import {\n platform, release, arch, homedir\n} from 'os';\nimport { join } from 'path';\n\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/index.js';\nimport { logger, output } from '../ui/index.js';\nimport { CLI_NAME, CLI_VERSION, DOCYRUS_API_URL } from '../config/constants.js';\n\ninterface SystemInfo {\n cli: {\n name: string;\n version: string;\n };\n node: {\n version: string;\n };\n os: {\n platform: string;\n release: string;\n arch: string;\n };\n environment: {\n apiUrl: string;\n configDir: string;\n };\n auth: {\n loggedIn: boolean;\n email?: string;\n };\n}\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Display CLI and environment information')\n .action(async () => {\n const tokenManager = getTokenManager();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = isLoggedIn ? await tokenManager.getUserEmail() : undefined;\n\n const info: SystemInfo = {\n cli: {\n name: CLI_NAME,\n version: CLI_VERSION\n },\n node: {\n version: process.version\n },\n os: {\n platform: platform(),\n release: release(),\n arch: arch()\n },\n environment: {\n apiUrl: DOCYRUS_API_URL,\n configDir: join(homedir(), '.docyrus')\n },\n auth: {\n loggedIn: isLoggedIn,\n ...(email && { email })\n }\n };\n\n if (output.isJson()) {\n output.set('info', info);\n } else {\n logger.bold(`${CLI_NAME} v${CLI_VERSION}`);\n logger.newline();\n\n logger.log('System:');\n logger.dim(` Node.js: ${info.node.version}`);\n logger.dim(` OS: ${info.os.platform} ${info.os.release} (${info.os.arch})`);\n logger.newline();\n\n logger.log('Environment:');\n logger.dim(` API URL: ${info.environment.apiUrl}`);\n logger.dim(` Config: ${info.environment.configDir}`);\n logger.newline();\n\n logger.log('Authentication:');\n if (info.auth.loggedIn) {\n logger.dim(` Status: Logged in`);\n if (info.auth.email) {\n logger.dim(` Email: ${info.auth.email}`);\n }\n } else {\n logger.dim(` Status: Not logged in`);\n }\n }\n });\n}\n","import { password } from '@inquirer/prompts';\nimport { type Command } from 'commander';\n\nimport { getTokenManager } from '../storage/cli-token-manager.js';\nimport { logger } from '../ui/logger.js';\nimport { MESSAGES } from '../ui/messages.js';\n\ninterface ConfigOptions {\n token?: boolean;\n show?: boolean;\n}\n\nexport function registerConfigCommand(program: Command): void {\n program\n .command('config')\n .description('Manage CLI configuration')\n .option('--token', 'Update Docyrus token for private template access')\n .option('--show', 'Show current configuration')\n .action(async (options: ConfigOptions) => {\n const tokenManager = getTokenManager();\n\n if (options.show) {\n // Show current config\n const githubToken = await tokenManager.getGithubToken();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = await tokenManager.getUserEmail();\n\n logger.log('Current configuration:');\n logger.newline();\n logger.log(` Docyrus Login: ${isLoggedIn ? `✓ ${email}` : '✗ Not logged in'}`);\n logger.log(` Docyrus Token: ${githubToken ? '✓ Configured' : '✗ Not configured'}`);\n logger.newline();\n\n return;\n }\n\n if (options.token) {\n // Update Docyrus token\n const currentToken = await tokenManager.getGithubToken();\n\n if (currentToken) {\n logger.log('Current Docyrus token will be replaced.');\n }\n\n const newToken = await password({\n message: MESSAGES.DOCYRUS_TOKEN_PROMPT,\n mask: '*'\n });\n\n if (newToken) {\n await tokenManager.setGithubToken(newToken);\n logger.success(MESSAGES.DOCYRUS_TOKEN_SAVED);\n } else {\n logger.warn('No token provided. Token not updated.');\n }\n\n return;\n }\n\n // No option provided - show config by default\n const githubToken = await tokenManager.getGithubToken();\n const isLoggedIn = await tokenManager.isLoggedIn();\n const email = await tokenManager.getUserEmail();\n\n logger.log('Current configuration:');\n logger.newline();\n logger.log(` Docyrus Login: ${isLoggedIn ? `✓ ${email}` : '✗ Not logged in'}`);\n logger.log(` Docyrus Token: ${githubToken ? '✓ Configured' : '✗ Not configured'}`);\n logger.newline();\n logger.log('To update token: docyrus config --token');\n });\n}\n","import { type Command } from 'commander';\n\nimport { registerLoginCommand } from './login.js';\nimport { registerLogoutCommand } from './logout.js';\nimport { registerWhoamiCommand } from './whoami.js';\nimport { registerCreateCommand } from './create.js';\nimport { registerGenerateCommand } from './generate.js';\nimport { registerUpgradeCommand } from './upgrade.js';\nimport { registerCompletionCommand } from './completion.js';\nimport { registerInfoCommand } from './info.js';\nimport { registerConfigCommand } from './config.js';\n\nexport function registerCommands(program: Command): void {\n registerLoginCommand(program);\n registerLogoutCommand(program);\n registerWhoamiCommand(program);\n registerCreateCommand(program);\n registerGenerateCommand(program);\n registerUpgradeCommand(program);\n registerCompletionCommand(program);\n registerInfoCommand(program);\n registerConfigCommand(program);\n}\n\nexport { registerLoginCommand } from './login.js';\nexport { registerLogoutCommand } from './logout.js';\nexport { registerWhoamiCommand } from './whoami.js';\nexport { registerCreateCommand } from './create.js';\nexport { registerGenerateCommand } from './generate.js';\nexport { registerUpgradeCommand } from './upgrade.js';\nexport { registerCompletionCommand } from './completion.js';\nexport { registerInfoCommand } from './info.js';\nexport { registerConfigCommand } from './config.js';\n","import chalk from 'chalk';\n\ninterface NpmRegistryResponse {\n 'dist-tags': {\n latest: string;\n };\n}\n\n/**\n * Compare two semver versions\n * Returns true if latest > current\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.replace(/^v/, '').split('.').map(Number);\n const latestParts = latest.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const curr = currentParts[i] || 0;\n const lat = latestParts[i] || 0;\n\n if (lat > curr) return true;\n if (lat < curr) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for newer version and print update notice\n */\nexport async function checkForUpdates(packageName: string, currentVersion: string): Promise<void> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`https://registry.npmjs.org/${packageName}`, {\n signal: controller.signal,\n headers: { Accept: 'application/json' }\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return;\n\n const data = await response.json() as NpmRegistryResponse;\n const latestVersion = data['dist-tags']?.latest;\n\n if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {\n console.info();\n console.info(chalk.yellow('┌────────────────────────────────────────────┐'));\n console.info(chalk.yellow('│') + chalk.bold(' Update available! ') + chalk.dim(`${currentVersion} → `) + chalk.green(latestVersion) + chalk.yellow(' │'));\n console.info(chalk.yellow('│') + chalk.dim(` Run `) + chalk.cyan(`npm i -g ${packageName}`) + chalk.dim(' to update') + chalk.yellow(' │'));\n console.info(chalk.yellow('└────────────────────────────────────────────┘'));\n console.info();\n }\n } catch {\n // Silently ignore errors (network issues, timeouts, etc.)\n }\n}\n","import { Command } from 'commander';\n\nimport { registerCommands } from './commands/index.js';\nimport { logger, output } from './ui/index.js';\nimport { CliError } from './utils/errors.js';\nimport { CLI_NAME, CLI_VERSION, NPM_PACKAGE_NAME } from './config/constants.js';\nimport { checkForUpdates } from './utils/update-checker.js';\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description('Docyrus CLI - Authentication and project management tools')\n .version(CLI_VERSION, '-v, --version', 'Display version number')\n .option('--json', 'Output results in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n if (opts.json) {\n output.setFormat('json');\n }\n })\n .hook('postAction', () => {\n // Flush JSON output if in JSON mode\n output.flush();\n });\n\n// Register all commands\nregisterCommands(program);\n\n// Handle help output without throwing\nprogram.configureOutput({\n outputError: (str, write) => write(str)\n});\n\n// Parse arguments\nasync function main(): Promise<void> {\n try {\n // Check for updates (non-blocking, only in text mode)\n if (!process.argv.includes('--json')) {\n checkForUpdates(NPM_PACKAGE_NAME, CLI_VERSION).catch(() => {\n // Silently ignore update check errors\n });\n }\n\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof CliError) {\n output.error(error.message);\n if (error.suggestion && !output.isJson()) {\n logger.dim(error.suggestion);\n }\n output.flush();\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n output.error(error.message);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n output.flush();\n process.exit(1);\n }\n\n output.error('An unexpected error occurred.');\n output.flush();\n process.exit(1);\n }\n}\n\nmain();\n"]}