@almadar/integrations 2.32.0 → 2.34.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/contracts.ts","../../src/core/logger.ts","../../src/core/validation.ts","../../src/core/retry.ts","../../src/core/BaseIntegration.ts","../../src/registry.ts","../../src/factory.ts","../../src/credentials/resolver.ts","../../src/credentials/filePersistence.ts","../../src/integrations/stripe/index.ts","../../src/integrations/youtube/index.ts","../../src/integrations/twilio/index.ts","../../src/integrations/email/index.ts","../../src/integrations/webhook/index.ts","../../src/integrations/push/index.ts","../../src/integrations/calendar/index.ts","../../src/integrations/drive/index.ts","../../src/integrations/metaAds/index.ts","../../src/integrations/accounting/index.ts","../../src/integrations/banking/index.ts","../../src/integrations/esign/index.ts","../../src/integrations/llm/index.ts","../../src/integrations/ml/index.ts","../../src/integrations/deepagent/index.ts","../../src/integrations/github/github-git.ts","../../src/integrations/github/github-api.ts","../../src/integrations/github/index.ts","../../src/integrations/cli/index.ts","../../src/integrations/redis/index.ts","../../src/integrations/queue/index.ts","../../src/integrations/otel/index.ts","../../src/integrations/oauth/index.ts","../../src/integrations/credentials/index.ts","../../src/integrations/storage/index.ts","../../src/integrations/docker/index.ts","../../src/integrations/database/sql-guard.ts","../../src/integrations/database/index.ts","../../src/integrations/wikimedia/index.ts","../../src/integrations/iconify/index.ts","../../src/integrations/arxiv/index.ts","../../src/mocks/MockIntegration.ts","../../src/runtime/effectHandler.ts","../../src/runtime/RuntimeIntegrationManager.ts"],"names":["Stripe","sub","google","init","fs","join","commit","writeFileSync","isParamRecord","decodeContent","createHash","bytes","contentType","url","s3GetSignedUrl","DEFAULT_TIMEOUT_MS","DEFAULT_UA"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core types for Almadar integrations\n */\n\n/**\n * Configuration for an integration instance\n */\nexport interface IntegrationConfig {\n /** Integration name (matches registry) */\n name: string;\n\n /** Environment variables (API keys, secrets) */\n env: Record<string, string>;\n\n /** Optional logger */\n logger?: IntegrationLogger;\n\n /** Optional rate limiting config */\n rateLimit?: {\n requestsPerSecond: number;\n burstSize: number;\n };\n\n /** Optional timeout (ms) */\n timeout?: number;\n\n /** Optional retry config */\n retry?: {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n };\n}\n\n/**\n * Result of an integration action call\n */\nexport interface IntegrationResult<T = unknown> {\n /** Success flag */\n success: boolean;\n\n /** Response data (on success) */\n data?: T;\n\n /** Error (on failure) */\n error?: IntegrationError;\n\n /** Metadata (timing, retries, etc.) */\n metadata: {\n integration: string;\n action: string;\n duration: number;\n retries: number;\n timestamp: number;\n };\n}\n\n/**\n * Integration error codes\n */\nexport type IntegrationErrorCode =\n | 'VALIDATION_ERROR'\n | 'AUTH_ERROR'\n | 'RATE_LIMIT_ERROR'\n | 'TIMEOUT_ERROR'\n | 'NETWORK_ERROR'\n | 'SERVICE_ERROR'\n | 'UNKNOWN_ERROR';\n\n/**\n * Integration error\n */\nexport class IntegrationError extends Error {\n code: IntegrationErrorCode;\n integration?: string;\n action?: string;\n details?: unknown;\n\n constructor(\n message: string,\n code: IntegrationErrorCode = 'UNKNOWN_ERROR',\n details?: unknown,\n ) {\n super(message);\n this.name = 'IntegrationError';\n this.code = code;\n this.details = details;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n integration: this.integration,\n action: this.action,\n details: this.details,\n };\n }\n}\n\nimport type { LogMeta } from '@almadar/core';\n\n/** Re-export LogMeta from @almadar/core as the canonical log metadata type. */\nexport type { LogMeta };\n\n/**\n * Logger interface\n */\nexport interface IntegrationLogger {\n debug(message: string, meta?: LogMeta): void;\n info(message: string, meta?: LogMeta): void;\n warn(message: string, meta?: LogMeta): void;\n error(message: string, meta?: LogMeta): void;\n}\n\n/**\n * Integration action parameters.\n * Each integration's execute() method receives params as this type.\n * Individual methods cast to specific param shapes from their contracts.\n *\n * Per-key value union is widened to admit `@almadar/core`'s `FieldValue`\n * shape (entity / payload values flowing into call-service args): `Date`\n * for date fields, `IntegrationParams[]` for nested object arrays, and a\n * raw-value array catch-all so `string[]` / `number[]` / mixed payload\n * arrays satisfy the index signature without requiring `as unknown as`\n * casts at the call site. Adapters narrow these to their canonical input\n * types (typically JSON-string serialisation for `Date`).\n */\nexport type IntegrationParamValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | ReadonlyArray<IntegrationParamValue>\n | { readonly [key: string]: IntegrationParamValue };\n\nexport interface IntegrationParams {\n [key: string]: IntegrationParamValue;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n param: string;\n message: string;\n}\n","/**\n * ServiceContract type definitions for all @almadar/integrations.\n *\n * Each integration defines its own action map as a Record<string, ServiceAction>,\n * suitable for use with ServiceContract<T> from @almadar/core.\n *\n * Types are simplified representations of the actual params/results. They capture\n * the contract shape without pulling in third-party SDK types (Stripe, Twilio, etc.).\n *\n * @packageDocumentation\n */\n\nimport type { ServiceAction, ServiceEvents, ServiceParams, ServiceParamsValue } from '@almadar/core';\nimport type { IntegrationParams } from './types';\nimport type { DatabaseQueryParamValue, DatabaseRow } from './integrations/database/types';\n\n// ============================================================================\n// GitHub\n// ============================================================================\n\nexport type GitHubActions = {\n /** Clone a repository via the git CLI into a local target directory, using the configured token for auth. */\n cloneRepo: {\n params: {\n /** HTTPS clone URL, e.g. https://github.com/owner/repo. Owner/repo are parsed from it when not preconfigured. */\n repoUrl: string;\n /** Local directory to clone into. */\n targetDir: string;\n /** Branch to check out after cloning; defaults to the repo's default branch. */\n branch?: string;\n };\n result: { message: string };\n };\n /** Create a new local branch via the git CLI in the configured working directory. */\n createBranch: {\n params: {\n /** Name of the branch to create. */\n branchName: string;\n /** Branch to branch from; defaults to the current branch. */\n baseBranch?: string;\n };\n result: { message: string };\n };\n /** Commit staged (or given) changes via the git CLI in the configured working directory. */\n commit: {\n params: {\n /** Commit message. */\n message: string;\n /** Specific files to commit; when omitted, all changes are committed. */\n files?: string[];\n };\n result: { message: string };\n };\n /** Push a local branch to the remote via the git CLI, using the configured token for auth. */\n push: {\n params: {\n /** Branch name to push. */\n branchName: string;\n /** Force-push (overwrites remote history); never set true in an agent context. */\n force?: boolean;\n };\n result: { message: string };\n };\n /** Open a pull request via the GitHub REST API. */\n createPR: {\n params: {\n /** Pull request title. */\n title: string;\n /** Pull request description body. */\n body: string;\n /** Branch the PR merges into, e.g. main. */\n baseBranch: string;\n /** Branch the PR merges from (the feature branch). */\n headBranch: string;\n /** Open as a draft PR instead of ready-for-review. */\n draft?: boolean;\n };\n result: { number: number; url: string; title: string };\n };\n /** List review comments on a pull request via the GitHub REST API. */\n getPRComments: {\n params: {\n /** Pull request number. */\n prNumber: number;\n };\n result: { comments: Array<{ id: number; body: string; user: string }> };\n };\n /** List issues on the configured repository via the GitHub REST API. */\n listIssues: {\n params: {\n /** Issue state filter: 'open', 'closed', or 'all'; defaults to open. */\n state?: string;\n /** Only issues carrying all of these labels. */\n labels?: string[];\n /** Page size for the GitHub API request. */\n per_page?: number;\n };\n result: { issues: Array<{ number: number; title: string; state: string }> };\n };\n /** Fetch a single issue's details via the GitHub REST API. */\n getIssue: {\n params: {\n /** Issue number. */\n issueNumber: number;\n };\n result: { number: number; title: string; body: string; state: string };\n };\n /** Read a file's content from a repository at a given ref (declared intent — dispatch is being wired). */\n getFile: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** File path within the repository. */\n path: string;\n /** Branch, tag, or commit SHA to read from; defaults to the default branch. */\n ref?: string;\n };\n result: { path: string; content: string; sha: string; size: number };\n };\n /** List commits on a repository, optionally filtered by file path (declared intent — dispatch is being wired). */\n listCommits: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** Only commits touching this file path. */\n path?: string;\n /** Branch, tag, or commit SHA to start from; defaults to the default branch. */\n ref?: string;\n /** Page size for the GitHub API request. */\n per_page?: number;\n };\n result: { commits: Array<{ sha: string; message: string; author: string; date: string }> };\n };\n /** Open a new issue on a repository (declared intent — dispatch is being wired). */\n createIssue: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** Issue title. */\n title: string;\n /** Issue body/description. */\n body?: string;\n /** Labels to apply to the new issue. */\n labels?: string[];\n };\n result: { number: number; title: string; url: string };\n };\n};\n\n// ============================================================================\n// Stripe\n// ============================================================================\n\nexport type StripeActions = {\n /**\n * Create a Stripe PaymentIntent for a one-off charge.\n * @synonyms charge, pay\n */\n createPaymentIntent: {\n params: {\n /** Charge amount in the currency's smallest unit (e.g. cents for USD). */\n amount: number;\n /** ISO 4217 currency code, e.g. usd. */\n currency: string;\n /** Arbitrary key-value tags attached to the PaymentIntent (string values only). */\n metadata?: Record<string, string>;\n };\n result: { id: string; clientSecret: string; status: string; amount: number; currency: string };\n };\n /** Confirm a previously created PaymentIntent, attempting to complete the charge. */\n confirmPayment: {\n params: {\n /** The PaymentIntent id returned by createPaymentIntent. */\n paymentIntentId: string;\n };\n result: { id: string; status: string };\n };\n /** Refund a charged PaymentIntent, in full or in part. */\n refund: {\n params: {\n /** The PaymentIntent id to refund. */\n paymentIntentId: string;\n /** Amount to refund in the currency's smallest unit; omit for a full refund. */\n amount?: number;\n };\n result: { id: string; status: string; amount: number };\n };\n};\n\n// ============================================================================\n// LLM\n// ============================================================================\n\nexport type LLMIntegrationActions = {\n /** Generate free-form text from a prompt via the configured LLM provider (default 'You are a helpful assistant.' system prompt). */\n generate: {\n params: {\n /** The user/task prompt sent to the model. */\n userPrompt: string;\n /** System prompt steering the model's behavior; defaults to a generic assistant prompt. */\n systemPrompt?: string;\n /** Model id override; when set, a fresh client is built for this call instead of the shared one. */\n model?: string;\n /** Sampling temperature (0-1ish, provider-dependent); higher is more random. */\n temperature?: number;\n /** Maximum tokens to generate; defaults to 1024. */\n maxTokens?: number;\n };\n result: {\n content: string;\n usage: { promptTokens?: number; completionTokens?: number; totalTokens?: number; tokens?: number };\n };\n };\n /** Classify text into exactly one of a caller-supplied category list, with a confidence score and reasoning. */\n classify: {\n params: {\n /** Text to classify. */\n text: string;\n /** Closed set of category labels the model must choose from. */\n categories: string[];\n /** Model id override. */\n model?: string;\n };\n result: { category: string; confidence: number; reasoning: string };\n };\n /** Extract structured data from text according to a JSON-schema-shaped description; returned data is not validated against the schema. */\n extract: {\n params: {\n /** Source text to extract data from. */\n text: string;\n /** JSON-schema-like description of the fields to extract; passed to the model as a prompt, not enforced structurally. */\n schema: IntegrationParams;\n /** Model id override. */\n model?: string;\n };\n result: IntegrationParams;\n };\n /** Summarize text, optionally constrained by length and style, returning a summary plus key points. */\n summarize: {\n params: {\n /** Text to summarize. */\n text: string;\n /** Target maximum summary length in words. */\n maxLength?: number;\n /** Summary style: 'bullet' for bullet points, 'detailed' for thorough, otherwise concise. */\n style?: string;\n /** Model id override. */\n model?: string;\n };\n result: { summary: string; keyPoints: string[] };\n };\n /** Generate embedding vectors for an array of texts via the configured embedding model (default baai/bge-base-en-v1.5 on OpenRouter, independent of the chat provider). */\n embed: {\n params: {\n /** Texts to embed, one vector per entry, in order. */\n texts: string[];\n /** Embedding model id override. */\n model?: string;\n };\n result: { embeddings: number[][] };\n };\n};\n\n// ============================================================================\n// ML (model inference)\n// ============================================================================\n\nexport type MLActions = {\n /** Run inference against a deployed model-serving orbital by posting an INFER event and reading the prediction back out of the emitted INFERRED result; may cold-start (up to 60s default timeout). */\n infer: {\n params: {\n /** Checkpoint or model identifier the serving orbital resolves. */\n model: string;\n /** JSON-safe model input payload. */\n input: ServiceParamsValue;\n };\n result: { output: ServiceParamsValue; confidence: number; violations: ServiceParamsValue[] };\n };\n};\n\n// ============================================================================\n// YouTube\n// ============================================================================\n\nexport type YouTubeActions = {\n /** Search YouTube via the Data API and return matching video snippets. */\n search: {\n params: {\n /** Search query text. */\n query: string;\n /** Maximum number of results; defaults to 10. */\n maxResults?: number;\n /** Resource type filter passed to the Data API (e.g. 'video', 'channel', 'playlist'). */\n type?: string;\n };\n result: Array<{ videoId: string; title: string; thumbnail: string; description: string }>;\n };\n /** Fetch a video's snippet and statistics via the YouTube Data API. */\n getVideo: {\n params: {\n /** YouTube video id. */\n videoId: string;\n };\n result: { title: string; description: string; viewCount: string; likeCount: string };\n };\n /** Fetch a channel's snippet and statistics via the YouTube Data API. */\n getChannel: {\n params: {\n /** YouTube channel id. */\n channelId: string;\n };\n result: { name: string; description: string; subscriberCount: string };\n };\n};\n\n// ============================================================================\n// Twilio\n// ============================================================================\n\nexport type TwilioActions = {\n /**\n * Send an SMS message via Twilio.\n * @synonyms text message, text\n */\n sendSMS: {\n params: {\n /** Destination phone number, E.164 format. */\n to: string;\n /** Message text. */\n body: string;\n /** Sender phone number; defaults to TWILIO_PHONE_NUMBER. */\n from?: string;\n };\n result: { sid: string; status: string };\n };\n /** Send a WhatsApp message via Twilio, using the configured phone number as sender on both ends. */\n sendWhatsApp: {\n params: {\n /** Destination phone number, E.164 format (sent as whatsapp:number). */\n to: string;\n /** Message text. */\n body: string;\n };\n result: { sid: string; status: string };\n };\n};\n\n// ============================================================================\n// Email\n// ============================================================================\n\nexport type EmailActions = {\n /** Send a transactional email via the configured provider (SendGrid or Resend). */\n send: {\n params: {\n /** Recipient email address. */\n to: string;\n /** Email subject line. */\n subject: string;\n /** Plain-text (or HTML, if `htmlBody` is absent) body content. */\n body: string;\n /** Sender address; defaults to FROM_EMAIL. */\n from?: string;\n /** HTML content; when present `body` becomes the plain-text alternative. */\n htmlBody?: string;\n /** Reply-To address. */\n replyTo?: string;\n /** Provider template reference (SendGrid dynamic templates; Resend rejects it loudly). */\n templateId?: string;\n };\n result: { id: string; status: string };\n };\n};\n\n// ============================================================================\n// Webhook\n// ============================================================================\n\nexport type WebhookActions = {\n /** POST a JSON event notification to an external URL, HMAC-SHA256-signed when a secret is configured; 5xx responses retry, 4xx do not. */\n send: {\n params: {\n /** Destination URL to POST to. */\n url: string;\n /** Event name, carried in the body and the X-Almadar-Event header. */\n event: string;\n /** Event payload; defaults to an empty object. */\n payload?: Record<string, string>;\n /** Per-call HMAC signing secret, overriding WEBHOOK_SIGNING_SECRET. */\n secret?: string;\n };\n result: { status: number; ok: boolean; durationMs: number };\n };\n};\n\n// ============================================================================\n// Push (Web Push / VAPID)\n// ============================================================================\n\nexport type PushActions = {\n /** Send a VAPID-signed Web Push notification to a browser PushSubscription endpoint. */\n send: {\n params: {\n /** Browser PushSubscription: endpoint URL plus the p256dh/auth encryption keys. */\n subscription: { endpoint: string; keys: { p256dh: string; auth: string } };\n /** Notification title. */\n title: string;\n /** Notification body text. */\n body: string;\n /** URL to open when the notification is clicked. */\n url?: string;\n /** Notification icon URL. */\n icon?: string;\n };\n result: {\n statusCode: number;\n ok: boolean;\n /** True on a 404/410 push-service response — the subscription is gone and must be pruned, never retried. */\n expired: boolean;\n };\n };\n};\n\n// ============================================================================\n// Calendar (Google Calendar, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type CalendarActions = {\n /** List events on a Google Calendar; pass `syncToken` for incremental sync instead of a time window (the API rejects combining them). */\n listEvents: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID (or 'primary'). */\n calendarId?: string;\n /** ISO start of the time window (ignored when `syncToken` is set). */\n timeMin?: string;\n /** ISO end of the time window (ignored when `syncToken` is set). */\n timeMax?: string;\n /** Incremental-sync token from a previous call's `nextSyncToken`; supersedes timeMin/timeMax. */\n syncToken?: string;\n /** Maximum events to return; defaults to 250. */\n maxResults?: number;\n };\n result: {\n events: Array<{ id: string; summary: string; description: string; location: string; start: string; end: string; status: string; updated: string }>;\n /** Token to pass as `syncToken` on the next call; null when incremental sync isn't available for this response. */\n nextSyncToken: string | null;\n };\n };\n /** Create a calendar event; an all-day event uses a 10-char (YYYY-MM-DD) start with no `end`/`durationMinutes`, defaulting to the next day. */\n createEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Event title. */\n summary: string;\n /** Event description. */\n description?: string;\n /** Event location text. */\n location?: string;\n /** ISO start (10 chars = all-day date, longer = dateTime). */\n start: string;\n /** ISO end; if omitted, derived from `durationMinutes` or the all-day next-day convention. */\n end?: string;\n /** Duration in minutes used to derive `end` when `end` is omitted (non-all-day events only). */\n durationMinutes?: number;\n };\n result: { id: string; status: string; htmlLink: string };\n };\n /** Patch an existing event's fields; only fields present in params are changed. */\n updateEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Id of the event to update. */\n eventId: string;\n /** New event title. */\n summary?: string;\n /** New event description. */\n description?: string;\n /** New event location text. */\n location?: string;\n /** New ISO start. */\n start?: string;\n /** New ISO end. */\n end?: string;\n };\n result: { id: string; status: string };\n };\n /** Delete a calendar event. */\n deleteEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Id of the event to delete. */\n eventId: string;\n };\n result: { id: string; deleted: boolean };\n };\n /** Query busy time blocks on a calendar within a window. */\n freeBusy: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** ISO start of the query window. */\n timeMin: string;\n /** ISO end of the query window. */\n timeMax: string;\n };\n result: { busy: Array<{ start: string; end: string }> };\n };\n /** Register a push-notification channel for calendar change events (Google Calendar API watch). */\n watch: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Caller-chosen id identifying this notification channel. */\n channelId: string;\n /** HTTPS callback URL Google POSTs change notifications to. */\n address: string;\n /** Requested channel time-to-live in seconds. */\n ttlSeconds?: number;\n };\n result: { channelId: string; resourceId: string; expiration: string };\n };\n /** Stop an active watch channel, ending calendar change notifications. */\n stopWatch: {\n params: {\n /** The channel id from the corresponding `watch` call. */\n channelId: string;\n /** The resourceId returned by the corresponding `watch` call. */\n resourceId: string;\n };\n result: { stopped: boolean };\n };\n};\n\n// ============================================================================\n// Drive (Google Drive, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type DriveActions = {\n /** List non-trashed files in a Google Drive folder, optionally filtered by a Drive API query clause. */\n listFiles: {\n params: {\n /** Restrict to files whose parents include this folder id. */\n folderId?: string;\n /** Extra Drive API query clause, ANDed with the folder/trashed filters. */\n query?: string;\n /** Maximum files to return; defaults to 100. */\n maxResults?: number;\n };\n result: {\n files: Array<{ id: string; name: string; mimeType: string; size: number; modifiedTime: string; webViewLink: string }>;\n };\n };\n /** Download a file's content, base64-encoded. */\n getFile: {\n params: {\n /** Drive file id. */\n fileId: string;\n };\n result: { id: string; name: string; mimeType: string; content: string; size: number };\n };\n /**\n * Upload a file to Drive; writes go through the user OAuth client when configured (service-account uploads have no storage quota on personal accounts).\n * @synonyms upload file\n */\n uploadFile: {\n params: {\n /** File name to create. */\n name: string;\n /** File content as a base64 data URL (data:mime;base64,...) or raw base64/plain text. */\n content: string;\n /** MIME type; inferred from a data URL when omitted. */\n mimeType?: string;\n /** Parent folder id; defaults to GOOGLE_DRIVE_FOLDER_ID. */\n folderId?: string;\n };\n result: { id: string; name: string; webViewLink: string };\n };\n /** Create a new Drive folder. */\n createFolder: {\n params: {\n /** Folder name to create. */\n name: string;\n /** Parent folder id; defaults to GOOGLE_DRIVE_FOLDER_ID. */\n parentId?: string;\n };\n result: { id: string; name: string };\n };\n /** Grant a user permission on a Drive file. */\n shareFile: {\n params: {\n /** Drive file id. */\n fileId: string;\n /** Email address of the grantee. */\n email: string;\n /** Permission level; defaults to 'reader'. */\n role?: 'reader' | 'writer' | 'commenter';\n };\n result: { shared: boolean; permissionId: string };\n };\n};\n\n// ============================================================================\n// Meta Ads (Graph API Marketing Insights, read-only)\n// ============================================================================\n\nexport type MetaAdsActions = {\n /** Fetch total ad spend, impressions, and clicks for an account over a date range via the Meta Graph API Marketing Insights endpoint (read-only). */\n getSpend: {\n params: {\n /** Ad account id (with or without the `act_` prefix); defaults to META_AD_ACCOUNT_ID. */\n accountId?: string;\n /** Range start date (YYYY-MM-DD). */\n since: string;\n /** Range end date (YYYY-MM-DD). */\n until: string;\n };\n result: { spend: number; currency: string; impressions: number; clicks: number };\n };\n /** List campaigns on an ad account via the Meta Graph API (read-only); dailyBudget is converted from Meta's minor-unit reporting. */\n listCampaigns: {\n params: {\n /** Ad account id (with or without the `act_` prefix); defaults to META_AD_ACCOUNT_ID. */\n accountId?: string;\n /** Filter by campaign effective_status (e.g. 'ACTIVE', 'PAUSED'). */\n status?: string;\n };\n result: { campaigns: Array<{ id: string; name: string; status: string; dailyBudget: number }> };\n };\n};\n\n// ============================================================================\n// Accounting (generic export — provider-pluggable, CSV first)\n// ============================================================================\n\nexport type AccountingActions = {\n /** Shape invoice rows into an import-ready CSV export (no accounting-vendor connection — generic column set). */\n exportInvoices: {\n params: {\n /** Invoice rows to export, in column order id/number/customer/issuedAt/dueAt/currency/net/tax/gross/status. */\n invoices: Array<{ id: string; number: string; customer: string; issuedAt: string; dueAt: string; currency: string; net: number; tax: number; gross: number; status: string }>;\n /** Export format; only 'csv' is currently supported. */\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n /** Shape journal entry rows into an import-ready CSV export. */\n exportJournal: {\n params: {\n /** Journal entry rows to export, in column order date/account/description/debit/credit/reference. */\n entries: Array<{ date: string; account: string; description: string; debit: number; credit: number; reference: string }>;\n /** Export format; only 'csv' is currently supported. */\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n};\n\n// ============================================================================\n// Banking (GoCardless Bank Account Data)\n// ============================================================================\n\nexport type BankingActions = {\n /** Start a GoCardless Bank Account Data requisition (bank-connection consent flow); the returned `link` is where the end user authorizes access. */\n createRequisition: {\n params: {\n /** GoCardless institution id (the bank to connect). */\n institutionId: string;\n /** URL GoCardless redirects the user to after consent. */\n redirectUrl: string;\n /** Caller-chosen reference to correlate the requisition. */\n reference?: string;\n };\n result: { requisitionId: string; link: string };\n };\n /** List account ids linked under a completed requisition. */\n listAccounts: {\n params: {\n /** Requisition id from createRequisition. */\n requisitionId: string;\n };\n result: { accounts: string[] };\n };\n /** List booked transactions on a linked bank account, optionally filtered by date range. */\n listTransactions: {\n params: {\n /** GoCardless account id. */\n accountId: string;\n /** Only transactions booked on/after this date (YYYY-MM-DD). */\n dateFrom?: string;\n /** Only transactions booked on/before this date (YYYY-MM-DD). */\n dateTo?: string;\n };\n result: {\n transactions: Array<{ id: string; amount: number; currency: string; date: string; description: string; counterparty: string }>;\n };\n };\n};\n\n// ============================================================================\n// E-sign (pluggable, DocuSign first)\n// ============================================================================\n\nexport type EsignActions = {\n /** Send a document for e-signature via DocuSign; accepts the document content as a data URL or raw base64. */\n sendEnvelope: {\n params: {\n /** Signer's email address. */\n recipientEmail: string;\n /** Signer's display name. */\n recipientName: string;\n /** Document file name (its extension also picks the DocuSign fileExtension). */\n documentName: string;\n /** Document content as a base64 data URL or raw base64. */\n documentContent: string;\n /** Envelope email subject; defaults to \"Please sign: \" + documentName. */\n emailSubject?: string;\n };\n result: { envelopeId: string; status: string };\n };\n /** Poll a DocuSign envelope's signing status. */\n getEnvelopeStatus: {\n params: {\n /** DocuSign envelope id from sendEnvelope. */\n envelopeId: string;\n };\n result: { status: string; completedAt: string };\n };\n /** Download the combined signed document(s) for a completed envelope, base64-encoded PDF. */\n downloadDocument: {\n params: {\n /** DocuSign envelope id. */\n envelopeId: string;\n };\n result: { content: string; documentName: string };\n };\n};\n\n// ============================================================================\n// Docker\n// ============================================================================\n\nexport type DockerActions = {\n /** Simulate building a container image (in-memory backend — no real Docker daemon/SDK; a real build is not yet implemented). */\n build: {\n params: {\n /** Image tag to build, e.g. myapp:latest. */\n tag: string;\n /** Dockerfile path; defaults to 'Dockerfile'. */\n dockerfile?: string;\n /** Build context directory; defaults to '.'. */\n context?: string;\n /** Build-time --build-arg values. */\n buildArgs?: Record<string, string>;\n };\n result: { imageId: string; tag: string; size: number; buildTime: number };\n };\n /** Simulate starting a container from an image (in-memory backend). */\n run: {\n params: {\n /** Image to run (as built/tagged by the `build` action, or an arbitrary name). */\n image: string;\n /** Container name; auto-generated when omitted. */\n name?: string;\n /** Host/container port mappings. */\n ports?: Array<{ host: number; container: number; protocol?: string }>;\n /** Environment variables set inside the container. */\n env?: Record<string, string>;\n /** Host/container path mounts. */\n volumes?: Array<{ host: string; container: string }>;\n /** Override command run inside the container. */\n command?: string;\n };\n result: {\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n };\n };\n /** Stop a running (or paused) simulated container. */\n stop: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n };\n result: { containerId: string; status: string; stoppedAt: number };\n };\n /** Remove a simulated container; fails if it is running unless `force` is set. */\n remove: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n /** Remove even if the container is currently running. */\n force?: boolean;\n };\n result: { containerId: string; removed: boolean };\n };\n /** Fetch generated log lines for a simulated container. */\n logs: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n /** Number of most-recent lines to return; defaults to 100. */\n tail?: number;\n /** Only lines timestamped at/after this ISO time. */\n since?: string;\n };\n result: { containerId: string; logs: string[]; lineCount: number };\n };\n /** Fetch a simulated container's current status and metadata. */\n status: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n };\n result: {\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n };\n };\n /** List simulated containers; by default only running ones (like `docker ps`). */\n list: {\n params: {\n /** Include stopped/exited containers, not just running ones. */\n all?: boolean;\n /** Filter by a `key` or `key=value` label match. */\n filterByLabel?: string;\n };\n result: {\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n };\n };\n};\n\n// ============================================================================\n// Storage\n// ============================================================================\n\nexport type StorageActions = {\n /**\n * Upload an object to an S3-compatible bucket (real S3/R2/MinIO backend when storage credentials are configured, in-memory dev fallback otherwise — refused in production). Admits either the canonical `key`+`content` pair or the file-form `file` payload (UploadDropZone's `{ name, size, type, content }` shape); when `file` is present its `key`/`content` are derived from it.\n * @synonyms upload file, upload object\n */\n upload: {\n params: {\n /** Target bucket; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key to store under (canonical shape); ignored when `file` is present. */\n key?: string;\n /** Object content as a base64 data URL, raw base64, or plain text (canonical shape); ignored when `file` is present. */\n content?: string;\n /** MIME type override for the canonical shape; inferred from a data URL when omitted. */\n contentType?: string;\n /** File-form upload payload (as emitted by UploadDropZone); `content` is a base64 data URL. */\n file?: { name: string; size: number; type: string; content?: string };\n /** Object ACL — 'public' produces a public URL, otherwise the URL is signed/private. */\n acl?: 'public' | 'private';\n /** Reject the upload if the file-form payload's declared size exceeds this many bytes. */\n maxSize?: number;\n /** Arbitrary metadata stored alongside the object (in-memory backend only). */\n metadata?: IntegrationParams;\n };\n result: { key: string; bucket: string; size: number; etag: string; id: string; url: string };\n };\n /** Upload a whole UploadDropZone batch in one call, one item per file — the FSM-friendly shape for bulk-persisting uploaded-file rows. */\n uploadMany: {\n params: {\n /** Target bucket; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Files to upload, in UploadDropZone's `{ name, size, type, content }` shape. */\n files: Array<{ name: string; size: number; type: string; content?: string }>;\n /** Object ACL applied to every file in the batch. */\n acl?: 'public' | 'private';\n /** Reject any file whose declared size exceeds this many bytes. */\n maxSize?: number;\n };\n result: {\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n };\n };\n /** Download an object's content, base64-encoded. */\n download: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key. */\n key: string;\n };\n result: { content: string; contentType: string; size: number; metadata: IntegrationParams };\n };\n /** List object keys in a bucket, optionally prefix-filtered, one page at a time. */\n list: {\n params: {\n /** Bucket to list; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Only keys starting with this prefix. */\n prefix?: string;\n /** Maximum keys per page; defaults to 1000. */\n maxKeys?: number;\n /** Pagination token from a previous call's `nextToken`. */\n continuationToken?: string;\n };\n result: {\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n /** Present iff `truncated` — pass back as `continuationToken` for the next page. */\n nextToken?: string;\n };\n };\n /** Delete an object from a bucket. */\n delete: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key to delete. */\n key: string;\n };\n result: { deleted: boolean };\n };\n /** Generate a time-limited pre-signed URL for direct GET or PUT access to an object. */\n getSignedUrl: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key. */\n key: string;\n /** URL validity window in seconds; defaults to 3600. */\n expiresIn?: number;\n /** Whether the URL authorizes a read or a write; defaults to 'get'. */\n operation?: 'get' | 'put';\n };\n result: { url: string; expiresAt: number };\n };\n};\n\n// ============================================================================\n// Queue\n// ============================================================================\n\nexport type QueueActions = {\n /** Add a job to an in-memory job queue, ordered by priority (higher first) among ready jobs. */\n enqueue: {\n params: {\n /** Queue name. */\n queue: string;\n /** Arbitrary job payload. */\n payload: ServiceParams;\n /** Delay before the job becomes eligible for dequeue, in milliseconds. */\n delay?: number;\n /** Priority — higher values are dequeued before lower ones. */\n priority?: number;\n };\n result: { jobId: string; position: number };\n };\n /** Pop the highest-priority pending job whose delay has elapsed, marking it 'processing'; returns null if none is ready. */\n dequeue: {\n params: {\n /** Queue name. */\n queue: string;\n };\n result: { job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null };\n };\n /** Look up a job's current status by id. */\n status: {\n params: {\n /** Job id from enqueue. */\n jobId: string;\n };\n result: {\n status: 'pending' | 'processing' | 'completed' | 'failed';\n job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null;\n };\n };\n /** Mark a 'processing' job completed and store its result; no-op (returns false) if the job isn't in 'processing' state. */\n complete: {\n params: {\n /** Job id. */\n jobId: string;\n /** Result payload to attach to the job. */\n result?: ServiceParams;\n };\n result: { completed: boolean };\n };\n /** Mark a 'processing' job failed; no-op (returns false) if the job isn't in 'processing' state. */\n fail: {\n params: {\n /** Job id. */\n jobId: string;\n /** Failure reason to attach to the job. */\n error?: string;\n };\n result: { failed: boolean };\n };\n /** Remove a 'pending' job from its queue; no-op (returns false) once it has been dequeued. */\n cancel: {\n params: {\n /** Job id. */\n jobId: string;\n };\n result: { cancelled: boolean };\n };\n /** Count pending and processing jobs in a queue. */\n size: {\n params: {\n /** Queue name. */\n queue: string;\n };\n result: { size: number; pending: number; processing: number };\n };\n};\n\n// ============================================================================\n// Redis\n// ============================================================================\n\nexport type RedisActions = {\n /** Read a key's value from the in-memory cache; returns null (as `value`) if absent or expired. */\n get: {\n params: {\n /** Cache key. */\n key: string;\n };\n result: { value: ServiceParams };\n };\n /** Write a key's value, optionally with an expiry. */\n set: {\n params: {\n /** Cache key. */\n key: string;\n /** Value to store. */\n value: ServiceParams;\n /** Time-to-live in seconds; omit for no expiry. */\n ttl?: number;\n };\n result: { ok: boolean };\n };\n /** Delete a key. */\n delete: {\n params: {\n /** Cache key. */\n key: string;\n };\n result: { deleted: boolean };\n };\n /** Acquire a mutex on a key; fails (returns acquired:false) if another lock on the key is still alive. */\n lock: {\n params: {\n /** Lock key. */\n key: string;\n /** Lock time-to-live in milliseconds; defaults to 30000 (30s). */\n ttl?: number;\n };\n result: { acquired: boolean; lockId: string };\n };\n /** Release a lock; only succeeds when `lockId` matches the current holder. */\n unlock: {\n params: {\n /** Lock key. */\n key: string;\n /** Lock id returned by the corresponding `lock` call. */\n lockId: string;\n };\n result: { released: boolean };\n };\n /** Atomically add to a numeric key's value (creating it at 0 if absent), preserving any existing TTL. */\n increment: {\n params: {\n /** Cache key. */\n key: string;\n /** Amount to add; defaults to 1 (can be negative to decrement). */\n by?: number;\n };\n result: { value: number };\n };\n /** Set (or reset) a key's expiry; no-op (returns set:false) if the key doesn't exist or is already expired. */\n expire: {\n params: {\n /** Cache key. */\n key: string;\n /** New time-to-live in seconds. */\n ttl: number;\n };\n result: { set: boolean };\n };\n /** Publish a message to a channel; delivered synchronously to in-process subscriber callbacks only. */\n publish: {\n params: {\n /** Channel name. */\n channel: string;\n /** Message payload. */\n message: ServiceParams;\n };\n result: { receivers: number };\n };\n /** Register interest in a channel; does not itself wire a callback (that happens at a higher-level API). */\n subscribe: {\n params: {\n /** Channel name. */\n channel: string;\n };\n result: { subscribed: boolean };\n };\n};\n\n// ============================================================================\n// OAuth\n// ============================================================================\n\nexport type OAuthActions = {\n /** Build the provider authorization URL (PKCE + state) for an OAuth/OIDC login redirect; real OIDC discovery when OAUTH_CLIENT_ID/SECRET are configured, an in-memory mock otherwise. */\n authorize: {\n params: {\n /** Identity provider; OIDC issuer defaults to Google unless OIDC_ISSUER_URL overrides it. */\n provider: 'google' | 'github' | 'auth0';\n /** OAuth scopes to request. */\n scopes: string[];\n /** Callback URL the provider redirects back to after consent. */\n redirectUri: string;\n };\n result: { authUrl: string; state: string };\n };\n /** Exchange an authorization code for tokens, consuming the one-time-use `state` from the matching `authorize` call. */\n token: {\n params: {\n /** Authorization code from the provider's redirect callback. */\n code: string;\n /** The `state` value returned by `authorize`. */\n state: string;\n };\n result: { accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' };\n };\n /** Exchange a refresh token for a new access token. */\n refresh: {\n params: {\n /** Refresh token from a prior `token` call. */\n refreshToken: string;\n };\n result: { accessToken: string; expiresIn: number };\n };\n /** Revoke an access or refresh token. */\n revoke: {\n params: {\n /** The access or refresh token to revoke. */\n token: string;\n };\n result: { revoked: boolean };\n };\n /** Fetch the authenticated user's profile claims for an access token. */\n userinfo: {\n params: {\n /** Access token from a prior `token`/`refresh` call. */\n accessToken: string;\n };\n result: { sub: string; email: string; name: string; picture: string };\n };\n};\n\n// ============================================================================\n// Credentials (hosted tenant credential store — the settings-page backend)\n// ============================================================================\n\nexport type CredentialsActions = {\n /** List declared credentials and their masked (last-4) configuration status; open to any caller. */\n list: {\n params: {\n /** Restrict the listing to one service's declared credentials; omit for all services. */\n service?: string;\n };\n result: {\n enabled: boolean;\n entries: Array<{\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n }>;\n };\n };\n /** Save a credential value into the hosted store; the env var must be one declared for the service (or a well-formed connection-ref name for `database`). Admin/owner role required. */\n set: {\n params: {\n /** Integration name the credential belongs to. */\n service: string;\n /** Declared env-var name being set. */\n envVar: string;\n /** Secret value to store; never logged. */\n value: string;\n };\n result: { saved: boolean; service: string; envVar: string; last4: string };\n };\n /** Delete a stored credential from the hosted store. Admin/owner role required. */\n remove: {\n params: {\n /** Integration name the credential belongs to. */\n service: string;\n /** Env-var name to remove. */\n envVar: string;\n };\n result: { removed: boolean };\n };\n /** Check whether a service's required credentials are present and, if a live probe is declared for it, exercise the service to confirm they actually work. Admin/owner role required. */\n test: {\n params: {\n /** Integration name to test. */\n service: string;\n };\n result: { service: string; configured: boolean; missing: string[]; probed: boolean; ok: boolean; message: string };\n };\n /** Re-encrypt all stored credentials under the current master key (ALMADAR_CREDENTIAL_MASTER_KEY), retiring ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS. Admin/owner role required. */\n rotate: {\n params: Record<string, never>;\n result: {\n /** Entries successfully re-encrypted under the current key. */\n rotated: number;\n /** Entries already under the current key (no-op). */\n alreadyCurrent: number;\n /** Entries that could not be decrypted with either key (data loss risk). */\n unreadable: number;\n };\n };\n};\n\n// ============================================================================\n// OpenTelemetry\n// ============================================================================\n\nexport type OtelActions = {\n /** Start a trace span (in-memory backend — no OpenTelemetry SDK/exporter). */\n startSpan: {\n params: {\n /** Span name. */\n name: string;\n /** Key-value attributes attached to the span. */\n attributes?: IntegrationParams;\n /** Existing trace id to attach this span to; a new one is generated when omitted. */\n traceId?: string;\n };\n result: { spanId: string; traceId: string };\n };\n /** Mark a span ended, optionally recording its final status; no-op (returns ended:false) for an unknown span id. */\n endSpan: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n /** Final span status. */\n status?: 'ok' | 'error';\n };\n result: { ended: boolean };\n };\n /** Attach a timestamped event to an open span; no-op (returns added:false) for an unknown span id. */\n addEvent: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n /** Event name. */\n name: string;\n /** Key-value attributes attached to the event. */\n attributes?: IntegrationParams;\n };\n result: { added: boolean };\n };\n /** Record a metric sample: counters accumulate, gauges overwrite, histograms append to the sample list. */\n recordMetric: {\n params: {\n /** Metric name. */\n name: string;\n /** Sample value. */\n value: number;\n /** Aggregation kind; defaults to 'counter'. */\n type?: 'counter' | 'gauge' | 'histogram';\n /** Key-value labels attached to the metric (replaces prior labels on the same name). */\n labels?: IntegrationParams;\n };\n result: { recorded: boolean };\n };\n /** Fetch a stored span's full record by id; null if unknown. */\n getSpan: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n };\n result: {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n } | null;\n };\n /** Fetch all recorded metrics, keyed by metric name. */\n getMetrics: {\n params: Record<string, never>;\n result: Record<string, { name: string; type: string; value: number; values: number[]; labels: IntegrationParams }>;\n };\n};\n\n// ============================================================================\n// CLI\n// ============================================================================\n\nexport type CLIActions = {\n /** Validate an orbital schema by writing it to a temp file and shelling out to `npx @almadar/cli validate --format=json`. */\n validate: {\n params: {\n /** Raw .orb schema content to validate. */\n schema: string;\n };\n result: { valid: boolean; errors: string[]; warnings: string[]; summary: string };\n };\n};\n\n// ============================================================================\n// DeepAgent\n// ============================================================================\n\nexport type DeepAgentActions = {\n /** Send a chat message to the DeepAgent server (POST /api/agent/message), continuing an existing thread or starting one. */\n sendMessage: {\n params: {\n /** Message text. */\n message: string;\n /** Existing thread id to continue; a new thread starts when omitted. */\n threadId?: string;\n /** Named skill to invoke for this message. */\n skill?: string;\n /** Extra context passed through to the agent. */\n context?: IntegrationParams;\n };\n result: { response: string; threadId: string };\n };\n /** Cancel an in-flight generation on a DeepAgent thread (POST /api/agent/cancel). */\n cancelGeneration: {\n params: {\n /** Thread whose generation to cancel. */\n threadId: string;\n };\n result: { cancelled: boolean };\n };\n /** Validate a schema via the DeepAgent server (POST /api/schema/validate). */\n validateSchema: {\n params: {\n /** Schema content to validate. */\n schema: string;\n };\n result: { valid: boolean; errors: string[] };\n };\n /** Compile a schema to a target shell via the DeepAgent server (POST /api/schema/compile). */\n compileSchema: {\n params: {\n /** Schema content to compile. */\n schema: string;\n /** Target codegen shell (e.g. 'typescript'). */\n shell?: string;\n };\n result: { output: string; files: string[] };\n };\n /** Fetch a thread's message history via the DeepAgent server (POST /api/agent/history). */\n getThreadHistory: {\n params: {\n /** Thread id. */\n threadId: string;\n };\n result: { messages: Array<{ role: string; content: string; timestamp: number }> };\n };\n};\n\n// ============================================================================\n// Database\n// ============================================================================\n\nexport type DatabaseActions = {\n /** Run a single read-only SELECT against a Postgres connection (write statements and multi-statement SQL are rejected before execution). */\n query: {\n params: {\n /** Env-var NAME whose value is the Postgres connection string — never the secret itself; resolved from the credential store/environment at run time. */\n connectionRef: string;\n /** SQL text; must be exactly one SELECT statement. */\n sql: string;\n /** Positional bind parameters for the query. */\n params?: DatabaseQueryParamValue[];\n };\n result: { rows: DatabaseRow[]; rowCount: number };\n };\n};\n\n// ============================================================================\n// Wikimedia\n// ============================================================================\n\nexport type WikimediaActions = {\n /** Look up a Wikipedia page (redirect-resolved): a one-line description, a Commons thumbnail, and the lead-section extract; empty fields on a miss. */\n getPage: {\n params: {\n /** Page title to look up. */\n title: string;\n };\n result: { title?: string; description?: string; portraitUrl?: string; extract?: string };\n };\n};\n\n// ============================================================================\n// Iconify\n// ============================================================================\n\nexport type IconifyActions = {\n /** Check whether an icon exists at the given Iconify API path (a GET, not a HEAD, despite the name). */\n svgExists: {\n params: {\n /** Iconify API path segment to probe, e.g. 'prefix/name.svg'. */\n path: string;\n };\n result: { exists: boolean };\n };\n /** Search Iconify's icon sets by relevance. */\n search: {\n params: {\n /** Search query text. */\n query: string;\n /** Maximum icon ids to return; defaults to 1. */\n limit?: number;\n };\n result: { icons: string[] };\n };\n /** Fetch an icon's raw SVG body (for color-tone classification); null if the icon or its collection isn't found. */\n getIconBody: {\n params: {\n /** Icon id in \"prefix:name\" form. */\n iconId: string;\n };\n result: { body: string | null };\n };\n};\n\n// ============================================================================\n// arXiv\n// ============================================================================\n\nexport type ArxivActions = {\n /** Search arXiv's public Atom API by relevance. */\n search: {\n params: {\n /** Search query text (matched across all fields). */\n query: string;\n /** Maximum results to return; defaults to 8. */\n maxResults?: number;\n };\n result: { results: Array<{ id: string; title: string; summary: string; authors: string[]; published: string; url: string }> };\n };\n};\n\n// ============================================================================\n// Barrel: IntegrationContracts\n// ============================================================================\n\n/**\n * Maps each integration name (as used in `registerIntegration`) to its action\n * map type. Use with `ServiceContract<IntegrationContracts[K]>` to get a fully\n * typed service interface for a specific integration.\n *\n * @example\n * ```typescript\n * import type { ServiceContract } from '@almadar/core';\n * import type { IntegrationContracts } from '@almadar/integrations';\n *\n * type TypedStripe = ServiceContract<IntegrationContracts['stripe']>;\n * ```\n */\nexport type IntegrationContracts = {\n github: GitHubActions;\n stripe: StripeActions;\n llm: LLMIntegrationActions;\n ml: MLActions;\n youtube: YouTubeActions;\n twilio: TwilioActions;\n email: EmailActions;\n webhook: WebhookActions;\n push: PushActions;\n calendar: CalendarActions;\n drive: DriveActions;\n metaAds: MetaAdsActions;\n accounting: AccountingActions;\n banking: BankingActions;\n esign: EsignActions;\n docker: DockerActions;\n storage: StorageActions;\n queue: QueueActions;\n redis: RedisActions;\n oauth: OAuthActions;\n credentials: CredentialsActions;\n otel: OtelActions;\n cli: CLIActions;\n deepagent: DeepAgentActions;\n database: DatabaseActions;\n wikimedia: WikimediaActions;\n iconify: IconifyActions;\n arxiv: ArxivActions;\n};\n\n/** Integration name literal union. */\nexport type IntegrationName = keyof IntegrationContracts;\n\n/**\n * Helper: extract the action names for a given integration.\n *\n * @example\n * ```typescript\n * type StripeAction = IntegrationActionName<'stripe'>;\n * // => 'createPaymentIntent' | 'confirmPayment' | 'refund'\n * ```\n */\nexport type IntegrationActionName<K extends IntegrationName> =\n keyof IntegrationContracts[K] & string;\n\n// ============================================================================\n// Event Map\n// ============================================================================\n\n/** Events emitted by integrations during execution. */\nexport type IntegrationEventMap = {\n INTEGRATION_CALL_STARTED: { integration: string; action: string; timestamp: number };\n INTEGRATION_CALL_SUCCEEDED: { integration: string; action: string; durationMs: number };\n INTEGRATION_CALL_FAILED: { integration: string; action: string; error: string; retryCount: number };\n INTEGRATION_RETRY: { integration: string; action: string; attempt: number; maxRetries: number };\n INTEGRATION_REGISTERED: { integration: string; actions: string[] };\n};\n\n/** Typed event emitter for integration events. */\nexport type IntegrationServiceEvents = ServiceEvents<IntegrationEventMap>;\n\n// ============================================================================\n// Type Assertions\n// ============================================================================\n\n// Compile-time verification that all action maps satisfy Record<string, ServiceAction>.\n// This is a type-level assertion, not runtime code.\ntype _AssertActions<T extends Record<string, ServiceAction>> = T;\ntype _CheckGitHub = _AssertActions<GitHubActions>;\ntype _CheckStripe = _AssertActions<StripeActions>;\ntype _CheckLLM = _AssertActions<LLMIntegrationActions>;\ntype _CheckML = _AssertActions<MLActions>;\ntype _CheckYouTube = _AssertActions<YouTubeActions>;\ntype _CheckTwilio = _AssertActions<TwilioActions>;\ntype _CheckEmail = _AssertActions<EmailActions>;\ntype _CheckWebhook = _AssertActions<WebhookActions>;\ntype _CheckPush = _AssertActions<PushActions>;\ntype _CheckCalendar = _AssertActions<CalendarActions>;\ntype _CheckDrive = _AssertActions<DriveActions>;\ntype _CheckMetaAds = _AssertActions<MetaAdsActions>;\ntype _CheckAccounting = _AssertActions<AccountingActions>;\ntype _CheckBanking = _AssertActions<BankingActions>;\ntype _CheckEsign = _AssertActions<EsignActions>;\ntype _CheckDocker = _AssertActions<DockerActions>;\ntype _CheckStorage = _AssertActions<StorageActions>;\ntype _CheckQueue = _AssertActions<QueueActions>;\ntype _CheckRedis = _AssertActions<RedisActions>;\ntype _CheckOAuth = _AssertActions<OAuthActions>;\ntype _CheckCredentials = _AssertActions<CredentialsActions>;\ntype _CheckOtel = _AssertActions<OtelActions>;\ntype _CheckCLI = _AssertActions<CLIActions>;\ntype _CheckDeepAgent = _AssertActions<DeepAgentActions>;\ntype _CheckDatabase = _AssertActions<DatabaseActions>;\ntype _CheckWikimedia = _AssertActions<WikimediaActions>;\ntype _CheckIconify = _AssertActions<IconifyActions>;\ntype _CheckArxiv = _AssertActions<ArxivActions>;\n\n// ============================================================================\n// Credential Declarations\n// ============================================================================\n\n/** A credential (environment variable) required by an integration. */\nexport interface CredentialDeclaration {\n envVar: string;\n required: boolean;\n description: string;\n}\n\n/**\n * Credential declarations for all integrations.\n *\n * This is the single source of truth for what env vars each service needs.\n * Consumed by:\n * - almadar-service-sync (extracts into services-registry.json)\n * - @almadar-io/terraform (provisions Secret Manager resources)\n * - RuntimeIntegrationManager (validates env configuration)\n */\nexport const serviceCredentials: Record<string, CredentialDeclaration[]> = {\n stripe: [\n { envVar: 'STRIPE_SECRET_KEY', required: true, description: 'Stripe secret API key' },\n { envVar: 'STRIPE_WEBHOOK_SECRET', required: false, description: 'Webhook endpoint signing secret' },\n ],\n youtube: [\n { envVar: 'YOUTUBE_API_KEY', required: true, description: 'YouTube Data API key' },\n ],\n twilio: [\n { envVar: 'TWILIO_ACCOUNT_SID', required: true, description: 'Twilio account SID' },\n { envVar: 'TWILIO_AUTH_TOKEN', required: true, description: 'Twilio auth token' },\n { envVar: 'TWILIO_PHONE_NUMBER', required: false, description: 'Default sender phone number' },\n ],\n email: [\n { envVar: 'SENDGRID_API_KEY', required: false, description: 'SendGrid API key (use this OR RESEND_API_KEY)' },\n { envVar: 'RESEND_API_KEY', required: false, description: 'Resend API key (use this OR SENDGRID_API_KEY)' },\n { envVar: 'FROM_EMAIL', required: false, description: 'Default sender email address' },\n ],\n webhook: [\n { envVar: 'WEBHOOK_SIGNING_SECRET', required: false, description: 'Default HMAC-SHA256 signing secret (per-call secret overrides)' },\n { envVar: 'WEBHOOK_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms, default 10000)' },\n ],\n push: [\n { envVar: 'VAPID_PUBLIC_KEY', required: true, description: 'VAPID public key (web-push generate-vapid-keys)' },\n { envVar: 'VAPID_PRIVATE_KEY', required: true, description: 'VAPID private key' },\n { envVar: 'VAPID_SUBJECT', required: true, description: 'VAPID subject (mailto: or https: contact URI)' },\n ],\n calendar: [\n { envVar: 'GOOGLE_CALENDAR_SA_KEY', required: true, description: 'Google service-account key JSON (raw or base64) with calendar scope; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_CALENDAR_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_CALENDAR_ID', required: false, description: 'Default calendar id (default: primary)' },\n { envVar: 'GOOGLE_CALENDAR_CHANNEL_TOKEN', required: false, description: 'Watch-channel verification token — required to receive inbound calendar hooks (two-way sync)' },\n ],\n drive: [\n { envVar: 'GOOGLE_DRIVE_SA_KEY', required: false, description: 'Google service-account key JSON (raw or base64) with drive scope — serves reads; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_DRIVE_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_DRIVE_REFRESH_TOKEN', required: false, description: 'User OAuth refresh token (drive-consent.mjs) — serves writes; SA uploads are impossible on personal accounts (no SA storage quota)' },\n { envVar: 'GOOGLE_DRIVE_FOLDER_ID', required: false, description: 'Default parent folder for uploads/new folders when the call names none' },\n ],\n metaAds: [\n { envVar: 'META_ACCESS_TOKEN', required: true, description: 'Meta Graph API access token (Marketing API, ads_read)' },\n { envVar: 'META_AD_ACCOUNT_ID', required: false, description: 'Default ad account id (act_…); per-call accountId overrides' },\n ],\n accounting: [],\n banking: [\n { envVar: 'GOCARDLESS_SECRET_ID', required: true, description: 'GoCardless Bank Account Data secret id' },\n { envVar: 'GOCARDLESS_SECRET_KEY', required: true, description: 'GoCardless Bank Account Data secret key' },\n ],\n esign: [\n { envVar: 'DOCUSIGN_BASE_URL', required: true, description: 'DocuSign REST base (e.g. https://demo.docusign.net/restapi/v2.1/accounts/<accountId>)' },\n { envVar: 'DOCUSIGN_ACCESS_TOKEN', required: true, description: 'DocuSign OAuth access token (JWT grant rotation is the deployment concern)' },\n ],\n llm: [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key (use this OR OPENAI_API_KEY)' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key (use this OR ANTHROPIC_API_KEY)' },\n ],\n 'llm-integration': [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key' },\n ],\n ml: [\n { envVar: 'MASAR_URL', required: true, description: 'Base URL of the deployed model-serving orbital' },\n { envVar: 'MASAR_ML_TRAIT', required: true, description: 'Kebab-case trait name the serving orbital exposes its /events route under' },\n ],\n deepagent: [\n { envVar: 'DEEPAGENT_API_URL', required: true, description: 'DeepAgent server URL' },\n { envVar: 'DEEPAGENT_API_KEY', required: false, description: 'DeepAgent API key' },\n ],\n github: [\n { envVar: 'GITHUB_TOKEN', required: true, description: 'GitHub personal access token' },\n { envVar: 'GITHUB_OWNER', required: false, description: 'Default repository owner' },\n { envVar: 'GITHUB_REPO', required: false, description: 'Default repository name' },\n ],\n docker: [\n { envVar: 'DOCKER_HOST', required: false, description: 'Docker daemon host URL' },\n ],\n storage: [\n { envVar: 'STORAGE_ACCESS_KEY_ID', required: true, description: 'S3-compatible access key id' },\n { envVar: 'STORAGE_SECRET_ACCESS_KEY', required: true, description: 'S3-compatible secret access key' },\n { envVar: 'STORAGE_BUCKET', required: true, description: 'Default bucket name' },\n { envVar: 'STORAGE_REGION', required: false, description: 'Region (default us-east-1)' },\n { envVar: 'STORAGE_ENDPOINT', required: false, description: 'Custom S3-compatible endpoint (R2/MinIO/…); empty = AWS S3' },\n { envVar: 'STORAGE_PUBLIC_URL_BASE', required: false, description: 'Base URL for public-acl object links; empty = endpoint-derived' },\n ],\n queue: [\n { envVar: 'QUEUE_URL', required: true, description: 'Message queue connection URL' },\n ],\n redis: [\n { envVar: 'REDIS_URL', required: true, description: 'Redis connection URL' },\n ],\n oauth: [\n { envVar: 'OAUTH_CLIENT_ID', required: true, description: 'OIDC client ID' },\n { envVar: 'OAUTH_CLIENT_SECRET', required: true, description: 'OIDC client secret' },\n { envVar: 'OAUTH_REDIRECT_URI', required: false, description: 'OIDC redirect URI (default per-call param)' },\n { envVar: 'OIDC_ISSUER_URL', required: false, description: 'OIDC issuer URL (default https://accounts.google.com)' },\n ],\n credentials: [\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY', required: false, description: 'AES-256 master key (64-char hex) enabling the hosted credential store — hold it alone in the platform secret store' },\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS', required: false, description: 'Previous master key, present only during a rotation window — decrypts old rows until `credentials.rotate` re-encrypts them' },\n ],\n otel: [\n { envVar: 'OTEL_EXPORTER_OTLP_ENDPOINT', required: true, description: 'OpenTelemetry collector endpoint' },\n { envVar: 'OTEL_SERVICE_NAME', required: false, description: 'Service name for traces' },\n ],\n cli: [],\n // No fixed env vars — connection strings are resolved per-query from the\n // caller-supplied connectionRef, so credentials cannot be declared statically.\n database: [],\n wikimedia: [\n { envVar: 'WIKIMEDIA_USER_AGENT', required: false, description: 'Descriptive User-Agent for the Wikipedia API' },\n { envVar: 'WIKIMEDIA_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n iconify: [\n { envVar: 'ICONIFY_USER_AGENT', required: false, description: 'User-Agent for the Iconify API' },\n { envVar: 'ICONIFY_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n arxiv: [\n { envVar: 'ARXIV_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n};\n\n/**\n * Every env var name declared anywhere in `serviceCredentials` — provider\n * secrets and the credential-store's own bootstrap keys alike. The single\n * source a forked verify/harness process scrubs from its env so it can never\n * see, and therefore never spend, a real credential (regardless of which\n * integration mode the fork ends up in).\n */\nexport function allCredentialEnvVars(): Set<string> {\n const vars = new Set<string>();\n for (const decls of Object.values(serviceCredentials)) {\n for (const { envVar } of decls) vars.add(envVar);\n }\n return vars;\n}\n\n/**\n * Bootstrap secrets that must NEVER enter store custody: the master key(s)\n * decrypt the store itself, so seeding them as rows (encrypted under\n * themselves) or stripping them from the env would be circular.\n */\nexport const STORE_BOOTSTRAP_ENV_VARS = new Set([\n 'ALMADAR_CREDENTIAL_MASTER_KEY',\n 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS',\n]);\n\n/**\n * Every declared PROVIDER credential env var — `allCredentialEnvVars()` minus\n * the store's own bootstrap keys. The store-first custody set (I-31):\n * `RuntimeIntegrationManager` strips these from the base env before merging\n * the store's decrypted values, so every resolution flows the exact store →\n * env → unconfigured path a deployed client app uses.\n */\nexport function declaredCredentialEnvVars(): Set<string> {\n const vars = allCredentialEnvVars();\n for (const bootstrapVar of STORE_BOOTSTRAP_ENV_VARS) vars.delete(bootstrapVar);\n return vars;\n}\n\n/**\n * Declared side-effect-free \"Test connection\" probes, executed by the\n * `credentials.test` action through the normal factory path. Only services\n * with a genuinely cheap, read-only, env-defaulted action carry one; the\n * rest report credential presence + constructor validation.\n */\n/**\n * One inbound-hook mount a service's provider needs in a deployed app:\n * `POST /api/hooks/:provider` verified by the provider's own token/signature,\n * dispatching `event` onto the app bus. A hook is a PROVIDER property — the\n * service invocation is the `.lolo` surface; codegen derives the mount from\n * the app's invoked services × these declarations (I-26).\n */\nexport interface HookDeclaration {\n /** Provider key mounted at POST /api/hooks/:provider */\n provider: string;\n /** Bus event dispatched into the app on a verified callback */\n event: string;\n /** Env var carrying the provider's verification secret/channel token */\n credentialEnv: string;\n /** Factory export in @almadar/integrations: (secret?) => HookProvider */\n providerExport: string;\n}\n\n/**\n * Inbound-hook declarations per service — the single source the registry,\n * codegen, and the playground mount derive from.\n */\nexport const serviceHooks: Record<string, HookDeclaration[]> = {\n calendar: [\n {\n provider: 'google-calendar',\n event: 'CAL_REMOTE_CHANGED',\n credentialEnv: 'GOOGLE_CALENDAR_CHANNEL_TOKEN',\n providerExport: 'googleCalendarHookProvider',\n },\n ],\n};\n\nexport const serviceProbes: Partial<Record<IntegrationName, { action: string; params: ServiceParams }>> = {\n calendar: { action: 'listEvents', params: { maxResults: 1 } },\n drive: { action: 'listFiles', params: { maxResults: 1 } },\n metaAds: { action: 'listCampaigns', params: {} },\n};\n\n/** Backend maturity grade of an integration implementation. */\nexport type IntegrationBackendGrade = 'production' | 'simulated' | 'stub';\n\n/**\n * Honest backend grade per integration — 'simulated' marks an in-memory\n * implementation that must never be mistaken for a real backend. Synced into\n * services-registry.json (`backend`) by `almadar-sync services` and surfaced\n * by the verify service manifest and /health.\n */\nexport const serviceBackends: Record<IntegrationName, IntegrationBackendGrade> = {\n github: 'production',\n stripe: 'production',\n llm: 'production',\n ml: 'production',\n youtube: 'production',\n twilio: 'production',\n email: 'production',\n webhook: 'production',\n push: 'production',\n calendar: 'production',\n drive: 'production',\n metaAds: 'production',\n accounting: 'production',\n banking: 'production',\n esign: 'production',\n docker: 'simulated',\n storage: 'production',\n queue: 'simulated',\n redis: 'simulated',\n oauth: 'production',\n credentials: 'production',\n otel: 'simulated',\n cli: 'production',\n deepagent: 'production',\n database: 'production',\n wikimedia: 'production',\n iconify: 'production',\n arxiv: 'production',\n};\n","import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/** Envelope keys owned by the call-service form, never action params. */\nconst RESERVED_ENVELOPE_KEYS = new Set(['emit', 'onSuccess', 'onError', 'timeout']);\n\n/** Thrown by an integration's dispatch default/miss arm — contract↔dispatch parity marker. */\nexport class UnknownActionError extends Error {\n integration: string;\n action: string;\n\n constructor(integration: string, action: string) {\n super(`Unknown ${integration} action: ${action}`);\n this.name = 'UnknownActionError';\n this.integration = integration;\n this.action = action;\n }\n}\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Unknown-key check (I-13 runtime parity with orb validate): a param the\n // contract does not declare is an error, not a silent drop. Envelope keys\n // belong to the call-service form itself, never to the action contract.\n const declaredNames = new Set(actionDef.params.map((p: ActionParam) => p.name));\n for (const key of Object.keys(params)) {\n if (RESERVED_ENVELOPE_KEYS.has(key)) continue;\n if (!declaredNames.has(key)) {\n errors.push({\n param: key,\n message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(', ')})`,\n });\n }\n }\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\nimport type { IntegrationCallContext } from '../factory';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action. `context` carries the caller's identity when the host\n * supplies one; integrations that gate actions by role read it and fail\n * closed when it is absent.\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","import type { IntegrationConfig } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\n\n/**\n * Integration constructor type\n */\nexport type IntegrationConstructor = new (\n config: IntegrationConfig,\n) => BaseIntegration;\n\n/**\n * Integration registry (populated as integrations are imported)\n */\nexport const INTEGRATION_REGISTRY: Record<string, IntegrationConstructor> = {};\n\n/**\n * Register an integration\n */\nexport function registerIntegration(\n name: string,\n constructor: IntegrationConstructor,\n): void {\n INTEGRATION_REGISTRY[name] = constructor;\n}\n\n/**\n * Get integration constructor by name\n */\nexport function getIntegration(\n name: string,\n): IntegrationConstructor | undefined {\n return INTEGRATION_REGISTRY[name];\n}\n\n/**\n * Check if integration is known\n */\nexport function isKnownIntegration(name: string): boolean {\n return name in INTEGRATION_REGISTRY;\n}\n\n/**\n * Get all registered integration names\n */\nexport function getRegisteredIntegrations(): string[] {\n return Object.keys(INTEGRATION_REGISTRY);\n}\n","import type { IntegrationConfig, IntegrationResult, IntegrationParams } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Optional per-call context for principal-scoped resolution (W4) and\n * caller-identity enforcement (I-25). The default — absent — means the\n * tenant/app-wide credential set with an anonymous caller; role-gated\n * integrations (credentials) fail closed without it. Additive: every\n * existing call site is untouched.\n */\nexport interface IntegrationCallContext {\n principal?: string;\n /** The caller's roster role, from the same identity entity-ACL enforces against. */\n role?: string;\n}\n\n/** Cache key for (name, principal?) — NUL never appears in either part. */\nfunction instanceKey(name: string, principal?: string): string {\n return principal ? `${name}\\u0000${principal}` : name;\n}\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet). A `principal` scopes\n * the config to that principal; the app-wide config (no principal) is the\n * fallback for every principal.\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>, principal?: string): void {\n this.configs.set(instanceKey(name, principal), { name, ...config });\n }\n\n /**\n * Get or create an integration instance. Principal-scoped lookups fall\n * back to the app-wide config when no per-principal config exists.\n */\n get(name: string, principal?: string): BaseIntegration {\n const key = instanceKey(name, principal);\n const cached = this.instances.get(key);\n if (cached) {\n return cached;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config — per-principal first, app-wide fallback\n const config = this.configs.get(key) ?? this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(key, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration, context?.principal);\n return await instance.execute(action, params, context);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string, principal?: string): boolean {\n return this.configs.has(instanceKey(name, principal)) || this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration, principal?: string): void {\n this.instances.set(instanceKey(name, principal), instance);\n }\n\n /**\n * Drop the cached instance(s) for a name so the next `get` rebuilds from\n * the current config — how a credential change goes live without restart.\n * Configs are kept; without a name, every instance is dropped.\n */\n invalidate(name?: string): void {\n if (name === undefined) {\n this.instances.clear();\n return;\n }\n for (const key of this.instances.keys()) {\n if (key === name || key.startsWith(`${name}\\u0000`)) {\n this.instances.delete(key);\n }\n }\n }\n\n /**\n * Clear all instances (useful for testing)\n */\n clear(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all instances and configs\n */\n reset(): void {\n this.instances.clear();\n this.configs.clear();\n }\n}\n\nlet _factory: IntegrationFactory | null = null;\n\nexport function getIntegrationFactory(): IntegrationFactory {\n if (!_factory) {\n _factory = new IntegrationFactory();\n }\n return _factory;\n}\n\nexport function resetIntegrationFactory(): void {\n _factory?.reset();\n _factory = null;\n}\n","import type { CredentialStore } from './store';\nimport type { IntegrationFactory } from '../factory';\n\nlet installedStore: CredentialStore | null = null;\nlet activeFactory: IntegrationFactory | null = null;\n\n/**\n * The factory the host's `RuntimeIntegrationManager` configures — installed\n * by its constructor so the `credentials.test` probe executes through the\n * SAME factory (and therefore the same configs) as every other call-service.\n */\nexport function installActiveFactory(factory: IntegrationFactory): void {\n activeFactory = factory;\n}\n\nexport function getActiveFactory(): IntegrationFactory | null {\n return activeFactory;\n}\n\n/**\n * Install the host's credential store as the process-wide resolution source.\n * Called once at boot (playground / generated server) after the store is\n * constructed over the host's persistence adapter.\n */\nexport function installCredentialStore(store: CredentialStore): void {\n installedStore = store;\n}\n\n/** The installed store, for the credentials admin service. */\nexport function getInstalledCredentialStore(): CredentialStore | null {\n return installedStore;\n}\n\n/** Testing/reset hook. */\nexport function uninstallCredentialStore(): void {\n installedStore = null;\n}\n\n/**\n * The one credential-reference resolver: store → env → undefined.\n * `ref` is an env-var name — the same name `serviceCredentials` declares and\n * `connectionRef` params carry. Every place that used to read\n * `process.env[ref]` for a credential routes through here.\n */\nexport function resolveCredentialRef(\n ref: string,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n return installedStore?.resolve(ref) ?? env[ref];\n}\n","import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { EntityRow } from '@almadar/core';\nimport type { CredentialPersistence } from './store';\n\n/** Env var overriding where the dev credential file lives. */\nexport const CREDENTIALS_FILE_ENV = 'ALMADAR_CREDENTIALS_FILE';\n\nconst DEFAULT_RELATIVE_PATH = join('.almadar', 'dev-credentials.json');\n\n/**\n * File-backed `CredentialPersistence` for dev store-first mode (I-31): rows\n * survive playground restarts so the encrypt-at-rest path is exercised on\n * every dev run, exactly like a deployed app's Firestore-backed store. Rows\n * arrive already encrypted (ciphertext/iv/authTag) — this adapter never sees\n * plaintext. Writes are atomic (tmp file + rename). Never use in production.\n */\nexport class FileCredentialPersistence implements CredentialPersistence {\n private readonly path: string;\n private counter = 0;\n\n constructor(path?: string) {\n this.path =\n path ?? process.env[CREDENTIALS_FILE_ENV] ?? join(process.cwd(), DEFAULT_RELATIVE_PATH);\n }\n\n get filePath(): string {\n return this.path;\n }\n\n private load(): Map<string, EntityRow> {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const rows = JSON.parse(raw) as EntityRow[];\n const map = new Map<string, EntityRow>();\n for (const row of rows) {\n if (typeof row.id === 'string') map.set(row.id, row);\n }\n return map;\n } catch {\n return new Map();\n }\n }\n\n private save(rows: Map<string, EntityRow>): void {\n mkdirSync(dirname(this.path), { recursive: true });\n const tmp = `${this.path}.tmp`;\n writeFileSync(tmp, JSON.stringify([...rows.values()], null, 2), 'utf-8');\n renameSync(tmp, this.path);\n }\n\n async create(entityType: string, data: EntityRow): Promise<{ id: string }> {\n const rows = this.load();\n const id = `${entityType}-${Date.now()}-${++this.counter}`;\n rows.set(id, { ...data, id });\n this.save(rows);\n return { id };\n }\n\n async update(_entityType: string, id: string, data: EntityRow): Promise<void> {\n const rows = this.load();\n const existing = rows.get(id);\n if (existing) {\n rows.set(id, { ...existing, ...data, id });\n this.save(rows);\n }\n }\n\n async delete(_entityType: string, id: string): Promise<void> {\n const rows = this.load();\n if (rows.delete(id)) this.save(rows);\n }\n\n async list(_entityType: string): Promise<EntityRow[]> {\n return [...this.load().values()];\n }\n}\n","import Stripe from 'stripe';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationError,\n IntegrationParams,\n} from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n AlmadarInvoicePayment,\n AlmadarInvoiceFailure,\n AlmadarStripeEvent,\n AlmadarStripeEventOk,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport { verifyAndParseStripeEvent } from './webhooks';\nexport type { VerifyAndParseInput } from './webhooks';\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction shapeCustomer(customer: Stripe.Customer): AlmadarCustomer {\n return {\n customerId: customer.id,\n email: customer.email ?? null,\n almadarUid: customer.metadata?.almadarUid ?? null,\n };\n}\n\n/**\n * Stripe integration for payment processing and subscription billing.\n *\n * Two surfaces:\n * - Legacy `execute(action, params)` switch for the original three\n * PaymentIntent actions (kept for back-compat).\n * - New typed methods (`createCustomer`, `createCheckoutSession`,\n * `createSubscription`, etc.) that return canonical `Almadar*`\n * types. Consumers MUST prefer these — `Stripe.*` types never leak.\n */\nexport class StripeIntegration extends BaseIntegration {\n private client: Stripe;\n private prices: StripePriceMap;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('STRIPE_SECRET_KEY not configured');\n }\n\n this.client = new Stripe(apiKey, {\n apiVersion: STRIPE_API_VERSION,\n });\n\n this.prices = {\n solo: config.env.STRIPE_PRICE_SOLO ?? '',\n teams: config.env.STRIPE_PRICE_TEAMS ?? '',\n };\n\n this.logger.info('Stripe integration initialized');\n }\n\n /** Provisioned Price IDs the integration was constructed with. */\n getPrices(): StripePriceMap {\n return this.prices;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n const retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createPaymentIntent':\n data = await this.executeWithRetry(() =>\n this.createPaymentIntent(params),\n );\n break;\n case 'confirmPayment':\n data = await this.executeWithRetry(() => this.confirmPayment(params));\n break;\n case 'refund':\n data = await this.executeWithRetry(() => this.refund(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async createPaymentIntent(params: IntegrationParams) {\n const { amount, currency, metadata } = params;\n this.logger.debug('Creating payment intent', {\n amount: Number(amount),\n currency: String(currency ?? ''),\n });\n return await this.client.paymentIntents.create({\n amount: amount as number,\n currency: currency as string,\n metadata: metadata as Stripe.MetadataParam | undefined,\n });\n }\n\n private async confirmPayment(params: IntegrationParams) {\n const { paymentIntentId } = params;\n this.logger.debug('Confirming payment', {\n paymentIntentId: String(paymentIntentId ?? ''),\n });\n return await this.client.paymentIntents.confirm(paymentIntentId as string);\n }\n\n private async refund(params: IntegrationParams) {\n const { paymentIntentId, amount } = params;\n this.logger.debug('Creating refund', {\n paymentIntentId: String(paymentIntentId ?? ''),\n amount: Number(amount),\n });\n return await this.client.refunds.create({\n payment_intent: paymentIntentId as string,\n amount: amount as number | undefined,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────\n // Typed action surface — canonical Almadar shapes only.\n // ───────────────────────────────────────────────────────────────────\n\n /** Look up an existing customer by Stripe ID. */\n async getCustomer(customerId: string): Promise<AlmadarCustomer | null> {\n this.logger.debug('Fetching customer', { customerId });\n const customer = await this.client.customers.retrieve(customerId);\n if (customer.deleted === true) return null;\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe Customer for the given Almadar user. `almadarUid` is\n * stored as Stripe metadata so webhook handlers can resolve back to\n * the right `users/{uid}` document.\n */\n async createCustomer(input: CreateCustomerInput): Promise<AlmadarCustomer> {\n this.logger.debug('Creating customer', { almadarUid: input.almadarUid });\n const customer = await this.client.customers.create({\n email: input.email,\n name: input.displayName ?? undefined,\n metadata: { almadarUid: input.almadarUid },\n });\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe-hosted Checkout Session for the given tier. Client\n * redirects the user to the returned `url`; on success Stripe fires\n * `customer.subscription.created`, which the apps/builder webhook\n * handler turns into a `users/{uid}.tier` write.\n */\n async createCheckoutSession(\n input: CreateCheckoutInput,\n ): Promise<AlmadarCheckoutSession> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n\n this.logger.debug('Creating Checkout session', {\n tier: input.tier,\n quantity: input.quantity,\n hasCustomer: input.customerId !== null,\n });\n\n const session = await this.client.checkout.sessions.create({\n mode: 'subscription',\n customer: input.customerId ?? undefined,\n line_items: [{ price, quantity: input.quantity }],\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n subscription_data: {\n metadata: input.metadata,\n },\n automatic_tax: { enabled: true },\n allow_promotion_codes: true,\n });\n\n return {\n url: session.url ?? '',\n sessionId: session.id,\n customerId:\n typeof session.customer === 'string'\n ? session.customer\n : session.customer?.id ?? null,\n };\n }\n\n /** Create a Billing Portal session for self-service plan management. */\n async createBillingPortalSession(\n input: CreatePortalInput,\n ): Promise<AlmadarPortalSession> {\n this.logger.debug('Creating Portal session', { customerId: input.customerId });\n const session = await this.client.billingPortal.sessions.create({\n customer: input.customerId,\n return_url: input.returnUrl,\n });\n return {\n url: session.url,\n customerId: input.customerId,\n };\n }\n\n /** Fetch a subscription and shape it into the canonical form. */\n async getSubscription(subscriptionId: string): Promise<AlmadarSubscription> {\n this.logger.debug('Fetching subscription', { subscriptionId });\n const sub = await this.client.subscriptions.retrieve(subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Create a subscription directly (server-side, no Checkout). Used by\n * P13.3 Solo → Teams upgrade flow.\n */\n async createSubscription(input: {\n customerId: string;\n tier: 'solo' | 'teams';\n quantity: number;\n metadata: Record<string, string>;\n }): Promise<AlmadarSubscription> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n this.logger.debug('Creating subscription', {\n customerId: input.customerId,\n tier: input.tier,\n quantity: input.quantity,\n });\n const sub = await this.client.subscriptions.create({\n customer: input.customerId,\n items: [{ price, quantity: input.quantity }],\n metadata: input.metadata,\n proration_behavior: 'create_prorations',\n automatic_tax: { enabled: true },\n });\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Update quantity or cancel-at-period-end. Used for Teams seat resize\n * and Solo → Teams transition.\n */\n async updateSubscription(\n input: UpdateSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Updating subscription', { subscriptionId: input.subscriptionId });\n const update: Stripe.SubscriptionUpdateParams = {\n proration_behavior: 'create_prorations',\n };\n if (typeof input.quantity === 'number') {\n const existing = await this.client.subscriptions.retrieve(input.subscriptionId);\n const itemId = existing.items.data[0]?.id;\n if (itemId !== undefined) {\n update.items = [{ id: itemId, quantity: input.quantity }];\n }\n }\n if (typeof input.cancelAtPeriodEnd === 'boolean') {\n update.cancel_at_period_end = input.cancelAtPeriodEnd;\n }\n const sub = await this.client.subscriptions.update(\n input.subscriptionId,\n update,\n );\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Cancel a subscription. Defaults to `atPeriodEnd: true` so the user\n * keeps access until the current period ends.\n */\n async cancelSubscription(\n input: CancelSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Canceling subscription', {\n subscriptionId: input.subscriptionId,\n atPeriodEnd: input.atPeriodEnd,\n });\n if (input.atPeriodEnd) {\n const sub = await this.client.subscriptions.update(input.subscriptionId, {\n cancel_at_period_end: true,\n });\n return shapeSubscription(sub, this.prices);\n }\n const sub = await this.client.subscriptions.cancel(input.subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n}\n\n// Auto-register\nregisterIntegration('stripe', StripeIntegration);\n","import { google, youtube_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * YouTube Data API integration\n */\nexport class YouTubeIntegration extends BaseIntegration {\n private client: youtube_v3.Youtube;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.YOUTUBE_API_KEY;\n if (!apiKey) {\n throw new Error('YOUTUBE_API_KEY not configured');\n }\n\n this.client = google.youtube({\n version: 'v3',\n auth: apiKey,\n });\n\n this.logger.info('YouTube integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getVideo':\n data = await this.executeWithRetry(() => this.getVideo(params));\n break;\n case 'getChannel':\n data = await this.executeWithRetry(() => this.getChannel(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams) {\n const { query, maxResults, type } = params;\n\n this.logger.debug('Searching YouTube', { query: String(query ?? ''), maxResults: Number(maxResults ?? 10), type: String(type ?? '') });\n\n const response = await this.client.search.list({\n part: ['snippet'],\n q: query as string,\n maxResults: (maxResults as number) || 10,\n type: type ? [type as string] : undefined,\n });\n\n return response.data.items?.map((item) => ({\n videoId: item.id?.videoId,\n title: item.snippet?.title,\n thumbnail: item.snippet?.thumbnails?.default?.url,\n description: item.snippet?.description,\n }));\n }\n\n private async getVideo(params: IntegrationParams) {\n const { videoId } = params;\n\n this.logger.debug('Getting video details', { videoId: String(videoId ?? '') });\n\n const response = await this.client.videos.list({\n part: ['snippet', 'statistics'],\n id: [videoId as string],\n });\n\n const video = response.data.items?.[0];\n if (!video) {\n throw new Error(`Video not found: ${videoId}`);\n }\n\n return {\n title: video.snippet?.title,\n description: video.snippet?.description,\n viewCount: video.statistics?.viewCount,\n likeCount: video.statistics?.likeCount,\n };\n }\n\n private async getChannel(params: IntegrationParams) {\n const { channelId } = params;\n\n this.logger.debug('Getting channel details', { channelId: String(channelId ?? '') });\n\n const response = await this.client.channels.list({\n part: ['snippet', 'statistics'],\n id: [channelId as string],\n });\n\n const channel = response.data.items?.[0];\n if (!channel) {\n throw new Error(`Channel not found: ${channelId}`);\n }\n\n return {\n name: channel.snippet?.title,\n description: channel.snippet?.description,\n subscriberCount: channel.statistics?.subscriberCount,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('youtube', YouTubeIntegration);\n","import twilio from 'twilio';\nimport type { Twilio } from 'twilio';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Twilio messaging integration\n */\nexport class TwilioIntegration extends BaseIntegration {\n private client: Twilio;\n private phoneNumber: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const accountSid = config.env.TWILIO_ACCOUNT_SID;\n const authToken = config.env.TWILIO_AUTH_TOKEN;\n this.phoneNumber = config.env.TWILIO_PHONE_NUMBER || '';\n\n if (!accountSid || !authToken) {\n throw new Error('TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN not configured');\n }\n\n this.client = twilio(accountSid, authToken);\n\n this.logger.info('Twilio integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendSMS':\n data = await this.executeWithRetry(() => this.sendSMS(params));\n break;\n case 'sendWhatsApp':\n data = await this.executeWithRetry(() => this.sendWhatsApp(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async sendSMS(params: IntegrationParams) {\n const { to, body, from } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: (from as string) || this.phoneNumber,\n to: to as string,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n\n private async sendWhatsApp(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending WhatsApp message', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: `whatsapp:${this.phoneNumber}`,\n to: `whatsapp:${to}`,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('twilio', TwilioIntegration);\n","import sgMail from '@sendgrid/mail';\nimport { Resend } from 'resend';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ntype EmailProvider = 'sendgrid' | 'resend';\n\n/**\n * Email integration (SendGrid/Resend)\n */\nexport class EmailIntegration extends BaseIntegration {\n private provider: EmailProvider;\n private fromEmail: string;\n private resendClient?: Resend;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.provider = (config.env.PROVIDER as EmailProvider) || 'sendgrid';\n this.fromEmail = config.env.FROM_EMAIL || 'noreply@example.com';\n\n if (this.provider === 'sendgrid') {\n const apiKey = config.env.SENDGRID_API_KEY;\n if (!apiKey) {\n throw new Error('SENDGRID_API_KEY not configured');\n }\n sgMail.setApiKey(apiKey);\n } else if (this.provider === 'resend') {\n const apiKey = config.env.RESEND_API_KEY;\n if (!apiKey) {\n throw new Error('RESEND_API_KEY not configured');\n }\n this.resendClient = new Resend(apiKey);\n }\n\n this.logger.info(`Email integration initialized (${this.provider})`);\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { to, subject, body, from, htmlBody, replyTo, templateId } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n const message: SendMessage = {\n to: to as string,\n subject: subject as string,\n body: body as string,\n from: (from as string) || this.fromEmail,\n htmlBody: (htmlBody as string) || undefined,\n replyTo: (replyTo as string) || undefined,\n templateId: (templateId as string) || undefined,\n };\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(message);\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(message);\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(message: SendMessage) {\n const msg = {\n to: message.to,\n from: message.from,\n subject: message.subject,\n // htmlBody present → it carries the HTML and body becomes the\n // plain-text alternative; absent → body renders as HTML (legacy).\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n ...(message.templateId ? { templateId: message.templateId } : {}),\n };\n\n const response = await sgMail.send(msg);\n\n return {\n id: response[0].headers['x-message-id'],\n status: 'sent',\n };\n }\n\n private async sendViaResend(message: SendMessage) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n if (message.templateId) {\n // Resend's send API has no template reference — silently ignoring the\n // author's template intent would be a dropped feature.\n throw new Error('templateId is not supported by the resend provider — use sendgrid or drop templateId');\n }\n\n const response = await this.resendClient.emails.send({\n from: message.from,\n to: message.to,\n subject: message.subject,\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\ninterface SendMessage {\n to: string;\n subject: string;\n body: string;\n from: string;\n htmlBody?: string;\n replyTo?: string;\n templateId?: string;\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { createHmac } from 'node:crypto';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Outbound webhook integration — signed HTTP POST notifications to external endpoints.\n */\nexport class WebhookIntegration extends BaseIntegration {\n private signingSecret: string;\n private timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.signingSecret = config.env.WEBHOOK_SIGNING_SECRET || '';\n this.timeoutMs = Number(config.env.WEBHOOK_TIMEOUT_MS) || 10000;\n\n this.logger.info('Webhook integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { url, event, payload, secret } = params;\n\n const body = JSON.stringify({\n event: event as string,\n payload: payload ?? {},\n timestamp: new Date().toISOString(),\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Almadar-Event': event as string,\n };\n\n const signingSecret = (secret as string) || this.signingSecret;\n if (signingSecret) {\n headers['X-Almadar-Signature'] =\n 'sha256=' + createHmac('sha256', signingSecret).update(body).digest('hex');\n }\n\n this.logger.debug('Sending webhook', { url: String(url), event: String(event) });\n\n const startTime = Date.now();\n const response = await fetch(url as string, {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n\n // 5xx should retry via executeWithRetry; 4xx is a caller error and must not.\n if (response.status >= 500) {\n throw new Error(`Webhook endpoint returned ${response.status}`);\n }\n\n return {\n status: response.status,\n ok: response.ok,\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('webhook', WebhookIntegration);\n","import webpush from 'web-push';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ninterface PushSubscriptionParam {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toSubscription(value: IntegrationParamValue | undefined): PushSubscriptionParam {\n if (isParamRecord(value)) {\n const { endpoint, keys } = value;\n if (typeof endpoint === 'string' && isParamRecord(keys)) {\n const { p256dh, auth } = keys;\n if (typeof p256dh === 'string' && typeof auth === 'string') {\n return { endpoint, keys: { p256dh, auth } };\n }\n }\n }\n throw new Error('push.send: subscription must be { endpoint, keys: { p256dh, auth } }');\n}\n\n/**\n * Web Push integration — VAPID-signed push notifications to browser\n * PushSubscription endpoints. VAPID details are passed per call (never via the\n * web-push module singleton) so concurrent configs cannot contaminate each other.\n */\nexport class PushIntegration extends BaseIntegration {\n private vapidPublicKey: string;\n private vapidPrivateKey: string;\n private vapidSubject: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.vapidPublicKey = config.env.VAPID_PUBLIC_KEY || '';\n this.vapidPrivateKey = config.env.VAPID_PRIVATE_KEY || '';\n this.vapidSubject = config.env.VAPID_SUBJECT || '';\n\n this.logger.info('Push integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { subscription, title, body, url, icon } = params;\n const sub = toSubscription(subscription);\n\n const payload = JSON.stringify({\n title: title as string,\n body: body as string,\n url: (url as string) || undefined,\n icon: (icon as string) || undefined,\n });\n\n this.logger.debug('Sending push notification', { endpoint: sub.endpoint });\n\n try {\n const response = await webpush.sendNotification(sub, payload, {\n vapidDetails: {\n subject: this.vapidSubject,\n publicKey: this.vapidPublicKey,\n privateKey: this.vapidPrivateKey,\n },\n });\n return { statusCode: response.statusCode, ok: true, expired: false };\n } catch (error) {\n if (error instanceof webpush.WebPushError) {\n // 5xx retries via executeWithRetry; 404/410 means the subscription is\n // gone — the caller must prune the stored row, never retry.\n if (error.statusCode >= 500) {\n throw new Error(`Push endpoint returned ${error.statusCode}`);\n }\n return {\n statusCode: error.statusCode,\n ok: false,\n expired: error.statusCode === 404 || error.statusCode === 410,\n };\n }\n throw error;\n }\n }\n}\n\n// Auto-register\nregisterIntegration('push', PushIntegration);\n","export { parseCalendarPushNotification, googleCalendarHookProvider } from './webhooks';\nexport type { CalendarHookEvent } from './webhooks';\n\nimport { google, calendar_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Google Calendar integration — service account auth, optionally acting as a\n * Workspace user via domain-wide delegation (GOOGLE_CALENDAR_SUBJECT). All\n * event times are ISO strings on the wire; a 10-char value (YYYY-MM-DD) maps\n * to an all-day `date`, anything longer to `dateTime`.\n */\nexport class CalendarIntegration extends BaseIntegration {\n private client: calendar_v3.Calendar;\n private defaultCalendarId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_CALENDAR_SA_KEY;\n if (!rawKey) {\n throw new Error('GOOGLE_CALENDAR_SA_KEY not configured');\n }\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n\n const subject = config.env.GOOGLE_CALENDAR_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/calendar'],\n subject,\n });\n\n this.client = google.calendar({ version: 'v3', auth });\n this.defaultCalendarId = config.env.GOOGLE_CALENDAR_ID || 'primary';\n\n this.logger.info('Calendar integration initialized', {\n delegated: Boolean(subject),\n });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listEvents':\n data = await this.executeWithRetry(() => this.listEvents(params));\n break;\n case 'createEvent':\n data = await this.executeWithRetry(() => this.createEvent(params));\n break;\n case 'updateEvent':\n data = await this.executeWithRetry(() => this.updateEvent(params));\n break;\n case 'deleteEvent':\n data = await this.executeWithRetry(() => this.deleteEvent(params));\n break;\n case 'freeBusy':\n data = await this.executeWithRetry(() => this.freeBusy(params));\n break;\n case 'watch':\n data = await this.executeWithRetry(() => this.watch(params));\n break;\n case 'stopWatch':\n data = await this.executeWithRetry(() => this.stopWatch(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private calendarId(params: IntegrationParams): string {\n return (params.calendarId as string) || this.defaultCalendarId;\n }\n\n private toEventTime(value: string): calendar_v3.Schema$EventDateTime {\n return value.length === 10 ? { date: value } : { dateTime: value };\n }\n\n private fromEventTime(time: calendar_v3.Schema$EventDateTime | undefined): string {\n return time?.dateTime ?? time?.date ?? '';\n }\n\n private async listEvents(params: IntegrationParams) {\n const { timeMin, timeMax, syncToken, maxResults } = params;\n const response = await this.client.events.list({\n calendarId: this.calendarId(params),\n // Incremental sync: a syncToken supersedes the window params (the API\n // rejects combining them).\n ...(syncToken\n ? { syncToken: syncToken as string }\n : {\n timeMin: (timeMin as string) || undefined,\n timeMax: (timeMax as string) || undefined,\n singleEvents: true,\n orderBy: 'startTime' as const,\n }),\n maxResults: (maxResults as number) || 250,\n });\n const items = response.data.items ?? [];\n return {\n events: items.map((event) => ({\n id: event.id ?? '',\n summary: event.summary ?? '',\n description: event.description ?? '',\n location: event.location ?? '',\n start: this.fromEventTime(event.start ?? undefined),\n end: this.fromEventTime(event.end ?? undefined),\n status: event.status ?? '',\n updated: event.updated ?? '',\n })),\n nextSyncToken: response.data.nextSyncToken ?? null,\n };\n }\n\n private resolveEnd(start: string, end: string | undefined, durationMinutes: number | undefined): string {\n if (end) return end;\n if (start.length === 10) {\n // All-day start with no end → the exclusive-end convention: next day.\n const next = new Date(Date.parse(start) + 24 * 60 * 60_000);\n return next.toISOString().slice(0, 10);\n }\n if (durationMinutes && durationMinutes > 0) {\n return new Date(Date.parse(start) + durationMinutes * 60_000).toISOString();\n }\n throw new Error('createEvent requires `end` or a positive `durationMinutes`');\n }\n\n private async createEvent(params: IntegrationParams) {\n const { summary, description, location, start, end, durationMinutes } = params;\n const response = await this.client.events.insert({\n calendarId: this.calendarId(params),\n requestBody: {\n summary: summary as string,\n description: (description as string) || undefined,\n location: (location as string) || undefined,\n start: this.toEventTime(start as string),\n end: this.toEventTime(\n this.resolveEnd(start as string, (end as string) || undefined, (durationMinutes as number) || undefined),\n ),\n },\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n htmlLink: response.data.htmlLink ?? '',\n };\n }\n\n private async updateEvent(params: IntegrationParams) {\n const { eventId, summary, description, location, start, end } = params;\n const requestBody: calendar_v3.Schema$Event = {};\n if (typeof summary === 'string') requestBody.summary = summary;\n if (typeof description === 'string') requestBody.description = description;\n if (typeof location === 'string') requestBody.location = location;\n if (typeof start === 'string' && start) requestBody.start = this.toEventTime(start);\n if (typeof end === 'string' && end) requestBody.end = this.toEventTime(end);\n const response = await this.client.events.patch({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n requestBody,\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n };\n }\n\n private async deleteEvent(params: IntegrationParams) {\n const { eventId } = params;\n await this.client.events.delete({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n });\n return { id: eventId as string, deleted: true };\n }\n\n private async freeBusy(params: IntegrationParams) {\n const { timeMin, timeMax } = params;\n const id = this.calendarId(params);\n const response = await this.client.freebusy.query({\n requestBody: {\n timeMin: timeMin as string,\n timeMax: timeMax as string,\n items: [{ id }],\n },\n });\n const busy = response.data.calendars?.[id]?.busy ?? [];\n return {\n busy: busy.map((slot) => ({ start: slot.start ?? '', end: slot.end ?? '' })),\n };\n }\n\n private async watch(params: IntegrationParams) {\n const { channelId, address, ttlSeconds } = params;\n const response = await this.client.events.watch({\n calendarId: this.calendarId(params),\n requestBody: {\n id: channelId as string,\n type: 'web_hook',\n address: address as string,\n params: ttlSeconds ? { ttl: String(ttlSeconds) } : undefined,\n },\n });\n return {\n channelId: response.data.id ?? (channelId as string),\n resourceId: response.data.resourceId ?? '',\n expiration: response.data.expiration ?? '',\n };\n }\n\n private async stopWatch(params: IntegrationParams) {\n const { channelId, resourceId } = params;\n await this.client.channels.stop({\n requestBody: {\n id: channelId as string,\n resourceId: resourceId as string,\n },\n });\n return { stopped: true };\n }\n}\n\n// Auto-register\nregisterIntegration('calendar', CalendarIntegration);\n","import { Readable } from 'node:stream';\nimport { google, drive_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Google Drive integration — dual auth:\n * - **Service account** (GOOGLE_DRIVE_SA_KEY, optional GOOGLE_DRIVE_SUBJECT\n * delegation) serves reads (list/get/share).\n * - **User OAuth** (GOOGLE_DRIVE_REFRESH_TOKEN + the app's OAUTH_CLIENT_ID/\n * SECRET, obtained once via `scripts/drive-consent.mjs`) serves\n * WRITES (`uploadFile`/`createFolder`) when present — Google enforces zero\n * SA storage quota on personal accounts, so SA writes into a shared My\n * Drive folder are impossible; the user client also covers reads when no\n * SA key is configured. `GOOGLE_DRIVE_FOLDER_ID` is the default upload\n * parent. File content crosses this boundary as base64 (data URL accepted\n * on upload).\n */\nexport class DriveIntegration extends BaseIntegration {\n private readonly saClient: drive_v3.Drive | null;\n private readonly userClient: drive_v3.Drive | null;\n private readonly defaultFolderId: string | undefined;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_DRIVE_SA_KEY;\n if (rawKey) {\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n const subject = config.env.GOOGLE_DRIVE_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/drive'],\n subject,\n });\n this.saClient = google.drive({ version: 'v3', auth });\n } else {\n this.saClient = null;\n }\n\n const refreshToken = config.env.GOOGLE_DRIVE_REFRESH_TOKEN;\n const clientId = config.env.OAUTH_CLIENT_ID;\n const clientSecret = config.env.OAUTH_CLIENT_SECRET;\n if (refreshToken && clientId && clientSecret) {\n const oauth2 = new google.auth.OAuth2(clientId, clientSecret);\n oauth2.setCredentials({ refresh_token: refreshToken });\n this.userClient = google.drive({ version: 'v3', auth: oauth2 });\n } else {\n this.userClient = null;\n }\n\n if (!this.saClient && !this.userClient) {\n throw new Error(\n 'Drive not configured — set GOOGLE_DRIVE_SA_KEY (reads) and/or GOOGLE_DRIVE_REFRESH_TOKEN + OAUTH_CLIENT_ID/SECRET (writes)',\n );\n }\n\n this.defaultFolderId = config.env.GOOGLE_DRIVE_FOLDER_ID || undefined;\n\n this.logger.info('Drive integration initialized', {\n serviceAccount: this.saClient !== null,\n userToken: this.userClient !== null,\n delegated: Boolean(config.env.GOOGLE_DRIVE_SUBJECT),\n });\n }\n\n /** Reads prefer the SA client (delegation-aware); user client covers its absence. */\n private readClient(): drive_v3.Drive {\n const client = this.saClient ?? this.userClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n /** Writes REQUIRE the user client on personal accounts (SA has no storage quota); SA only as a Workspace fallback. */\n private writeClient(): drive_v3.Drive {\n const client = this.userClient ?? this.saClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listFiles':\n data = await this.executeWithRetry(() => this.listFiles(params));\n break;\n case 'getFile':\n data = await this.executeWithRetry(() => this.getFile(params));\n break;\n case 'uploadFile':\n data = await this.executeWithRetry(() => this.uploadFile(params));\n break;\n case 'createFolder':\n data = await this.executeWithRetry(() => this.createFolder(params));\n break;\n case 'shareFile':\n data = await this.executeWithRetry(() => this.shareFile(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async listFiles(params: IntegrationParams) {\n const { folderId, query, maxResults } = params;\n const clauses = ['trashed = false'];\n if (folderId) clauses.push(`'${String(folderId).replace(/'/g, \"\\\\'\")}' in parents`);\n if (query) clauses.push(String(query));\n const response = await this.readClient().files.list({\n q: clauses.join(' and '),\n pageSize: (maxResults as number) || 100,\n fields: 'files(id, name, mimeType, size, modifiedTime, webViewLink)',\n });\n return {\n files: (response.data.files ?? []).map((file) => ({\n id: file.id ?? '',\n name: file.name ?? '',\n mimeType: file.mimeType ?? '',\n size: Number(file.size ?? 0),\n modifiedTime: file.modifiedTime ?? '',\n webViewLink: file.webViewLink ?? '',\n })),\n };\n }\n\n private async getFile(params: IntegrationParams) {\n const fileId = params.fileId as string;\n const meta = await this.readClient().files.get({\n fileId,\n fields: 'id, name, mimeType, size',\n });\n const content = await this.readClient().files.get(\n { fileId, alt: 'media' },\n { responseType: 'arraybuffer' },\n );\n const bytes = Buffer.from(content.data as ArrayBuffer);\n return {\n id: meta.data.id ?? fileId,\n name: meta.data.name ?? '',\n mimeType: meta.data.mimeType ?? 'application/octet-stream',\n content: bytes.toString('base64'),\n size: bytes.length,\n };\n }\n\n private async uploadFile(params: IntegrationParams) {\n const { name, content, mimeType, folderId } = params;\n const { bytes, contentType } = decodeContent(content as string);\n const parent = (folderId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n parents: parent ? [parent] : undefined,\n },\n media: {\n mimeType: (mimeType as string) || contentType || 'application/octet-stream',\n body: Readable.from(bytes),\n },\n fields: 'id, name, webViewLink',\n });\n return {\n id: response.data.id ?? '',\n name: response.data.name ?? (name as string),\n webViewLink: response.data.webViewLink ?? '',\n };\n }\n\n private async createFolder(params: IntegrationParams) {\n const { name, parentId } = params;\n const parent = (parentId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n mimeType: 'application/vnd.google-apps.folder',\n parents: parent ? [parent] : undefined,\n },\n fields: 'id, name',\n });\n return { id: response.data.id ?? '', name: response.data.name ?? (name as string) };\n }\n\n private async shareFile(params: IntegrationParams) {\n const { fileId, email, role } = params;\n const response = await this.readClient().permissions.create({\n fileId: fileId as string,\n requestBody: {\n type: 'user',\n role: (role as string) || 'reader',\n emailAddress: email as string,\n },\n fields: 'id',\n });\n return { shared: true, permissionId: response.data.id ?? '' };\n }\n}\n\n// Auto-register\nregisterIntegration('drive', DriveIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GRAPH_BASE = 'https://graph.facebook.com/v21.0';\n\n/**\n * Meta Ads integration — Graph API Marketing Insights, READ-ONLY (spend and\n * campaign listings for profitability reporting). No SDK: plain fetch with\n * the webhook integration's 5xx-retries / 4xx-returns split.\n */\nexport class MetaAdsIntegration extends BaseIntegration {\n private accessToken: string;\n private defaultAccountId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.accessToken = config.env.META_ACCESS_TOKEN || '';\n if (!this.accessToken) {\n throw new Error('META_ACCESS_TOKEN not configured');\n }\n this.defaultAccountId = config.env.META_AD_ACCOUNT_ID || '';\n\n this.logger.info('Meta Ads integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'getSpend':\n data = await this.executeWithRetry(() => this.getSpend(params));\n break;\n case 'listCampaigns':\n data = await this.executeWithRetry(() => this.listCampaigns(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private accountId(params: IntegrationParams): string {\n const id = (params.accountId as string) || this.defaultAccountId;\n if (!id) {\n throw new Error('No ad account: pass `accountId` or set META_AD_ACCOUNT_ID');\n }\n return id.startsWith('act_') ? id : `act_${id}`;\n }\n\n private async graphGet(path: string, query: Record<string, string>): Promise<unknown> {\n const url = new URL(`${GRAPH_BASE}/${path}`);\n for (const [key, value] of Object.entries(query)) {\n url.searchParams.set(key, value);\n }\n url.searchParams.set('access_token', this.accessToken);\n const response = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (response.status >= 500) {\n // 5xx retries via executeWithRetry; 4xx is a caller/token error.\n throw new Error(`Meta Graph API returned ${response.status}`);\n }\n const body = (await response.json()) as { error?: { message?: string }; data?: unknown };\n if (!response.ok) {\n throw new Error(`Meta Graph API error: ${body.error?.message ?? response.status}`);\n }\n return body.data ?? body;\n }\n\n private async getSpend(params: IntegrationParams) {\n const { since, until } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/insights`, {\n fields: 'spend,impressions,clicks,account_currency',\n time_range: JSON.stringify({ since: since as string, until: until as string }),\n level: 'account',\n })) as Array<{ spend?: string; impressions?: string; clicks?: string; account_currency?: string }>;\n const row = Array.isArray(rows) ? rows[0] : undefined;\n return {\n spend: Number(row?.spend ?? 0),\n currency: row?.account_currency ?? '',\n impressions: Number(row?.impressions ?? 0),\n clicks: Number(row?.clicks ?? 0),\n };\n }\n\n private async listCampaigns(params: IntegrationParams) {\n const { status } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/campaigns`, {\n fields: 'id,name,status,daily_budget',\n ...(status ? { effective_status: JSON.stringify([status]) } : {}),\n })) as Array<{ id?: string; name?: string; status?: string; daily_budget?: string }>;\n return {\n campaigns: (Array.isArray(rows) ? rows : []).map((row) => ({\n id: row.id ?? '',\n name: row.name ?? '',\n status: row.status ?? '',\n // Meta reports budgets in minor units (cents).\n dailyBudget: Number(row.daily_budget ?? 0) / 100,\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('metaAds', MetaAdsIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Accounting export integration — the generic half of \"export to accounting\n * software\": shapes invoice / journal rows into import-ready CSV without\n * committing to a vendor. A `provider` field is reserved on the config for\n * direct DATEV/Xero/QuickBooks connectors later; the CSV column sets follow\n * the common import templates those systems accept.\n */\nexport class AccountingIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Accounting integration initialized (generic CSV export)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'exportInvoices':\n data = this.exportRows(params.invoices, INVOICE_COLUMNS, 'invoices');\n break;\n case 'exportJournal':\n data = this.exportRows(params.entries, JOURNAL_COLUMNS, 'journal');\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private exportRows(\n rowsValue: IntegrationParamValue | undefined,\n columns: readonly string[],\n kind: string,\n ): { content: string; filename: string; count: number } {\n if (!Array.isArray(rowsValue)) {\n throw new Error(`${kind} export requires an array of rows`);\n }\n const lines = [columns.join(',')];\n for (const row of rowsValue) {\n if (row === null || typeof row !== 'object' || Array.isArray(row) || row instanceof Date) {\n throw new Error(`${kind} export: every row must be an object`);\n }\n const record = row as { readonly [key: string]: IntegrationParamValue };\n lines.push(columns.map((column) => csvCell(record[column])).join(','));\n }\n const stamp = new Date().toISOString().slice(0, 10);\n return {\n content: lines.join('\\r\\n') + '\\r\\n',\n filename: `${kind}-export-${stamp}.csv`,\n count: rowsValue.length,\n };\n }\n}\n\nconst INVOICE_COLUMNS = ['id', 'number', 'customer', 'issuedAt', 'dueAt', 'currency', 'net', 'tax', 'gross', 'status'] as const;\nconst JOURNAL_COLUMNS = ['date', 'account', 'description', 'debit', 'credit', 'reference'] as const;\n\nfunction csvCell(value: IntegrationParamValue | undefined): string {\n if (value === undefined || value === null) return '';\n const raw = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\r\\n]/.test(raw) ? `\"${raw.replace(/\"/g, '\"\"')}\"` : raw;\n}\n\n// Auto-register\nregisterIntegration('accounting', AccountingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GC_BASE = 'https://bankaccountdata.gocardless.com/api/v2';\n\n/**\n * Banking integration — GoCardless Bank Account Data (read-only requisition →\n * accounts → transactions flow feeding reconciliation). Access tokens are\n * minted per instance from the secret pair and refreshed on expiry.\n */\nexport class BankingIntegration extends BaseIntegration {\n private secretId: string;\n private secretKey: string;\n private accessToken: string | null = null;\n private accessTokenExpiresAt = 0;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.secretId = config.env.GOCARDLESS_SECRET_ID || '';\n this.secretKey = config.env.GOCARDLESS_SECRET_KEY || '';\n if (!this.secretId || !this.secretKey) {\n throw new Error('GOCARDLESS_SECRET_ID / GOCARDLESS_SECRET_KEY not configured');\n }\n\n this.logger.info('Banking integration initialized (GoCardless Bank Account Data)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createRequisition':\n data = await this.executeWithRetry(() => this.createRequisition(params));\n break;\n case 'listAccounts':\n data = await this.executeWithRetry(() => this.listAccounts(params));\n break;\n case 'listTransactions':\n data = await this.executeWithRetry(() => this.listTransactions(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async token(): Promise<string> {\n if (this.accessToken && Date.now() < this.accessTokenExpiresAt - 60_000) {\n return this.accessToken;\n }\n const response = await fetch(`${GC_BASE}/token/new/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ secret_id: this.secretId, secret_key: this.secretKey }),\n signal: AbortSignal.timeout(15000),\n });\n if (!response.ok) {\n throw new Error(`GoCardless token request failed: ${response.status}`);\n }\n const body = (await response.json()) as { access: string; access_expires: number };\n this.accessToken = body.access;\n this.accessTokenExpiresAt = Date.now() + body.access_expires * 1000;\n return this.accessToken;\n }\n\n private async gcRequest(path: string, init?: { method?: string; body?: unknown }): Promise<unknown> {\n const response = await fetch(`${GC_BASE}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${await this.token()}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(20000),\n });\n if (response.status >= 500) {\n throw new Error(`GoCardless returned ${response.status}`);\n }\n const body: unknown = await response.json();\n if (!response.ok) {\n throw new Error(`GoCardless error ${response.status}: ${JSON.stringify(body).slice(0, 300)}`);\n }\n return body;\n }\n\n private async createRequisition(params: IntegrationParams) {\n const { institutionId, redirectUrl, reference } = params;\n const body = (await this.gcRequest('/requisitions/', {\n method: 'POST',\n body: {\n institution_id: institutionId as string,\n redirect: redirectUrl as string,\n reference: (reference as string) || undefined,\n },\n })) as { id?: string; link?: string };\n return { requisitionId: body.id ?? '', link: body.link ?? '' };\n }\n\n private async listAccounts(params: IntegrationParams) {\n const { requisitionId } = params;\n const body = (await this.gcRequest(`/requisitions/${requisitionId as string}/`)) as { accounts?: string[] };\n return { accounts: body.accounts ?? [] };\n }\n\n private async listTransactions(params: IntegrationParams) {\n const { accountId, dateFrom, dateTo } = params;\n const query = new URLSearchParams();\n if (dateFrom) query.set('date_from', dateFrom as string);\n if (dateTo) query.set('date_to', dateTo as string);\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n const body = (await this.gcRequest(`/accounts/${accountId as string}/transactions/${suffix}`)) as {\n transactions?: {\n booked?: Array<{\n transactionId?: string;\n internalTransactionId?: string;\n transactionAmount?: { amount?: string; currency?: string };\n bookingDate?: string;\n remittanceInformationUnstructured?: string;\n creditorName?: string;\n debtorName?: string;\n }>;\n };\n };\n return {\n transactions: (body.transactions?.booked ?? []).map((tx) => ({\n id: tx.transactionId ?? tx.internalTransactionId ?? '',\n amount: Number(tx.transactionAmount?.amount ?? 0),\n currency: tx.transactionAmount?.currency ?? '',\n date: tx.bookingDate ?? '',\n description: tx.remittanceInformationUnstructured ?? '',\n counterparty: tx.creditorName ?? tx.debtorName ?? '',\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('banking', BankingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * E-signature integration — DocuSign eSignature REST first, deliberately\n * provider-pluggable: the action surface (sendEnvelope / getEnvelopeStatus /\n * downloadDocument) is vendor-neutral and every DocuSign shape stays inside\n * this module. `DOCUSIGN_BASE_URL` carries the account-scoped REST base;\n * `DOCUSIGN_ACCESS_TOKEN` the OAuth token (JWT-grant rotation is the\n * deployment's concern — the token is read per call so a rotated env value\n * takes effect without restart).\n */\nexport class EsignIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n\n if (!config.env.DOCUSIGN_BASE_URL || !config.env.DOCUSIGN_ACCESS_TOKEN) {\n throw new Error('DOCUSIGN_BASE_URL / DOCUSIGN_ACCESS_TOKEN not configured');\n }\n\n this.logger.info('E-sign integration initialized (DocuSign)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendEnvelope':\n data = await this.executeWithRetry(() => this.sendEnvelope(params));\n break;\n case 'getEnvelopeStatus':\n data = await this.executeWithRetry(() => this.getEnvelopeStatus(params));\n break;\n case 'downloadDocument':\n data = await this.executeWithRetry(() => this.downloadDocument(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async dsRequest(\n path: string,\n init?: { method?: string; body?: unknown; raw?: boolean },\n ): Promise<unknown> {\n const base = this.config.env.DOCUSIGN_BASE_URL.replace(/\\/$/, '');\n const response = await fetch(`${base}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: init?.raw ? 'application/pdf' : 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.env.DOCUSIGN_ACCESS_TOKEN}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(30000),\n });\n if (response.status >= 500) {\n throw new Error(`DocuSign returned ${response.status}`);\n }\n if (!response.ok) {\n const detail = await response.text();\n throw new Error(`DocuSign error ${response.status}: ${detail.slice(0, 300)}`);\n }\n if (init?.raw) {\n return Buffer.from(await response.arrayBuffer());\n }\n return response.json();\n }\n\n private async sendEnvelope(params: IntegrationParams) {\n const { recipientEmail, recipientName, documentName, documentContent, emailSubject } = params;\n const rawContent = documentContent as string;\n // Accept a data URL or raw base64.\n const base64 = rawContent.startsWith('data:') ? rawContent.slice(rawContent.indexOf(',') + 1) : rawContent;\n const body = (await this.dsRequest('/envelopes', {\n method: 'POST',\n body: {\n emailSubject: (emailSubject as string) || `Please sign: ${documentName as string}`,\n status: 'sent',\n documents: [\n {\n documentBase64: base64,\n name: documentName as string,\n fileExtension: String(documentName).split('.').pop() || 'pdf',\n documentId: '1',\n },\n ],\n recipients: {\n signers: [\n {\n email: recipientEmail as string,\n name: recipientName as string,\n recipientId: '1',\n routingOrder: '1',\n },\n ],\n },\n },\n })) as { envelopeId?: string; status?: string };\n return { envelopeId: body.envelopeId ?? '', status: body.status ?? 'sent' };\n }\n\n private async getEnvelopeStatus(params: IntegrationParams) {\n const { envelopeId } = params;\n const body = (await this.dsRequest(`/envelopes/${envelopeId as string}`)) as {\n status?: string;\n completedDateTime?: string;\n };\n return { status: body.status ?? '', completedAt: body.completedDateTime ?? '' };\n }\n\n private async downloadDocument(params: IntegrationParams) {\n const { envelopeId } = params;\n const bytes = (await this.dsRequest(`/envelopes/${envelopeId as string}/documents/combined`, {\n raw: true,\n })) as Buffer;\n return { content: bytes.toString('base64'), documentName: `envelope-${envelopeId as string}.pdf` };\n }\n}\n\n// Auto-register\nregisterIntegration('esign', EsignIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n EmbeddingClient,\n getAvailableProvider,\n type LLMCallOptions,\n type LLMProvider,\n} from '@almadar/llm';\nimport { z } from 'zod';\n\n/**\n * LLM integration using @almadar/llm\n *\n * Provides 5 actions:\n * - generate: Generate text content from a prompt\n * - classify: Classify text into predefined categories\n * - extract: Extract structured data from text using a schema\n * - summarize: Summarize long text content\n * - embed: Generate embeddings for an array of texts\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private embeddings: EmbeddingClient | null = null;\n private provider: LLMProvider;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n // Determine provider from config or auto-detect from available API keys\n const configuredProvider = config.env.PROVIDER as LLMProvider | undefined;\n this.provider = configuredProvider || getAvailableProvider() || 'anthropic';\n\n this.logger.info(`LLM integration initialized (provider: ${this.provider})`);\n }\n\n /**\n * Lazily create client — avoids throwing on construction if API key is missing.\n * The client will throw a clear error when actually used without a key.\n */\n private getClient(): LLMClient {\n if (!this.client) {\n this.client = new LLMClient({\n provider: this.provider,\n temperature: 0.7,\n trackTokens: true,\n });\n }\n return this.client;\n }\n\n /**\n * Lazily create the embeddings client. Embeddings route through a dedicated\n * embedding model (default OpenRouter `baai/bge-base-en-v1.5`, matching\n * `@almadar/curation-core`), independent of the chat provider/key, because\n * most chat providers do not expose an embeddings endpoint. Override via\n * `EMBEDDING_PROVIDER` / `EMBEDDING_MODEL` / `EMBEDDING_API_KEY`.\n */\n private getEmbeddings(): EmbeddingClient {\n if (!this.embeddings) {\n this.embeddings = new EmbeddingClient({\n provider: (this.config.env.EMBEDDING_PROVIDER as 'openai' | 'openrouter') ?? 'openrouter',\n model: this.config.env.EMBEDDING_MODEL ?? 'baai/bge-base-en-v1.5',\n apiKey: this.config.env.EMBEDDING_API_KEY,\n });\n }\n return this.embeddings;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'generate':\n data = await this.executeWithRetry(() => this.generate(params));\n break;\n case 'classify':\n data = await this.executeWithRetry(() => this.classify(params));\n break;\n case 'extract':\n data = await this.executeWithRetry(() => this.extract(params));\n break;\n case 'summarize':\n data = await this.executeWithRetry(() => this.summarize(params));\n break;\n case 'embed':\n data = await this.executeWithRetry(() => this.embed(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async generate(params: IntegrationParams) {\n const {\n systemPrompt,\n userPrompt,\n model,\n temperature,\n maxTokens,\n } = params as {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n\n this.logger.debug('Generating content', { model, temperature });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: temperature ?? 0.7 })\n : this.getClient();\n\n const response = await client.callWithMetadata<string>({\n systemPrompt: systemPrompt || 'You are a helpful assistant.',\n userPrompt,\n maxTokens: maxTokens ?? 1024,\n temperature,\n skipSchemaValidation: true,\n });\n\n return {\n content: response.data,\n usage: response.usage\n ? {\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n totalTokens: response.usage.totalTokens,\n }\n : { tokens: 0 },\n };\n }\n\n private async classify(params: IntegrationParams) {\n const { text, categories, model } = params as {\n text: string;\n categories: string[];\n model?: string;\n };\n\n this.logger.debug('Classifying text', { categories: categories.join(', ') });\n\n const ClassificationSchema = z.object({\n category: z.enum(categories as [string, ...string[]]),\n confidence: z.number().min(0).max(1),\n reasoning: z.string(),\n });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.1 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text classifier. Classify the given text into one of these categories: ${categories.join(', ')}. Return JSON with: category, confidence (0-1), and reasoning.`,\n userPrompt: text,\n schema: ClassificationSchema,\n temperature: 0.1,\n });\n\n return result;\n }\n\n private async extract(params: IntegrationParams) {\n const { text, schema, model } = params as {\n text: string;\n schema: IntegrationParams;\n model?: string;\n };\n\n this.logger.debug('Extracting structured data', { schema: String(schema ?? '') });\n\n // Build a Zod schema from the JSON schema description.\n // For complex schemas, we use z.record to accept any shape and let the LLM\n // follow the schema description in the prompt.\n const ExtractSchema = z.record(z.unknown());\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.2 })\n : this.getClient();\n\n const schemaDescription = JSON.stringify(schema, null, 2);\n\n const result = await client.call({\n systemPrompt: `You are a structured data extractor. Extract data from the given text according to this schema:\\n\\n${schemaDescription}\\n\\nReturn ONLY valid JSON matching the schema.`,\n userPrompt: text,\n schema: ExtractSchema,\n temperature: 0.2,\n skipSchemaValidation: true,\n });\n\n return result;\n }\n\n private async summarize(params: IntegrationParams) {\n const { text, maxLength, style, model } = params as {\n text: string;\n maxLength?: number;\n style?: string;\n model?: string;\n };\n\n this.logger.debug('Summarizing text', { maxLength, style });\n\n const SummarySchema = z.object({\n summary: z.string(),\n keyPoints: z.array(z.string()),\n });\n\n const styleInstructions = style === 'bullet'\n ? 'Use bullet points.'\n : style === 'detailed'\n ? 'Be thorough and detailed.'\n : 'Be concise.';\n\n const lengthInstructions = maxLength\n ? `Keep the summary under ${maxLength} words.`\n : '';\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.3 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text summarizer. ${styleInstructions} ${lengthInstructions} Return JSON with: summary (string) and keyPoints (array of strings).`,\n userPrompt: text,\n schema: SummarySchema,\n temperature: 0.3,\n });\n\n return result;\n }\n\n private async embed(params: IntegrationParams) {\n const { texts } = params as { texts: string[] };\n\n if (!Array.isArray(texts)) {\n throw new Error('llm.embed: `texts` must be an array of strings');\n }\n\n this.logger.debug('Embedding texts', { count: texts.length });\n\n const batch = await this.getEmbeddings().embedBatch(texts);\n return { embeddings: batch.embeddings };\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport { IntegrationError } from '../../types';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type { ServiceParams, ServiceParamsValue } from '@almadar/core';\n\n/**\n * ML integration — model inference via a deployed serving orbital.\n *\n * The serving orbital is a separate compiled app (Python/PyTorch) with no\n * dedicated inference route; it is reached through the generic per-trait\n * event endpoint every compiled Almadar app exposes: `POST\n * /api/<kebab-trait>/events`. This integration posts an `INFER` event and\n * reads the prediction back out of the returned `effectResults` — the\n * `emit` effect result whose `data.event` matches `INFERRED_EVENT`.\n *\n * Provides 1 action:\n * - infer: Run inference against a deployed model checkpoint\n */\n\n/** Success/failure event names the serving orbital's `INFER` transition emits — mirrors `std-ml-infer`'s own emit vocabulary. */\nconst INFERRED_EVENT = 'INFERRED';\nconst INFER_FAILED_EVENT = 'INFER_FAILED';\n\nconst DEFAULT_TIMEOUT_MS = 60_000; // masar scales to zero — cold starts run long.\n\ninterface MLEffectResult {\n effect: string;\n action?: string;\n entityType?: string;\n data?: ServiceParamsValue;\n success: boolean;\n error?: string;\n}\n\ninterface MLEventsResponse {\n success: boolean;\n newState?: string;\n data?: Record<string, ServiceParamsValue>;\n effectResults?: MLEffectResult[];\n error?: string;\n}\n\ninterface InferResult {\n output: ServiceParamsValue;\n confidence: number;\n violations: readonly ServiceParamsValue[];\n}\n\nfunction isServiceParams(value: ServiceParamsValue | undefined): value is ServiceParams {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/**\n * Find the `INFERRED` emit result in the serving orbital's `effectResults`\n * and pull `{ output, confidence, violations }` out of its payload. Returns\n * `null` on any shape mismatch — the caller turns that into a typed failure,\n * never a fabricated result.\n */\nfunction extractInferResult(response: MLEventsResponse): InferResult | null {\n const emitted = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && result.success && isServiceParams(result.data) && result.data.event === INFERRED_EVENT,\n );\n if (!emitted || !isServiceParams(emitted.data)) {\n return null;\n }\n\n const payload = emitted.data.payload;\n if (!isServiceParams(payload)) {\n return null;\n }\n\n if (!('output' in payload) || typeof payload.confidence !== 'number' || !Array.isArray(payload.violations)) {\n return null;\n }\n\n return {\n output: payload.output,\n confidence: payload.confidence,\n violations: payload.violations,\n };\n}\n\nexport class MLIntegration extends BaseIntegration {\n private readonly eventsUrl: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const baseUrl = config.env.MASAR_URL;\n const traitPrefix = config.env.MASAR_ML_TRAIT;\n if (!baseUrl || !traitPrefix) {\n throw new Error(\n 'ML integration requires MASAR_URL (serving orbital host) and MASAR_ML_TRAIT (kebab-case trait name of its /events route) to be configured',\n );\n }\n\n this.eventsUrl = `${baseUrl.replace(/\\/+$/, '')}/api/${traitPrefix}/events`;\n this.timeoutMs = config.env.MASAR_ML_TIMEOUT_MS ? Number(config.env.MASAR_ML_TIMEOUT_MS) : DEFAULT_TIMEOUT_MS;\n\n this.logger.info('ML integration initialized', { eventsUrl: this.eventsUrl });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'infer':\n data = await this.executeWithRetry(() => this.infer(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async infer(params: IntegrationParams): Promise<InferResult> {\n const { model, input } = params as { model: string; input: ServiceParamsValue };\n\n this.logger.debug('Running ML inference', { model });\n\n const response = await this.postEvent(model, input);\n\n if (!response.success) {\n throw new IntegrationError(\n `ML service reported failure: ${response.error ?? 'unknown error'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const failed = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && isServiceParams(result.data) && result.data.event === INFER_FAILED_EVENT,\n );\n if (failed) {\n throw new IntegrationError(\n `ML service could not infer: ${failed.error ?? 'model unavailable'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const inferred = extractInferResult(response);\n if (!inferred) {\n throw new IntegrationError(\n 'ML service response did not include a valid inference result',\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n return inferred;\n }\n\n private async postEvent(model: string, input: ServiceParamsValue): Promise<MLEventsResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let httpResponse: Response;\n try {\n httpResponse = await fetch(this.eventsUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ event: 'INFER', payload: { model, input } }),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new IntegrationError(\n `ML service request timed out after ${this.timeoutMs}ms (model may be cold-starting)`,\n 'TIMEOUT_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n }\n throw new IntegrationError(\n `ML service request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n } finally {\n clearTimeout(timer);\n }\n\n if (!httpResponse.ok) {\n const body = await httpResponse.text().catch(() => '');\n throw new IntegrationError(\n `ML service responded with status ${httpResponse.status}`,\n 'SERVICE_ERROR',\n { model, status: httpResponse.status, body },\n );\n }\n\n try {\n return (await httpResponse.json()) as MLEventsResponse;\n } catch (error) {\n throw new IntegrationError(\n `ML service returned a malformed response body: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { model },\n );\n }\n }\n}\n\n// Auto-register\nregisterIntegration('ml', MLIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * DeepAgent integration for AI code generation\n */\nexport class DeepAgentIntegration extends BaseIntegration {\n private apiUrl: string;\n private apiKey: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.apiUrl = config.env.DEEPAGENT_API_URL || 'http://localhost:3000';\n this.apiKey = config.env.DEEPAGENT_API_KEY || '';\n\n this.logger.info('DeepAgent integration initialized', { apiUrl: this.apiUrl });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendMessage':\n data = await this.executeWithRetry(() => this.sendMessage(params));\n break;\n case 'cancelGeneration':\n data = await this.executeWithRetry(() =>\n this.cancelGeneration(params),\n );\n break;\n case 'validateSchema':\n data = await this.executeWithRetry(() => this.validateSchema(params));\n break;\n case 'compileSchema':\n data = await this.executeWithRetry(() => this.compileSchema(params));\n break;\n case 'getThreadHistory':\n data = await this.executeWithRetry(() =>\n this.getThreadHistory(params),\n );\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async sendMessage(params: IntegrationParams) {\n const { message, threadId, skill, context } = params;\n\n this.logger.debug('Sending message to DeepAgent', { threadId: String(threadId ?? ''), skill: String(skill ?? '') });\n\n const response = await this.request('/api/agent/message', {\n message,\n threadId,\n skill,\n context,\n });\n\n return response;\n }\n\n private async cancelGeneration(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Cancelling generation', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/cancel', {\n threadId,\n });\n\n return response;\n }\n\n private async validateSchema(params: IntegrationParams) {\n const { schema } = params;\n\n this.logger.debug('Validating schema');\n\n const response = await this.request('/api/schema/validate', {\n schema,\n });\n\n return response;\n }\n\n private async compileSchema(params: IntegrationParams) {\n const { schema, shell } = params;\n\n this.logger.debug('Compiling schema', { shell: String(shell ?? '') });\n\n const response = await this.request('/api/schema/compile', {\n schema,\n shell,\n });\n\n return response;\n }\n\n private async getThreadHistory(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Getting thread history', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/history', {\n threadId,\n });\n\n return response;\n }\n\n private async request(endpoint: string, body: IntegrationParams) {\n const url = `${this.apiUrl}${endpoint}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `DeepAgent request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return await response.json();\n }\n}\n\n// Auto-register\nregisterIntegration('deepagent', DeepAgentIntegration);\n","/**\n * Git CLI operations for GitHub integration\n */\n\nimport { spawn } from 'child_process';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubInitParams,\n GitHubPullParams,\n GitHubPullResult,\n GitHubAddRemoteParams,\n GitHubSetUserConfigParams,\n GitHubRenameBranchParams,\n} from './types';\nimport type { GitHubCommit } from './github-api';\n\n/**\n * Execute a git command\n */\nasync function execGit(\n args: string[],\n cwd: string,\n env?: Record<string, string>\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd,\n env: { ...process.env, ...env },\n stdio: 'pipe',\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n } else {\n reject(\n new IntegrationError(\n `Git command failed: ${args.join(' ')}\\n${stderr}`,\n 'SERVICE_ERROR',\n { code, stderr }\n )\n );\n }\n });\n\n proc.on('error', (error) => {\n reject(\n new IntegrationError(\n `Failed to execute git: ${error.message}`,\n 'SERVICE_ERROR',\n { error }\n )\n );\n });\n });\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n params: GitHubCloneParams,\n token: string\n): Promise<void> {\n const { repoUrl, targetDir, branch, depth = 1 } = params;\n\n // Inject token into URL for authentication\n const authUrl = injectTokenIntoUrl(repoUrl, token);\n\n const args = ['clone'];\n\n if (depth > 0) {\n args.push('--depth', depth.toString());\n }\n\n if (branch) {\n args.push('--branch', branch);\n }\n\n args.push(authUrl, targetDir);\n\n try {\n await execGit(args, process.cwd());\n\n // Immediately scrub the token from git config\n await scrubTokenFromRemote(targetDir, repoUrl);\n } catch (error) {\n throw new IntegrationError(\n `Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { repoUrl, error }\n );\n }\n}\n\n/**\n * Create a new branch\n */\nexport async function createBranch(\n params: GitHubCreateBranchParams,\n workDir: string\n): Promise<void> {\n const { branchName, baseBranch } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // If baseBranch is specified, check it out first\n if (baseBranch) {\n await execGit(['checkout', baseBranch], cwd);\n }\n\n // Create and checkout new branch\n await execGit(['checkout', '-b', branchName], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to create branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, baseBranch, error }\n );\n }\n}\n\n/**\n * Commit changes\n */\nexport async function commit(\n params: GitHubCommitParams,\n workDir: string\n): Promise<void> {\n const { message, files } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // Stage files\n if (files && files.length > 0) {\n await execGit(['add', ...files], cwd);\n } else {\n // Stage all changes\n await execGit(['add', '.'], cwd);\n }\n\n // Commit\n await execGit(['commit', '-m', message], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { message, error }\n );\n }\n}\n\n/**\n * Push branch to remote\n */\nexport async function push(\n params: GitHubPushParams,\n workDir: string,\n token: string\n): Promise<void> {\n const { branchName, force = false } = params;\n const cwd = params.workDir || workDir;\n\n // Security: Never allow force push to protected branches\n const protectedBranches = ['main', 'master', 'production', 'prod'];\n if (force && protectedBranches.includes(branchName.toLowerCase())) {\n throw new IntegrationError(\n `Force push to protected branch '${branchName}' is not allowed`,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // Create a temporary credential helper script\n const credHelper = await createTempCredentialHelper(token);\n\n const args = ['push'];\n\n if (force) {\n args.push('--force');\n }\n\n args.push('-u', 'origin', branchName);\n\n // Use GIT_ASKPASS for authentication\n await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n\n // Clean up credential helper\n await fs.unlink(credHelper);\n } catch (error) {\n throw new IntegrationError(\n `Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, error }\n );\n }\n}\n\n/**\n * Inject token into repository URL for authentication\n */\nfunction injectTokenIntoUrl(repoUrl: string, token: string): string {\n const url = new URL(repoUrl);\n url.username = 'x-access-token';\n url.password = token;\n return url.toString();\n}\n\n/**\n * Remove token from git remote URL (security measure)\n */\nasync function scrubTokenFromRemote(workDir: string, originalUrl: string): Promise<void> {\n try {\n // Parse the URL to ensure it's clean (no credentials)\n const url = new URL(originalUrl);\n url.username = '';\n url.password = '';\n const cleanUrl = url.toString();\n\n await execGit(['remote', 'set-url', 'origin', cleanUrl], workDir);\n } catch (error) {\n // Log but don't fail - the clone succeeded\n console.error('Warning: Failed to scrub token from remote URL:', error);\n }\n}\n\n/**\n * Create a temporary credential helper script for GIT_ASKPASS\n */\nasync function createTempCredentialHelper(token: string): Promise<string> {\n const tmpDir = process.env.TMPDIR || '/tmp';\n const helperPath = join(tmpDir, `git-cred-${Date.now()}.sh`);\n\n const script = `#!/bin/sh\\necho \"${token}\"`;\n\n await fs.writeFile(helperPath, script, { mode: 0o700 });\n\n return helperPath;\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['branch', '--show-current'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Check if working directory has uncommitted changes\n */\nexport async function hasUncommittedChanges(workDir: string): Promise<boolean> {\n try {\n const { stdout } = await execGit(['status', '--porcelain'], workDir);\n return stdout.trim().length > 0;\n } catch (error) {\n throw new IntegrationError(\n `Failed to check git status: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Initialize a git repository in `workDir`. No-op when `.git/` already\n * exists. The default initial branch is `main` to match what GitHub\n * creates for new repos.\n */\nexport async function init(params: GitHubInitParams): Promise<void> {\n const { workDir, initialBranch = 'main' } = params;\n try {\n // `git init -b <branch>` works on git >= 2.28; the runtime ships 2.x.\n // The command is idempotent — re-running on an existing repo just\n // re-asserts the initial branch ref (no error).\n await execGit(['init', '-b', initialBranch], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to git init: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { workDir, error }\n );\n }\n}\n\n/**\n * Add a remote to the repository. Used after `init` to attach the\n * freshly-created GitHub remote as `origin`.\n */\nexport async function addRemote(params: GitHubAddRemoteParams): Promise<void> {\n const { name, url, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n throw new IntegrationError(\n `addRemote requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n try {\n await execGit(['remote', 'add', name, url], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to add remote ${name}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { name, error }\n );\n }\n}\n\n/**\n * Set `user.name` and `user.email` for git commits. Scope defaults to\n * per-repo (`--local`) so each workspace can carry the GitHub identity\n * of the user who owns it — global config would clobber the developer's\n * own machine settings.\n */\nexport async function setUserConfig(params: GitHubSetUserConfigParams): Promise<void> {\n const { userName, userEmail, scope = 'local', workDir } = params;\n const scopeFlag = scope === 'global' ? '--global' : '--local';\n if (scope === 'local' && !workDir) {\n throw new IntegrationError(\n `setUserConfig with scope='local' requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n const cwd = workDir ?? process.cwd();\n try {\n await execGit(['config', scopeFlag, 'user.name', userName], cwd);\n await execGit(['config', scopeFlag, 'user.email', userEmail], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to set git user config: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Pull from the remote. Returns a structured outcome so callers can\n * tell \"the workspace advanced\" from \"nothing changed because <X>\"\n * without parsing git's stderr. Best-effort posture: network / conflict\n * / no-upstream all resolve cleanly rather than throwing — the caller\n * decides whether to surface the no-op as user-facing.\n */\nexport async function pull(\n params: GitHubPullParams,\n token: string,\n): Promise<GitHubPullResult> {\n const { branchName, ffOnly = true, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n return { updated: false, reason: 'no-upstream' };\n }\n\n let credHelper: string | null = null;\n try {\n credHelper = await createTempCredentialHelper(token);\n const args = ['pull'];\n if (ffOnly) args.push('--ff-only');\n args.push('origin', branchName);\n\n const { stdout } = await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n // `git pull` prints \"Already up to date.\" when there's nothing to\n // fetch. Anything else (Updating, Fast-forward, +n -m line) means\n // the working tree actually moved.\n const updated = !/^Already up to date\\.?\\s*$/m.test(stdout.trim());\n return updated ? { updated: true } : { updated: false, reason: 'up-to-date' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Heuristics on git's stderr text — exit codes are too coarse to\n // discriminate the cases.\n if (/no upstream|no such ref|couldn't find remote ref/i.test(message)) {\n return { updated: false, reason: 'no-upstream' };\n }\n if (/conflict|not possible to fast-forward|divergent/i.test(message)) {\n return { updated: false, reason: 'conflict' };\n }\n return { updated: false, reason: 'network' };\n } finally {\n if (credHelper) {\n try { await fs.unlink(credHelper); } catch { /* best-effort */ }\n }\n }\n}\n\n/**\n * Return the current HEAD commit sha (full 40-char). Throws when the\n * workspace has no commits yet (caller decides whether that's an error\n * or an \"init, then commit, then read\" sequencing issue).\n */\nexport async function getHeadSha(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['rev-parse', 'HEAD'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get HEAD sha: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Return the current HEAD commit as a `GitHubCommit` shape. Reuses the\n * canonical type from the REST module (no parallel `LocalCommit`\n * interface). `stats` is absent — that's GitHub-API-only and would\n * require a separate fetch to populate.\n *\n * The format string uses NUL (`%x00`) as a field separator so commit\n * messages containing newlines / pipes can't break parsing.\n */\nexport async function getHeadCommit(workDir: string): Promise<GitHubCommit> {\n try {\n const FORMAT = '%H%x00%an%x00%ae%x00%aI%x00%B';\n const { stdout } = await execGit(\n ['show', '--no-patch', `--format=${FORMAT}`, 'HEAD'],\n workDir,\n );\n const [sha, name, email, date, ...messageParts] = stdout.split('\\x00');\n return {\n sha: sha.trim(),\n message: messageParts.join('\\x00').trimEnd(),\n author: {\n name: name?.trim() ?? '',\n email: email?.trim() ?? '',\n date: date?.trim() ?? '',\n },\n };\n } catch (error) {\n throw new IntegrationError(\n `Failed to read HEAD commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Rename the current branch with `git branch -M <newName>`. The `-M`\n * (capital) flag forces the rename even if a branch with that name\n * already exists, which is fine for our use case (aligning a fresh\n * local workspace's branch with the linked repo's default branch).\n */\nexport async function renameCurrentBranch(params: GitHubRenameBranchParams): Promise<void> {\n const { newName, workDir } = params;\n try {\n await execGit(['branch', '-M', newName], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to rename branch to ${newName}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { newName, error }\n );\n }\n}\n","/**\n * GitHub REST API client\n */\n\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCreateRepoParams,\n GitHubRepoCreated,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubGetFileParams,\n GitHubFileContent,\n GitHubListCommitsParams,\n GitHubCommitSummary,\n GitHubCreateIssueParams,\n GitHubIssueCreated,\n GitHubPullRequest,\n GitHubIssue,\n GitHubComment,\n GitHubRateLimit,\n} from './types';\n\n/**\n * GitHub API client configuration\n */\nexport interface GitHubAPIConfig {\n token: string;\n owner: string;\n repo: string;\n}\n\n/**\n * GitHub API response\n */\ninterface GitHubAPIResponse<T> {\n data: T;\n rateLimit: GitHubRateLimit;\n}\n\n/**\n * Execute a GitHub API request\n */\nasync function githubFetch<T>(\n endpoint: string,\n config: GitHubAPIConfig,\n options: RequestInit = {}\n): Promise<GitHubAPIResponse<T>> {\n const url = `https://api.github.com${endpoint}`;\n\n const headers = {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Extract rate limit info\n const rateLimit: GitHubRateLimit = {\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\n limit: parseInt(response.headers.get('x-ratelimit-limit') || '5000', 10),\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\n };\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n\n // Handle rate limiting\n if (response.status === 429) {\n throw new IntegrationError(\n 'GitHub API rate limit exceeded',\n 'RATE_LIMIT_ERROR',\n { rateLimit, error }\n );\n }\n\n // Handle authentication errors\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationError(\n `GitHub API authentication failed: ${error.message || response.statusText}`,\n 'AUTH_ERROR',\n { status: response.status, error }\n );\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error.message || response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status, error }\n );\n }\n\n const data = await response.json();\n\n return { data, rateLimit };\n } catch (error) {\n if (error instanceof IntegrationError) {\n throw error;\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { error }\n );\n }\n}\n\n/**\n * GAP-104/105: Create a new repository for the authenticated user.\n * The token must have the `repo` scope.\n */\nexport async function createRepo(\n params: GitHubCreateRepoParams,\n token: string,\n): Promise<GitHubRepoCreated> {\n const { name, isPrivate = true, description, autoInit = true } = params;\n\n const response = await fetch('https://api.github.com/user/repos', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n name,\n private: isPrivate,\n description: description ?? 'Generated by Almadar Studio',\n auto_init: autoInit,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new IntegrationError(\n `Failed to create GitHub repository \"${name}\": ${response.status} ${err}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n const repo = await response.json() as {\n clone_url: string;\n owner: { login: string };\n name: string;\n default_branch: string;\n full_name: string;\n };\n\n return {\n repoUrl: repo.clone_url,\n owner: repo.owner.login,\n repo: repo.name,\n defaultBranch: repo.default_branch,\n fullName: repo.full_name,\n };\n}\n\n/**\n * GAP-104/105: List the file tree of a repository using the Git Trees API.\n * Returns a flat list of all files in one request (recursive=1).\n */\nexport async function listRepoTree(\n config: GitHubAPIConfig,\n branch?: string,\n): Promise<Array<{ path: string; type: 'blob' | 'tree'; size?: number }>> {\n const ref = branch ?? 'main';\n const { data } = await githubFetch<{ tree: Array<{ path: string; type: string; size?: number }> }>(\n `/repos/${config.owner}/${config.repo}/git/trees/${ref}?recursive=1`,\n config,\n );\n return data.tree.map(entry => ({\n path: entry.path,\n type: entry.type as 'blob' | 'tree',\n size: entry.size,\n }));\n}\n\n/**\n * GAP-104/105: Read a single file's content from a repository.\n */\nexport async function readRepoFile(\n config: GitHubAPIConfig,\n filePath: string,\n branch?: string,\n): Promise<string | null> {\n const ref = branch ? `?ref=${branch}` : '';\n try {\n const response = await fetch(\n `https://api.github.com/repos/${config.owner}/${config.repo}/contents/${filePath}${ref}`,\n {\n headers: {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n },\n );\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n\n/**\n * Create a pull request\n */\nexport async function createPR(\n params: GitHubCreatePRParams,\n config: GitHubAPIConfig\n): Promise<GitHubPullRequest> {\n const { title, body, baseBranch, headBranch, draft = false } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls`;\n\n const { data } = await githubFetch<GitHubPullRequest>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({\n title,\n body,\n base: baseBranch,\n head: headBranch,\n draft,\n }),\n });\n\n return data;\n}\n\n/**\n * Get pull request comments\n */\nexport async function getPRComments(\n params: GitHubGetPRCommentsParams,\n config: GitHubAPIConfig\n): Promise<GitHubComment[]> {\n const { prNumber } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls/${prNumber}/comments`;\n\n const { data } = await githubFetch<GitHubComment[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * List repository issues\n */\nexport async function listIssues(\n params: GitHubListIssuesParams,\n config: GitHubAPIConfig\n): Promise<GitHubIssue[]> {\n const { state = 'open', labels = [], per_page = 30 } = params;\n\n const queryParams = new URLSearchParams({\n state,\n per_page: Math.min(per_page, 100).toString(),\n });\n\n if (labels.length > 0) {\n queryParams.append('labels', labels.join(','));\n }\n\n const endpoint = `/repos/${config.owner}/${config.repo}/issues?${queryParams}`;\n\n const { data } = await githubFetch<GitHubIssue[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * Get issue details\n */\nexport async function getIssue(\n params: GitHubGetIssueParams,\n config: GitHubAPIConfig\n): Promise<{ issue: GitHubIssue; comments: GitHubComment[] }> {\n const { issueNumber } = params;\n\n // Get issue details\n const issueEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}`;\n const { data: issue } = await githubFetch<GitHubIssue>(issueEndpoint, config);\n\n // Get issue comments\n const commentsEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}/comments`;\n const { data: comments } = await githubFetch<GitHubComment[]>(commentsEndpoint, config);\n\n return { issue, comments };\n}\n\n/**\n * Get current rate limit status\n */\nexport async function getRateLimit(config: GitHubAPIConfig): Promise<GitHubRateLimit> {\n const endpoint = '/rate_limit';\n\n const { data } = await githubFetch<{ rate: GitHubRateLimit }>(endpoint, config);\n\n return data.rate;\n}\n\n// ============================================================================\n// Git History API\n// ============================================================================\n\n/**\n * A commit from the GitHub API with optional stats.\n */\nexport interface GitHubCommit {\n sha: string;\n message: string;\n author: { name: string; email: string; date: string };\n stats?: { additions: number; deletions: number; total: number };\n}\n\n/**\n * List commits for a repository, optionally filtered by file path.\n */\nexport async function listCommits(\n config: GitHubAPIConfig,\n options?: { path?: string; ref?: string; perPage?: number; page?: number },\n): Promise<GitHubCommit[]> {\n const params = new URLSearchParams();\n if (options?.path) params.set('path', options.path);\n if (options?.ref) params.set('sha', options.ref);\n if (options?.perPage) params.set('per_page', options.perPage.toString());\n if (options?.page) params.set('page', options.page.toString());\n\n const queryStr = params.toString();\n const endpoint = `/repos/${config.owner}/${config.repo}/commits${queryStr ? `?${queryStr}` : ''}`;\n\n const { data } = await githubFetch<Array<{\n sha: string;\n commit: {\n message: string;\n author: { name: string; email: string; date: string };\n };\n stats?: { additions: number; deletions: number; total: number };\n }>>(endpoint, config);\n\n return data.map((item) => ({\n sha: item.sha,\n message: item.commit.message,\n author: item.commit.author,\n stats: item.stats,\n }));\n}\n\n/**\n * Get the diff for a specific commit as a unified diff string.\n */\nexport async function getCommitDiff(\n config: GitHubAPIConfig,\n sha: string,\n): Promise<string> {\n const url = `https://api.github.com/repos/${config.owner}/${config.repo}/commits/${sha}`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.diff',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n throw new IntegrationError(\n `GitHub API request failed: ${response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n return response.text();\n}\n\n/**\n * Get a file's content at a specific commit SHA.\n * Returns null if the file doesn't exist at that commit.\n */\nexport async function getFileAtCommit(\n config: GitHubAPIConfig,\n path: string,\n sha: string,\n): Promise<string | null> {\n const endpoint = `/repos/${config.owner}/${config.repo}/contents/${path}?ref=${sha}`;\n\n try {\n const response = await fetch(`https://api.github.com${endpoint}`, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) return null;\n throw new Error(`${response.status}: ${response.statusText}`);\n }\n\n return response.text();\n } catch (error) {\n if (error instanceof IntegrationError) throw error;\n throw new IntegrationError(\n `Failed to get file at commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { path, sha, error },\n );\n }\n}\n\n/**\n * Get a file's content plus metadata (sha, size) — the `getFile` contract\n * action. Unlike `getFileAtCommit` (raw bytes only, no sha/size), this reads\n * the JSON contents API to satisfy the declared response shape in one call,\n * and takes owner/repo per-call rather than from a pre-resolved config.\n */\nexport async function getFile(\n params: GitHubGetFileParams,\n token: string,\n): Promise<GitHubFileContent> {\n const { owner, repo, path, ref } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : '';\n const endpoint = `/repos/${owner}/${repo}/contents/${path}${query}`;\n\n const { data } = await githubFetch<{\n path: string;\n sha: string;\n size: number;\n content: string;\n encoding: string;\n }>(endpoint, config);\n\n const content =\n data.encoding === 'base64' ? Buffer.from(data.content, 'base64').toString('utf-8') : data.content;\n\n return { path: data.path, content, sha: data.sha, size: data.size };\n}\n\n/**\n * List commits shaped for the `listCommits` contract action — per-call\n * owner/repo, and the flattened author-name + date the declared response\n * requires (the raw API nests author under `commit.author`).\n */\nexport async function listCommitsSummary(\n params: GitHubListCommitsParams,\n token: string,\n): Promise<GitHubCommitSummary[]> {\n const { owner, repo, path, ref, per_page } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n\n const commits = await listCommits(config, { path, ref, perPage: per_page });\n\n return commits.map((commit) => ({\n sha: commit.sha,\n message: commit.message,\n author: commit.author.name,\n date: commit.author.date,\n }));\n}\n\n/**\n * Create an issue — the `createIssue` contract action.\n */\nexport async function createIssue(\n params: GitHubCreateIssueParams,\n token: string,\n): Promise<GitHubIssueCreated> {\n const { owner, repo, title, body, labels } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n const endpoint = `/repos/${owner}/${repo}/issues`;\n\n const { data } = await githubFetch<GitHubIssue>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({ title, body, labels }),\n });\n\n return { number: data.number, title: data.title, url: data.url };\n}\n\n/**\n * Parse repository owner and name from URL\n */\nexport function parseRepoUrl(repoUrl: string): { owner: string; repo: string } {\n try {\n const url = new URL(repoUrl);\n const pathParts = url.pathname.split('/').filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error('Invalid repository URL format');\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1].replace(/\\.git$/, '');\n\n return { owner, repo };\n } catch (error) {\n throw new IntegrationError(\n `Failed to parse repository URL: ${repoUrl}`,\n 'VALIDATION_ERROR',\n { error }\n );\n }\n}\n","/**\n * GitHub Integration for Almadar\n * Provides git operations and GitHub API access for the agent\n */\n\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport * as GitOps from './github-git';\nimport * as GitHubAPI from './github-api';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubGetFileParams,\n GitHubListCommitsParams,\n GitHubCreateIssueParams,\n} from './types';\n\n/**\n * GitHub integration class\n */\nexport class GitHubIntegration extends BaseIntegration {\n private token: string;\n private owner: string;\n private repo: string;\n private workDir: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.token = config.env.GITHUB_TOKEN;\n if (!this.token) {\n throw new Error('GITHUB_TOKEN not configured');\n }\n\n this.owner = config.env.GITHUB_OWNER || '';\n this.repo = config.env.GITHUB_REPO || '';\n this.workDir = config.env.GITHUB_WORK_DIR || process.cwd();\n\n this.logger.info('GitHub integration initialized', {\n owner: this.owner,\n repo: this.repo,\n });\n }\n\n /**\n * Execute a GitHub action\n */\n async execute(\n action: string,\n params: IntegrationParams\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'cloneRepo':\n data = await this.executeWithRetry(() =>\n this.cloneRepo(params as GitHubCloneParams)\n );\n break;\n\n case 'createBranch':\n data = await this.executeWithRetry(() =>\n this.createBranch(params as GitHubCreateBranchParams)\n );\n break;\n\n case 'commit':\n data = await this.executeWithRetry(() =>\n this.commit(params as GitHubCommitParams)\n );\n break;\n\n case 'push':\n data = await this.executeWithRetry(() =>\n this.push(params as GitHubPushParams)\n );\n break;\n\n case 'createPR':\n data = await this.executeWithRetry(() =>\n this.createPR(params as GitHubCreatePRParams)\n );\n break;\n\n case 'getPRComments':\n data = await this.executeWithRetry(() =>\n this.getPRComments(params as GitHubGetPRCommentsParams)\n );\n break;\n\n case 'listIssues':\n data = await this.executeWithRetry(() =>\n this.listIssues(params as GitHubListIssuesParams)\n );\n break;\n\n case 'getIssue':\n data = await this.executeWithRetry(() =>\n this.getIssue(params as GitHubGetIssueParams)\n );\n break;\n\n case 'getFile':\n data = await this.executeWithRetry(() =>\n this.getFile(params as GitHubGetFileParams)\n );\n break;\n\n case 'listCommits':\n data = await this.executeWithRetry(() =>\n this.listCommits(params as GitHubListCommitsParams)\n );\n break;\n\n case 'createIssue':\n data = await this.executeWithRetry(() =>\n this.createIssue(params as GitHubCreateIssueParams)\n );\n break;\n\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /**\n * Clone a repository\n */\n private async cloneRepo(params: GitHubCloneParams): Promise<{ message: string }> {\n this.logger.debug('Cloning repository', { repoUrl: params.repoUrl });\n\n // If owner/repo not set, parse from URL\n if (!this.owner || !this.repo) {\n const parsed = GitHubAPI.parseRepoUrl(params.repoUrl);\n this.owner = parsed.owner;\n this.repo = parsed.repo;\n }\n\n await GitOps.cloneRepo(params, this.token);\n\n return {\n message: `Successfully cloned ${params.repoUrl} to ${params.targetDir}`,\n };\n }\n\n /**\n * Create a branch\n */\n private async createBranch(params: GitHubCreateBranchParams): Promise<{ message: string }> {\n this.logger.debug('Creating branch', { branchName: params.branchName });\n\n await GitOps.createBranch(params, this.workDir);\n\n return {\n message: `Successfully created branch: ${params.branchName}`,\n };\n }\n\n /**\n * Commit changes\n */\n private async commit(params: GitHubCommitParams): Promise<{ message: string }> {\n this.logger.debug('Committing changes', { message: params.message });\n\n await GitOps.commit(params, this.workDir);\n\n return {\n message: `Successfully committed changes: ${params.message}`,\n };\n }\n\n /**\n * Push branch\n */\n private async push(params: GitHubPushParams): Promise<{ message: string }> {\n this.logger.debug('Pushing branch', { branchName: params.branchName });\n\n await GitOps.push(params, this.workDir, this.token);\n\n return {\n message: `Successfully pushed branch: ${params.branchName}`,\n };\n }\n\n /**\n * Create a pull request\n */\n private async createPR(params: GitHubCreatePRParams) {\n this.logger.debug('Creating pull request', { title: params.title });\n\n const apiConfig = this.getAPIConfig();\n const pr = await GitHubAPI.createPR(params, apiConfig);\n\n this.logger.info('Pull request created', { number: pr.number, url: pr.url });\n\n return pr;\n }\n\n /**\n * Get PR comments\n */\n private async getPRComments(params: GitHubGetPRCommentsParams) {\n this.logger.debug('Getting PR comments', { prNumber: params.prNumber });\n\n const apiConfig = this.getAPIConfig();\n const comments = await GitHubAPI.getPRComments(params, apiConfig);\n\n return { comments };\n }\n\n /**\n * List issues\n */\n private async listIssues(params: GitHubListIssuesParams) {\n this.logger.debug('Listing issues', { state: params.state, labels: params.labels?.join(', '), per_page: params.per_page });\n\n const apiConfig = this.getAPIConfig();\n const issues = await GitHubAPI.listIssues(params, apiConfig);\n\n return { issues };\n }\n\n /**\n * Get issue details\n */\n private async getIssue(params: GitHubGetIssueParams) {\n this.logger.debug('Getting issue', { issueNumber: params.issueNumber });\n\n const apiConfig = this.getAPIConfig();\n const result = await GitHubAPI.getIssue(params, apiConfig);\n\n return result;\n }\n\n /**\n * Get a file's content plus metadata (owner/repo are per-call, not the\n * configured default repo)\n */\n private async getFile(params: GitHubGetFileParams) {\n this.logger.debug('Getting file', { owner: params.owner, repo: params.repo, path: params.path });\n\n return GitHubAPI.getFile(params, this.token);\n }\n\n /**\n * List commits (owner/repo are per-call, not the configured default repo)\n */\n private async listCommits(params: GitHubListCommitsParams) {\n this.logger.debug('Listing commits', { owner: params.owner, repo: params.repo, path: params.path });\n\n const commits = await GitHubAPI.listCommitsSummary(params, this.token);\n\n return { commits };\n }\n\n /**\n * Create an issue (owner/repo are per-call, not the configured default repo)\n */\n private async createIssue(params: GitHubCreateIssueParams) {\n this.logger.debug('Creating issue', { owner: params.owner, repo: params.repo, title: params.title });\n\n return GitHubAPI.createIssue(params, this.token);\n }\n\n /**\n * Get API config for GitHub API calls\n */\n private getAPIConfig(): GitHubAPI.GitHubAPIConfig {\n if (!this.owner || !this.repo) {\n throw new Error(\n 'GitHub owner and repo must be configured. Either set GITHUB_OWNER/GITHUB_REPO or clone a repository first.'\n );\n }\n\n return {\n token: this.token,\n owner: this.owner,\n repo: this.repo,\n };\n }\n}\n\n// Auto-register the integration\nregisterIntegration('github', GitHubIntegration);\n\n// Export types\nexport * from './types';\n\n// Export git CLI operations (clone, push, commit, branch)\nexport {\n cloneRepo,\n createBranch,\n commit,\n push,\n getCurrentBranch,\n hasUncommittedChanges,\n init,\n pull,\n addRemote,\n setUserConfig,\n getHeadSha,\n getHeadCommit,\n renameCurrentBranch,\n} from './github-git';\n\n// Export GitHub REST API functions\nexport {\n createRepo,\n listRepoTree,\n readRepoFile,\n createPR,\n getPRComments,\n listIssues,\n getIssue,\n getRateLimit,\n parseRepoUrl,\n listCommits,\n listCommitsSummary,\n getCommitDiff,\n getFileAtCommit,\n getFile,\n createIssue,\n type GitHubAPIConfig,\n type GitHubCommit,\n} from './github-api';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { execSync } from 'child_process';\nimport { writeFileSync, mkdtempSync, rmSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\n\n/**\n * CLI integration for Almadar CLI commands.\n *\n * Wraps `@almadar/cli` commands (validate, compile) as integration actions.\n * This runs server-side and executes CLI commands as child processes.\n *\n * Actions:\n * - validate: Validate an orbital schema and return structured results\n */\nexport class CLIIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('CLI integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'validate':\n data = await this.validate(params);\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async validate(params: IntegrationParams) {\n const { schema } = params as { schema: string };\n\n if (!schema || typeof schema !== 'string') {\n throw new Error('validate requires a \"schema\" parameter (string)');\n }\n\n // Create temp directory for the schema file\n const tempDir = mkdtempSync(join(tmpdir(), 'almadar-validate-'));\n const schemaPath = join(tempDir, 'schema.orb');\n\n try {\n // Write schema content to temp file\n writeFileSync(schemaPath, schema, 'utf-8');\n\n this.logger.debug('Validating schema', { path: schemaPath });\n\n // Run CLI validation\n const output = execSync(\n `npx @almadar/cli validate \"${schemaPath}\" --format=json`,\n {\n encoding: 'utf-8',\n timeout: 30000,\n cwd: tempDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n // Parse JSON output\n const result = JSON.parse(output.trim());\n\n return {\n valid: result.valid ?? true,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch (error: unknown) {\n // CLI may return non-zero exit code for validation failures\n const execError = error as { stdout?: string; stderr?: string; message?: string };\n if (execError.stdout) {\n try {\n const result = JSON.parse(execError.stdout.trim());\n return {\n valid: false,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch {\n // stdout wasn't valid JSON, fall through\n }\n }\n\n // Actual execution failure\n throw new Error(\n `CLI validation failed: ${execError.message || String(error)}`,\n );\n } finally {\n // Cleanup temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n }\n}\n\n// Auto-register\nregisterIntegration('cli', CLIIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored entry in the in-memory cache */\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\n/** Callback type for pub/sub subscribers */\ntype SubscriberCallback = (msg: unknown) => void;\n\n/**\n * Redis / Cache integration with in-memory default backend.\n *\n * When `REDIS_URL` is provided in `config.env`, a warning is logged and the\n * integration falls back to the in-memory store (real Redis client support is\n * not yet implemented). When `REDIS_URL` is absent the in-memory store is\n * used silently — this is the expected development mode.\n */\nexport class RedisIntegration extends BaseIntegration {\n private store: Map<string, CacheEntry> = new Map();\n private locks: Map<string, string> = new Map();\n private channels: Map<string, Set<SubscriberCallback>> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const redisUrl = config.env.REDIS_URL;\n if (redisUrl) {\n this.logger.warn(\n 'REDIS_URL is configured but real Redis client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { redisUrl },\n );\n }\n\n this.logger.info('Redis integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'get':\n data = await this.executeWithRetry(() => this.getKey(params));\n break;\n case 'set':\n data = await this.executeWithRetry(() => this.setKey(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteKey(params));\n break;\n case 'lock':\n data = await this.executeWithRetry(() => this.acquireLock(params));\n break;\n case 'unlock':\n data = await this.executeWithRetry(() => this.releaseLock(params));\n break;\n case 'increment':\n data = await this.executeWithRetry(() => this.incrementKey(params));\n break;\n case 'expire':\n data = await this.executeWithRetry(() => this.expireKey(params));\n break;\n case 'publish':\n data = await this.executeWithRetry(() => this.publishMessage(params));\n break;\n case 'subscribe':\n data = await this.executeWithRetry(() =>\n this.subscribeChannel(params),\n );\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Remove expired entries on access and return whether a key is alive. */\n private isAlive(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n /** Generate a unique lock identifier. */\n private generateLockId(): string {\n return `lock_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async getKey(\n params: IntegrationParams,\n ): Promise<{ value: unknown }> {\n const key = params.key as string;\n\n this.logger.debug('Cache GET', { key });\n\n if (!this.isAlive(key)) {\n return { value: null };\n }\n\n const entry = this.store.get(key);\n return { value: entry ? entry.value : null };\n }\n\n private async setKey(\n params: IntegrationParams,\n ): Promise<{ ok: boolean }> {\n const key = params.key as string;\n const value = params.value;\n const ttl = params.ttl as number | undefined;\n\n this.logger.debug('Cache SET', { key, ttl });\n\n const entry: CacheEntry = { value };\n if (ttl !== undefined && ttl > 0) {\n entry.expiresAt = Date.now() + ttl * 1000;\n }\n\n this.store.set(key, entry);\n return { ok: true };\n }\n\n private async deleteKey(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const key = params.key as string;\n\n this.logger.debug('Cache DELETE', { key });\n\n const existed = this.store.has(key);\n this.store.delete(key);\n return { deleted: existed };\n }\n\n private async acquireLock(\n params: IntegrationParams,\n ): Promise<{ acquired: boolean; lockId: string }> {\n const key = params.key as string;\n const ttl = (params.ttl as number | undefined) ?? 30_000;\n\n this.logger.debug('Cache LOCK', { key, ttl });\n\n // Check if the lock already exists and is still alive\n const existingLockId = this.locks.get(key);\n if (existingLockId) {\n // The lock key in the store tracks its expiry\n if (this.isAlive(`__lock:${key}`)) {\n return { acquired: false, lockId: '' };\n }\n // Expired — clean up\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n }\n\n const lockId = this.generateLockId();\n this.locks.set(key, lockId);\n // Store the lock with a TTL (ttl param is in ms, expiresAt is epoch ms)\n this.store.set(`__lock:${key}`, {\n value: lockId,\n expiresAt: Date.now() + ttl,\n });\n\n return { acquired: true, lockId };\n }\n\n private async releaseLock(\n params: IntegrationParams,\n ): Promise<{ released: boolean }> {\n const key = params.key as string;\n const lockId = params.lockId as string;\n\n this.logger.debug('Cache UNLOCK', { key, lockId });\n\n const currentLockId = this.locks.get(key);\n if (currentLockId !== lockId) {\n return { released: false };\n }\n\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n return { released: true };\n }\n\n private async incrementKey(\n params: IntegrationParams,\n ): Promise<{ value: number }> {\n const key = params.key as string;\n const by = (params.by as number | undefined) ?? 1;\n\n this.logger.debug('Cache INCR', { key, by });\n\n let current = 0;\n\n if (this.isAlive(key)) {\n const entry = this.store.get(key);\n if (entry) {\n current = typeof entry.value === 'number' ? entry.value : 0;\n }\n }\n\n const newValue = current + by;\n // Preserve existing TTL if the key already exists\n const existing = this.store.get(key);\n this.store.set(key, {\n value: newValue,\n expiresAt: existing?.expiresAt,\n });\n\n return { value: newValue };\n }\n\n private async expireKey(\n params: IntegrationParams,\n ): Promise<{ set: boolean }> {\n const key = params.key as string;\n const ttl = params.ttl as number;\n\n this.logger.debug('Cache EXPIRE', { key, ttl });\n\n if (!this.isAlive(key)) {\n return { set: false };\n }\n\n const entry = this.store.get(key);\n if (!entry) {\n return { set: false };\n }\n\n entry.expiresAt = Date.now() + ttl * 1000;\n this.store.set(key, entry);\n return { set: true };\n }\n\n private async publishMessage(\n params: IntegrationParams,\n ): Promise<{ receivers: number }> {\n const channel = params.channel as string;\n const message = params.message;\n\n this.logger.debug('Cache PUBLISH', { channel });\n\n const subscribers = this.channels.get(channel);\n if (!subscribers || subscribers.size === 0) {\n return { receivers: 0 };\n }\n\n for (const callback of subscribers) {\n try {\n callback(message);\n } catch (err) {\n this.logger.error('Subscriber callback error', {\n channel,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { receivers: subscribers.size };\n }\n\n private async subscribeChannel(\n params: IntegrationParams,\n ): Promise<{ subscribed: boolean }> {\n const channel = params.channel as string;\n\n this.logger.debug('Cache SUBSCRIBE', { channel });\n\n if (!this.channels.has(channel)) {\n this.channels.set(channel, new Set());\n }\n\n // The in-memory subscribe registers the channel but the actual callback\n // would be wired via a higher-level API. For the integration contract we\n // simply confirm the subscription was created.\n return { subscribed: true };\n }\n}\n\n// Auto-register\nregisterIntegration('redis', RedisIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Job status values */\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed';\n\n/** Internal job representation */\ninterface QueueJob {\n id: string;\n queue: string;\n payload: unknown;\n priority: number;\n status: JobStatus;\n enqueuedAt: number;\n delay: number;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Queue integration with in-memory backend.\n *\n * Provides job queue semantics: enqueue, dequeue, status tracking,\n * completion, failure, cancellation, and size queries.\n */\nexport class QueueIntegration extends BaseIntegration {\n /** Map from queue name to ordered list of job IDs */\n private queues: Map<string, string[]> = new Map();\n\n /** Map from job ID to job data */\n private jobs: Map<string, QueueJob> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Queue integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'enqueue':\n data = await this.executeWithRetry(() => this.enqueue(params));\n break;\n case 'dequeue':\n data = await this.executeWithRetry(() => this.dequeue(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'complete':\n data = await this.executeWithRetry(() => this.complete(params));\n break;\n case 'fail':\n data = await this.executeWithRetry(() => this.failJob(params));\n break;\n case 'cancel':\n data = await this.executeWithRetry(() => this.cancel(params));\n break;\n case 'size':\n data = await this.executeWithRetry(() => this.size(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a unique job identifier. */\n private generateJobId(): string {\n return `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /** Get or create the queue array for a given queue name. */\n private getQueue(name: string): string[] {\n let queue = this.queues.get(name);\n if (!queue) {\n queue = [];\n this.queues.set(name, queue);\n }\n return queue;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async enqueue(\n params: IntegrationParams,\n ): Promise<{ jobId: string; position: number }> {\n const queueName = params.queue as string;\n const payload = params.payload;\n const delay = (params.delay as number | undefined) ?? 0;\n const priority = (params.priority as number | undefined) ?? 0;\n\n this.logger.debug('Queue ENQUEUE', { queue: queueName, delay, priority });\n\n const jobId = this.generateJobId();\n const job: QueueJob = {\n id: jobId,\n queue: queueName,\n payload,\n priority,\n status: 'pending',\n enqueuedAt: Date.now(),\n delay,\n };\n\n this.jobs.set(jobId, job);\n\n const queue = this.getQueue(queueName);\n\n // Insert respecting priority (higher priority = earlier in queue)\n let insertIndex = queue.length;\n for (let i = 0; i < queue.length; i++) {\n const existingJob = this.jobs.get(queue[i]);\n if (existingJob && existingJob.priority < priority) {\n insertIndex = i;\n break;\n }\n }\n queue.splice(insertIndex, 0, jobId);\n\n return { jobId, position: insertIndex };\n }\n\n private async dequeue(\n params: IntegrationParams,\n ): Promise<{ job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue DEQUEUE', { queue: queueName });\n\n const queue = this.getQueue(queueName);\n const now = Date.now();\n\n // Find first pending job whose delay has elapsed\n for (let i = 0; i < queue.length; i++) {\n const job = this.jobs.get(queue[i]);\n if (!job || job.status !== 'pending') continue;\n\n const readyAt = job.enqueuedAt + job.delay;\n if (now < readyAt) continue;\n\n // Mark as processing and remove from queue\n job.status = 'processing';\n queue.splice(i, 1);\n\n return {\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n return { job: null };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{ status: JobStatus; job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue STATUS', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job) {\n return { status: 'pending', job: null };\n }\n\n return {\n status: job.status,\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n private async complete(\n params: IntegrationParams,\n ): Promise<{ completed: boolean }> {\n const jobId = params.jobId as string;\n const result = params.result;\n\n this.logger.debug('Queue COMPLETE', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { completed: false };\n }\n\n job.status = 'completed';\n job.result = result;\n return { completed: true };\n }\n\n private async failJob(\n params: IntegrationParams,\n ): Promise<{ failed: boolean }> {\n const jobId = params.jobId as string;\n const error = params.error as string | undefined;\n\n this.logger.debug('Queue FAIL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { failed: false };\n }\n\n job.status = 'failed';\n job.error = error;\n return { failed: true };\n }\n\n private async cancel(\n params: IntegrationParams,\n ): Promise<{ cancelled: boolean }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue CANCEL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'pending') {\n return { cancelled: false };\n }\n\n // Remove from queue\n const queue = this.queues.get(job.queue);\n if (queue) {\n const idx = queue.indexOf(jobId);\n if (idx !== -1) {\n queue.splice(idx, 1);\n }\n }\n\n this.jobs.delete(jobId);\n return { cancelled: true };\n }\n\n private async size(\n params: IntegrationParams,\n ): Promise<{ size: number; pending: number; processing: number }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue SIZE', { queue: queueName });\n\n let pending = 0;\n let processing = 0;\n\n for (const job of this.jobs.values()) {\n if (job.queue !== queueName) continue;\n if (job.status === 'pending') pending++;\n if (job.status === 'processing') processing++;\n }\n\n return { size: pending + processing, pending, processing };\n }\n}\n\n// Auto-register\nregisterIntegration('queue', QueueIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** In-memory span representation */\ninterface Span {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n events: Array<{ name: string; timestamp: number; attributes?: IntegrationParams }>;\n}\n\n/** Shape of a stored metric */\ninterface Metric {\n name: string;\n type: 'counter' | 'gauge' | 'histogram';\n value: number;\n values: number[];\n labels: IntegrationParams;\n}\n\n/** Generate a random hex id of the given byte-length. */\nfunction randomHexId(bytes: number): string {\n const arr: string[] = [];\n for (let i = 0; i < bytes; i++) {\n arr.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return arr.join('');\n}\n\n/**\n * OpenTelemetry integration with in-memory backend.\n *\n * Tracks spans and metrics internally for development and testing purposes.\n * No actual OpenTelemetry SDK dependency is required.\n */\nexport class OtelIntegration extends BaseIntegration {\n private spans: Map<string, Span> = new Map();\n private metrics: Map<string, Metric> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OTel integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'startSpan':\n data = await this.executeWithRetry(() => this.startSpan(params));\n break;\n case 'endSpan':\n data = await this.executeWithRetry(() => this.endSpan(params));\n break;\n case 'addEvent':\n data = await this.executeWithRetry(() => this.addEvent(params));\n break;\n case 'recordMetric':\n data = await this.executeWithRetry(() => this.recordMetric(params));\n break;\n case 'getSpan':\n data = await this.executeWithRetry(() => this.getSpan(params));\n break;\n case 'getMetrics':\n data = await this.executeWithRetry(() => this.getAllMetrics());\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async startSpan(\n params: IntegrationParams,\n ): Promise<{ spanId: string; traceId: string }> {\n const name = params.name as string;\n const attributes = (params.attributes as IntegrationParams | undefined) ?? {};\n const spanId = randomHexId(8);\n const traceId = (params.traceId as string | undefined) ?? randomHexId(16);\n\n const span: Span = {\n spanId,\n traceId,\n name,\n startTime: Date.now(),\n attributes,\n events: [],\n };\n\n this.spans.set(spanId, span);\n this.logger.debug('Span started', { spanId, traceId, name });\n\n return { spanId, traceId };\n }\n\n private async endSpan(\n params: IntegrationParams,\n ): Promise<{ ended: boolean }> {\n const spanId = params.spanId as string;\n const status = params.status as 'ok' | 'error' | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('endSpan called for unknown span', { spanId });\n return { ended: false };\n }\n\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n }\n\n this.logger.debug('Span ended', { spanId, status, duration: span.endTime - span.startTime });\n return { ended: true };\n }\n\n private async addEvent(\n params: IntegrationParams,\n ): Promise<{ added: boolean }> {\n const spanId = params.spanId as string;\n const name = params.name as string;\n const attributes = params.attributes as IntegrationParams | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('addEvent called for unknown span', { spanId });\n return { added: false };\n }\n\n span.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n\n this.logger.debug('Event added to span', { spanId, eventName: name });\n return { added: true };\n }\n\n private async recordMetric(\n params: IntegrationParams,\n ): Promise<{ recorded: boolean }> {\n const name = params.name as string;\n const value = params.value as number;\n const type = (params.type as 'counter' | 'gauge' | 'histogram' | undefined) ?? 'counter';\n const labels = (params.labels as IntegrationParams | undefined) ?? {};\n\n const existing = this.metrics.get(name);\n\n if (existing) {\n switch (type) {\n case 'counter':\n existing.value += value;\n break;\n case 'gauge':\n existing.value = value;\n break;\n case 'histogram':\n existing.values.push(value);\n break;\n }\n existing.labels = labels;\n } else {\n this.metrics.set(name, {\n name,\n type,\n value: type === 'histogram' ? 0 : value,\n values: type === 'histogram' ? [value] : [],\n labels,\n });\n }\n\n this.logger.debug('Metric recorded', { name, value, type });\n return { recorded: true };\n }\n\n private async getSpan(\n params: IntegrationParams,\n ): Promise<Span | null> {\n const spanId = params.spanId as string;\n const span = this.spans.get(spanId);\n return span ?? null;\n }\n\n private async getAllMetrics(): Promise<Record<string, Metric>> {\n const result: Record<string, Metric> = {};\n for (const [key, metric] of this.metrics) {\n result[key] = metric;\n }\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('otel', OtelIntegration);\n","import * as oidc from 'openid-client';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Supported OAuth providers */\ntype OAuthProvider = 'google' | 'github' | 'auth0';\n\n/** Mock provider authorization endpoints */\nconst PROVIDER_AUTH_URLS: Record<OAuthProvider, string> = {\n google: 'https://accounts.google.com/o/oauth2/v2/auth',\n github: 'https://github.com/login/oauth/authorize',\n auth0: 'https://auth.example.com/authorize',\n};\n\n/** Default OIDC issuer per provider (Google Workspace first — W4 decision). */\nconst PROVIDER_ISSUERS: Partial<Record<OAuthProvider, string>> = {\n google: 'https://accounts.google.com',\n};\n\n/** Stored token set */\ninterface TokenSet {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n}\n\n/** Mock user profile */\ninterface UserInfo {\n sub: string;\n email: string;\n name: string;\n picture: string;\n}\n\n/** Server-held per-authorization state (never leaves the process). */\ninterface PendingAuthorization {\n provider: OAuthProvider;\n redirectUri: string;\n pkceVerifier: string;\n}\n\n/**\n * Where pending OIDC authorizations (PKCE verifier, redirect URI) live\n * between `authorize` and `token`. The in-memory default works single-\n * instance; a multi-instance deployment injects a shared-store impl (the\n * FirestoreCredentialPersistence structural pattern) via\n * `installPendingGrantStore` — no sticky routing needed once it does.\n * `take` is single-use: it returns AND removes, so a state token can never\n * be replayed. `sweep` drops expired grants.\n */\nexport interface PendingGrantStore {\n put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void>;\n take(state: string): Promise<PendingAuthorization | null>;\n sweep(): Promise<void>;\n}\n\nconst PENDING_GRANT_TTL_MS = 10 * 60 * 1000;\n\nexport class InMemoryPendingGrantStore implements PendingGrantStore {\n private readonly grants = new Map<string, { grant: PendingAuthorization; expiresAt: number }>();\n\n async put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void> {\n this.grants.set(state, { grant, expiresAt: Date.now() + ttlMs });\n }\n\n async take(state: string): Promise<PendingAuthorization | null> {\n const entry = this.grants.get(state);\n if (!entry) return null;\n this.grants.delete(state);\n return entry.expiresAt >= Date.now() ? entry.grant : null;\n }\n\n async sweep(): Promise<void> {\n const now = Date.now();\n for (const [state, entry] of this.grants) {\n if (entry.expiresAt < now) this.grants.delete(state);\n }\n }\n}\n\nlet installedPendingGrantStore: PendingGrantStore | null = null;\n\n/** Install a shared pending-grant store (multi-instance hosts); null resets to in-memory. */\nexport function installPendingGrantStore(store: PendingGrantStore | null): void {\n installedPendingGrantStore = store;\n}\n\n/**\n * OAuth2/OIDC integration.\n *\n * Two backends behind one contract:\n * - **OIDC (production)** — `openid-client` against a discovered issuer\n * (default Google; override via `OIDC_ISSUER_URL`), authorization-code +\n * PKCE, real token exchange / refresh / revocation / userinfo. Selected\n * whenever `OAUTH_CLIENT_ID` + `OAUTH_CLIENT_SECRET` are configured and\n * `OAUTH_MODE` is not `mock`.\n * - **Mock (dev/tests)** — the original in-memory backend, kept verbatim\n * behind `OAUTH_MODE=mock` (or absent client credentials) so existing\n * tests and offline dev flows are untouched.\n *\n * Pending-authorization state (PKCE verifier, redirect URI) lives in a\n * `PendingGrantStore` — in-memory by default (single instance), injectable\n * via `installPendingGrantStore` for multi-instance deployments (a shared\n * store replaces the old sticky-routing requirement). Grants are TTL-bound\n * and single-use.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending MOCK authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set (mock backend) */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups (mock backend) */\n private refreshIndex: Map<string, string> = new Map();\n\n /** Maps access token -> mock user session */\n private sessions: Map<string, UserInfo> = new Map();\n\n /** Pending OIDC authorizations (real backend) — injectable, in-memory default. */\n private readonly fallbackPending = new InMemoryPendingGrantStore();\n\n private pendingStore(): PendingGrantStore {\n return installedPendingGrantStore ?? this.fallbackPending;\n }\n\n /** Maps access token -> ID-token subject, for userinfo subject checks */\n private subjects: Map<string, string> = new Map();\n\n /** Discovered issuer configurations, keyed by issuer URL */\n private discovered: Map<string, oidc.Configuration> = new Map();\n\n private readonly real: boolean;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.real =\n config.env.OAUTH_MODE !== 'mock' &&\n Boolean(config.env.OAUTH_CLIENT_ID) &&\n Boolean(config.env.OAUTH_CLIENT_SECRET);\n this.logger.info(\n this.real\n ? 'OAuth integration initialized (OIDC backend via openid-client)'\n : 'OAuth integration initialized (mock backend)',\n );\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'authorize':\n data = await this.executeWithRetry(() => (this.real ? this.oidcAuthorize(params) : this.authorize(params)));\n break;\n case 'token':\n data = await this.executeWithRetry(() => (this.real ? this.oidcToken(params) : this.token(params)));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRefresh(params) : this.refresh(params)));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRevoke(params) : this.revoke(params)));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => (this.real ? this.oidcUserinfo(params) : this.userinfo(params)));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // OIDC backend (openid-client)\n // ---------------------------------------------------------------------------\n\n private issuerFor(provider: OAuthProvider): string {\n const configured = this.config.env.OIDC_ISSUER_URL;\n if (configured) return configured;\n const issuer = PROVIDER_ISSUERS[provider];\n if (!issuer) {\n throw new Error(\n `Provider \"${provider}\" has no OIDC issuer — set OIDC_ISSUER_URL to an OIDC-compliant issuer, or use OAUTH_MODE=mock`,\n );\n }\n return issuer;\n }\n\n private async configurationFor(provider: OAuthProvider): Promise<oidc.Configuration> {\n const issuer = this.issuerFor(provider);\n const cached = this.discovered.get(issuer);\n if (cached) return cached;\n const configuration = await oidc.discovery(\n new URL(issuer),\n this.config.env.OAUTH_CLIENT_ID,\n this.config.env.OAUTH_CLIENT_SECRET,\n );\n this.discovered.set(issuer, configuration);\n return configuration;\n }\n\n private async oidcAuthorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = (params.redirectUri as string) || this.config.env.OAUTH_REDIRECT_URI;\n\n const configuration = await this.configurationFor(provider);\n const state = oidc.randomState();\n const pkceVerifier = oidc.randomPKCECodeVerifier();\n const codeChallenge = await oidc.calculatePKCECodeChallenge(pkceVerifier);\n\n const parameters: Record<string, string> = {\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n };\n // Google issues a refresh token only for offline-consented requests.\n if (provider === 'google') {\n parameters.access_type = 'offline';\n parameters.prompt = 'consent';\n }\n\n const authUrl = oidc.buildAuthorizationUrl(configuration, parameters);\n await this.pendingStore().put(state, { provider, redirectUri, pkceVerifier }, PENDING_GRANT_TTL_MS);\n void this.pendingStore().sweep();\n return { authUrl: authUrl.toString(), state };\n }\n\n private async oidcToken(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' }> {\n const code = params.code as string;\n const state = params.state as string;\n\n const pendingAuth = await this.pendingStore().take(state);\n if (!pendingAuth) {\n throw new Error(`Invalid or expired state token: ${state}`);\n }\n\n const configuration = await this.configurationFor(pendingAuth.provider);\n const callbackUrl = new URL(pendingAuth.redirectUri);\n callbackUrl.searchParams.set('code', code);\n callbackUrl.searchParams.set('state', state);\n\n const tokens = await oidc.authorizationCodeGrant(configuration, callbackUrl, {\n expectedState: state,\n pkceCodeVerifier: pendingAuth.pkceVerifier,\n });\n\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? '',\n expiresIn: tokens.expires_in ?? 3600,\n tokenType: 'bearer',\n };\n }\n\n private async oidcRefresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n const configuration = await this.configurationFor('google');\n\n const tokens = await oidc.refreshTokenGrant(configuration, refreshToken);\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n return {\n accessToken: tokens.access_token,\n expiresIn: tokens.expires_in ?? 3600,\n };\n }\n\n private async oidcRevoke(params: IntegrationParams): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n const configuration = await this.configurationFor('google');\n await oidc.tokenRevocation(configuration, token);\n this.subjects.delete(token);\n return { revoked: true };\n }\n\n private async oidcUserinfo(params: IntegrationParams): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n const configuration = await this.configurationFor('google');\n const subject = this.subjects.get(accessToken);\n const info = await oidc.fetchUserInfo(\n configuration,\n accessToken,\n subject ?? oidc.skipSubjectCheck,\n );\n return {\n sub: info.sub,\n email: typeof info.email === 'string' ? info.email : '',\n name: typeof info.name === 'string' ? info.name : '',\n picture: typeof info.picture === 'string' ? info.picture : '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex token of the given byte length. */\n private generateToken(bytes: number = 32): string {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < bytes * 2; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n }\n\n /** Generate a mock user profile from a provider and access token. */\n private generateMockUser(provider: OAuthProvider, sub: string): UserInfo {\n return {\n sub,\n email: `user-${sub.slice(0, 8)}@${provider}.example.com`,\n name: `Mock User (${provider})`,\n picture: `https://${provider}.example.com/avatar/${sub.slice(0, 8)}.png`,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend actions\n // ---------------------------------------------------------------------------\n\n private async authorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = params.redirectUri as string;\n\n this.logger.debug('OAuth AUTHORIZE', { provider, scopes: scopes.join(', '), redirectUri });\n\n const state = this.generateToken(16);\n this.states.set(state, provider);\n\n const baseUrl = PROVIDER_AUTH_URLS[provider];\n const queryParams = new URLSearchParams({\n response_type: 'code',\n scope: scopes.join(' '),\n redirect_uri: redirectUri,\n state,\n client_id: this.config.env.CLIENT_ID ?? 'mock-client-id',\n });\n\n const authUrl = `${baseUrl}?${queryParams.toString()}`;\n\n return { authUrl, state };\n }\n\n private async token(\n params: IntegrationParams,\n ): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n tokenType: 'bearer';\n }> {\n const code = params.code as string;\n const state = params.state as string;\n\n this.logger.debug('OAuth TOKEN', { code, state });\n\n const provider = this.states.get(state);\n if (!provider) {\n throw new Error(\n `Invalid or expired state token: ${state}`,\n );\n }\n\n // Consume the state (one-time use)\n this.states.delete(state);\n\n const accessToken = this.generateToken(32);\n const refreshToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(accessToken, tokenSet);\n this.refreshIndex.set(refreshToken, accessToken);\n\n // Generate and store a mock user session\n const sub = this.generateToken(8);\n this.sessions.set(accessToken, this.generateMockUser(provider, sub));\n\n return { accessToken, refreshToken, expiresIn, tokenType: 'bearer' };\n }\n\n private async refresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n\n this.logger.debug('OAuth REFRESH', { refreshToken: refreshToken.slice(0, 8) + '...' });\n\n const oldAccessToken = this.refreshIndex.get(refreshToken);\n if (!oldAccessToken) {\n throw new Error('Invalid refresh token');\n }\n\n // Carry over user session to the new access token\n const userInfo = this.sessions.get(oldAccessToken);\n\n // Clean up old access token\n this.tokens.delete(oldAccessToken);\n this.sessions.delete(oldAccessToken);\n\n // Issue new access token\n const newAccessToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken: newAccessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(newAccessToken, tokenSet);\n this.refreshIndex.set(refreshToken, newAccessToken);\n\n if (userInfo) {\n this.sessions.set(newAccessToken, userInfo);\n }\n\n return { accessToken: newAccessToken, expiresIn };\n }\n\n private async revoke(\n params: IntegrationParams,\n ): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n\n this.logger.debug('OAuth REVOKE', { token: token.slice(0, 8) + '...' });\n\n // Check if it is an access token\n const tokenSet = this.tokens.get(token);\n if (tokenSet) {\n this.refreshIndex.delete(tokenSet.refreshToken);\n this.tokens.delete(token);\n this.sessions.delete(token);\n return { revoked: true };\n }\n\n // Check if it is a refresh token\n const accessToken = this.refreshIndex.get(token);\n if (accessToken) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n this.refreshIndex.delete(token);\n return { revoked: true };\n }\n\n return { revoked: false };\n }\n\n private async userinfo(\n params: IntegrationParams,\n ): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n\n this.logger.debug('OAuth USERINFO', { accessToken: accessToken.slice(0, 8) + '...' });\n\n const tokenSet = this.tokens.get(accessToken);\n if (!tokenSet) {\n throw new Error('Invalid access token');\n }\n\n if (Date.now() > tokenSet.expiresAt) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n throw new Error('Access token expired');\n }\n\n const userInfo = this.sessions.get(accessToken);\n if (!userInfo) {\n throw new Error('No session found for access token');\n }\n\n return userInfo;\n }\n}\n\n// Auto-register\nregisterIntegration('oauth', OAuthIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport { IntegrationError, type IntegrationConfig, type IntegrationResult, type IntegrationParams } from '../../types';\nimport type { IntegrationCallContext } from '../../factory';\nimport { registerIntegration } from '../../registry';\nimport {\n getActiveFactory,\n getInstalledCredentialStore,\n resolveCredentialRef,\n} from '../../credentials';\nimport { serviceCredentials, serviceProbes, type IntegrationName } from '../../contracts';\n\n/** Env-var name shape accepted for the `database` connectionRef exception. */\nconst ENV_VAR_NAME = /^[A-Z][A-Z0-9_]*$/;\n\n/** Write/probe actions require an admin-role caller; `list` stays open (masked last-4 only). */\nconst ROLE_GATED_ACTIONS = new Set(['set', 'remove', 'test', 'rotate']);\n\nconst DEFAULT_ADMIN_ROLES = ['admin', 'owner'];\n\ninterface CredentialListEntry {\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n}\n\nfunction isProbeService(service: string): service is IntegrationName {\n return service in serviceProbes;\n}\n\n/**\n * The hosted credential store's service surface (W4 Tier C) — what the\n * Owner-gated Integrations settings page calls through the NORMAL\n * call-service path (server-side only; organisms own the access policy,\n * per the I-16 std-atom ACL constraint).\n *\n * Security contract: `list` returns masked entries only (last-4, never\n * plaintext); `set` accepts only env vars DECLARED in `serviceCredentials`\n * for the named service (plus well-formed connection refs for `database`),\n * so the page can never become an arbitrary env-injection surface; values\n * are never logged. `set`/`remove`/`test` additionally require the caller's\n * role (from IntegrationCallContext) to be in the admin list\n * (ALMADAR_CREDENTIAL_ADMIN_ROLES, default admin,owner) and FAIL CLOSED\n * without one — the un-bypassable twin of the organism-side page gate (I-25).\n */\nexport class CredentialsIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Credentials integration initialized (tenant credential store surface)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n if (ROLE_GATED_ACTIONS.has(action)) {\n const allowed = this.adminRoles();\n if (!context?.role || !allowed.includes(context.role)) {\n return {\n success: false,\n error: new IntegrationError(\n `forbidden: \"${action}\" requires one of roles: ${allowed.join(', ')}`,\n 'AUTH_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n }\n\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'list':\n data = this.list(typeof params.service === 'string' ? params.service : undefined);\n break;\n case 'set':\n data = await this.set(params.service as string, params.envVar as string, params.value as string);\n break;\n case 'remove':\n data = await this.remove(params.service as string, params.envVar as string);\n break;\n case 'test':\n data = await this.test(params.service as string, context);\n break;\n case 'rotate': {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n data = await store.rotate();\n break;\n }\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private adminRoles(): string[] {\n const raw = this.config.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || process.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || '';\n const roles = raw.split(',').map((r) => r.trim()).filter((r) => r.length > 0);\n return roles.length > 0 ? roles : DEFAULT_ADMIN_ROLES;\n }\n\n private declaredFor(service: string): { envVar: string; required: boolean; description: string }[] {\n return serviceCredentials[service] ?? [];\n }\n\n private assertSettable(service: string, envVar: string): void {\n if (service === 'database') {\n if (!ENV_VAR_NAME.test(envVar)) {\n throw new Error(`\"${envVar}\" is not a well-formed connection reference (expected an env-var name)`);\n }\n return;\n }\n const declared = this.declaredFor(service);\n if (declared.length === 0) {\n throw new Error(`Service \"${service}\" declares no credentials`);\n }\n if (!declared.some((c) => c.envVar === envVar)) {\n const valid = declared.map((c) => c.envVar).join(', ');\n throw new Error(`\"${envVar}\" is not a declared credential of \"${service}\" (declared: ${valid})`);\n }\n }\n\n private storeFirst(): boolean {\n const flag = this.config.env['ALMADAR_CREDENTIALS_SOURCE'] || process.env['ALMADAR_CREDENTIALS_SOURCE'];\n return flag === 'store';\n }\n\n private list(serviceFilter?: string): { enabled: boolean; entries: CredentialListEntry[] } {\n const store = getInstalledCredentialStore();\n const stored = new Map((store?.entries() ?? []).map((e) => [`${e.service}\\u0000${e.envVar}`, e]));\n const entries: CredentialListEntry[] = [];\n for (const [service, declared] of Object.entries(serviceCredentials)) {\n if (serviceFilter && service !== serviceFilter) continue;\n for (const { envVar, required, description } of declared) {\n const fromStore = stored.get(`${service}\\u0000${envVar}`);\n stored.delete(`${service}\\u0000${envVar}`);\n // Store-first (I-31): declared refs resolve ONLY through the store, so\n // an env-only value reports 'none' — never a source the runtime won't use.\n const fromEnv = this.storeFirst() ? undefined : process.env[envVar];\n const source: CredentialListEntry['source'] = fromStore ? 'store' : fromEnv ? 'env' : 'none';\n entries.push({\n service,\n envVar,\n required,\n description,\n configured: source !== 'none',\n source,\n last4: fromStore ? fromStore.last4 : fromEnv ? fromEnv.slice(-4) : '',\n });\n }\n }\n // Stored rows outside the declared tables (database connection refs).\n for (const e of stored.values()) {\n if (serviceFilter && e.service !== serviceFilter) continue;\n entries.push({\n service: e.service,\n envVar: e.envVar,\n required: false,\n description: 'Stored connection reference',\n configured: true,\n source: 'store',\n last4: e.last4,\n });\n }\n return { enabled: store?.enabled ?? false, entries };\n }\n\n private async set(\n service: string,\n envVar: string,\n value: string,\n ): Promise<{ saved: boolean; service: string; envVar: string; last4: string }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host — set credentials via the environment');\n }\n this.assertSettable(service, envVar);\n const entry = await store.set(service, envVar, value);\n return { saved: true, service, envVar, last4: entry.last4 };\n }\n\n private async remove(service: string, envVar: string): Promise<{ removed: boolean }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n this.assertSettable(service, envVar);\n return { removed: await store.remove(envVar) };\n }\n\n private async test(service: string, context?: IntegrationCallContext): Promise<{\n service: string;\n configured: boolean;\n missing: string[];\n probed: boolean;\n ok: boolean;\n message: string;\n }> {\n const declared = this.declaredFor(service);\n const missing = declared\n .filter((c) => c.required && !resolveCredentialRef(c.envVar))\n .map((c) => c.envVar);\n const configured = missing.length === 0;\n if (!configured) {\n return { service, configured, missing, probed: false, ok: false, message: `Missing required credentials: ${missing.join(', ')}` };\n }\n\n const factory = getActiveFactory();\n const probe = isProbeService(service) ? serviceProbes[service] : undefined;\n if (!factory || !probe) {\n return { service, configured, missing, probed: false, ok: true, message: 'Credentials present (no live probe declared for this service)' };\n }\n if (!factory.isConfigured(service)) {\n return { service, configured, missing, probed: false, ok: false, message: 'Credentials present but the service is not configured on this host — restart or re-save a credential' };\n }\n const result = await factory.execute(service, probe.action, probe.params as IntegrationParams, context);\n if (!result.success) {\n return { service, configured, missing, probed: true, ok: false, message: result.error?.message ?? `Probe ${probe.action} failed` };\n }\n const echoed = result.data !== null && typeof result.data === 'object' && '_mock' in result.data;\n if (echoed) {\n return { service, configured, missing, probed: false, ok: false, message: 'Probe was mock-echoed — the service is not actually configured' };\n }\n return { service, configured, missing, probed: true, ok: true, message: `Probe ${probe.action} succeeded` };\n }\n}\n\n// Auto-register\nregisterIntegration('credentials', CredentialsIntegration);\n","import { createHash } from 'node:crypto';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n ListObjectsV2Command,\n type ObjectCannedACL,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl as s3GetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored object in the in-memory store */\ninterface StoredObject {\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n lastModified: number;\n etag: string;\n}\n\ninterface UploadResult {\n key: string;\n bucket: string;\n size: number;\n etag: string;\n /** Mirror of `key` — the field the .lolo upload consumers read. */\n id: string;\n /** Public (acl: public) or signed GET address of the uploaded object. */\n url: string;\n}\n\n/** The file-form upload payload (UploadDropZone emit shape). */\ninterface UploadFilePayload {\n name: string;\n size: number;\n type: string;\n /** base64 data URL (`data:<mime>;base64,...`) or raw base64. */\n content?: string;\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toFilePayload(value: IntegrationParamValue | undefined): UploadFilePayload | null {\n if (!isParamRecord(value)) return null;\n const { name, size, type, content } = value;\n if (typeof name !== 'string') return null;\n return {\n name,\n size: typeof size === 'number' ? size : 0,\n type: typeof type === 'string' ? type : 'application/octet-stream',\n content: typeof content === 'string' ? content : undefined,\n };\n}\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Object storage integration — real S3-compatible backend (AWS S3, R2, MinIO,\n * …) when `STORAGE_ACCESS_KEY_ID`/`STORAGE_SECRET_ACCESS_KEY` are configured,\n * in-memory simulation otherwise. Production REFUSES the in-memory fallback:\n * a missing credential must fail loudly, never simulate success (D-3).\n *\n * `upload` admits two shapes: the canonical `{ key, content }` pair and the\n * file-form `{ file: { name, size, type, content }, acl?, maxSize? }` that\n * lolo authors wire from UploadDropZone. The result carries `id`/`url`\n * alongside `key` — the fields the .lolo consumers read.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n private s3: S3Client | null = null;\n private defaultBucket: string;\n private publicUrlBase: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.defaultBucket = config.env.STORAGE_BUCKET || '';\n this.publicUrlBase = config.env.STORAGE_PUBLIC_URL_BASE || '';\n\n const accessKeyId = config.env.STORAGE_ACCESS_KEY_ID || '';\n const secretAccessKey = config.env.STORAGE_SECRET_ACCESS_KEY || '';\n if (accessKeyId && secretAccessKey) {\n const endpoint = config.env.STORAGE_ENDPOINT || undefined;\n this.s3 = new S3Client({\n region: config.env.STORAGE_REGION || 'us-east-1',\n endpoint,\n // Path-style is what MinIO/R2-style endpoints expect.\n forcePathStyle: Boolean(endpoint),\n credentials: { accessKeyId, secretAccessKey },\n });\n this.logger.info('Storage integration initialized (S3 backend)', {\n endpoint: endpoint ?? 'aws',\n bucket: this.defaultBucket,\n });\n } else {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'Storage credentials missing in production (STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEY) — refusing the in-memory fallback. See SECRETS.md.',\n );\n }\n this.logger.warn('Storage integration initialized (in-memory backend — dev only, nothing persists)');\n }\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'upload':\n data = await this.executeWithRetry(() => this.upload(params));\n break;\n case 'uploadMany':\n data = await this.executeWithRetry(() => this.uploadMany(params));\n break;\n case 'download':\n data = await this.executeWithRetry(() => this.download(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteObject(params));\n break;\n case 'getSignedUrl':\n data = await this.executeWithRetry(() => this.getSignedUrl(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private bucketOf(params: IntegrationParams): string {\n return (params.bucket as string) || this.defaultBucket;\n }\n\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n private generateEtag(bytes: Buffer): string {\n return `\"${createHash('md5').update(bytes).digest('hex')}\"`;\n }\n\n /** Resolve the upload inputs from either admitted shape. */\n private resolveUpload(params: IntegrationParams): {\n key: string;\n bytes: Buffer;\n contentType: string;\n acl: ObjectCannedACL | undefined;\n } {\n const file = toFilePayload(params.file);\n if (file) {\n const maxSize = typeof params.maxSize === 'number' ? params.maxSize : 0;\n if (maxSize > 0 && file.size > maxSize) {\n throw new Error(`Upload rejected: ${file.name} is ${file.size} bytes (max ${maxSize})`);\n }\n if (!file.content) {\n throw new Error(\n `Upload rejected: file payload for '${file.name}' carries no content — the uploader must include the base64 data URL`,\n );\n }\n const { bytes, contentType } = decodeContent(file.content);\n // Timestamped key keeps concurrent uploads of a same-named file distinct.\n const safeName = file.name.replace(/[^A-Za-z0-9._-]/g, '_');\n return {\n key: `${Date.now()}-${safeName}`,\n bytes,\n contentType: contentType ?? file.type,\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n const key = params.key as string | undefined;\n const content = params.content;\n if (!key || content === undefined || content === null) {\n throw new Error('upload requires either `file` (with content) or the `key` + `content` pair');\n }\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n const { bytes, contentType } = decodeContent(raw);\n return {\n key,\n bytes,\n contentType: (params.contentType as string) || contentType || 'application/octet-stream',\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n private publicUrl(bucket: string, key: string): string {\n if (this.publicUrlBase) {\n return `${this.publicUrlBase.replace(/\\/$/, '')}/${key}`;\n }\n const endpoint = this.config.env.STORAGE_ENDPOINT;\n if (endpoint) {\n return `${endpoint.replace(/\\/$/, '')}/${bucket}/${key}`;\n }\n const region = this.config.env.STORAGE_REGION || 'us-east-1';\n return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(params: IntegrationParams): Promise<UploadResult> {\n const bucket = this.bucketOf(params);\n const { key, bytes, contentType, acl } = this.resolveUpload(params);\n const etag = this.generateEtag(bytes);\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType, size: bytes.length });\n\n if (this.s3) {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: bytes,\n ContentType: contentType,\n ACL: acl,\n }),\n );\n } else {\n this.objects.set(this.compositeKey(bucket, key), {\n content: bytes.toString('base64'),\n contentType,\n size: bytes.length,\n metadata: (params.metadata as IntegrationParams | undefined) ?? {},\n lastModified: Date.now(),\n etag,\n });\n }\n\n // In-memory (no-credentials) mode: the bytes live only in this process, so\n // a fabricated S3/signed address is a DEAD link — every uploaded image\n // renders broken in the playground. A data: URL is the only address that\n // resolves to the actual bytes; consumers persist it and <img>/download\n // chips read it directly. Real-credential paths are unchanged.\n const url = this.s3\n ? acl === 'public-read'\n ? this.publicUrl(bucket, key)\n : (await this.signUrl(bucket, key, 'get', 3600)).url\n : `data:${contentType};base64,${bytes.toString('base64')}`;\n\n return { key, bucket, size: bytes.length, etag, id: key, url };\n }\n\n /**\n * Upload a whole UploadDropZone batch in one action — the FSM-friendly\n * shape for multi-file atoms (std-image-upload-multi): one call-service\n * arm in, one bulk-persistable `items` array out. Each item carries\n * id/url plus the name/sizeBytes/mimeType columns an uploaded-file row\n * declares.\n */\n private async uploadMany(params: IntegrationParams): Promise<{\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n }> {\n const rawFiles = Array.isArray(params.files) ? params.files : [];\n const files = rawFiles\n .map((f) => toFilePayload(f))\n .filter((f): f is UploadFilePayload => f !== null);\n if (files.length === 0) {\n throw new Error('uploadMany requires a non-empty `files` array (UploadDropZone batch shape)');\n }\n const items = [];\n for (const file of files) {\n const result = await this.upload({\n bucket: params.bucket,\n file: { name: file.name, size: file.size, type: file.type, content: file.content },\n acl: params.acl,\n maxSize: params.maxSize,\n });\n items.push({\n id: result.id,\n key: result.key,\n url: result.url,\n name: file.name,\n sizeBytes: file.size,\n mimeType: file.type,\n });\n }\n return { items, count: items.length };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{ content: string; contentType: string; size: number; metadata: IntegrationParams }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n if (this.s3) {\n const response = await this.s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));\n const bytes = Buffer.from(await response.Body!.transformToByteArray());\n return {\n content: bytes.toString('base64'),\n contentType: response.ContentType ?? 'application/octet-stream',\n size: bytes.length,\n metadata: {},\n };\n }\n\n const obj = this.objects.get(this.compositeKey(bucket, key));\n if (!obj) {\n throw new Error(`Object not found: ${bucket}/${key}`);\n }\n return {\n content: String(obj.content),\n contentType: obj.contentType,\n size: obj.size,\n metadata: obj.metadata,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{ keys: Array<{ key: string; size: number; lastModified: number }>; truncated: boolean; nextToken?: string }> {\n const bucket = this.bucketOf(params);\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n const continuationToken = params.continuationToken as string | undefined;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n if (this.s3) {\n const response = await this.s3.send(\n new ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix || undefined,\n MaxKeys: maxKeys,\n ContinuationToken: continuationToken,\n }),\n );\n return {\n keys: (response.Contents ?? []).map((entry) => ({\n key: entry.Key ?? '',\n size: entry.Size ?? 0,\n lastModified: entry.LastModified?.getTime() ?? 0,\n })),\n truncated: Boolean(response.IsTruncated),\n ...(response.IsTruncated && response.NextContinuationToken !== undefined\n ? { nextToken: response.NextContinuationToken }\n : {}),\n };\n }\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n results.push({\n key: compositeKey.slice(bucketPrefix.length),\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n results.sort((a, b) => a.key.localeCompare(b.key));\n // Dev backend: the token is a plain offset into the sorted listing.\n const offset = continuationToken !== undefined ? Number.parseInt(continuationToken, 10) || 0 : 0;\n const page = results.slice(offset, offset + maxKeys);\n const truncated = offset + maxKeys < results.length;\n return {\n keys: page,\n truncated,\n ...(truncated ? { nextToken: String(offset + maxKeys) } : {}),\n };\n }\n\n private async deleteObject(params: IntegrationParams): Promise<{ deleted: boolean }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n if (this.s3) {\n await this.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));\n return { deleted: true };\n }\n\n const existed = this.objects.has(this.compositeKey(bucket, key));\n this.objects.delete(this.compositeKey(bucket, key));\n return { deleted: existed };\n }\n\n private async signUrl(\n bucket: string,\n key: string,\n operation: 'get' | 'put',\n expiresIn: number,\n ): Promise<{ url: string; expiresAt: number }> {\n const expiresAt = Date.now() + expiresIn * 1000;\n if (this.s3) {\n const command =\n operation === 'put'\n ? new PutObjectCommand({ Bucket: bucket, Key: key })\n : new GetObjectCommand({ Bucket: bucket, Key: key });\n const url = await s3GetSignedUrl(this.s3, command, { expiresIn });\n return { url, expiresAt };\n }\n const token = createHash('sha256').update(`${bucket}/${key}/${expiresAt}`).digest('hex').slice(0, 16);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host&X-Amz-Signature=${token}&operation=${operation}`;\n return { url, expiresAt };\n }\n\n private async getSignedUrl(params: IntegrationParams): Promise<{ url: string; expiresAt: number }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n const expiresIn = (params.expiresIn as number | undefined) ?? 3600;\n const operation = (params.operation as 'get' | 'put' | undefined) ?? 'get';\n this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n return this.signUrl(bucket, key, operation, expiresIn);\n }\n}\n\n// Auto-register\nregisterIntegration('storage', StorageIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Represents a container in the in-memory store */\ninterface SimulatedContainer {\n id: string;\n name: string;\n image: string;\n status: 'created' | 'running' | 'paused' | 'exited' | 'dead';\n ports: Array<{ host: number; container: number; protocol: string }>;\n env: Record<string, string>;\n volumes: Array<{ host: string; container: string }>;\n command: string;\n labels: Record<string, string>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n logs: string[];\n}\n\n/** Represents a built image in the in-memory store */\ninterface SimulatedImage {\n id: string;\n tag: string;\n dockerfile: string;\n size: number;\n createdAt: number;\n}\n\n/**\n * Docker/Container integration with in-memory backend for development/testing.\n *\n * Provides container lifecycle operations (build, run, stop, remove, logs,\n * status, list) backed by an in-memory Map. No Docker SDK or daemon connection\n * is required.\n */\nexport class DockerIntegration extends BaseIntegration {\n private containers: Map<string, SimulatedContainer> = new Map();\n private images: Map<string, SimulatedImage> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const dockerHost = config.env.DOCKER_HOST;\n if (dockerHost) {\n this.logger.warn(\n 'DOCKER_HOST is configured but real Docker client is not yet implemented. ' +\n 'Falling back to in-memory simulation.',\n { dockerHost },\n );\n }\n\n this.logger.info('Docker integration initialized (in-memory simulation)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'build':\n data = await this.executeWithRetry(() => this.build(params));\n break;\n case 'run':\n data = await this.executeWithRetry(() => this.run(params));\n break;\n case 'stop':\n data = await this.executeWithRetry(() => this.stop(params));\n break;\n case 'remove':\n data = await this.executeWithRetry(() => this.removeContainer(params));\n break;\n case 'logs':\n data = await this.executeWithRetry(() => this.logs(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex container/image ID. */\n private generateId(): string {\n const segments: string[] = [];\n for (let i = 0; i < 16; i++) {\n segments.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return segments.join('');\n }\n\n /** Find a container by ID (prefix match supported). */\n private findContainer(containerId: string): SimulatedContainer | undefined {\n // Exact match first\n const exact = this.containers.get(containerId);\n if (exact) return exact;\n\n // Prefix match (like real Docker)\n for (const [id, container] of this.containers) {\n if (id.startsWith(containerId)) {\n return container;\n }\n }\n\n return undefined;\n }\n\n /** Generate realistic log lines for a container. */\n private generateLogLines(container: SimulatedContainer, count: number): string[] {\n const lines: string[] = [...container.logs];\n const baseTime = container.startedAt ?? container.createdAt;\n\n while (lines.length < count) {\n const ts = new Date(baseTime + lines.length * 1000).toISOString();\n lines.push(`${ts} [info] Container ${container.name} — heartbeat #${lines.length + 1}`);\n }\n\n return lines;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async build(\n params: IntegrationParams,\n ): Promise<{ imageId: string; tag: string; size: number; buildTime: number }> {\n const dockerfile = (params.dockerfile as string | undefined) ?? 'Dockerfile';\n const tag = params.tag as string;\n const context = (params.context as string | undefined) ?? '.';\n const buildArgs = (params.buildArgs as Record<string, string> | undefined) ?? {};\n\n this.logger.debug('Docker BUILD', { dockerfile, tag, context, buildArgs });\n\n const imageId = `sha256:${this.generateId()}`;\n const size = 150_000_000 + Math.floor(Math.random() * 350_000_000); // 150–500 MB\n const buildTime = 2000 + Math.floor(Math.random() * 8000); // 2–10s simulated\n\n const image: SimulatedImage = {\n id: imageId,\n tag,\n dockerfile,\n size,\n createdAt: Date.now(),\n };\n\n this.images.set(tag, image);\n\n return { imageId, tag, size, buildTime };\n }\n\n private async run(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n }> {\n const image = params.image as string;\n const name = (params.name as string | undefined) ?? `container-${this.generateId().slice(0, 12)}`;\n const rawPorts = (params.ports as Array<{ host: number; container: number; protocol?: string }> | undefined) ?? [];\n const env = (params.env as Record<string, string> | undefined) ?? {};\n const rawVolumes = (params.volumes as Array<{ host: string; container: string }> | undefined) ?? [];\n const command = (params.command as string | undefined) ?? '';\n\n this.logger.debug('Docker RUN', { image, name, ports: rawPorts.map(p => `${p.host}:${p.container}`).join(', '), volumes: rawVolumes.map(v => `${v.host}:${v.container}`).join(', '), command });\n\n const containerId = this.generateId();\n\n const ports = rawPorts.map((p) => ({\n host: p.host,\n container: p.container,\n protocol: p.protocol ?? 'tcp',\n }));\n\n const volumes = rawVolumes.map((v) => ({\n host: v.host,\n container: v.container,\n }));\n\n const container: SimulatedContainer = {\n id: containerId,\n name,\n image,\n status: 'running',\n ports,\n env,\n volumes,\n command,\n labels: {},\n createdAt: Date.now(),\n startedAt: Date.now(),\n stoppedAt: null,\n logs: [\n `${new Date().toISOString()} [info] Starting container ${name} from image ${image}`,\n `${new Date().toISOString()} [info] Container ${name} is now running`,\n ],\n };\n\n this.containers.set(containerId, container);\n\n return {\n containerId,\n name,\n status: container.status,\n ports,\n };\n }\n\n private async stop(\n params: IntegrationParams,\n ): Promise<{ containerId: string; status: string; stoppedAt: number }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STOP', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status !== 'running' && container.status !== 'paused') {\n throw new Error(`Container ${containerId} is not running (current status: ${container.status})`);\n }\n\n container.status = 'exited';\n container.stoppedAt = Date.now();\n container.logs.push(\n `${new Date().toISOString()} [info] Container ${container.name} stopped`,\n );\n\n return {\n containerId: container.id,\n status: container.status,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async removeContainer(\n params: IntegrationParams,\n ): Promise<{ containerId: string; removed: boolean }> {\n const containerId = params.containerId as string;\n const force = (params.force as boolean | undefined) ?? false;\n\n this.logger.debug('Docker REMOVE', { containerId, force });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status === 'running' && !force) {\n throw new Error(\n `Container ${containerId} is running. Stop it first or use force=true.`,\n );\n }\n\n this.containers.delete(container.id);\n\n return { containerId: container.id, removed: true };\n }\n\n private async logs(\n params: IntegrationParams,\n ): Promise<{ containerId: string; logs: string[]; lineCount: number }> {\n const containerId = params.containerId as string;\n const tail = (params.tail as number | undefined) ?? 100;\n const since = (params.since as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LOGS', { containerId, tail, since });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n let logLines = this.generateLogLines(container, tail);\n\n // Filter by since timestamp if provided\n if (since) {\n const sinceMs = new Date(since).getTime();\n logLines = logLines.filter((line) => {\n const timestampMatch = /^\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z/.exec(line);\n if (!timestampMatch) return true;\n return new Date(timestampMatch[0]).getTime() >= sinceMs;\n });\n }\n\n // Apply tail limit\n const tailedLines = logLines.slice(-tail);\n\n return {\n containerId: container.id,\n logs: tailedLines,\n lineCount: tailedLines.length,\n };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STATUS', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n return {\n containerId: container.id,\n name: container.name,\n image: container.image,\n status: container.status,\n ports: container.ports,\n createdAt: container.createdAt,\n startedAt: container.startedAt,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n }> {\n const showAll = (params.all as boolean | undefined) ?? false;\n const filterByLabel = (params.filterByLabel as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LIST', { all: showAll, filterByLabel });\n\n let entries = Array.from(this.containers.values());\n\n // By default, only show running containers (like `docker ps`)\n if (!showAll) {\n entries = entries.filter((c) => c.status === 'running');\n }\n\n // Filter by label if specified\n if (filterByLabel) {\n const [labelKey, labelValue] = filterByLabel.split('=');\n entries = entries.filter((c) => {\n if (labelValue !== undefined) {\n return c.labels[labelKey] === labelValue;\n }\n return labelKey in c.labels;\n });\n }\n\n // Sort by creation time (newest first)\n entries.sort((a, b) => b.createdAt - a.createdAt);\n\n const containers = entries.map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image,\n status: c.status,\n ports: c.ports,\n createdAt: c.createdAt,\n }));\n\n return { containers, total: containers.length };\n }\n}\n\n// Auto-register\nregisterIntegration('docker', DockerIntegration);\n","/**\n * Read-only SQL enforcement for the database integration.\n *\n * The guard accepts exactly one SELECT statement (optionally CTE-led) and\n * nothing else. Comments are stripped and string/identifier contents are\n * blanked before keyword checks, so denied keywords inside literals (e.g.\n * `WHERE note = 'delete this'`) never false-positive, and comment/quote\n * tricks cannot smuggle a second statement past the check.\n */\n\nexport interface SqlGuardResult {\n ok: boolean;\n reason?: string;\n}\n\n/**\n * Reserved words that mutate or lock wherever they appear inside a SELECT:\n * data-modifying CTE bodies (INSERT/UPDATE/DELETE/MERGE), `SELECT ... INTO`\n * DDL, and `FOR UPDATE`/`FOR SHARE` locking clauses.\n */\nconst DENIED_KEYWORDS = new Set(['INSERT', 'UPDATE', 'DELETE', 'MERGE', 'INTO', 'FOR']);\n\nfunction isWordChar(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_' || ch === '$';\n}\n\n/** Skip a single-quoted literal starting at `start` (the opening quote). */\nfunction skipSingleQuoted(sql: string, start: number, eString: boolean): number {\n let i = start + 1;\n while (i < sql.length) {\n if (eString && sql[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (sql[i] === \"'\") {\n if (sql[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Skip a double-quoted identifier starting at `start` (the opening quote). */\nfunction skipDoubleQuoted(sql: string, start: number): number {\n let i = start + 1;\n while (i < sql.length) {\n if (sql[i] === '\"') {\n if (sql[i + 1] === '\"') {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Match a dollar-quote tag ($$ or $tag$) at `start`; `$1` placeholders are not tags. */\nfunction matchDollarTag(sql: string, start: number): string | undefined {\n let i = start + 1;\n if (sql[i] === '$') return '$$';\n const first = sql[i];\n if (!first || !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first === '_')) {\n return undefined;\n }\n i++;\n while (i < sql.length && isWordChar(sql[i]) && sql[i] !== '$') i++;\n if (sql[i] !== '$') return undefined;\n return sql.slice(start, i + 1);\n}\n\n/** Strip comments and blank string/identifier contents, keeping structure. */\nfunction sanitizeSql(sql: string): string {\n const out: string[] = [];\n let i = 0;\n\n while (i < sql.length) {\n const ch = sql[i];\n\n if (ch === '-' && sql[i + 1] === '-') {\n while (i < sql.length && sql[i] !== '\\n') i++;\n out.push(' ');\n continue;\n }\n\n if (ch === '/' && sql[i + 1] === '*') {\n // Postgres nests block comments\n let depth = 1;\n i += 2;\n while (i < sql.length && depth > 0) {\n if (sql[i] === '/' && sql[i + 1] === '*') {\n depth++;\n i += 2;\n } else if (sql[i] === '*' && sql[i + 1] === '/') {\n depth--;\n i += 2;\n } else {\n i++;\n }\n }\n out.push(' ');\n continue;\n }\n\n if (ch === \"'\") {\n // E'…' strings honor backslash escapes; standard strings do not\n let j = i - 1;\n while (j >= 0 && (sql[j] === ' ' || sql[j] === '\\t' || sql[j] === '\\n' || sql[j] === '\\r')) j--;\n const prev = j >= 0 ? sql[j] : '';\n const eString = (prev === 'e' || prev === 'E') && (j === 0 || !isWordChar(sql[j - 1]));\n i = skipSingleQuoted(sql, i, eString);\n out.push(\"''\");\n continue;\n }\n\n if (ch === '\"') {\n i = skipDoubleQuoted(sql, i);\n out.push('\"\"');\n continue;\n }\n\n if (ch === '$') {\n const tag = matchDollarTag(sql, i);\n if (tag) {\n const close = sql.indexOf(tag, i + tag.length);\n i = close === -1 ? sql.length : close + tag.length;\n out.push('$$');\n continue;\n }\n }\n\n out.push(ch);\n i++;\n }\n\n return out.join('');\n}\n\n/**\n * Verify `sql` is a single read-only SELECT statement.\n * Returns `{ ok: false, reason }` for anything else.\n */\nexport function assertReadOnlySelect(sql: string): SqlGuardResult {\n const sanitized = sanitizeSql(sql);\n\n const statements = sanitized\n .split(';')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (statements.length === 0) {\n return { ok: false, reason: 'Empty statement' };\n }\n if (statements.length > 1) {\n return { ok: false, reason: 'Only a single statement is allowed' };\n }\n\n const words = (statements[0].match(/\\b[A-Za-z_][A-Za-z0-9_]*\\b/g) ?? []).map((w) =>\n w.toUpperCase(),\n );\n const first = words[0];\n if (first !== 'SELECT' && first !== 'WITH') {\n return { ok: false, reason: 'Only SELECT statements are allowed' };\n }\n\n const denied = words.find((w) => DENIED_KEYWORDS.has(w));\n if (denied) {\n return { ok: false, reason: `Keyword not allowed in a read-only query: ${denied}` };\n }\n\n return { ok: true };\n}\n","/**\n * Database Integration for Almadar\n * Read-only SQL queries over external connections (migration fetch seam).\n */\n\nimport { Pool } from 'pg';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { IntegrationError } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { resolveCredentialRef } from '../../credentials';\nimport { assertReadOnlySelect } from './sql-guard';\nimport type {\n DatabaseDriver,\n DatabaseQueryParams,\n DatabaseQueryParamValue,\n DatabaseQueryResult,\n DatabaseRow,\n} from './types';\n\nconst DEFAULT_STATEMENT_TIMEOUT_MS = 10_000;\n\n/** Postgres SQLSTATE raised when statement_timeout cancels a query. */\nconst PG_QUERY_CANCELED = '57014';\n\nclass PostgresDriver implements DatabaseDriver {\n private pool: Pool;\n\n constructor(connectionString: string, statementTimeoutMs: number) {\n this.pool = new Pool({\n connectionString,\n statement_timeout: statementTimeoutMs,\n query_timeout: statementTimeoutMs,\n });\n }\n\n async query(\n sql: string,\n params: readonly DatabaseQueryParamValue[],\n ): Promise<DatabaseQueryResult> {\n const result = await this.pool.query(sql, [...params]);\n return {\n rows: result.rows as DatabaseRow[],\n rowCount: result.rowCount ?? result.rows.length,\n };\n }\n\n async end(): Promise<void> {\n await this.pool.end();\n }\n}\n\nfunction mapDriverError(error: unknown): IntegrationError {\n if (error instanceof IntegrationError) return error;\n const code = (error as { code?: string }).code;\n if (code === PG_QUERY_CANCELED) {\n return new IntegrationError('Statement timeout exceeded', 'TIMEOUT_ERROR');\n }\n const message = error instanceof Error ? error.message : String(error);\n return new IntegrationError(message, 'SERVICE_ERROR');\n}\n\n/**\n * Generic database integration. One action — `query` — with read-only\n * enforced in the integration itself (single SELECT only, statement\n * timeout). `connectionRef` is an environment variable NAME, never the\n * secret; the connection string is resolved from `process.env` at run time.\n */\nexport class DatabaseIntegration extends BaseIntegration {\n private drivers: Map<string, DatabaseDriver> = new Map();\n private statementTimeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const fromEnv = config.env.DATABASE_STATEMENT_TIMEOUT_MS;\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid DATABASE_STATEMENT_TIMEOUT_MS: ${fromEnv}`);\n }\n this.statementTimeoutMs = parsed;\n } else {\n this.statementTimeoutMs = config.timeout ?? DEFAULT_STATEMENT_TIMEOUT_MS;\n }\n\n this.logger.info('Database integration initialized', {\n statementTimeoutMs: this.statementTimeoutMs,\n });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'query':\n data = await this.executeWithRetry(() => this.runQuery(params as DatabaseQueryParams));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async runQuery(params: DatabaseQueryParams): Promise<DatabaseQueryResult> {\n const guard = assertReadOnlySelect(params.sql);\n if (!guard.ok) {\n throw new IntegrationError(\n `Read-only violation: ${guard.reason ?? 'not a SELECT statement'}`,\n 'VALIDATION_ERROR',\n );\n }\n\n const driver = this.driverFor(params.connectionRef);\n\n this.logger.debug('Database QUERY', { connectionRef: params.connectionRef });\n\n try {\n return await driver.query(params.sql, params.params ?? []);\n } catch (error) {\n throw mapDriverError(error);\n }\n }\n\n /** Resolve (and cache) the driver for a connection reference. */\n private driverFor(connectionRef: string): DatabaseDriver {\n const connectionString = resolveCredentialRef(connectionRef);\n if (!connectionString) {\n throw new IntegrationError(\n `Connection reference \"${connectionRef}\" is not set in the credential store or environment`,\n 'AUTH_ERROR',\n );\n }\n\n const cached = this.drivers.get(connectionString);\n if (cached) return cached;\n\n const driver = new PostgresDriver(connectionString, this.statementTimeoutMs);\n this.drivers.set(connectionString, driver);\n return driver;\n }\n}\n\n// Auto-register\nregisterIntegration('database', DatabaseIntegration);\n\n// Export types\nexport * from './types';\nexport { assertReadOnlySelect, type SqlGuardResult } from './sql-guard';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Wikimedia (Wikipedia API) integration — redirect-resolved page lookup returning\n * a verified one-line description, a real Commons portrait, and the lead-section\n * extract. The single canonical home for the User-Agent + timeout that kflow's\n * persona services previously duplicated as ad-hoc `fetch` calls.\n */\nconst WIKI_ENDPOINT = 'https://en.wikipedia.org/w/api.php';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\nconst EXTRACT_CHAR_CAP = 2000;\n\ninterface WikiPage {\n missing?: '' | boolean;\n title?: string;\n description?: string;\n extract?: string;\n thumbnail?: { source?: string };\n}\ninterface WikiQueryResponse {\n query?: { pages?: Record<string, WikiPage> };\n}\n\nexport class WikimediaIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.WIKIMEDIA_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.WIKIMEDIA_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Wikimedia integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'getPage':\n data = await this.executeWithRetry(() => this.getPage(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /** Look up a title on Wikipedia: description, portrait, lead extract. Empty fields on miss. */\n private async getPage(params: IntegrationParams): Promise<{ title?: string; description?: string; portraitUrl?: string; extract?: string }> {\n const title = String(params.title ?? '').trim();\n if (!title) return {};\n const url =\n `${WIKI_ENDPOINT}?action=query&format=json&redirects=1` +\n `&prop=pageimages|description|extracts&explaintext=1&exintro=1` +\n `&piprop=thumbnail&pithumbsize=240&titles=${encodeURIComponent(title)}`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return {};\n const data = (await res.json()) as WikiQueryResponse;\n const pages = data.query?.pages;\n if (!pages) return {};\n const page = Object.values(pages)[0];\n if (!page || page.missing !== undefined) return {};\n const extract = typeof page.extract === 'string' ? page.extract.slice(0, EXTRACT_CHAR_CAP).trim() : undefined;\n return {\n title: page.title,\n description: page.description ?? (typeof page.extract === 'string' ? page.extract.split('.')[0] : undefined),\n portraitUrl: page.thumbnail?.source,\n extract,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('wikimedia', WikimediaIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Iconify integration — brand-logo / icon resolution via the Iconify API.\n * Exposes the three atomic HTTP calls kflow's concept-icon service previously\n * made as ad-hoc `fetch`: existence check, relevance search, and icon-body\n * fetch (for color-tone classification). Caching + tone classification stay\n * in the caller; this owns only the transport (UA, timeout, retry).\n */\nconst ICONIFY_API = 'https://api.iconify.design';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\n\ninterface IconCollection { icons?: Record<string, { body: string }>; aliases?: Record<string, { body: string }>; }\ninterface SearchResponse { icons?: string[]; }\n\nexport class IconifyIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.ICONIFY_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.ICONIFY_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Iconify integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'svgExists':\n data = await this.executeWithRetry(() => this.svgExists(params));\n break;\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getIconBody':\n data = await this.executeWithRetry(() => this.getIconBody(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async svgExists(params: IntegrationParams): Promise<{ exists: boolean }> {\n const path = String(params.path ?? '');\n if (!path) return { exists: false };\n return { exists: await this.headOk(`${ICONIFY_API}/${path}`) };\n }\n\n private async search(params: IntegrationParams): Promise<{ icons: string[] }> {\n const query = String(params.query ?? '');\n if (!query) return { icons: [] };\n const limit = Number(params.limit ?? 1);\n const data = await this.getJson<SearchResponse>(`${ICONIFY_API}/search?query=${encodeURIComponent(query)}&limit=${limit}`);\n return { icons: data?.icons ?? [] };\n }\n\n private async getIconBody(params: IntegrationParams): Promise<{ body: string | null }> {\n const iconId = String(params.iconId ?? '');\n const [prefix, name] = iconId.split(':');\n if (!prefix || !name) return { body: null };\n const data = await this.getJson<IconCollection>(`${ICONIFY_API}/${prefix}.json?icons=${encodeURIComponent(name)}`);\n return { body: data?.icons?.[name]?.body ?? data?.aliases?.[name]?.body ?? null };\n }\n\n private async headOk(url: string): Promise<boolean> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { method: 'GET', headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async getJson<T>(url: string): Promise<T | null> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('iconify', IconifyIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * arXiv integration — the live-search backend for the knowledge-worker's\n * \"emerging\" axis (frontier academic concepts beyond the user's graph). Wraps\n * the public Atom API at export.arxiv.org. Chosen as the placeholder web-search\n * vendor; the action shape matches a generic search so the backend can be\n * swapped without touching the rabit tool surface.\n */\nconst ARXIV_ENDPOINT = 'https://export.arxiv.org/api/query';\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_RESULTS = 8;\n\nexport interface ArxivResult {\n id: string;\n title: string;\n summary: string;\n authors: string[];\n published: string;\n url: string;\n}\n\n/** Minimal Atom `<entry>` extractor — arXiv's feed is regular; no XML dep needed. */\nfunction parseAtom(xml: string): ArxivResult[] {\n const entries: ArxivResult[] = [];\n for (const block of xml.split('<entry>').slice(1)) {\n const grab = (tag: string): string => {\n const m = block.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)</${tag}>`, 'i'));\n return m ? m[1].replace(/<[^>]+>/g, '').trim() : '';\n };\n const id = grab('id');\n const title = grab('title').replace(/\\s+/g, ' ');\n const summary = grab('summary').replace(/\\s+/g, ' ');\n const published = grab('published');\n const authors = Array.from(block.matchAll(/<author>\\s*<name>([^<]+)<\\/name>/g)).map(m => m[1].trim());\n const linkMatch = block.match(/<link[^>]*rel=\"alternate\"[^>]*href=\"([^\"]+)\"/i);\n const url = linkMatch ? linkMatch[1] : id;\n if (id || title) entries.push({ id, title, summary, authors, published, url });\n }\n return entries;\n}\n\nexport class ArxivIntegration extends BaseIntegration {\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.timeoutMs = Number(config.env?.ARXIV_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('arXiv integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams): Promise<{ results: ArxivResult[] }> {\n const query = String(params.query ?? '').trim();\n if (!query) return { results: [] };\n const maxResults = Number(params.maxResults ?? DEFAULT_MAX_RESULTS);\n // arXiv search_query: quote the term as an all-fields term.\n const url = `${ARXIV_ENDPOINT}?search_query=${encodeURIComponent(`all:${query}`)}&start=0&max_results=${maxResults}&sortBy=relevance`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'Accept': 'application/atom+xml' }, signal: ctrl.signal });\n if (!res.ok) return { results: [] };\n const xml = await res.text();\n return { results: parseAtom(xml) };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('arxiv', ArxivIntegration);\n","import { BaseIntegration } from '../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../types';\nimport { IntegrationError } from '../types';\n\n/**\n * Mock integration for testing\n */\nexport class MockIntegration extends BaseIntegration {\n private responses: Map<string, unknown> = new Map();\n private calls: Array<{ action: string; params: IntegrationParams }> =\n [];\n\n constructor(config: IntegrationConfig) {\n super(config);\n }\n\n /**\n * Set mock response for an action\n */\n setResponse(action: string, data: unknown): void {\n this.responses.set(action, data);\n }\n\n /**\n * Get all calls made to this integration\n */\n getCalls(): Array<{ action: string; params: IntegrationParams }> {\n return this.calls;\n }\n\n /**\n * Clear all calls\n */\n clearCalls(): void {\n this.calls = [];\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Record the call\n this.calls.push({ action, params });\n\n const data = this.responses.get(action);\n\n if (!data) {\n return {\n success: false,\n error: new IntegrationError(\n `No mock response for action: ${action}`,\n 'UNKNOWN_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, 0),\n };\n }\n}\n","import { IntegrationFactory, type IntegrationCallContext } from '../factory';\nimport type { IntegrationResult, IntegrationParams } from '../types';\nimport type {\n IntegrationContracts,\n IntegrationName,\n IntegrationActionName,\n} from '../contracts';\n\n/**\n * Signature of the call-service handler returned by `createCallServiceHandler`\n * and `RuntimeIntegrationManager.getCallServiceHandler`. Exported so that\n * consumers (e.g. orbital-codegen-emitted `clients.ts`) can give the value\n * a public type and avoid TS2742 \"inferred type cannot be named without a\n * reference to <bundler-internal>\" errors when emitting `.d.ts`.\n *\n * Overloaded: when the caller passes a service + action LITERAL pair the\n * compiler narrows to `IntegrationContracts[Service][Action]['result']`.\n * Codegen-emitted call sites pass string literals (`callService('github',\n * 'listIssues', ...)`) so they get the typed result for free and no\n * longer need a `: unknown` annotation or downstream `as <Result>` casts.\n * The wide fallback signature keeps non-literal call sites (e.g. dynamic\n * dispatch via `manager.getCallServiceHandler()`) working.\n */\nexport interface CallServiceHandler {\n <S extends IntegrationName, A extends IntegrationActionName<S>>(\n service: S,\n action: A,\n params: IntegrationContracts[S][A] extends { params: infer P } ? P : IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<\n IntegrationContracts[S][A] extends { result: infer R } ? R : unknown\n >;\n (\n service: string,\n action: string,\n params: IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<unknown>;\n}\n\n/**\n * Create a callService effect handler for @almadar/runtime.\n *\n * The implementation is the wide form `(string, string, params) =>\n * Promise<unknown>` — at runtime we don't know which action's result\n * shape to return. The handler is returned as `CallServiceHandler`,\n * whose typed overload narrows to `IntegrationContracts[S][A]['result']`\n * at every literal call site (codegen-emitted `callService('github',\n * 'listIssues', ...)` gets typed result for free). The cast is to a\n * specific callable interface — not `unknown` / `any` — so the\n * `no-as-any` / `no-unknown-type` rules are unaffected.\n */\nexport function createCallServiceHandler(factory: IntegrationFactory): CallServiceHandler {\n const handler = async (\n service: string,\n action: string,\n params: IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<unknown> => {\n const result = await factory.execute(service, action, params || {}, context);\n\n if (!result.success) {\n throw result.error;\n }\n\n return result.data;\n };\n return handler as CallServiceHandler;\n}\n","import { createRequire } from 'node:module';\nimport { IntegrationFactory, type IntegrationCallContext } from '../factory';\nimport { MockIntegration } from '../mocks/MockIntegration';\nimport { createCallServiceHandler, type CallServiceHandler } from './effectHandler';\nimport { installActiveFactory, installCredentialStore, type CredentialStore } from '../credentials';\nimport { serviceCredentials, declaredCredentialEnvVars, STORE_BOOTSTRAP_ENV_VARS } from '../contracts';\nimport type { IntegrationResult, IntegrationParams } from '../types';\n\n/** Mock data value types generated from response shapes */\ntype MockValue = string | number | boolean | Record<string, never> | never[];\n\n/**\n * Generate mock data from a responseShape definition.\n * Maps type strings to realistic placeholder values.\n */\nfunction generateMockFromShape(shape: Record<string, string>): Record<string, MockValue> {\n const data: Record<string, MockValue> = {};\n for (const [key, type] of Object.entries(shape)) {\n switch (type) {\n case 'string': data[key] = `mock_${key}`; break;\n case 'number': data[key] = 42; break;\n case 'boolean': data[key] = true; break;\n case 'object': data[key] = {}; break;\n case 'string[]': data[key] = []; break;\n default: data[key] = `mock_${key}`;\n }\n }\n return data;\n}\n\n/**\n * Runtime integration manager\n * Auto-configures integrations from environment variables.\n * When USE_MOCK_DATA=true, registers mock integrations for all services\n * using response shapes from services-registry.json.\n */\nexport class RuntimeIntegrationManager {\n private factory: IntegrationFactory;\n private credentialStore: CredentialStore | null = null;\n private storeEnvBase: Record<string, string | undefined> | null = null;\n private storeFirst = false;\n\n constructor() {\n this.factory = new IntegrationFactory();\n this.installNotConfiguredFallback();\n installActiveFactory(this.factory);\n }\n\n /**\n * W4: configure with the tenant credential store layered over the env —\n * store → env → unconfigured. Installs the store as the process-wide\n * `resolveCredentialRef` source, warms it, and re-configures whenever a\n * credential changes (dropping cached instances so new keys go live\n * without a restart). Mock mode short-circuits inside `configureFromEnv`\n * exactly as before, so verify harnesses are unaffected.\n */\n async configureFromStore(\n store: CredentialStore,\n envOverride?: Record<string, string | undefined>,\n ): Promise<void> {\n this.credentialStore = store;\n this.storeEnvBase = envOverride ?? process.env;\n // I-31 store-first: the store is the ONLY source for declared credentials —\n // boot seeds it from the declared env values (.env stays the documented\n // write surface, as seed data), then the env fallback is stripped so every\n // resolution flows the exact path a deployed client app uses. Undeclared\n // refs (database connectionRefs) deliberately pass through.\n this.storeFirst = this.storeEnvBase.ALMADAR_CREDENTIALS_SOURCE === 'store';\n installCredentialStore(store);\n await store.warm();\n if (this.storeFirst && store.enabled) {\n await this.seedStoreFromEnv(store, this.storeEnvBase);\n }\n store.subscribe(() => this.refreshFromStore());\n this.refreshFromStore();\n }\n\n /** Whether store-first custody (I-31) is active on this manager. */\n get credentialsStoreFirst(): boolean {\n return this.storeFirst;\n }\n\n /** Copy each declared credential present in env but absent from the store. */\n private async seedStoreFromEnv(\n store: CredentialStore,\n env: Record<string, string | undefined>,\n ): Promise<void> {\n const present = new Set(store.entries().map((e) => e.envVar));\n for (const [service, decls] of Object.entries(serviceCredentials)) {\n for (const { envVar } of decls) {\n if (STORE_BOOTSTRAP_ENV_VARS.has(envVar)) continue;\n const value = env[envVar];\n if (value && !present.has(envVar)) {\n await store.set(service, envVar, value);\n present.add(envVar);\n }\n }\n }\n }\n\n /**\n * Re-derive configs from base env + warmed store values. `reset()` (not\n * `invalidate()`): configs must go too, or a REMOVED credential's service\n * resurrects from its stale config on the next `get()` — removal must\n * revoke. `configureFromEnv` below rebuilds every configured service from\n * the merged env.\n */\n private refreshFromStore(): void {\n if (!this.credentialStore || !this.storeEnvBase) return;\n this.factory.reset();\n let base = this.storeEnvBase;\n if (this.storeFirst) {\n const declared = declaredCredentialEnvVars();\n base = Object.fromEntries(\n Object.entries(this.storeEnvBase).filter(([key]) => !declared.has(key)),\n );\n }\n this.configureFromEnv({ ...base, ...this.credentialStore.snapshotEnv() });\n }\n\n /**\n * Wrap `factory.execute` so an unknown/unconfigured service echoes its\n * params instead of throwing. This makes the manager safe to install as a\n * default `callService` handler (e.g. the playground sidecar) without every\n * service being configured. REAL execution errors (API failures, bad\n * params, schema violations) still propagate so the circuit's failure\n * events fire — only the two \"not set up\" errors (`Unknown integration`,\n * `Integration not configured`) are caught. Subsumes the broader wrapper\n * that previously lived inside `configureMockMode`.\n *\n * In production the fallback is OFF: a missing key must surface as the\n * circuit's failure event and a degraded health check, never a fake success.\n */\n private installNotConfiguredFallback(): void {\n const originalExecute = this.factory.execute.bind(this.factory);\n this.factory.execute = async (\n integration: string,\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> => {\n try {\n return await originalExecute(integration, action, params, context);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (process.env.NODE_ENV !== 'production' && /Unknown integration|not configured/i.test(msg)) {\n return {\n success: true,\n data: { ...params, _mock: true, _service: integration, _action: action },\n metadata: { integration, action, duration: 0, retries: 0, timestamp: Date.now() },\n };\n }\n throw err;\n }\n };\n }\n\n /**\n * Configure from environment variables.\n * In mock mode (USE_MOCK_DATA=true), all services return realistic mock data.\n *\n * Pass an explicit env map to configure hermetically (verify harnesses,\n * per-tenant resolution); defaults to `process.env`.\n */\n configureFromEnv(envOverride?: Record<string, string | undefined>): void {\n const env = envOverride ?? process.env;\n\n // ALMADAR_INTEGRATIONS_MODE=mock scopes mock mode to integrations only\n // (verify harnesses set it so catalog runs never spend real keys);\n // USE_MOCK_DATA=true additionally mocks the data tier and implies it.\n if (env.ALMADAR_INTEGRATIONS_MODE === 'mock' || env.USE_MOCK_DATA === 'true') {\n if (env.NODE_ENV === 'production') {\n throw new Error(\n 'Mocked integrations are not permitted when NODE_ENV=production — unset ALMADAR_INTEGRATIONS_MODE/USE_MOCK_DATA.',\n );\n }\n this.configureMockMode();\n return;\n }\n\n // Stripe\n if (env.STRIPE_SECRET_KEY) {\n this.factory.configure('stripe', {\n env: {\n STRIPE_SECRET_KEY: env.STRIPE_SECRET_KEY,\n },\n });\n }\n\n // YouTube\n if (env.YOUTUBE_API_KEY) {\n this.factory.configure('youtube', {\n env: {\n YOUTUBE_API_KEY: env.YOUTUBE_API_KEY,\n },\n });\n }\n\n // Twilio\n if (env.TWILIO_ACCOUNT_SID && env.TWILIO_AUTH_TOKEN) {\n this.factory.configure('twilio', {\n env: {\n TWILIO_ACCOUNT_SID: env.TWILIO_ACCOUNT_SID,\n TWILIO_AUTH_TOKEN: env.TWILIO_AUTH_TOKEN,\n TWILIO_PHONE_NUMBER: env.TWILIO_PHONE_NUMBER || '',\n },\n });\n }\n\n // Email (SendGrid)\n if (env.SENDGRID_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'sendgrid',\n SENDGRID_API_KEY: env.SENDGRID_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n // Email (Resend)\n else if (env.RESEND_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'resend',\n RESEND_API_KEY: env.RESEND_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n\n // Push (Web Push / VAPID)\n if (env.VAPID_PUBLIC_KEY && env.VAPID_PRIVATE_KEY && env.VAPID_SUBJECT) {\n this.factory.configure('push', {\n env: {\n VAPID_PUBLIC_KEY: env.VAPID_PUBLIC_KEY,\n VAPID_PRIVATE_KEY: env.VAPID_PRIVATE_KEY,\n VAPID_SUBJECT: env.VAPID_SUBJECT,\n },\n });\n }\n\n // Calendar (Google service account, optional domain-wide delegation)\n if (env.GOOGLE_CALENDAR_SA_KEY) {\n this.factory.configure('calendar', {\n env: {\n GOOGLE_CALENDAR_SA_KEY: env.GOOGLE_CALENDAR_SA_KEY,\n GOOGLE_CALENDAR_SUBJECT: env.GOOGLE_CALENDAR_SUBJECT || '',\n GOOGLE_CALENDAR_ID: env.GOOGLE_CALENDAR_ID || '',\n },\n });\n }\n\n // Drive — SA (reads, optional delegation) and/or user OAuth (writes;\n // SA writes are impossible on personal accounts — zero SA storage quota).\n if (env.GOOGLE_DRIVE_SA_KEY || (env.GOOGLE_DRIVE_REFRESH_TOKEN && env.OAUTH_CLIENT_ID && env.OAUTH_CLIENT_SECRET)) {\n this.factory.configure('drive', {\n env: {\n GOOGLE_DRIVE_SA_KEY: env.GOOGLE_DRIVE_SA_KEY || '',\n GOOGLE_DRIVE_SUBJECT: env.GOOGLE_DRIVE_SUBJECT || '',\n GOOGLE_DRIVE_REFRESH_TOKEN: env.GOOGLE_DRIVE_REFRESH_TOKEN || '',\n GOOGLE_DRIVE_FOLDER_ID: env.GOOGLE_DRIVE_FOLDER_ID || '',\n OAUTH_CLIENT_ID: env.OAUTH_CLIENT_ID || '',\n OAUTH_CLIENT_SECRET: env.OAUTH_CLIENT_SECRET || '',\n },\n });\n }\n\n // Meta Ads (Graph API, read-only insights)\n if (env.META_ACCESS_TOKEN) {\n this.factory.configure('metaAds', {\n env: {\n META_ACCESS_TOKEN: env.META_ACCESS_TOKEN,\n META_AD_ACCOUNT_ID: env.META_AD_ACCOUNT_ID || '',\n },\n });\n }\n\n // Accounting — generic CSV export, no credentials\n this.factory.configure('accounting', { env: {} });\n\n // Banking (GoCardless Bank Account Data)\n if (env.GOCARDLESS_SECRET_ID && env.GOCARDLESS_SECRET_KEY) {\n this.factory.configure('banking', {\n env: {\n GOCARDLESS_SECRET_ID: env.GOCARDLESS_SECRET_ID,\n GOCARDLESS_SECRET_KEY: env.GOCARDLESS_SECRET_KEY,\n },\n });\n }\n\n // E-sign (DocuSign)\n if (env.DOCUSIGN_BASE_URL && env.DOCUSIGN_ACCESS_TOKEN) {\n this.factory.configure('esign', {\n env: {\n DOCUSIGN_BASE_URL: env.DOCUSIGN_BASE_URL,\n DOCUSIGN_ACCESS_TOKEN: env.DOCUSIGN_ACCESS_TOKEN,\n },\n });\n }\n\n // OAuth (OIDC via openid-client; OAUTH_MODE=mock keeps the in-memory\n // backend for tests). Configured whenever a client is registered OR mock\n // mode is explicit — no silent half-configuration.\n if ((env.OAUTH_CLIENT_ID && env.OAUTH_CLIENT_SECRET) || env.OAUTH_MODE === 'mock') {\n this.factory.configure('oauth', {\n env: {\n OAUTH_CLIENT_ID: env.OAUTH_CLIENT_ID || '',\n OAUTH_CLIENT_SECRET: env.OAUTH_CLIENT_SECRET || '',\n OAUTH_REDIRECT_URI: env.OAUTH_REDIRECT_URI || '',\n OIDC_ISSUER_URL: env.OIDC_ISSUER_URL || '',\n OAUTH_MODE: env.OAUTH_MODE || '',\n },\n });\n }\n\n // Credentials — the hosted store's service surface; always configured\n // (its actions degrade honestly when no store is installed). The admin\n // role list + store-first flag ride the env so injected env maps stay\n // hermetic.\n this.factory.configure('credentials', {\n env: {\n ALMADAR_CREDENTIAL_ADMIN_ROLES: env.ALMADAR_CREDENTIAL_ADMIN_ROLES || '',\n ALMADAR_CREDENTIALS_SOURCE: env.ALMADAR_CREDENTIALS_SOURCE || '',\n },\n });\n\n // Storage — S3-compatible when credentialed; in-memory dev backend\n // otherwise (the integration itself refuses that fallback in production).\n this.factory.configure('storage', {\n env: {\n STORAGE_ACCESS_KEY_ID: env.STORAGE_ACCESS_KEY_ID || '',\n STORAGE_SECRET_ACCESS_KEY: env.STORAGE_SECRET_ACCESS_KEY || '',\n STORAGE_BUCKET: env.STORAGE_BUCKET || '',\n STORAGE_REGION: env.STORAGE_REGION || '',\n STORAGE_ENDPOINT: env.STORAGE_ENDPOINT || '',\n STORAGE_PUBLIC_URL_BASE: env.STORAGE_PUBLIC_URL_BASE || '',\n },\n });\n\n // Webhook — no required credentials; target URL is a per-call param\n this.factory.configure('webhook', {\n env: {\n WEBHOOK_SIGNING_SECRET: env.WEBHOOK_SIGNING_SECRET || '',\n WEBHOOK_TIMEOUT_MS: env.WEBHOOK_TIMEOUT_MS || '',\n },\n });\n\n // LLM — configure when any provider key (or an explicit PROVIDER) is\n // present. Pass every available key through and let the integration\n // auto-detect the provider via getAvailableProvider(), so deepseek /\n // openrouter / kimi work without a per-provider branch here. Embeddings\n // (the `embed` action) default to OpenRouter `baai/bge-base-en-v1.5`\n // unless EMBEDDING_* overrides.\n const llmEnv: Record<string, string> = {};\n for (const k of ['ANTHROPIC_API_KEY', 'OPENAI_API_KEY', 'DEEPSEEK_API_KEY', 'KIMI_API_KEY', 'OPEN_ROUTER_API_KEY']) {\n if (env[k]) llmEnv[k] = env[k] as string;\n }\n if (env.PROVIDER) llmEnv.PROVIDER = env.PROVIDER;\n for (const k of ['EMBEDDING_PROVIDER', 'EMBEDDING_MODEL', 'EMBEDDING_API_KEY']) {\n if (env[k]) llmEnv[k] = env[k] as string;\n }\n if (Object.keys(llmEnv).length > 0) {\n this.factory.configure('llm', { env: llmEnv });\n }\n\n // ML (model inference via a deployed serving orbital)\n if (env.MASAR_URL && env.MASAR_ML_TRAIT) {\n this.factory.configure('ml', {\n env: {\n MASAR_URL: env.MASAR_URL,\n MASAR_ML_TRAIT: env.MASAR_ML_TRAIT,\n MASAR_ML_TIMEOUT_MS: env.MASAR_ML_TIMEOUT_MS || '',\n },\n });\n }\n\n // DeepAgent\n if (env.DEEPAGENT_API_URL) {\n this.factory.configure('deepagent', {\n env: {\n DEEPAGENT_API_URL: env.DEEPAGENT_API_URL,\n DEEPAGENT_API_KEY: env.DEEPAGENT_API_KEY || '',\n },\n });\n }\n\n // GitHub\n if (env.GITHUB_TOKEN) {\n this.factory.configure('github', {\n env: {\n GITHUB_TOKEN: env.GITHUB_TOKEN,\n GITHUB_OWNER: env.GITHUB_OWNER || '',\n GITHUB_REPO: env.GITHUB_REPO || '',\n GITHUB_WORK_DIR: env.GITHUB_WORK_DIR || '',\n },\n });\n }\n }\n\n /**\n * Configure mock mode: register MockIntegration for all known services\n * with auto-generated responses from the services registry.\n */\n private configureMockMode(): void {\n // Load registry and populate mocks\n const registry = this.loadServicesRegistry();\n\n for (const [serviceName, service] of Object.entries(registry)) {\n const mock = new MockIntegration({ name: serviceName, env: {} });\n\n for (const action of service.actions) {\n if (action.responseShape && Object.keys(action.responseShape).length > 0) {\n mock.setResponse(action.name, generateMockFromShape(action.responseShape));\n } else {\n // No responseShape defined: return generic success\n mock.setResponse(action.name, { success: true, _mock: true, _action: action.name });\n }\n }\n\n this.factory.configure(serviceName, { env: {} });\n this.factory.registerInstance(serviceName, mock);\n }\n\n // Unknown/unconfigured services (e.g. custom-bearer-api) are echoed by\n // the constructor's `installNotConfiguredFallback`; nothing more to do.\n }\n\n /**\n * Load services registry from @almadar/core/patterns.\n * Returns a map of service name to { actions: [...] }.\n */\n private loadServicesRegistry(): Record<string, { actions: Array<{ name: string; responseShape: Record<string, string> }> }> {\n try {\n const esmRequire = createRequire(import.meta.url);\n const registry = esmRequire('@almadar/core/patterns/services-registry.json') as {\n services: Record<string, { actions: Array<{ name: string; responseShape: Record<string, string> }> }>;\n };\n return registry.services;\n } catch {\n // Registry not available (e.g., not installed). Return empty - fallback mock handles everything.\n return {};\n }\n }\n\n /**\n * Get effect handler for runtime. Annotated with `CallServiceHandler` so\n * the inferred type at consumer call sites resolves to a public exported\n * name instead of a tsup-bundler-generated chunk path (which causes\n * TS2742 in `.d.ts` emit).\n */\n getCallServiceHandler(): CallServiceHandler {\n return createCallServiceHandler(this.factory);\n }\n\n /**\n * Get factory (for advanced usage)\n */\n getFactory(): IntegrationFactory {\n return this.factory;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/types.ts","../../src/contracts.ts","../../src/core/logger.ts","../../src/core/validation.ts","../../src/core/retry.ts","../../src/core/BaseIntegration.ts","../../src/registry.ts","../../src/factory.ts","../../src/credentials/resolver.ts","../../src/credentials/filePersistence.ts","../../src/integrations/stripe/index.ts","../../src/integrations/youtube/index.ts","../../src/integrations/twilio/index.ts","../../src/integrations/email/index.ts","../../src/integrations/webhook/index.ts","../../src/integrations/push/index.ts","../../src/integrations/calendar/index.ts","../../src/integrations/drive/index.ts","../../src/integrations/metaAds/index.ts","../../src/integrations/accounting/index.ts","../../src/integrations/banking/index.ts","../../src/integrations/esign/index.ts","../../src/integrations/llm/index.ts","../../src/integrations/ml/index.ts","../../src/integrations/deepagent/index.ts","../../src/integrations/github/github-git.ts","../../src/integrations/github/github-api.ts","../../src/integrations/github/index.ts","../../src/integrations/cli/index.ts","../../src/integrations/redis/index.ts","../../src/integrations/queue/index.ts","../../src/integrations/otel/index.ts","../../src/integrations/oauth/index.ts","../../src/integrations/credentials/index.ts","../../src/integrations/storage/index.ts","../../src/integrations/docker/index.ts","../../src/integrations/database/sql-guard.ts","../../src/integrations/database/index.ts","../../src/integrations/wikimedia/index.ts","../../src/integrations/iconify/index.ts","../../src/integrations/arxiv/index.ts","../../src/integrations/rigger/index.ts","../../src/mocks/MockIntegration.ts","../../src/runtime/effectHandler.ts","../../src/runtime/RuntimeIntegrationManager.ts"],"names":["Stripe","sub","google","init","fs","join","commit","writeFileSync","isParamRecord","decodeContent","createHash","bytes","contentType","url","s3GetSignedUrl","DEFAULT_TIMEOUT_MS","DEFAULT_UA"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAM1C,WAAA,CACE,OAAA,EACA,IAAA,GAA6B,eAAA,EAC7B,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACF,CAAA;;;AC4iDO,IAAM,kBAAA,GAA8D;AAAA,EACzE,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,uBAAA,EAAwB;AAAA,IACpF,EAAE,MAAA,EAAQ,uBAAA,EAAyB,QAAA,EAAU,KAAA,EAAO,aAAa,iCAAA;AAAkC,GACrG;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,IAAA,EAAM,aAAa,sBAAA;AAAuB,GACnF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,IAAA,EAAM,aAAa,oBAAA,EAAqB;AAAA,IAClF,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,mBAAA,EAAoB;AAAA,IAChF,EAAE,MAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAU,KAAA,EAAO,aAAa,6BAAA;AAA8B,GAC/F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,aAAa,+CAAA,EAAgD;AAAA,IAC5G,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,aAAa,+CAAA,EAAgD;AAAA,IAC1G,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,KAAA,EAAO,aAAa,8BAAA;AAA+B,GACvF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,wBAAA,EAA0B,QAAA,EAAU,KAAA,EAAO,aAAa,gEAAA,EAAiE;AAAA,IACnI,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,yCAAA;AAA0C,GAC1G;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,IAAA,EAAM,aAAa,iDAAA,EAAkD;AAAA,IAC7G,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,mBAAA,EAAoB;AAAA,IAChF,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,IAAA,EAAM,aAAa,+CAAA;AAAgD,GAC1G;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAE,MAAA,EAAQ,wBAAA,EAA0B,QAAA,EAAU,IAAA,EAAM,aAAa,2GAAA,EAA4G;AAAA,IAC7K,EAAE,MAAA,EAAQ,yBAAA,EAA2B,QAAA,EAAU,KAAA,EAAO,aAAa,4FAAA,EAA6F;AAAA,IAChK,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,wCAAA,EAAyC;AAAA,IACvG,EAAE,MAAA,EAAQ,+BAAA,EAAiC,QAAA,EAAU,KAAA,EAAO,aAAa,mGAAA;AAA+F,GAC1K;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAU,KAAA,EAAO,aAAa,4HAAA,EAAwH;AAAA,IACvL,EAAE,MAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAU,KAAA,EAAO,aAAa,4FAAA,EAA6F;AAAA,IAC7J,EAAE,MAAA,EAAQ,4BAAA,EAA8B,QAAA,EAAU,KAAA,EAAO,aAAa,yIAAA,EAAqI;AAAA,IAC3M,EAAE,MAAA,EAAQ,wBAAA,EAA0B,QAAA,EAAU,KAAA,EAAO,aAAa,wEAAA;AAAyE,GAC7I;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,uDAAA,EAAwD;AAAA,IACpH,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,kEAAA;AAA8D,GAC9H;AAAA,EACA,YAAY,EAAC;AAAA,EACb,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAU,IAAA,EAAM,aAAa,wCAAA,EAAyC;AAAA,IACxG,EAAE,MAAA,EAAQ,uBAAA,EAAyB,QAAA,EAAU,IAAA,EAAM,aAAa,yCAAA;AAA0C,GAC5G;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,uFAAA,EAAwF;AAAA,IACpJ,EAAE,MAAA,EAAQ,uBAAA,EAAyB,QAAA,EAAU,IAAA,EAAM,aAAa,4EAAA;AAA6E,GAC/I;AAAA,EACA,GAAA,EAAK;AAAA,IACH,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,KAAA,EAAO,aAAa,gDAAA,EAAiD;AAAA,IAC9G,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,aAAa,gDAAA;AAAiD,GAC7G;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,KAAA,EAAO,aAAa,mBAAA,EAAoB;AAAA,IACjF,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,aAAa,gBAAA;AAAiB,GAC7E;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,aAAa,gDAAA,EAAiD;AAAA,IACrG,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,IAAA,EAAM,aAAa,2EAAA;AAA4E,GACvI;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,IAAA,EAAM,aAAa,sBAAA,EAAuB;AAAA,IACnF,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,KAAA,EAAO,aAAa,mBAAA;AAAoB,GACnF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,IAAA,EAAM,aAAa,8BAAA,EAA+B;AAAA,IACtF,EAAE,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,aAAa,0BAAA,EAA2B;AAAA,IACnF,EAAE,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,aAAa,yBAAA;AAA0B,GACnF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,aAAa,wBAAA;AAAyB,GAClF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,uBAAA,EAAyB,QAAA,EAAU,IAAA,EAAM,aAAa,6BAAA,EAA8B;AAAA,IAC9F,EAAE,MAAA,EAAQ,2BAAA,EAA6B,QAAA,EAAU,IAAA,EAAM,aAAa,iCAAA,EAAkC;AAAA,IACtG,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,IAAA,EAAM,aAAa,qBAAA,EAAsB;AAAA,IAC/E,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,aAAa,4BAAA,EAA6B;AAAA,IACvF,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,aAAa,iEAAA,EAA6D;AAAA,IACzH,EAAE,MAAA,EAAQ,yBAAA,EAA2B,QAAA,EAAU,KAAA,EAAO,aAAa,gEAAA;AAAiE,GACtI;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,aAAa,8BAAA;AAA+B,GACrF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,aAAa,sBAAA;AAAuB,GAC7E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,IAAA,EAAM,aAAa,gBAAA,EAAiB;AAAA,IAC3E,EAAE,MAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,aAAa,oBAAA,EAAqB;AAAA,IACnF,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,4CAAA,EAA6C;AAAA,IAC3G,EAAE,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,KAAA,EAAO,aAAa,uDAAA;AAAwD,GACrH;AAAA,EACA,WAAA,EAAa;AAAA,IACX,EAAE,MAAA,EAAQ,+BAAA,EAAiC,QAAA,EAAU,KAAA,EAAO,aAAa,yHAAA,EAAqH;AAAA,IAC9L,EAAE,MAAA,EAAQ,wCAAA,EAA0C,QAAA,EAAU,KAAA,EAAO,aAAa,iIAAA;AAA6H,GACjN;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAE,MAAA,EAAQ,6BAAA,EAA+B,QAAA,EAAU,IAAA,EAAM,aAAa,kCAAA,EAAmC;AAAA,IACzG,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,KAAA,EAAO,aAAa,yBAAA;AAA0B,GACzF;AAAA,EACA,KAAK,EAAC;AAAA;AAAA;AAAA,EAGN,UAAU,EAAC;AAAA,EACX,SAAA,EAAW;AAAA,IACT,EAAE,MAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAU,KAAA,EAAO,aAAa,8CAAA,EAA+C;AAAA,IAC/G,EAAE,MAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAU,KAAA,EAAO,aAAa,0BAAA;AAA2B,GAC7F;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,gCAAA,EAAiC;AAAA,IAC/F,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,aAAa,0BAAA;AAA2B,GAC3F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,aAAa,0BAAA;AAA2B,GACzF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,KAAA,EAAO,aAAa,+DAAA,EAAgE;AAAA,IAC3H,EAAE,MAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAU,KAAA,EAAO,aAAa,0BAAA;AAA2B;AAE5F,CAAA;AASO,SAAS,oBAAA,GAAoC;AAClD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAA,EAAG;AACrD,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,KAAA,EAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,IAAA;AACT;AAOO,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EAC9C,+BAAA;AAAA,EACA;AACF,CAAC,CAAA;AASM,SAAS,yBAAA,GAAyC;AACvD,EAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,EAAA,KAAA,MAAW,YAAA,IAAgB,wBAAA,EAA0B,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAC7E,EAAA,OAAO,IAAA;AACT;AAyCO,IAAM,aAAA,GAA6F;AAAA,EACxG,QAAA,EAAU,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAQ,EAAE,UAAA,EAAY,GAAE,EAAE;AAAA,EAC5D,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAQ,EAAE,UAAA,EAAY,GAAE,EAAE;AAAA,EACxD,SAAS,EAAE,MAAA,EAAQ,eAAA,EAAiB,MAAA,EAAQ,EAAC;AAC/C,CAAA;AC90DO,IAAM,gBAAN,MAAiD;AAAA,EAGtD,WAAA,CAAY,SAA8C,MAAA,EAAQ;AAEhE,IAAA,IAAA,CAAK,GAAA,GAAM,aAAa,sBAAsB,CAAA;AAAA,EAChD;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAsB;AAC3C,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,EAC9B;AAAA,EACA,IAAA,CAAK,SAAiB,IAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,EAC7B;AAAA,EACA,IAAA,CAAK,SAAiB,IAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,EAC7B;AAAA,EACA,KAAA,CAAM,SAAiB,IAAA,EAAsB;AAC3C,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,EAC9B;AACF,CAAA;ACHA,IAAM,sBAAA,uBAA6B,GAAA,CAAI,CAAC,QAAQ,WAAA,EAAa,SAAA,EAAW,SAAS,CAAC,CAAA;AAG3E,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAI5C,WAAA,CAAY,aAAqB,MAAA,EAAgB;AAC/C,IAAA,KAAA,CAAM,CAAA,QAAA,EAAW,WAAW,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAChD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF,CAAA;AAKO,SAAS,cAAA,CACd,WAAA,EACA,MAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,aAAA,GAAgB,mBAAA;AACtB,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,WAAA,CAAY,WAAW,CAAA;AAEtD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,KAAA,EAAO,aAAA;AAAA,UACP,OAAA,EAAS,wBAAwB,WAAW,CAAA;AAAA;AAC9C;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAiB,CAAA,CAAE,SAAS,MAAM,CAAA;AAE3E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,OAAA,EAAS,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAA,EAAI;AAAA,KACpE;AAAA,EACF;AAEA,EAAA,MAAM,SAA4B,EAAC;AAKnC,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA,KAAmB,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9E,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,IAAI,sBAAA,CAAuB,GAAA,CAAI,GAAG,CAAA,EAAG;AACrC,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,GAAA;AAAA,QACP,OAAA,EAAS,CAAA,mBAAA,EAAsB,GAAG,CAAA,YAAA,EAAe,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,OACtF,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAA,IAAY,UAAU,MAAA,EAAQ;AACvC,IAAA,IAAI,QAAA,CAAS,QAAA,IAAY,EAAE,QAAA,CAAS,QAAQ,MAAA,CAAA,EAAS;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,OAAO,QAAA,CAAS,IAAA;AAAA,QAChB,OAAA,EAAS,CAAA,4BAAA,EAA+B,QAAA,CAAS,IAAI,CAAA;AAAA,OACtD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,EAAQ;AAC3B,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAClC,MAAA,MAAM,eAAe,QAAA,CAAS,IAAA;AAC9B,MAAA,MAAM,aAAa,OAAO,KAAA;AAE1B,MAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,UAAA,KAAe,QAAA,EAAU;AACxD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAA,EAAS,CAAA,SAAA,EAAY,YAAY,CAAA,MAAA,EAAS,UAAU,CAAA;AAAA,SACrD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,UAAA,KAAe,QAAA,EAAU;AACxD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAA,EAAS,CAAA,SAAA,EAAY,YAAY,CAAA,MAAA,EAAS,UAAU,CAAA;AAAA,SACrD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,iBAAiB,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAA,EAAS,uBAAuB,UAAU,CAAA;AAAA,SAC3C,CAAA;AAAA,MACH;AAEA,MAAA,IACE,YAAA,KAAiB,aAChB,UAAA,KAAe,QAAA,IAAY,MAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,KAAU,IAAA,CAAA,EAC9D;AACA,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAA,EAAS,wBAAwB,UAAU,CAAA;AAAA,SAC5C,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;ACpIA,eAAsB,SAAA,CACpB,IACA,MAAA,EACY;AACZ,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,GAAe,GAAA;AAAA,IACf;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IACE,SACA,OAAO,KAAA,KAAU,QAAA,IACjB,MAAA,IAAU,SACV,eAAA,EACA;AACA,QAAA,MAAM,gBAAA,GAAmB,KAAA;AACzB,QAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACpD,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAGA,MAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,QACjB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,QACnC;AAAA,OACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;;;AC/CO,IAAe,kBAAf,MAA+B;AAAA,EAIpC,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAI,aAAA,EAAc;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAgBU,cAAA,CACR,QACA,MAAA,EACmC;AACnC,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKU,WAAA,CAAY,QAAgB,KAAA,EAAmC;AACvE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,OAAO,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI;AAAA,MACtE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,KAChE,CAAA;AAED,IAAA,MAAM,gBAAA,GACJ,iBAAiB,KAAA,GACb,KAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAE7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,gBAAA;AAAA,MACP,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,GAAG,CAAC;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,cAAA,CACR,MAAA,EACA,QAAA,EACA,OAAA,GAAkB,CAAA,EACa;AAC/B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,MAAA,CAAO,IAAA;AAAA,MACzB,MAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,iBACd,EAAA,EACY;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AACtB,MAAA,OAAO,EAAA,EAAG;AAAA,IACZ;AAEA,IAAA,OAAO,UAAU,EAAA,EAAI;AAAA,MACnB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,MAC/B,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAA;AAAA,MAC7B,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA;AAAA,MAChC,eAAA,EAAiB;AAAA,QACf,eAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH;AACF,CAAA;;;AC1FO,IAAM,uBAA+D,EAAC;AAKtE,SAAS,mBAAA,CACd,MACA,WAAA,EACM;AACN,EAAA,oBAAA,CAAqB,IAAI,CAAA,GAAI,WAAA;AAC/B;AAKO,SAAS,eACd,IAAA,EACoC;AACpC,EAAA,OAAO,qBAAqB,IAAI,CAAA;AAClC;;;ACdA,SAAS,WAAA,CAAY,MAAc,SAAA,EAA4B;AAC7D,EAAA,OAAO,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,EAAA,EAAS,SAAS,CAAA,CAAA,GAAK,IAAA;AACnD;AAKO,IAAM,qBAAN,MAAyB;AAAA,EAAzB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAA8C,GAAA,EAAI;AAC1D,IAAA,IAAA,CAAQ,OAAA,uBAA8C,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1D,SAAA,CAAU,IAAA,EAAc,MAAA,EAAyC,SAAA,EAA0B;AACzF,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,SAAS,GAAG,EAAE,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAI,MAAc,SAAA,EAAqC;AACrD,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,SAAS,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAc,eAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC1E;AAGA,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC7D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,+BAA+B,IAAI,CAAA,yBAAA;AAAA,OACrC;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAEhC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,WAAA,EACA,MAAA,EACA,QACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,SAAS,SAAS,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAc,SAAA,EAA6B;AACtD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,SAAS,CAAC,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,IAAA,EAAc,QAAA,EAA2B,SAAA,EAA0B;AAClF,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,SAAS,GAAG,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,IAAA,EAAqB;AAC9B,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK,EAAG;AACvC,MAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,CAAI,WAAW,CAAA,EAAG,IAAI,IAAQ,CAAA,EAAG;AACnD,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;;;AC7HA,IAAI,cAAA,GAAyC,IAAA;AAC7C,IAAI,aAAA,GAA2C,IAAA;AAOxC,SAAS,qBAAqB,OAAA,EAAmC;AACtE,EAAA,aAAA,GAAgB,OAAA;AAClB;AAEO,SAAS,gBAAA,GAA8C;AAC5D,EAAA,OAAO,aAAA;AACT;AAOO,SAAS,uBAAuB,KAAA,EAA8B;AACnE,EAAA,cAAA,GAAiB,KAAA;AACnB;AAGO,SAAS,2BAAA,GAAsD;AACpE,EAAA,OAAO,cAAA;AACT;AAaO,SAAS,oBAAA,CACd,GAAA,EACA,GAAA,GAA0C,OAAA,CAAQ,GAAA,EAC9B;AACpB,EAAA,OAAO,cAAA,EAAgB,OAAA,CAAQ,GAAG,CAAA,IAAK,IAAI,GAAG,CAAA;AAChD;ACzC8B,IAAA,CAAK,UAAA,EAAY,sBAAsB;;;ACuCrE,IAAM,kBAAA,GAA8C,mBAAA;AAEpD,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,OAAO,IAAI,IAAA,CAAK,OAAA,GAAU,GAAI,EAAE,WAAA,EAAY;AAC9C;AAEA,SAAS,WAAA,CAAY,SAAiB,MAAA,EAA4C;AAChF,EAAA,IAAI,OAAA,KAAY,MAAA,CAAO,IAAA,EAAM,OAAO,MAAA;AACpC,EAAA,IAAI,OAAA,KAAY,MAAA,CAAO,KAAA,EAAO,OAAO,OAAA;AACrC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,MAAA,EAA+D;AAChF,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,QAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,oBAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,SAAS;AAGP,MAAA,OAAO,YAAA;AAAA,IACT;AAAA;AAEJ;AAEA,SAAS,iBAAA,CACP,KACA,MAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,SAAA,EAAW,KAAA,CAAM,EAAA,IAAM,EAAA;AACvC,EAAA,MAAM,QAAA,GAAW,WAAW,QAAA,IAAY,CAAA;AACxC,EAAA,MAAM,UAAA,GACJ,OAAO,GAAA,CAAI,QAAA,KAAa,WAAW,GAAA,CAAI,QAAA,GAAW,IAAI,QAAA,CAAS,EAAA;AACjE,EAAA,OAAO;AAAA,IACL,gBAAgB,GAAA,CAAI,EAAA;AAAA,IACpB,UAAA;AAAA,IACA,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5B,OAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA,EAAoB,WAAA,CAAY,GAAA,CAAI,oBAAoB,CAAA;AAAA,IACxD,gBAAA,EAAkB,WAAA,CAAY,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACpD,mBAAmB,GAAA,CAAI,oBAAA;AAAA,IACvB,IAAA,EAAM,WAAA,CAAY,OAAA,EAAS,MAAM;AAAA,GACnC;AACF;AAEA,SAAS,cAAc,QAAA,EAA4C;AACjE,EAAA,OAAO;AAAA,IACL,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,IACzB,UAAA,EAAY,QAAA,CAAS,QAAA,EAAU,UAAA,IAAc;AAAA,GAC/C;AACF;AAYO,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EAIrD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,iBAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIA,OAAAA,CAAO,MAAA,EAAQ;AAAA,MAC/B,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,EAAA;AAAA,MACtC,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB;AAAA,KAC1C;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,SAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,qBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,mBAAA,CAAoB,MAAM;AAAA,WACjC;AACA,UAAA;AAAA,QACF,KAAK,gBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA;AACpE,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,MAAA,EAA2B;AAC3D,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAS,GAAI,MAAA;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAA,EAA2B;AAAA,MAC3C,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,MACrB,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAE;AAAA,KAChC,CAAA;AACD,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO;AAAA,MAC7C,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,eAAe,MAAA,EAA2B;AACtD,IAAA,MAAM,EAAE,iBAAgB,GAAI,MAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,oBAAA,EAAsB;AAAA,MACtC,eAAA,EAAiB,MAAA,CAAO,eAAA,IAAmB,EAAE;AAAA,KAC9C,CAAA;AACD,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,QAAQ,eAAyB,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAc,OAAO,MAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,eAAA,EAAiB,MAAA,EAAO,GAAI,MAAA;AACpC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iBAAA,EAAmB;AAAA,MACnC,eAAA,EAAiB,MAAA,CAAO,eAAA,IAAmB,EAAE,CAAA;AAAA,MAC7C,MAAA,EAAQ,OAAO,MAAM;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,MACtC,cAAA,EAAgB,eAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,UAAA,EAAqD;AACrE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,YAAY,CAAA;AACrD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,SAAS,UAAU,CAAA;AAChE,IAAA,IAAI,QAAA,CAAS,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AACtC,IAAA,OAAO,cAAc,QAAQ,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,KAAA,EAAsD;AACzE,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,UAAA,EAAY,KAAA,CAAM,YAAY,CAAA;AACvE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,MAAA,CAAO;AAAA,MAClD,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,WAAA,IAAe,MAAA;AAAA,MAC3B,QAAA,EAAU,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,KAC1C,CAAA;AACD,IAAA,OAAO,cAAc,QAAQ,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBACJ,KAAA,EACiC;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,KAAS,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,KAAA;AACrE,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,IAAA,CAAK,WAAA,EAAa,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2BAAA,EAA6B;AAAA,MAC7C,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,WAAA,EAAa,MAAM,UAAA,KAAe;AAAA,KACnC,CAAA;AAED,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,MAAA,CAAO;AAAA,MACzD,IAAA,EAAM,cAAA;AAAA,MACN,QAAA,EAAU,MAAM,UAAA,IAAc,MAAA;AAAA,MAC9B,YAAY,CAAC,EAAE,OAAO,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,MAChD,aAAa,KAAA,CAAM,UAAA;AAAA,MACnB,YAAY,KAAA,CAAM,SAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA,QACjB,UAAU,KAAA,CAAM;AAAA,OAClB;AAAA,MACA,aAAA,EAAe,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,MAC/B,qBAAA,EAAuB;AAAA,KACxB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,MACpB,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,UAAA,EACE,OAAO,OAAA,CAAQ,QAAA,KAAa,WACxB,OAAA,CAAQ,QAAA,GACR,OAAA,CAAQ,QAAA,EAAU,EAAA,IAAM;AAAA,KAChC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,2BACJ,KAAA,EAC+B;AAC/B,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,UAAA,EAAY,KAAA,CAAM,YAAY,CAAA;AAC7E,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,SAAS,MAAA,CAAO;AAAA,MAC9D,UAAU,KAAA,CAAM,UAAA;AAAA,MAChB,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,cAAA,EAAsD;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,gBAAgB,CAAA;AAC7D,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,SAAS,cAAc,CAAA;AACnE,IAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAmB,KAAA,EAKQ;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,KAAS,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,KAAA;AACrE,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,IAAA,CAAK,WAAA,EAAa,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC3E;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,MACzC,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,cAAc,MAAA,CAAO;AAAA,MACjD,UAAU,KAAA,CAAM,UAAA;AAAA,MAChB,OAAO,CAAC,EAAE,OAAO,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,MAC3C,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,kBAAA,EAAoB,mBAAA;AAAA,MACpB,aAAA,EAAe,EAAE,OAAA,EAAS,IAAA;AAAK,KAChC,CAAA;AACD,IAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBACJ,KAAA,EAC8B;AAC9B,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,cAAA,EAAgB,KAAA,CAAM,gBAAgB,CAAA;AACnF,IAAA,MAAM,MAAA,GAA0C;AAAA,MAC9C,kBAAA,EAAoB;AAAA,KACtB;AACA,IAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AACtC,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,QAAA,CAAS,MAAM,cAAc,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA;AACvC,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,EAAE,EAAA,EAAI,QAAQ,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,MAC1D;AAAA,IACF;AACA,IAAA,IAAI,OAAO,KAAA,CAAM,iBAAA,KAAsB,SAAA,EAAW;AAChD,MAAA,MAAA,CAAO,uBAAuB,KAAA,CAAM,iBAAA;AAAA,IACtC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,MAAA;AAAA,MAC1C,KAAA,CAAM,cAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBACJ,KAAA,EAC8B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B;AAAA,MAC1C,gBAAgB,KAAA,CAAM,cAAA;AAAA,MACtB,aAAa,KAAA,CAAM;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,MAAMC,OAAM,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,MAAA,CAAO,MAAM,cAAA,EAAgB;AAAA,QACvE,oBAAA,EAAsB;AAAA,OACvB,CAAA;AACD,MAAA,OAAO,iBAAA,CAAkBA,IAAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,MAAA,CAAO,MAAM,cAAc,CAAA;AACvE,IAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AACF,CAAA;AAGA,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AC1YxC,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAGtD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,eAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,OAAA,CAAQ;AAAA,MAC3B,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,MAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAK,GAAI,MAAA;AAEpC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,KAAA,EAAO,MAAA,CAAO,SAAS,EAAE,CAAA,EAAG,YAAY,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAE,GAAG,CAAA;AAErI,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,MAC7C,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,MAChB,CAAA,EAAG,KAAA;AAAA,MACH,YAAa,UAAA,IAAyB,EAAA;AAAA,MACtC,IAAA,EAAM,IAAA,GAAO,CAAC,IAAc,CAAA,GAAI;AAAA,KACjC,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzC,OAAA,EAAS,KAAK,EAAA,EAAI,OAAA;AAAA,MAClB,KAAA,EAAO,KAAK,OAAA,EAAS,KAAA;AAAA,MACrB,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,GAAA;AAAA,MAC9C,WAAA,EAAa,KAAK,OAAA,EAAS;AAAA,KAC7B,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AAEpB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uBAAA,EAAyB,EAAE,SAAS,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA,EAAG,CAAA;AAE7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,MAC7C,IAAA,EAAM,CAAC,SAAA,EAAW,YAAY,CAAA;AAAA,MAC9B,EAAA,EAAI,CAAC,OAAiB;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,MACtB,WAAA,EAAa,MAAM,OAAA,EAAS,WAAA;AAAA,MAC5B,SAAA,EAAW,MAAM,UAAA,EAAY,SAAA;AAAA,MAC7B,SAAA,EAAW,MAAM,UAAA,EAAY;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,MAAA,EAA2B;AAClD,IAAA,MAAM,EAAE,WAAU,GAAI,MAAA;AAEtB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,WAAW,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA,EAAG,CAAA;AAEnF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,MAC/C,IAAA,EAAM,CAAC,SAAA,EAAW,YAAY,CAAA;AAAA,MAC9B,EAAA,EAAI,CAAC,SAAmB;AAAA,KACzB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA;AAAA,MACvB,WAAA,EAAa,QAAQ,OAAA,EAAS,WAAA;AAAA,MAC9B,eAAA,EAAiB,QAAQ,UAAA,EAAY;AAAA,KACvC;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;ACtI1C,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EAIrD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,kBAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,iBAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,mBAAA,IAAuB,EAAA;AAErD,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,SAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,UAAA,EAAY,SAAS,CAAA;AAE1C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,MAAA,EAA2B;AAC/C,IAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK,GAAI,MAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,aAAA,EAAe,EAAE,IAAI,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA,EAAG,CAAA;AAEzD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,MAChD,IAAA,EAAO,QAAmB,IAAA,CAAK,WAAA;AAAA,MAC/B,EAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,MAAA,EAA2B;AACpD,IAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,IAAI,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA,EAAG,CAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,MAChD,IAAA,EAAM,CAAA,SAAA,EAAY,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,MAClC,EAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAAA,MAClB;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;ACpGxC,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EAKpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,QAAA,GAAY,MAAA,CAAO,GAAA,CAAI,QAAA,IAA8B,UAAA;AAC1D,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,qBAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,MAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,gBAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,MACnD;AACA,MAAA,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,cAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,MAAA,CAAO,MAAM,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,MAAA,EAA2B;AAC5C,IAAA,MAAM,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,MAAM,QAAA,EAAU,OAAA,EAAS,YAAW,GAAI,MAAA;AAEnE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,IAAI,MAAA,CAAO,EAAE,CAAA,EAAG,OAAA,EAAS,OAAO,OAAO,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAExG,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,EAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAO,QAAmB,IAAA,CAAK,SAAA;AAAA,MAC/B,UAAW,QAAA,IAAuB,MAAA;AAAA,MAClC,SAAU,OAAA,IAAsB,MAAA;AAAA,MAChC,YAAa,UAAA,IAAyB;AAAA,KACxC;AAEA,IAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,MAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAc,gBAAgB,OAAA,EAAsB;AAClD,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA;AAAA;AAAA,MAGjB,IAAA,EAAM,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA;AAAA,MAClC,GAAI,QAAQ,QAAA,GAAW,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,MACjD,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,MACtD,GAAI,QAAQ,UAAA,GAAa,EAAE,YAAY,OAAA,CAAQ,UAAA,KAAe;AAAC,KACjE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAEtC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,CAAE,QAAQ,cAAc,CAAA;AAAA,MACtC,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,OAAA,EAAsB;AAChD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AAGtB,MAAA,MAAM,IAAI,MAAM,2FAAsF,CAAA;AAAA,IACxG;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,IAAA,CAAK;AAAA,MACnD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,IAAA,EAAM,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA;AAAA,MAClC,GAAI,QAAQ,QAAA,GAAW,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,MACjD,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY;AAAC,KACvD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,SAAS,IAAA,EAAM,EAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACF,CAAA;AAaA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;AC5JtC,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAItD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,sBAAA,IAA0B,EAAA;AAC1D,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,kBAAkB,CAAA,IAAK,GAAA;AAE1D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,MAAA,EAA2B;AAC5C,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,QAAO,GAAI,MAAA;AAExC,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,KAAA;AAAA,MACA,OAAA,EAAS,WAAW,EAAC;AAAA,MACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAED,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,MAAM,aAAA,GAAiB,UAAqB,IAAA,CAAK,aAAA;AACjD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,qBAAqB,CAAA,GAC3B,SAAA,GAAY,UAAA,CAAW,QAAA,EAAU,aAAa,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAE/E,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAe;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS;AAAA,KAC3C,CAAA;AAGD,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KAC3B;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;ACjGjD,SAAS,cACP,KAAA,EAC4D;AAC5D,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,EAAE,KAAA,YAAiB,IAAA,CAAA;AACpG;AAEA,SAAS,eAAe,KAAA,EAAiE;AACvF,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,KAAA;AAC3B,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,aAAA,CAAc,IAAI,CAAA,EAAG;AACvD,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,IAAA;AACzB,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AAC1D,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAK,EAAE;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AACxF;AAOO,IAAM,eAAA,GAAN,cAA8B,eAAA,CAAgB;AAAA,EAKnD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,gBAAA,IAAoB,EAAA;AACrD,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,EAAA;AACvD,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,aAAA,IAAiB,EAAA;AAEhD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,MAAA,EAA2B;AAC5C,IAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,MAAK,GAAI,MAAA;AACjD,IAAA,MAAM,GAAA,GAAM,eAAe,YAAY,CAAA;AAEvC,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,MAC7B,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAM,GAAA,IAAkB,MAAA;AAAA,MACxB,MAAO,IAAA,IAAmB;AAAA,KAC3B,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AAEzE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,gBAAA,CAAiB,KAAK,OAAA,EAAS;AAAA,QAC5D,YAAA,EAAc;AAAA,UACZ,SAAS,IAAA,CAAK,YAAA;AAAA,UACd,WAAW,IAAA,CAAK,cAAA;AAAA,UAChB,YAAY,IAAA,CAAK;AAAA;AACnB,OACD,CAAA;AACD,MAAA,OAAO,EAAE,UAAA,EAAY,QAAA,CAAS,YAAY,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,QAAQ,YAAA,EAAc;AAGzC,QAAA,IAAI,KAAA,CAAM,cAAc,GAAA,EAAK;AAC3B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO;AAAA,UACL,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,EAAA,EAAI,KAAA;AAAA,UACJ,OAAA,EAAS,KAAA,CAAM,UAAA,KAAe,GAAA,IAAO,MAAM,UAAA,KAAe;AAAA,SAC5D;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,QAAQ,eAAe,CAAA;ACtHpC,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EAIvD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,sBAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AACA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA,GACxC,MAAA,GACA,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE9B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,uBAAA,IAA2B,MAAA;AACtD,IAAA,MAAM,IAAA,GAAO,IAAIC,MAAAA,CAAO,IAAA,CAAK,GAAA,CAAI;AAAA,MAC/B,OAAO,GAAA,CAAI,YAAA;AAAA,MACX,KAAK,GAAA,CAAI,WAAA;AAAA,MACT,MAAA,EAAQ,CAAC,0CAA0C,CAAA;AAAA,MACnD;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,SAASA,MAAAA,CAAO,QAAA,CAAS,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,SAAA;AAE1D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kCAAA,EAAoC;AAAA,MACnD,SAAA,EAAW,QAAQ,OAAO;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,WAAW,MAAA,EAAmC;AACpD,IAAA,OAAQ,MAAA,CAAO,cAAyB,IAAA,CAAK,iBAAA;AAAA,EAC/C;AAAA,EAEQ,YAAY,KAAA,EAAiD;AACnE,IAAA,OAAO,KAAA,CAAM,WAAW,EAAA,GAAK,EAAE,MAAM,KAAA,EAAM,GAAI,EAAE,QAAA,EAAU,KAAA,EAAM;AAAA,EACnE;AAAA,EAEQ,cAAc,IAAA,EAA4D;AAChF,IAAA,OAAO,IAAA,EAAM,QAAA,IAAY,IAAA,EAAM,IAAA,IAAQ,EAAA;AAAA,EACzC;AAAA,EAEA,MAAc,WAAW,MAAA,EAA2B;AAClD,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,YAAW,GAAI,MAAA;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,MAC7C,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA,MAGlC,GAAI,SAAA,GACA,EAAE,SAAA,EAA+B,GACjC;AAAA,QACE,SAAU,OAAA,IAAsB,MAAA;AAAA,QAChC,SAAU,OAAA,IAAsB,MAAA;AAAA,QAChC,YAAA,EAAc,IAAA;AAAA,QACd,OAAA,EAAS;AAAA,OACX;AAAA,MACJ,YAAa,UAAA,IAAyB;AAAA,KACvC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAC;AACtC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC5B,EAAA,EAAI,MAAM,EAAA,IAAM,EAAA;AAAA,QAChB,OAAA,EAAS,MAAM,OAAA,IAAW,EAAA;AAAA,QAC1B,WAAA,EAAa,MAAM,WAAA,IAAe,EAAA;AAAA,QAClC,QAAA,EAAU,MAAM,QAAA,IAAY,EAAA;AAAA,QAC5B,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,SAAS,MAAS,CAAA;AAAA,QAClD,GAAA,EAAK,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAO,MAAS,CAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,MAAA,IAAU,EAAA;AAAA,QACxB,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,CAAE,CAAA;AAAA,MACF,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,aAAA,IAAiB;AAAA,KAChD;AAAA,EACF;AAAA,EAEQ,UAAA,CAAW,KAAA,EAAe,GAAA,EAAyB,eAAA,EAA6C;AACtG,IAAA,IAAI,KAAK,OAAO,GAAA;AAChB,IAAA,IAAI,KAAA,CAAM,WAAW,EAAA,EAAI;AAEvB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAM,CAAA;AAC1D,MAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,eAAA,IAAmB,kBAAkB,CAAA,EAAG;AAC1C,MAAA,OAAO,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,eAAA,GAAkB,GAAM,CAAA,CAAE,WAAA,EAAY;AAAA,IAC5E;AACA,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,YAAY,MAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,UAAU,KAAA,EAAO,GAAA,EAAK,iBAAgB,GAAI,MAAA;AACxE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,MAC/C,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA,MAClC,WAAA,EAAa;AAAA,QACX,OAAA;AAAA,QACA,aAAc,WAAA,IAA0B,MAAA;AAAA,QACxC,UAAW,QAAA,IAAuB,MAAA;AAAA,QAClC,KAAA,EAAO,IAAA,CAAK,WAAA,CAAY,KAAe,CAAA;AAAA,QACvC,KAAK,IAAA,CAAK,WAAA;AAAA,UACR,KAAK,UAAA,CAAW,KAAA,EAAkB,GAAA,IAAkB,MAAA,EAAY,mBAA8B,MAAS;AAAA;AACzG;AACF,KACD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,EAAA,IAAM,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAA,IAAU,EAAA;AAAA,MAChC,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAA,IAAY;AAAA,KACtC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,aAAa,QAAA,EAAU,KAAA,EAAO,KAAI,GAAI,MAAA;AAChE,IAAA,MAAM,cAAwC,EAAC;AAC/C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,WAAA,CAAY,OAAA,GAAU,OAAA;AACvD,IAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,EAAU,WAAA,CAAY,WAAA,GAAc,WAAA;AAC/D,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,WAAA,CAAY,QAAA,GAAW,QAAA;AACzD,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,cAAmB,KAAA,GAAQ,IAAA,CAAK,YAAY,KAAK,CAAA;AAClF,IAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,cAAiB,GAAA,GAAM,IAAA,CAAK,YAAY,GAAG,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,KAAA,CAAM;AAAA,MAC9C,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA,MAClC,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,EAAA,IAAM,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAA,IAAU;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO;AAAA,MAC9B,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA,MAClC;AAAA,KACD,CAAA;AACD,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAmB,OAAA,EAAS,IAAA,EAAK;AAAA,EAChD;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,MAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,KAAA,CAAM;AAAA,MAChD,WAAA,EAAa;AAAA,QACX,OAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,EAAO,CAAC,EAAE,EAAA,EAAI;AAAA;AAChB,KACD,CAAA;AACD,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA,EAAG,QAAQ,EAAC;AACrD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,UAAU,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,IAAG,CAAE;AAAA,KAC7E;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,MAAA,EAA2B;AAC7C,IAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,UAAA,EAAW,GAAI,MAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,KAAA,CAAM;AAAA,MAC9C,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA,MAClC,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,UAAA;AAAA,QACN,OAAA;AAAA,QACA,QAAQ,UAAA,GAAa,EAAE,KAAK,MAAA,CAAO,UAAU,GAAE,GAAI;AAAA;AACrD,KACD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,EAAA,IAAO,SAAA;AAAA,MAChC,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,UAAA,IAAc,EAAA;AAAA,MACxC,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,UAAA,IAAc;AAAA,KAC1C;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAA,EAA2B;AACjD,IAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAW,GAAI,MAAA;AAClC,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK;AAAA,MAC9B,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,SAAA;AAAA,QACJ;AAAA;AACF,KACD,CAAA;AACD,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAA;AAGA,mBAAA,CAAoB,YAAY,mBAAmB,CAAA;AC5PnD,SAAS,cAAc,OAAA,EAAgE;AACrF,EAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,IAAA,CAAK,OAAO,CAAA;AACpE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,GAAG,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA,GAAI,YAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA,EAAG,MAAM,CAAA;AAChG,IAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,IAAQ,IAAA,EAAK;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA,EAAG,aAAa,IAAA,EAAK;AAClE;AAeO,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EAKpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,mBAAA;AAC1B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA,GACxC,MAAA,GACA,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AACjD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,oBAAA,IAAwB,MAAA;AACnD,MAAA,MAAM,IAAA,GAAO,IAAIA,MAAAA,CAAO,IAAA,CAAK,GAAA,CAAI;AAAA,QAC/B,OAAO,GAAA,CAAI,YAAA;AAAA,QACX,KAAK,GAAA,CAAI,WAAA;AAAA,QACT,MAAA,EAAQ,CAAC,uCAAuC,CAAA;AAAA,QAChD;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,WAAWA,MAAAA,CAAO,KAAA,CAAM,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAEA,IAAA,MAAM,YAAA,GAAe,OAAO,GAAA,CAAI,0BAAA;AAChC,IAAA,MAAM,QAAA,GAAW,OAAO,GAAA,CAAI,eAAA;AAC5B,IAAA,MAAM,YAAA,GAAe,OAAO,GAAA,CAAI,mBAAA;AAChC,IAAA,IAAI,YAAA,IAAgB,YAAY,YAAA,EAAc;AAC5C,MAAA,MAAM,SAAS,IAAIA,MAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAU,YAAY,CAAA;AAC5D,MAAA,MAAA,CAAO,cAAA,CAAe,EAAE,aAAA,EAAe,YAAA,EAAc,CAAA;AACrD,MAAA,IAAA,CAAK,UAAA,GAAaA,OAAO,KAAA,CAAM,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,UAAA,EAAY;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,sBAAA,IAA0B,MAAA;AAE5D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,+BAAA,EAAiC;AAAA,MAChD,cAAA,EAAgB,KAAK,QAAA,KAAa,IAAA;AAAA,MAClC,SAAA,EAAW,KAAK,UAAA,KAAe,IAAA;AAAA,MAC/B,SAAA,EAAW,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,oBAAoB;AAAA,KACnD,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,UAAA,GAA6B;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,sBAAsB,CAAA;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,WAAA,GAA8B;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,QAAA;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,sBAAsB,CAAA;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAA,EAA2B;AACjD,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW,GAAI,MAAA;AACxC,IAAA,MAAM,OAAA,GAAU,CAAC,iBAAiB,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,YAAA,CAAc,CAAA;AAClF,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,MAAM,IAAA,CAAK;AAAA,MAClD,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,MACvB,UAAW,UAAA,IAAyB,GAAA;AAAA,MACpC,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAA,CAAQ,SAAS,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAChD,EAAA,EAAI,KAAK,EAAA,IAAM,EAAA;AAAA,QACf,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,QACnB,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,QAC3B,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,YAAA,IAAgB,EAAA;AAAA,QACnC,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,OACnC,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,MAAA,EAA2B;AAC/C,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,MAAM,GAAA,CAAI;AAAA,MAC7C,MAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,GAAa,KAAA,CAAM,GAAA;AAAA,MAC5C,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAQ;AAAA,MACvB,EAAE,cAAc,aAAA;AAAc,KAChC;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAmB,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,MAAA;AAAA,MACpB,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,MACxB,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,0BAAA;AAAA,MAChC,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,MAChC,MAAM,KAAA,CAAM;AAAA,KACd;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,MAAA,EAA2B;AAClD,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,UAAS,GAAI,MAAA;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,cAAc,OAAiB,CAAA;AAC9D,IAAA,MAAM,MAAA,GAAU,YAAmC,IAAA,CAAK,eAAA;AACxD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,EAAY,CAAE,MAAM,MAAA,CAAO;AAAA,MACrD,WAAA,EAAa;AAAA,QACX,IAAA;AAAA,QACA,OAAA,EAAS,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI;AAAA,OAC/B;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAA,EAAW,YAAuB,WAAA,IAAe,0BAAA;AAAA,QACjD,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,KAAK;AAAA,OAC3B;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,EAAA,IAAM,EAAA;AAAA,MACxB,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAA,IAAS,IAAA;AAAA,MAC7B,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,WAAA,IAAe;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,MAAA,EAA2B;AACpD,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAU,YAAmC,IAAA,CAAK,eAAA;AACxD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,EAAY,CAAE,MAAM,MAAA,CAAO;AAAA,MACrD,WAAA,EAAa;AAAA,QACX,IAAA;AAAA,QACA,QAAA,EAAU,oCAAA;AAAA,QACV,OAAA,EAAS,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI;AAAA,OAC/B;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,EAAA,IAAM,IAAI,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAA,IAAS,IAAA,EAAgB;AAAA,EACpF;AAAA,EAEA,MAAc,UAAU,MAAA,EAA2B;AACjD,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AAChC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,YAAY,MAAA,CAAO;AAAA,MAC1D,MAAA;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,MAAA;AAAA,QACN,MAAO,IAAA,IAAmB,QAAA;AAAA,QAC1B,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,cAAc,QAAA,CAAS,IAAA,CAAK,MAAM,EAAA,EAAG;AAAA,EAC9D;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;;;AC/O7C,IAAM,UAAA,GAAa,kCAAA;AAOZ,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAItD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,EAAA;AACnD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,EAAA;AAEzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAC,CAAA;AACnE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAA,EAAmC;AACnD,IAAA,MAAM,EAAA,GAAM,MAAA,CAAO,SAAA,IAAwB,IAAA,CAAK,gBAAA;AAChD,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,GAAG,UAAA,CAAW,MAAM,CAAA,GAAI,EAAA,GAAK,OAAO,EAAE,CAAA,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAc,QAAA,CAAS,IAAA,EAAc,KAAA,EAAiD;AACpF,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IACjC;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,QAAQ,WAAA,CAAY,OAAA,CAAQ,IAAK,CAAA,EAAG,CAAA;AACxE,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAE1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,OAAA,IAAW,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,KAAK,IAAA,IAAQ,IAAA;AAAA,EACtB;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,MACtE,MAAA,EAAQ,2CAAA;AAAA,MACR,YAAY,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAwB,OAAwB,CAAA;AAAA,MAC7E,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,KAAA,IAAS,CAAC,CAAA;AAAA,MAC7B,QAAA,EAAU,KAAK,gBAAA,IAAoB,EAAA;AAAA,MACnC,WAAA,EAAa,MAAA,CAAO,GAAA,EAAK,WAAA,IAAe,CAAC,CAAA;AAAA,MACzC,MAAA,EAAQ,MAAA,CAAO,GAAA,EAAK,MAAA,IAAU,CAAC;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,MAAA,EAA2B;AACrD,IAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AACnB,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,UAAA,CAAA,EAAc;AAAA,MACvE,MAAA,EAAQ,6BAAA;AAAA,MACR,GAAI,MAAA,GAAS,EAAE,gBAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,CAAC,MAAM,CAAC,CAAA,EAAE,GAAI;AAAC,KAChE,CAAA;AACD,IAAA,OAAO;AAAA,MACL,SAAA,EAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACzD,EAAA,EAAI,IAAI,EAAA,IAAM,EAAA;AAAA,QACd,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,QAClB,MAAA,EAAQ,IAAI,MAAA,IAAU,EAAA;AAAA;AAAA,QAEtB,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,YAAA,IAAgB,CAAC,CAAA,GAAI;AAAA,OAC/C,CAAE;AAAA,KACJ;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;;;ACzH1C,IAAM,qBAAA,GAAN,cAAoC,eAAA,CAAgB;AAAA,EACzD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,yDAAyD,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,gBAAA;AACH,UAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,QAAA,EAAU,iBAAiB,UAAU,CAAA;AACnE,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS,iBAAiB,SAAS,CAAA;AACjE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,UAAA,CACN,SAAA,EACA,OAAA,EACA,IAAA,EACsD;AACtD,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAChC,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,YAAe,IAAA,EAAM;AACxF,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,oCAAA,CAAsC,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,MAAA,GAAS,GAAA;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AAAA,MAC9B,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,IAAA,CAAA;AAAA,MACjC,OAAO,SAAA,CAAU;AAAA,KACnB;AAAA,EACF;AACF,CAAA;AAEA,IAAM,eAAA,GAAkB,CAAC,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAA;AACrH,IAAM,kBAAkB,CAAC,MAAA,EAAQ,WAAW,aAAA,EAAe,OAAA,EAAS,UAAU,WAAW,CAAA;AAEzF,SAAS,QAAQ,KAAA,EAAkD;AACjE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAClD,EAAA,MAAM,MAAM,KAAA,YAAiB,IAAA,GAAO,MAAM,WAAA,EAAY,GAAI,OAAO,KAAK,CAAA;AACtE,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,GAAA;AACjE;AAGA,mBAAA,CAAoB,cAAc,qBAAqB,CAAA;;;AC5FvD,IAAM,OAAA,GAAU,+CAAA;AAOT,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAMtD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAJd,IAAA,IAAA,CAAQ,WAAA,GAA6B,IAAA;AACrC,IAAA,IAAA,CAAQ,oBAAA,GAAuB,CAAA;AAK7B,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,oBAAA,IAAwB,EAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,qBAAA,IAAyB,EAAA;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gEAAgE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,mBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AACvE,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,kBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA;AACtE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,KAAA,GAAyB;AACrC,IAAA,IAAI,KAAK,WAAA,IAAe,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,uBAAuB,GAAA,EAAQ;AACvE,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,MACpD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,QAAQ,kBAAA,EAAmB;AAAA,MAC1E,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,KAAK,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,MAC7E,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAK;AAAA,KAClC,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,MAAA;AACxB,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,cAAA,GAAiB,GAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAc,SAAA,CAAU,IAAA,EAAcC,KAAAA,EAA8D;AAClG,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAChD,MAAA,EAAQA,OAAM,MAAA,IAAU,KAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,IAAA,CAAK,OAAO,CAAA;AAAA,OAC7C;AAAA,MACA,IAAA,EAAMA,OAAM,IAAA,KAAS,MAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAUA,MAAK,IAAI,CAAA;AAAA,MACrE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK;AAAA,KAClC,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,IAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,MAAA,EAA2B;AACzD,IAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAa,SAAA,EAAU,GAAI,MAAA;AAClD,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB;AAAA,MACnD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,cAAA,EAAgB,aAAA;AAAA,QAChB,QAAA,EAAU,WAAA;AAAA,QACV,WAAY,SAAA,IAAwB;AAAA;AACtC,KACD,CAAA;AACD,IAAA,OAAO,EAAE,eAAe,IAAA,CAAK,EAAA,IAAM,IAAI,IAAA,EAAM,IAAA,CAAK,QAAQ,EAAA,EAAG;AAAA,EAC/D;AAAA,EAEA,MAAc,aAAa,MAAA,EAA2B;AACpD,IAAA,MAAM,EAAE,eAAc,GAAI,MAAA;AAC1B,IAAA,MAAM,OAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,cAAA,EAAiB,aAAuB,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC,EAAE;AAAA,EACzC;AAAA,EAEA,MAAc,iBAAiB,MAAA,EAA2B;AACxD,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,MAAA,EAAO,GAAI,MAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,WAAA,EAAa,QAAkB,CAAA;AACvD,IAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,MAAgB,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,GAAO,CAAA,GAAI,IAAI,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA,GAAK,EAAA;AACzD,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,aAAa,SAAmB,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,CAAA;AAa5F,IAAA,OAAO;AAAA,MACL,YAAA,EAAA,CAAe,KAAK,YAAA,EAAc,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC3D,EAAA,EAAI,EAAA,CAAG,aAAA,IAAiB,EAAA,CAAG,qBAAA,IAAyB,EAAA;AAAA,QACpD,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,UAAU,CAAC,CAAA;AAAA,QAChD,QAAA,EAAU,EAAA,CAAG,iBAAA,EAAmB,QAAA,IAAY,EAAA;AAAA,QAC5C,IAAA,EAAM,GAAG,WAAA,IAAe,EAAA;AAAA,QACxB,WAAA,EAAa,GAAG,iCAAA,IAAqC,EAAA;AAAA,QACrD,YAAA,EAAc,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,UAAA,IAAc;AAAA,OACpD,CAAE;AAAA,KACJ;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;;;AC3J1C,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EACpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,qBAAqB,CAAC,MAAA,CAAO,IAAI,qBAAA,EAAuB;AACtE,MAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,2CAA2C,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,mBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AACvE,UAAA;AAAA,QACF,KAAK,kBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA;AACtE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,SAAA,CACZ,IAAA,EACAA,KAAAA,EACkB;AAClB,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,iBAAA,CAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChE,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAC7C,MAAA,EAAQA,OAAM,MAAA,IAAU,KAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQA,KAAAA,EAAM,GAAA,GAAM,iBAAA,GAAoB,kBAAA;AAAA,QACxC,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,IAAI,qBAAqB,CAAA;AAAA,OAChE;AAAA,MACA,IAAA,EAAMA,OAAM,IAAA,KAAS,MAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAUA,MAAK,IAAI,CAAA;AAAA,MACrE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK;AAAA,KAClC,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9E;AACA,IAAA,IAAIA,OAAM,GAAA,EAAK;AACb,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAc,aAAa,MAAA,EAA2B;AACpD,IAAA,MAAM,EAAE,cAAA,EAAgB,aAAA,EAAe,YAAA,EAAc,eAAA,EAAiB,cAAa,GAAI,MAAA;AACvF,IAAA,MAAM,UAAA,GAAa,eAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,GAAI,UAAA;AAChG,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,YAAA,EAAe,YAAA,IAA2B,CAAA,aAAA,EAAgB,YAAsB,CAAA,CAAA;AAAA,QAChF,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW;AAAA,UACT;AAAA,YACE,cAAA,EAAgB,MAAA;AAAA,YAChB,IAAA,EAAM,YAAA;AAAA,YACN,aAAA,EAAe,OAAO,YAAY,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,KAAA;AAAA,YACxD,UAAA,EAAY;AAAA;AACd,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP;AAAA,cACE,KAAA,EAAO,cAAA;AAAA,cACP,IAAA,EAAM,aAAA;AAAA,cACN,WAAA,EAAa,GAAA;AAAA,cACb,YAAA,EAAc;AAAA;AAChB;AACF;AACF;AACF,KACD,CAAA;AACD,IAAA,OAAO,EAAE,YAAY,IAAA,CAAK,UAAA,IAAc,IAAI,MAAA,EAAQ,IAAA,CAAK,UAAU,MAAA,EAAO;AAAA,EAC5E;AAAA,EAEA,MAAc,kBAAkB,MAAA,EAA2B;AACzD,IAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AACvB,IAAA,MAAM,OAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,WAAA,EAAc,UAAoB,CAAA,CAAE,CAAA;AAIvE,IAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,IAAU,IAAI,WAAA,EAAa,IAAA,CAAK,qBAAqB,EAAA,EAAG;AAAA,EAChF;AAAA,EAEA,MAAc,iBAAiB,MAAA,EAA2B;AACxD,IAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AACvB,IAAA,MAAM,QAAS,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,WAAA,EAAc,UAAoB,CAAA,mBAAA,CAAA,EAAuB;AAAA,MAC3F,GAAA,EAAK;AAAA,KACN,CAAA;AACD,IAAA,OAAO,EAAE,SAAS,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG,YAAA,EAAc,CAAA,SAAA,EAAY,UAAoB,CAAA,IAAA,CAAA,EAAO;AAAA,EACnG;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;ACjItC,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAKlD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AALd,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,UAAA,GAAqC,IAAA;AAO3C,IAAA,MAAM,kBAAA,GAAqB,OAAO,GAAA,CAAI,QAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,kBAAA,IAAsB,oBAAA,EAAqB,IAAK,WAAA;AAEhE,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,uCAAA,EAA0C,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,QAC1B,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,eAAA,CAAgB;AAAA,QACpC,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAkD,YAAA;AAAA,QAC7E,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,eAAA,IAAmB,uBAAA;AAAA,QAC1C,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI;AAAA,OACzB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM;AAAA,MACJ,YAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAQJ,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,KAAA,EAAO,aAAa,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS,KAAA,GACX,IAAI,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,aAAa,WAAA,IAAe,GAAA,EAAK,CAAA,GACjF,KAAK,SAAA,EAAU;AAEnB,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,gBAAA,CAAyB;AAAA,MACrD,cAAc,YAAA,IAAgB,8BAAA;AAAA,MAC9B,UAAA;AAAA,MACA,WAAW,SAAA,IAAa,IAAA;AAAA,MACxB,WAAA;AAAA,MACA,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,IAAA;AAAA,MAClB,KAAA,EAAO,SAAS,KAAA,GACZ;AAAA,QACE,YAAA,EAAc,SAAS,KAAA,CAAM,YAAA;AAAA,QAC7B,gBAAA,EAAkB,SAAS,KAAA,CAAM,gBAAA;AAAA,QACjC,WAAA,EAAa,SAAS,KAAA,CAAM;AAAA,OAC9B,GACA,EAAE,MAAA,EAAQ,CAAA;AAAE,KAClB;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM,GAAI,MAAA;AAMpC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,YAAY,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAE3E,IAAA,MAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,MACpC,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,UAAmC,CAAA;AAAA,MACpD,UAAA,EAAY,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MACnC,SAAA,EAAW,EAAE,MAAA;AAAO,KACrB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,KAAA,GACX,IAAI,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,CAAA,GAClE,KAAK,SAAA,EAAU;AAEnB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK;AAAA,MAC/B,YAAA,EAAc,CAAA,iFAAA,EAAoF,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,8DAAA,CAAA;AAAA,MACvH,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ,oBAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,MAAA,EAA2B;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAA;AAMhC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,4BAAA,EAA8B,EAAE,QAAQ,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA,EAAG,CAAA;AAKhF,IAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AAE1C,IAAA,MAAM,MAAA,GAAS,KAAA,GACX,IAAI,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,CAAA,GAClE,KAAK,SAAA,EAAU;AAEnB,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAExD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK;AAAA,MAC/B,YAAA,EAAc,CAAA;;AAAA,EAAsG,iBAAiB;;AAAA,2CAAA,CAAA;AAAA,MACrI,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa,GAAA;AAAA,MACb,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,UAAU,MAAA,EAA2B;AACjD,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,OAAM,GAAI,MAAA;AAO1C,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,SAAA,EAAW,OAAO,CAAA;AAE1D,IAAA,MAAM,aAAA,GAAgB,EAAE,MAAA,CAAO;AAAA,MAC7B,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,MAClB,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ;AAAA,KAC9B,CAAA;AAED,IAAA,MAAM,oBAAoB,KAAA,KAAU,QAAA,GAChC,oBAAA,GACA,KAAA,KAAU,aACR,2BAAA,GACA,aAAA;AAEN,IAAA,MAAM,kBAAA,GAAqB,SAAA,GACvB,CAAA,uBAAA,EAA0B,SAAS,CAAA,OAAA,CAAA,GACnC,EAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,KAAA,GACX,IAAI,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,CAAA,GAClE,KAAK,SAAA,EAAU;AAEnB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK;AAAA,MAC/B,YAAA,EAAc,CAAA,2BAAA,EAA8B,iBAAiB,CAAA,CAAA,EAAI,kBAAkB,CAAA,qEAAA,CAAA;AAAA,MACnF,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,MAAM,MAAA,EAA2B;AAC7C,IAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAElB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAE5D,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,aAAA,EAAc,CAAE,WAAW,KAAK,CAAA;AACzD,IAAA,OAAO,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA,EAAW;AAAA,EACxC;AACF,CAAA;AAGA,mBAAA,CAAoB,OAAO,cAAc,CAAA;;;AClQzC,IAAM,cAAA,GAAiB,UAAA;AACvB,IAAM,kBAAA,GAAqB,cAAA;AAE3B,IAAM,kBAAA,GAAqB,GAAA;AAyB3B,SAAS,gBAAgB,KAAA,EAA+D;AACtF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,EAAE,KAAA,YAAiB,IAAA,CAAA;AACpG;AAQA,SAAS,mBAAmB,QAAA,EAAgD;AAC1E,EAAA,MAAM,OAAA,GAAA,CAAW,QAAA,CAAS,aAAA,IAAiB,EAAC,EAAG,IAAA;AAAA,IAC7C,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,MAAA,IAAU,MAAA,CAAO,OAAA,IAAW,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,KAAK,KAAA,KAAU;AAAA,GAClH;AACA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,OAAA;AAC7B,EAAA,IAAI,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAE,QAAA,IAAY,OAAA,CAAA,IAAY,OAAO,OAAA,CAAQ,UAAA,KAAe,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1G,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ;AAAA,GACtB;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,eAAA,CAAgB;AAAA,EAIjD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,SAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,OAAO,GAAA,CAAI,cAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,GAAG,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAC,QAAQ,WAAW,CAAA,OAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,GAAA,CAAI,mBAAA,GAAsB,OAAO,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,GAAI,kBAAA;AAE3F,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,4BAAA,EAA8B,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,MAAA,EAAiD;AACnE,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AAEzB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,OAAO,CAAA;AAEnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAElD,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,QAAA,CAAS,KAAA,IAAS,eAAe,CAAA,CAAA;AAAA,QACjE,eAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAA,CAAU,QAAA,CAAS,aAAA,IAAiB,EAAC,EAAG,IAAA;AAAA,MAC5C,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,MAAA,IAAU,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAA,KAAU;AAAA,KAChG;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAA,IAAS,mBAAmB,CAAA,CAAA;AAAA,QAClE,eAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,mBAAmB,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,8DAAA;AAAA,QACA,eAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS,OACpB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,SAAA,CAAU,KAAA,EAAe,KAAA,EAAsD;AAC3F,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAEjE,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,CAAA;AAAA,QAClE,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AAChE,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,CAAA,mCAAA,EAAsC,KAAK,SAAS,CAAA,+BAAA,CAAA;AAAA,UACpD,eAAA;AAAA,UACA,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,SAAA;AAAU,SACrC;AAAA,MACF;AACA,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QACpF,eAAA;AAAA,QACA,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,SAAA;AAAU,OACrC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,aAAa,EAAA,EAAI;AACpB,MAAA,MAAM,OAAO,MAAM,YAAA,CAAa,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACrD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,aAAa,MAAM,CAAA,CAAA;AAAA,QACvD,eAAA;AAAA,QACA,EAAE,KAAA,EAAO,MAAA,EAAQ,YAAA,CAAa,QAAQ,IAAA;AAAK,OAC7C;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAQ,MAAM,aAAa,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,kDAAkD,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QACxG,eAAA;AAAA,QACA,EAAE,KAAA;AAAM,OACV;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,MAAM,aAAa,CAAA;;;ACnOhC,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EAIxD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,uBAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,EAAA;AAE9C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,mCAAA,EAAqC,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,kBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,gBAAA,CAAiB,MAAM;AAAA,WAC9B;AACA,UAAA;AAAA,QACF,KAAK,gBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA;AACpE,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAC,CAAA;AACnE,UAAA;AAAA,QACF,KAAK,kBAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,gBAAA,CAAiB,MAAM;AAAA,WAC9B;AACA,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,SAAQ,GAAI,MAAA;AAE9C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,UAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAE,GAAG,CAAA;AAElH,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB;AAAA,MACxD,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,MAAA,EAA2B;AACxD,IAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uBAAA,EAAyB,EAAE,UAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,EAAG,CAAA;AAE/E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAA,EAAqB;AAAA,MACvD;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,MAAA,EAA2B;AACtD,IAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AAEnB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mBAAmB,CAAA;AAErC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB;AAAA,MAC1D;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,MAAA,EAA2B;AACrD,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAA;AAE1B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,OAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAG,CAAA;AAEpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB;AAAA,MACzD,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,MAAA,EAA2B;AACxD,IAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,UAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,EAAG,CAAA;AAEhF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB;AAAA,MACxD;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,OAAA,CAAQ,QAAA,EAAkB,IAAA,EAAyB;AAC/D,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,GAAG,QAAQ,CAAA,CAAA;AAErC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,IAAA,CAAK,MAAA,GAAS,EAAE,aAAA,EAAe,UAAU,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG,GAAI;AAAC,OAClE;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,OACrE;AAAA,IACF;AAEA,IAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B;AACF,CAAA;AAGA,mBAAA,CAAoB,aAAa,oBAAoB,CAAA;AC9IrD,eAAe,OAAA,CACb,IAAA,EACA,GAAA,EACA,GAAA,EAC6C;AAC7C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM;AAAA,MAC9B,GAAA;AAAA,MACA,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MAC9B,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AACzB,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,MAAA;AAAA,UACE,IAAI,gBAAA;AAAA,YACF,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC;AAAA,EAAK,MAAM,CAAA,CAAA;AAAA,YAChD,eAAA;AAAA,YACA,EAAE,MAAM,MAAA;AAAO;AACjB,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC1B,MAAA,MAAA;AAAA,QACE,IAAI,gBAAA;AAAA,UACF,CAAA,uBAAA,EAA0B,MAAM,OAAO,CAAA,CAAA;AAAA,UACvC,eAAA;AAAA,UACA,EAAE,KAAA;AAAM;AACV,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,SAAA,CACpB,QACA,KAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,KAAA,GAAQ,GAAE,GAAI,MAAA;AAGlD,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,OAAA,EAAS,KAAK,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,CAAC,OAAO,CAAA;AAErB,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,SAAS,SAAS,CAAA;AAE5B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,CAAA;AAGjC,IAAA,MAAM,oBAAA,CAAqB,WAAW,OAAO,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACrF,eAAA;AAAA,MACA,EAAE,SAAS,KAAA;AAAM,KACnB;AAAA,EACF;AACF;AAKA,eAAsB,YAAA,CACpB,QACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,MAAA;AACnC,EAAA,MAAM,GAAA,GAAM,OAAO,OAAA,IAAW,OAAA;AAE9B,EAAA,IAAI;AAEF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,OAAA,CAAQ,CAAC,UAAA,EAAY,UAAU,GAAG,GAAG,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,QAAQ,CAAC,UAAA,EAAY,IAAA,EAAM,UAAU,GAAG,GAAG,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAClF,eAAA;AAAA,MACA,EAAE,UAAA,EAAY,UAAA,EAAY,KAAA;AAAM,KAClC;AAAA,EACF;AACF;AAKA,eAAsB,MAAA,CACpB,QACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAO,OAAA,IAAW,OAAA;AAE9B,EAAA,IAAI;AAEF,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,QAAQ,CAAC,KAAA,EAAO,GAAG,KAAK,GAAG,GAAG,CAAA;AAAA,IACtC,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,QAAQ,CAAC,QAAA,EAAU,IAAA,EAAM,OAAO,GAAG,GAAG,CAAA;AAAA,EAC9C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC3E,eAAA;AAAA,MACA,EAAE,SAAS,KAAA;AAAM,KACnB;AAAA,EACF;AACF;AAKA,eAAsB,IAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,EAAE,UAAA,EAAY,KAAA,GAAQ,KAAA,EAAM,GAAI,MAAA;AACtC,EAAA,MAAM,GAAA,GAAM,OAAO,OAAA,IAAW,OAAA;AAG9B,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,EAAQ,QAAA,EAAU,cAAc,MAAM,CAAA;AACjE,EAAA,IAAI,SAAS,iBAAA,CAAkB,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAA,EAAG;AACjE,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,mCAAmC,UAAU,CAAA,gBAAA,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,KAAK,CAAA;AAEzD,IAAA,MAAM,IAAA,GAAO,CAAC,MAAM,CAAA;AAEpB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAGpC,IAAA,MAAM,OAAA,CAAQ,MAAM,GAAA,EAAK;AAAA,MACvB,WAAA,EAAa,UAAA;AAAA,MACb,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAGD,IAAA,MAAMC,QAAA,CAAG,OAAO,UAAU,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,mBAAmB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACzE,eAAA;AAAA,MACA,EAAE,YAAY,KAAA;AAAM,KACtB;AAAA,EACF;AACF;AAKA,SAAS,kBAAA,CAAmB,SAAiB,KAAA,EAAuB;AAClE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,GAAA,CAAI,QAAA,GAAW,gBAAA;AACf,EAAA,GAAA,CAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAKA,eAAe,oBAAA,CAAqB,SAAiB,WAAA,EAAoC;AACvF,EAAA,IAAI;AAEF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAC/B,IAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,IAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAE9B,IAAA,MAAM,QAAQ,CAAC,QAAA,EAAU,WAAW,QAAA,EAAU,QAAQ,GAAG,OAAO,CAAA;AAAA,EAClE,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,EACxE;AACF;AAKA,eAAe,2BAA2B,KAAA,EAAgC;AACxE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,IAAU,MAAA;AACrC,EAAA,MAAM,aAAaC,IAAAA,CAAK,MAAA,EAAQ,YAAY,IAAA,CAAK,GAAA,EAAK,CAAA,GAAA,CAAK,CAAA;AAE3D,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA,MAAA,EAAoB,KAAK,CAAA,CAAA,CAAA;AAExC,EAAA,MAAMD,SAAG,SAAA,CAAU,UAAA,EAAY,QAAQ,EAAE,IAAA,EAAM,KAAO,CAAA;AAEtD,EAAA,OAAO,UAAA;AACT;;;ACtNA,eAAe,WAAA,CACb,QAAA,EACA,MAAA,EACA,OAAA,GAAuB,EAAC,EACO;AAC/B,EAAA,MAAM,GAAA,GAAM,yBAAyB,QAAQ,CAAA,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,IACvC,QAAA,EAAU,6BAAA;AAAA,IACV,sBAAA,EAAwB,YAAA;AAAA,IACxB,GAAG,OAAA,CAAQ;AAAA,GACb;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,SAAA,GAA6B;AAAA,MACjC,SAAA,EAAW,SAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,uBAAuB,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,MAC5E,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,mBAAmB,CAAA,IAAK,QAAQ,EAAE,CAAA;AAAA,MACvE,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,mBAAmB,CAAA,IAAK,KAAK,EAAE;AAAA,KACtE;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,OAAA,EAAS,QAAA,CAAS,UAAA,EAAW,CAAE,CAAA;AAGlF,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,gCAAA;AAAA,UACA,kBAAA;AAAA,UACA,EAAE,WAAW,KAAA;AAAM,SACrB;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,CAAA,kCAAA,EAAqC,KAAA,CAAM,OAAA,IAAW,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,UACzE,YAAA;AAAA,UACA,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,KAAA;AAAM,SACnC;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,2BAAA,EAA8B,KAAA,CAAM,OAAA,IAAW,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,QAClE,eAAA;AAAA,QACA,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,KAAA;AAAM,OACnC;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,gBAAA,EAAkB;AACrC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACpF,eAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACF;AAwGA,eAAsB,QAAA,CACpB,QACA,MAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,YAAY,UAAA,EAAY,KAAA,GAAQ,OAAM,GAAI,MAAA;AAE/D,EAAA,MAAM,WAAW,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,MAAA,CAAA;AAEtD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAA+B,UAAU,MAAA,EAAQ;AAAA,IACtE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,KAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACD;AAAA,GACF,CAAA;AAED,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,aAAA,CACpB,QACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAErB,EAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,KAAK,IAAI,MAAA,CAAO,IAAI,UAAU,QAAQ,CAAA,SAAA,CAAA;AAExE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAA6B,UAAU,MAAM,CAAA;AAEpE,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,UAAA,CACpB,QACA,MAAA,EACwB;AACxB,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,MAAA,GAAS,EAAC,EAAG,QAAA,GAAW,IAAG,GAAI,MAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB;AAAA,IACtC,KAAA;AAAA,IACA,UAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG,EAAE,QAAA;AAAS,GAC5C,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,KAAK,IAAI,MAAA,CAAO,IAAI,WAAW,WAAW,CAAA,CAAA;AAE5E,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAA2B,UAAU,MAAM,CAAA;AAElE,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,QAAA,CACpB,QACA,MAAA,EAC4D;AAC5D,EAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAGxB,EAAA,MAAM,aAAA,GAAgB,UAAU,MAAA,CAAO,KAAK,IAAI,MAAA,CAAO,IAAI,WAAW,WAAW,CAAA,CAAA;AACjF,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,WAAA,CAAyB,eAAe,MAAM,CAAA;AAG5E,EAAA,MAAM,gBAAA,GAAmB,UAAU,MAAA,CAAO,KAAK,IAAI,MAAA,CAAO,IAAI,WAAW,WAAW,CAAA,SAAA,CAAA;AACpF,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,KAAa,MAAM,WAAA,CAA6B,kBAAkB,MAAM,CAAA;AAEtF,EAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAC3B;AA8BA,eAAsB,WAAA,CACpB,QACA,OAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAClD,EAAA,IAAI,SAAS,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,QAAQ,GAAG,CAAA;AAC/C,EAAA,IAAI,OAAA,EAAS,SAAS,MAAA,CAAO,GAAA,CAAI,YAAY,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACvE,EAAA,IAAI,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,EAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,QAAA,EAAW,QAAA,GAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAE/F,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAOnB,UAAU,MAAM,CAAA;AAEpB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IACzB,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,IACrB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,IACpB,OAAO,IAAA,CAAK;AAAA,GACd,CAAE,CAAA;AACJ;AAwEA,eAAsB,OAAA,CACpB,QACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAI,GAAI,MAAA;AACnC,EAAA,MAAM,MAAA,GAA0B,EAAE,KAAmB,CAAA;AACrD,EAAA,MAAM,QAAQ,GAAA,GAAM,CAAA,KAAA,EAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AACxD,EAAA,MAAM,QAAA,GAAW,UAAU,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,EAAa,IAAI,GAAG,KAAK,CAAA,CAAA;AAEjE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAMpB,UAAU,MAAM,CAAA;AAEnB,EAAA,MAAM,OAAA,GACJ,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,OAAO,IAAI,IAAA,CAAK,OAAA;AAE5F,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,KAAK,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AACpE;AAOA,eAAsB,kBAAA,CACpB,QACA,KAAA,EACgC;AAChC,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,UAAS,GAAI,MAAA;AAC7C,EAAA,MAAM,MAAA,GAA0B,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAErD,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,QAAA,EAAU,CAAA;AAE1E,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAACE,OAAAA,MAAY;AAAA,IAC9B,KAAKA,OAAAA,CAAO,GAAA;AAAA,IACZ,SAASA,OAAAA,CAAO,OAAA;AAAA,IAChB,MAAA,EAAQA,QAAO,MAAA,CAAO,IAAA;AAAA,IACtB,IAAA,EAAMA,QAAO,MAAA,CAAO;AAAA,GACtB,CAAE,CAAA;AACJ;AAKA,eAAsB,WAAA,CACpB,QACA,KAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAO,GAAI,MAAA;AAC7C,EAAA,MAAM,MAAA,GAA0B,EAAE,KAAmB,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,CAAA;AAExC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAA,CAAyB,UAAU,MAAA,EAAQ;AAAA,IAChE,MAAA,EAAQ,MAAA;AAAA,IACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ;AAAA,GAC7C,CAAA;AAED,EAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI;AACjE;AAKO,SAAS,aAAa,OAAA,EAAkD;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,IAAA,MAAM,YAAY,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAExD,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,MAAM,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAE9C,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,mCAAmC,OAAO,CAAA,CAAA;AAAA,MAC1C,kBAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACF;;;ACveO,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EAMrD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,GAAA,CAAI,YAAA;AACxB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,YAAA,IAAgB,EAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,EAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,eAAA,IAAmB,QAAQ,GAAA,EAAI;AAEzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAA,EAAkC;AAAA,MACjD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,SAAA,CAAU,MAA2B;AAAA,WAC5C;AACA,UAAA;AAAA,QAEF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,YAAA,CAAa,MAAkC;AAAA,WACtD;AACA,UAAA;AAAA,QAEF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,MAAA,CAAO,MAA4B;AAAA,WAC1C;AACA,UAAA;AAAA,QAEF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,IAAA,CAAK,MAA0B;AAAA,WACtC;AACA,UAAA;AAAA,QAEF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,QAAA,CAAS,MAA8B;AAAA,WAC9C;AACA,UAAA;AAAA,QAEF,KAAK,eAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,aAAA,CAAc,MAAmC;AAAA,WACxD;AACA,UAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,UAAA,CAAW,MAAgC;AAAA,WAClD;AACA,UAAA;AAAA,QAEF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,QAAA,CAAS,MAA8B;AAAA,WAC9C;AACA,UAAA;AAAA,QAEF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,OAAA,CAAQ,MAA6B;AAAA,WAC5C;AACA,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,WAAA,CAAY,MAAiC;AAAA,WACpD;AACA,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,WAAA,CAAY,MAAiC;AAAA,WACpD;AACA,UAAA;AAAA,QAEF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,QAAA,EAAU,KAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,GAAA,EAAI,GAAI,WAAW,OAAO;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,MAAA,EAAyD;AAC/E,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAGnE,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,IAAA,EAAM;AAC7B,MAAA,MAAM,MAAA,GAAmB,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AACpD,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAAA,IACrB;AAEA,IAAA,MAAa,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,SAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,OAAO,CAAA,IAAA,EAAO,OAAO,SAAS,CAAA;AAAA,KACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,MAAA,EAAgE;AACzF,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,UAAA,EAAY,MAAA,CAAO,YAAY,CAAA;AAEtE,IAAA,MAAa,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA,6BAAA,EAAgC,MAAA,CAAO,UAAU,CAAA;AAAA,KAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAO,MAAA,EAA0D;AAC7E,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAEnE,IAAA,MAAa,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA,gCAAA,EAAmC,MAAA,CAAO,OAAO,CAAA;AAAA,KAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KAAK,MAAA,EAAwD;AACzE,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,UAAA,EAAY,MAAA,CAAO,YAAY,CAAA;AAErE,IAAA,MAAa,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAElD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA,4BAAA,EAA+B,MAAA,CAAO,UAAU,CAAA;AAAA,KAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAS,MAAA,EAA8B;AACnD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAElE,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,EAAA,GAAK,MAAgB,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAErD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,sBAAA,EAAwB,EAAE,MAAA,EAAQ,GAAG,MAAA,EAAQ,GAAA,EAAK,EAAA,CAAG,GAAA,EAAK,CAAA;AAE3E,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,MAAA,EAAmC;AAC7D,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAEtE,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,QAAA,GAAW,MAAgB,aAAA,CAAc,MAAA,EAAQ,SAAS,CAAA;AAEhE,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,MAAA,EAAgC;AACvD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,KAAK,IAAI,CAAA,EAAG,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAEzH,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,MAAA,GAAS,MAAgB,UAAA,CAAW,MAAA,EAAQ,SAAS,CAAA;AAE3D,IAAA,OAAO,EAAE,MAAA,EAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAS,MAAA,EAA8B;AACnD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,WAAA,EAAa,MAAA,CAAO,aAAa,CAAA;AAEtE,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,MAAA,GAAS,MAAgB,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAEzD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QAAQ,MAAA,EAA6B;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAE/F,IAAA,OAAiB,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,MAAA,EAAiC;AACzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAElG,IAAA,MAAM,OAAA,GAAU,MAAgB,kBAAA,CAAmB,MAAA,EAAQ,KAAK,KAAK,CAAA;AAErE,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,MAAA,EAAiC;AACzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAEnG,IAAA,OAAiB,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAA0C;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,IAAA,EAAM;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AC7SxC,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAClD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACjC,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2B;AAChD,IAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AAEnB,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAGA,IAAA,MAAM,UAAU,WAAA,CAAYD,IAAAA,CAAK,MAAA,EAAO,EAAG,mBAAmB,CAAC,CAAA;AAC/D,IAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AAE7C,IAAA,IAAI;AAEF,MAAAE,aAAAA,CAAc,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAEzC,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,IAAA,EAAM,YAAY,CAAA;AAG3D,MAAA,MAAM,MAAA,GAAS,QAAA;AAAA,QACb,8BAA8B,UAAU,CAAA,eAAA,CAAA;AAAA,QACxC;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,GAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA;AAChC,OACF;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,QACvB,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,QAC1B,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,QAC9B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,OAC7B;AAAA,IACF,SAAS,KAAA,EAAgB;AAEvB,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AACjD,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,YAC1B,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,YAC9B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,WAC7B;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,SAAA,CAAU,OAAA,IAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC9D;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,SAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,OAAO,cAAc,CAAA;;;ACnGlC,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EAKpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AALd,IAAA,IAAA,CAAQ,KAAA,uBAAqC,GAAA,EAAI;AACjD,IAAA,IAAA,CAAQ,KAAA,uBAAiC,GAAA,EAAI;AAC7C,IAAA,IAAA,CAAQ,QAAA,uBAAqD,GAAA,EAAI;AAK/D,IAAA,MAAM,QAAA,GAAW,OAAO,GAAA,CAAI,SAAA;AAC5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,wGAAA;AAAA,QAEA,EAAE,QAAA;AAAS,OACb;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA;AACpE,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA;AAAA,YAAiB,MACjC,IAAA,CAAK,gBAAA,CAAiB,MAAM;AAAA,WAC9B;AACA,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAQ,GAAA,EAAsB;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAI,MAAM,SAAA,KAAc,MAAA,IAAa,KAAK,GAAA,EAAI,GAAI,MAAM,SAAA,EAAW;AACjE,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,cAAA,GAAyB;AAC/B,IAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,OACZ,MAAA,EAC6B;AAC7B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA,EAAa,EAAE,KAAK,CAAA;AAEtC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,IACvB;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAM,QAAQ,IAAA,EAAK;AAAA,EAC7C;AAAA,EAEA,MAAc,OACZ,MAAA,EAC0B;AAC1B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,WAAA,EAAa,EAAE,GAAA,EAAK,KAAK,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAoB,EAAE,KAAA,EAAM;AAClC,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,GAAM,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAM,GAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AAAA,EAEA,MAAc,UACZ,MAAA,EAC+B;AAC/B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAK,CAAA;AAEzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAAA,EAC5B;AAAA,EAEA,MAAc,YACZ,MAAA,EACgD;AAChD,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,GAAA,GAAO,OAAO,GAAA,IAA8B,GAAA;AAElD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAK,KAAK,CAAA;AAG5C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,OAAA,EAAU,GAAG,EAAE,CAAA,EAAG;AACjC,QAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAG;AAAA,MACvC;AAEA,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,EAAe;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAE1B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI;AAAA,MAC9B,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB,CAAA;AAED,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAAA,EAClC;AAAA,EAEA,MAAc,YACZ,MAAA,EACgC;AAChC,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,GAAA,EAAK,QAAQ,CAAA;AAEjD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,IAC3B;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AACjC,IAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,EAC1B;AAAA,EAEA,MAAc,aACZ,MAAA,EAC4B;AAC5B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,EAAA,GAAM,OAAO,EAAA,IAA6B,CAAA;AAEhD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAK,IAAI,CAAA;AAE3C,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,GAAU,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,GAAW,MAAM,KAAA,GAAQ,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,OAAA,GAAU,EAAA;AAE3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,MAClB,KAAA,EAAO,QAAA;AAAA,MACP,WAAW,QAAA,EAAU;AAAA,KACtB,CAAA;AAED,IAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAAA,EAC3B;AAAA,EAEA,MAAc,UACZ,MAAA,EAC2B;AAC3B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,GAAA,EAAK,KAAK,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,IACtB;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,IACtB;AAEA,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAM,GAAA;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AAAA,EACrB;AAAA,EAEA,MAAc,eACZ,MAAA,EACgC;AAChC,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,SAAS,CAAA;AAE9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG;AAC1C,MAAA,OAAO,EAAE,WAAW,CAAA,EAAE;AAAA,IACxB;AAEA,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,OAAO,CAAA;AAAA,MAClB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2BAAA,EAA6B;AAAA,UAC7C,OAAA;AAAA,UACA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,IAAA,EAAK;AAAA,EACvC;AAAA,EAEA,MAAc,iBACZ,MAAA,EACkC;AAClC,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,SAAS,CAAA;AAEhD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAS,IAAI,KAAK,CAAA;AAAA,IACtC;AAKA,IAAA,OAAO,EAAE,YAAY,IAAA,EAAK;AAAA,EAC5B;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;;;ACxStC,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EAOpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AANd;AAAA,IAAA,IAAA,CAAQ,MAAA,uBAAoC,GAAA,EAAI;AAGhD;AAAA,IAAA,IAAA,CAAQ,IAAA,uBAAkC,GAAA,EAAI;AAI5C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,GAAwB;AAC9B,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACpE;AAAA;AAAA,EAGQ,SAAS,IAAA,EAAwB;AACvC,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QACZ,MAAA,EAC8C;AAC9C,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AACzB,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,KAAA,GAAS,OAAO,KAAA,IAAgC,CAAA;AACtD,IAAA,MAAM,QAAA,GAAY,OAAO,QAAA,IAAmC,CAAA;AAE5D,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,eAAA,EAAiB,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAExE,IAAA,MAAM,KAAA,GAAQ,KAAK,aAAA,EAAc;AACjC,IAAA,MAAM,GAAA,GAAgB;AAAA,MACpB,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,MACrB;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAGrC,IAAA,IAAI,cAAc,KAAA,CAAM,MAAA;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1C,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,QAAA,GAAW,QAAA,EAAU;AAClD,QAAA,WAAA,GAAc,CAAA;AACd,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,KAAK,CAAA;AAElC,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAY;AAAA,EACxC;AAAA,EAEA,MAAc,QACZ,MAAA,EACiG;AACjG,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AAEzB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,KAAA,EAAO,WAAW,CAAA;AAEvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAEtC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,GAAa,GAAA,CAAI,KAAA;AACrC,MAAA,IAAI,MAAM,OAAA,EAAS;AAGnB,MAAA,GAAA,CAAI,MAAA,GAAS,YAAA;AACb,MAAA,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAEjB,MAAA,OAAO;AAAA,QACL,GAAA,EAAK;AAAA,UACH,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,UAAU,GAAA,CAAI;AAAA;AAChB,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AAAA,EACrB;AAAA,EAEA,MAAc,OACZ,MAAA,EACoH;AACpH,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAO,CAAA;AAE3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,IAAA,EAAK;AAAA,IACxC;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,GAAA,EAAK;AAAA,QACH,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,UAAU,GAAA,CAAI;AAAA;AAChB,KACF;AAAA,EACF;AAAA,EAEA,MAAc,SACZ,MAAA,EACiC;AACjC,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,OAAO,CAAA;AAE7C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,YAAA,EAAc;AACvC,MAAA,OAAO,EAAE,WAAW,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,GAAA,CAAI,MAAA,GAAS,WAAA;AACb,IAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,MAAc,QACZ,MAAA,EAC8B;AAC9B,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc,EAAE,OAAO,CAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,YAAA,EAAc;AACvC,MAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,IACzB;AAEA,IAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AAAA,EAEA,MAAc,OACZ,MAAA,EACiC;AACjC,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,OAAO,CAAA;AAE3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,OAAO,EAAE,WAAW,KAAA,EAAM;AAAA,IAC5B;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,KAAK,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC/B,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,MAAc,KACZ,MAAA,EACgE;AAChE,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AAEzB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,YAAA,EAAc,EAAE,KAAA,EAAO,WAAW,CAAA;AAEpD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AACpC,MAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC7B,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW,OAAA,EAAA;AAC9B,MAAA,IAAI,GAAA,CAAI,WAAW,YAAA,EAAc,UAAA,EAAA;AAAA,IACnC;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,GAAU,UAAA,EAAY,SAAS,UAAA,EAAW;AAAA,EAC3D;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;;;ACjR7C,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACpB;AAQO,IAAM,eAAA,GAAN,cAA8B,eAAA,CAAgB;AAAA,EAInD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAJd,IAAA,IAAA,CAAQ,KAAA,uBAA+B,GAAA,EAAI;AAC3C,IAAA,IAAA,CAAQ,OAAA,uBAAmC,GAAA,EAAI;AAI7C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kDAAkD,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,eAAe,CAAA;AAC7D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UACZ,MAAA,EAC8C;AAC9C,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAgD,EAAC;AAC5E,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAW,MAAA,CAAO,OAAA,IAAkC,WAAA,CAAY,EAAE,CAAA;AAExE,IAAA,MAAM,IAAA,GAAa;AAAA,MACjB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA;AAAA,MACA,QAAQ;AAAC,KACX;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAE3D,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC3B;AAAA,EAEA,MAAc,QACZ,MAAA,EAC6B;AAC7B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iCAAA,EAAmC,EAAE,QAAQ,CAAA;AAC9D,MAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,EAAI;AACxB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,SAAA,EAAW,CAAA;AAC3F,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAc,SACZ,MAAA,EAC6B;AAC7B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAE1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,EAAE,QAAQ,CAAA;AAC/D,MAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AACpE,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAc,aACZ,MAAA,EACgC;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAA0D,SAAA;AAC/E,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,IAA4C,EAAC;AAEpE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAEtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,SAAA;AACH,UAAA,QAAA,CAAS,KAAA,IAAS,KAAA;AAClB,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AACjB,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAC1B,UAAA;AAAA;AAEJ,MAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAA,EAAM;AAAA,QACrB,IAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,EAAO,IAAA,KAAS,WAAA,GAAc,CAAA,GAAI,KAAA;AAAA,QAClC,QAAQ,IAAA,KAAS,WAAA,GAAc,CAAC,KAAK,IAAI,EAAC;AAAA,QAC1C;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC1D,IAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,EAC1B;AAAA,EAEA,MAAc,QACZ,MAAA,EACsB;AACtB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,OAAO,IAAA,IAAQ,IAAA;AAAA,EACjB;AAAA,EAEA,MAAc,aAAA,GAAiD;AAC7D,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACxC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,IAChB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAGA,mBAAA,CAAoB,QAAQ,eAAe,CAAA;AC9N3C,IAAM,kBAAA,GAAoD;AAAA,EACxD,MAAA,EAAQ,8CAAA;AAAA,EACR,MAAA,EAAQ,0CAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,gBAAA,GAA2D;AAAA,EAC/D,MAAA,EAAQ;AACV,CAAA;AAuCA,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AAEhC,IAAM,4BAAN,MAA6D;AAAA,EAA7D,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAAgE;AAAA,EAAA;AAAA,EAE9F,MAAM,GAAA,CAAI,KAAA,EAAe,KAAA,EAA6B,KAAA,EAA8B;AAClF,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,KAAA,EAAO,WAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,EAAO,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,KAAK,KAAA,EAAqD;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AACxB,IAAA,OAAO,MAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,GAAI,MAAM,KAAA,GAAQ,IAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,KAAK,MAAA,EAAQ;AACxC,MAAA,IAAI,MAAM,SAAA,GAAY,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAA;AA4BO,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EA4BpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AA3Bd;AAAA,IAAA,IAAA,CAAQ,MAAA,uBAAyC,GAAA,EAAI;AAGrD;AAAA,IAAA,IAAA,CAAQ,MAAA,uBAAoC,GAAA,EAAI;AAGhD;AAAA,IAAA,IAAA,CAAQ,YAAA,uBAAwC,GAAA,EAAI;AAGpD;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAsC,GAAA,EAAI;AAGlD;AAAA,IAAA,IAAA,CAAiB,eAAA,GAAkB,IAAI,yBAAA,EAA0B;AAOjE;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAoC,GAAA,EAAI;AAGhD;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAkD,GAAA,EAAI;AAM5D,IAAA,IAAA,CAAK,IAAA,GACH,MAAA,CAAO,GAAA,CAAI,UAAA,KAAe,MAAA,IAC1B,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA,IAClC,OAAA,CAAQ,MAAA,CAAO,IAAI,mBAAmB,CAAA;AACxC,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,IAAA,CAAK,OACD,gEAAA,GACA;AAAA,KACN;AAAA,EACF;AAAA,EAvBQ,YAAA,GAAkC;AACxC,IAAA,OAAqC,IAAA,CAAK,eAAA;AAAA,EAC5C;AAAA,EAuBA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAE,CAAA;AAC1G,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAE,CAAA;AAClG,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAE,CAAA;AACtG,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAE,CAAA;AACpG,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAE,CAAA;AACxG,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,QAAA,EAAiC;AACjD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,eAAA;AACnC,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,QAAQ,CAAA,mGAAA;AAAA,OACvB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,QAAA,EAAsD;AACnF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,gBAAgB,MAAW,IAAA,CAAA,SAAA;AAAA,MAC/B,IAAI,IAAI,MAAM,CAAA;AAAA,MACd,IAAA,CAAK,OAAO,GAAA,CAAI,eAAA;AAAA,MAChB,IAAA,CAAK,OAAO,GAAA,CAAI;AAAA,KAClB;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAA,EAAQ,aAAa,CAAA;AACzC,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,MAAc,cACZ,MAAA,EAC6C;AAC7C,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,WAAA,GAAe,MAAA,CAAO,WAAA,IAA0B,IAAA,CAAK,OAAO,GAAA,CAAI,kBAAA;AAEtE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAC1D,IAAA,MAAM,QAAa,IAAA,CAAA,WAAA,EAAY;AAC/B,IAAA,MAAM,eAAoB,IAAA,CAAA,sBAAA,EAAuB;AACjD,IAAA,MAAM,aAAA,GAAgB,MAAW,IAAA,CAAA,0BAAA,CAA2B,YAAY,CAAA;AAExE,IAAA,MAAM,UAAA,GAAqC;AAAA,MACzC,YAAA,EAAc,WAAA;AAAA,MACd,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACtB,KAAA;AAAA,MACA,cAAA,EAAgB,aAAA;AAAA,MAChB,qBAAA,EAAuB;AAAA,KACzB;AAEA,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,UAAA,CAAW,WAAA,GAAc,SAAA;AACzB,MAAA,UAAA,CAAW,MAAA,GAAS,SAAA;AAAA,IACtB;AAEA,IAAA,MAAM,OAAA,GAAe,IAAA,CAAA,qBAAA,CAAsB,aAAA,EAAe,UAAU,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,YAAA,EAAa,CAAE,GAAA,CAAI,KAAA,EAAO,EAAE,QAAA,EAAU,WAAA,EAAa,YAAA,EAAa,EAAG,oBAAoB,CAAA;AAClG,IAAA,KAAK,IAAA,CAAK,YAAA,EAAa,CAAE,KAAA,EAAM;AAC/B,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,QAAA,IAAY,KAAA,EAAM;AAAA,EAC9C;AAAA,EAEA,MAAc,UACZ,MAAA,EACgG;AAChG,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,EAAa,CAAE,KAAK,KAAK,CAAA;AACxD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,YAAY,QAAQ,CAAA;AACtE,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,WAAA,CAAY,WAAW,CAAA;AACnD,IAAA,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AACzC,IAAA,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,MAAW,IAAA,CAAA,sBAAA,CAAuB,aAAA,EAAe,WAAA,EAAa;AAAA,MAC3E,aAAA,EAAe,KAAA;AAAA,MACf,kBAAkB,WAAA,CAAY;AAAA,KAC/B,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,EAAO;AAC7B,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,OAAO,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,YAAA;AAAA,MACpB,YAAA,EAAc,OAAO,aAAA,IAAiB,EAAA;AAAA,MACtC,SAAA,EAAW,OAAO,UAAA,IAAc,IAAA;AAAA,MAChC,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,MAAA,EACqD;AACrD,IAAA,MAAM,eAAe,MAAA,CAAO,YAAA;AAC5B,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAE1D,IAAA,MAAM,MAAA,GAAS,MAAW,IAAA,CAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,EAAO;AAC7B,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,OAAO,GAAG,CAAA;AAAA,IACnD;AACA,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,YAAA;AAAA,MACpB,SAAA,EAAW,OAAO,UAAA,IAAc;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,MAAA,EAA0D;AACjF,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAC1D,IAAA,MAAW,IAAA,CAAA,eAAA,CAAgB,eAAe,KAAK,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAC1B,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAc,aAAa,MAAA,EAA8C;AACvE,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AAC7C,IAAA,MAAM,OAAO,MAAW,IAAA,CAAA,aAAA;AAAA,MACtB,aAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,IAAgB,IAAA,CAAA;AAAA,KAClB;AACA,IAAA,OAAO;AAAA,MACL,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,EAAA;AAAA,MACrD,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAA;AAAA,MAClD,SAAS,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,CAAc,QAAgB,EAAA,EAAY;AAChD,IAAA,MAAM,KAAA,GAAQ,kBAAA;AACd,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAA,EAAK;AAClC,MAAA,MAAA,IAAU,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,gBAAA,CAAiB,UAAyB,GAAA,EAAuB;AACvE,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO,QAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAA,YAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,cAAc,QAAQ,CAAA,CAAA,CAAA;AAAA,MAC5B,OAAA,EAAS,WAAW,QAAQ,CAAA,oBAAA,EAAuB,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,IAAA;AAAA,KACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UACZ,MAAA,EAC6C;AAC7C,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,WAAA,EAAa,CAAA;AAEzF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,mBAAmB,QAAQ,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB;AAAA,MACtC,aAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACtB,YAAA,EAAc,WAAA;AAAA,MACd,KAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,IAAa;AAAA,KACzC,CAAA;AAED,IAAA,MAAM,UAAU,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,UAAU,CAAA,CAAA;AAEpD,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,MACZ,MAAA,EAMC;AACD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,aAAA,EAAe,EAAE,IAAA,EAAM,OAAO,CAAA;AAEhD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mCAAmC,KAAK,CAAA;AAAA,OAC1C;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAExB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,IAAA;AAElB,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,WAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY;AAAA,KACtC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,WAAW,CAAA;AAG/C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA;AAChC,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,WAAA,EAAa,KAAK,gBAAA,CAAiB,QAAA,EAAU,GAAG,CAAC,CAAA;AAEnE,IAAA,OAAO,EAAE,WAAA,EAAa,YAAA,EAAc,SAAA,EAAW,WAAW,QAAA,EAAS;AAAA,EACrE;AAAA,EAEA,MAAc,QACZ,MAAA,EACqD;AACrD,IAAA,MAAM,eAAe,MAAA,CAAO,YAAA;AAE5B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,YAAA,EAAc,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,EAAO,CAAA;AAErF,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA;AACzD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA;AAGjD,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,cAAc,CAAA;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,cAAc,CAAA;AAGnC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAA;AAElB,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,WAAA,EAAa,cAAA;AAAA,MACb,YAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY;AAAA,KACtC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,QAAQ,CAAA;AACxC,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,cAAc,CAAA;AAElD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,cAAA,EAAgB,QAAQ,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,EAAE,WAAA,EAAa,cAAA,EAAgB,SAAA,EAAU;AAAA,EAClD;AAAA,EAEA,MAAc,OACZ,MAAA,EAC+B;AAC/B,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,EAAO,CAAA;AAGtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA;AAC9C,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAC1B,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,WAAW,CAAA;AAC9B,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,WAAW,CAAA;AAChC,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,CAAA;AAC9B,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,SACZ,MAAA,EACmB;AACnB,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,WAAA,EAAa,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,EAAO,CAAA;AAEpF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,SAAA,EAAW;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,WAAW,CAAA;AAC9B,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,WAAW,CAAA;AAChC,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;;;ACrgB7C,IAAM,YAAA,GAAe,mBAAA;AAGrB,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,OAAO,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEtE,IAAM,mBAAA,GAAsB,CAAC,OAAA,EAAS,OAAO,CAAA;AAY7C,SAAS,eAAe,OAAA,EAA6C;AACnE,EAAA,OAAO,OAAA,IAAW,aAAA;AACpB;AAiBO,IAAM,sBAAA,GAAN,cAAqC,eAAA,CAAgB;AAAA,EAC1D,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,uEAAuE,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,EAAG;AAClC,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,IAAI,CAAC,SAAS,IAAA,IAAQ,CAAC,QAAQ,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,IAAI,gBAAA;AAAA,YACT,eAAe,MAAM,CAAA,yBAAA,EAA4B,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,YACnE;AAAA,WACF;AAAA,UACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,SACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,IAAA,CAAK,KAAK,OAAO,MAAA,CAAO,YAAY,QAAA,GAAW,MAAA,CAAO,UAAU,KAAA,CAAS,CAAA;AAChF,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,KAAK,GAAA,CAAI,MAAA,CAAO,SAAmB,MAAA,CAAO,MAAA,EAAkB,OAAO,KAAe,CAAA;AAC/F,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAA,EAAmB,OAAO,MAAgB,CAAA;AAC1E,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAmB,OAAO,CAAA;AACxD,UAAA;AAAA,QACF,KAAK,QAAA,EAAU;AACb,UAAA,MAAM,QAAQ,2BAAA,EAA4B;AAC1C,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,UACjE;AACA,UAAA,IAAA,GAAO,MAAM,MAAM,MAAA,EAAO;AAC1B,UAAA;AAAA,QACF;AAAA,QACA;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,UAAA,GAAuB;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,gCAAgC,CAAA,IAAK,EAAA;AAClH,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC5E,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,mBAAA;AAAA,EACpC;AAAA,EAEQ,YAAY,OAAA,EAA+E;AACjG,IAAA,OAAO,kBAAA,CAAmB,OAAO,CAAA,IAAK,EAAC;AAAA,EACzC;AAAA,EAEQ,cAAA,CAAe,SAAiB,MAAA,EAAsB;AAC5D,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,MAAM,CAAA,sEAAA,CAAwE,CAAA;AAAA,MACpG;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACzC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,OAAO,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,CAAC,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,EAAG;AAC9C,MAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrD,MAAA,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,MAAM,sCAAsC,OAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACjG;AAAA,EACF;AAAA,EAEQ,UAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA,IAAK,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACtG,IAAA,OAAO,IAAA,KAAS,OAAA;AAAA,EAClB;AAAA,EAEQ,KAAK,aAAA,EAA8E;AACzF,IAAA,MAAM,QAAQ,2BAAA,EAA4B;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAA,CAAK,KAAA,EAAO,SAAQ,IAAK,IAAI,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,EAAG,EAAE,OAAO,CAAA,EAAA,EAAS,EAAE,MAAM,CAAA,CAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAChG,IAAA,MAAM,UAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AACpE,MAAA,IAAI,aAAA,IAAiB,YAAY,aAAA,EAAe;AAChD,MAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,QAAA,EAAU,WAAA,MAAiB,QAAA,EAAU;AACxD,QAAA,MAAM,YAAY,MAAA,CAAO,GAAA,CAAI,GAAG,OAAO,CAAA,EAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AACxD,QAAA,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAGzC,QAAA,MAAM,UAAU,IAAA,CAAK,UAAA,KAAe,MAAA,GAAY,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClE,QAAA,MAAM,MAAA,GAAwC,SAAA,GAAY,OAAA,GAAU,OAAA,GAAU,KAAA,GAAQ,MAAA;AACtF,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAY,MAAA,KAAW,MAAA;AAAA,UACvB,MAAA;AAAA,UACA,KAAA,EAAO,YAAY,SAAA,CAAU,KAAA,GAAQ,UAAU,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,SACpE,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AAC/B,MAAA,IAAI,aAAA,IAAiB,CAAA,CAAE,OAAA,KAAY,aAAA,EAAe;AAClD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,WAAA,EAAa,6BAAA;AAAA,QACb,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ,OAAA;AAAA,QACR,OAAO,CAAA,CAAE;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,IAAW,OAAO,OAAA,EAAQ;AAAA,EACrD;AAAA,EAEA,MAAc,GAAA,CACZ,OAAA,EACA,MAAA,EACA,KAAA,EAC6E;AAC7E,IAAA,MAAM,QAAQ,2BAAA,EAA4B;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,0FAAqF,CAAA;AAAA,IACvG;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,SAAS,MAAM,CAAA;AACnC,IAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACpD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,MAAA,EAAQ,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,EAC5D;AAAA,EAEA,MAAc,MAAA,CAAO,OAAA,EAAiB,MAAA,EAA+C;AACnF,IAAA,MAAM,QAAQ,2BAAA,EAA4B;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,SAAS,MAAM,CAAA;AACnC,IAAA,OAAO,EAAE,OAAA,EAAS,MAAM,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAE;AAAA,EAC/C;AAAA,EAEA,MAAc,IAAA,CAAK,OAAA,EAAiB,OAAA,EAOjC;AACD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACzC,IAAA,MAAM,UAAU,QAAA,CACb,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAA,IAAY,CAAC,oBAAA,CAAqB,CAAA,CAAE,MAAM,CAAC,CAAA,CAC3D,IAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACtB,IAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,KAAW,CAAA;AACtC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,8BAAA,EAAiC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAG;AAAA,IAClI;AAEA,IAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,IAAA,MAAM,QAAQ,cAAA,CAAe,OAAO,CAAA,GAAI,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AACjE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO;AACtB,MAAA,OAAO,EAAE,SAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,+DAAA,EAAgE;AAAA,IAC3I;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AAClC,MAAA,OAAO,EAAE,SAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,2GAAA,EAAuG;AAAA,IACnL;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,MAAA,EAA6B,OAAO,CAAA;AACtG,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,OAAO,KAAA,EAAO,OAAA,IAAW,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,OAAA,CAAA,EAAU;AAAA,IACnI;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAS,IAAA,IAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,OAAA,IAAW,MAAA,CAAO,IAAA;AAC5F,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,EAAE,SAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,qEAAA,EAAiE;AAAA,IAC7I;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,UAAA,CAAA,EAAa;AAAA,EAC5G;AACF,CAAA;AAGA,mBAAA,CAAoB,eAAe,sBAAsB,CAAA;ACxNzD,SAASC,eACP,KAAA,EAC4D;AAC5D,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,EAAE,KAAA,YAAiB,IAAA,CAAA;AACpG;AAEA,SAAS,cAAc,KAAA,EAAoE;AACzF,EAAA,IAAI,CAACA,cAAAA,CAAc,KAAK,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAQ,GAAI,KAAA;AACtC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA,EAAM,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,CAAA;AAAA,IACxC,IAAA,EAAM,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,0BAAA;AAAA,IACxC,OAAA,EAAS,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU;AAAA,GACnD;AACF;AAGA,SAASC,eAAc,OAAA,EAAgE;AACrF,EAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,IAAA,CAAK,OAAO,CAAA;AACpE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,GAAG,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA,GAAI,YAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA,EAAG,MAAM,CAAA;AAChG,IAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,IAAQ,IAAA,EAAK;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA,EAAG,aAAa,IAAA,EAAK;AAClE;AAaO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAMtD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AANd,IAAA,IAAA,CAAQ,OAAA,uBAAyC,GAAA,EAAI;AACrD,IAAA,IAAA,CAAQ,EAAA,GAAsB,IAAA;AAO5B,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,EAAA;AAClD,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,uBAAA,IAA2B,EAAA;AAE3D,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,qBAAA,IAAyB,EAAA;AACxD,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,yBAAA,IAA6B,EAAA;AAChE,IAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,gBAAA,IAAoB,MAAA;AAChD,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,QAAA,CAAS;AAAA,QACrB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,WAAA;AAAA,QACrC,QAAA;AAAA;AAAA,QAEA,cAAA,EAAgB,QAAQ,QAAQ,CAAA;AAAA,QAChC,WAAA,EAAa,EAAE,WAAA,EAAa,eAAA;AAAgB,OAC7C,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,8CAAA,EAAgD;AAAA,QAC/D,UAAU,QAAA,IAAY,KAAA;AAAA,QACtB,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,uFAAkF,CAAA;AAAA,IACrG;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9D,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAClE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAS,MAAA,EAAmC;AAClD,IAAA,OAAQ,MAAA,CAAO,UAAqB,IAAA,CAAK,aAAA;AAAA,EAC3C;AAAA,EAEQ,YAAA,CAAa,QAAgB,GAAA,EAAqB;AACxD,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,EACzB;AAAA,EAEQ,aAAa,KAAA,EAAuB;AAC1C,IAAA,OAAO,CAAA,CAAA,EAAIC,WAAW,KAAK,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGQ,cAAc,MAAA,EAKpB;AACA,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,CAAA;AACtE,MAAA,IAAI,OAAA,GAAU,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,OAAA,EAAS;AACtC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,OAAO,IAAA,CAAK,IAAI,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,MACxF;AACA,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,mCAAA,EAAsC,KAAK,IAAI,CAAA,yEAAA;AAAA,SACjD;AAAA,MACF;AACA,MAAA,MAAM,EAAE,OAAAC,MAAAA,EAAO,WAAA,EAAAC,cAAY,GAAIH,cAAAA,CAAc,KAAK,OAAO,CAAA;AAEzD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,oBAAoB,GAAG,CAAA;AAC1D,MAAA,OAAO;AAAA,QACL,KAAK,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,QAAQ,CAAA,CAAA;AAAA,QAC9B,KAAA,EAAAE,MAAAA;AAAA,QACA,WAAA,EAAaC,gBAAe,IAAA,CAAK,IAAA;AAAA,QACjC,GAAA,EAAK,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,aAAA,GAAgB;AAAA,OACjD;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,OAAA,KAAY,MAAA,IAAa,YAAY,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,IAC9F;AACA,IAAA,MAAM,MAAM,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAC1E,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAIH,eAAc,GAAG,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA,EAAc,MAAA,CAAO,WAAA,IAA0B,WAAA,IAAe,0BAAA;AAAA,MAC9D,GAAA,EAAK,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,aAAA,GAAgB;AAAA,KACjD;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,QAAgB,GAAA,EAAqB;AACrD,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,OAAO,CAAA,EAAG,KAAK,aAAA,CAAc,OAAA,CAAQ,OAAO,EAAE,CAAC,IAAI,GAAG,CAAA,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,gBAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,CAAA,EAAG,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,WAAA;AACjD,IAAA,OAAO,CAAA,QAAA,EAAW,MAAM,CAAA,IAAA,EAAO,MAAM,kBAAkB,GAAG,CAAA,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,OAAO,MAAA,EAAkD;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,IAAA,MAAM,EAAE,KAAK,KAAA,EAAO,WAAA,EAAa,KAAI,GAAI,IAAA,CAAK,cAAc,MAAM,CAAA;AAClE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAEpC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAK,WAAA,EAAa,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,CAAA;AAEpF,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,KAAK,EAAA,CAAG,IAAA;AAAA,QACZ,IAAI,gBAAA,CAAiB;AAAA,UACnB,MAAA,EAAQ,MAAA;AAAA,UACR,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,WAAA,EAAa,WAAA;AAAA,UACb,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAA,EAAG;AAAA,QAC/C,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,QAChC,WAAA;AAAA,QACA,MAAM,KAAA,CAAM,MAAA;AAAA,QACZ,QAAA,EAAW,MAAA,CAAO,QAAA,IAA8C,EAAC;AAAA,QACjE,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,QACvB;AAAA,OACD,CAAA;AAAA,IACH;AAOA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,GACb,GAAA,KAAQ,aAAA,GACN,KAAK,SAAA,CAAU,MAAA,EAAQ,GAAG,CAAA,GAAA,CACzB,MAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,IAAI,CAAA,EAAG,GAAA,GACjD,CAAA,KAAA,EAAQ,WAAW,CAAA,QAAA,EAAW,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAE1D,IAAA,OAAO,EAAE,KAAK,MAAA,EAAQ,IAAA,EAAM,MAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,GAAA,EAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,WAAW,MAAA,EAGtB;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAC;AAC/D,IAAA,MAAM,KAAA,GAAQ,QAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA,CAC3B,MAAA,CAAO,CAAC,CAAA,KAA8B,MAAM,IAAI,CAAA;AACnD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,IAC9F;AACA,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO;AAAA,QAC/B,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA,QACjF,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,IAAA;AAAA,QAChB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AAAA,EACtC;AAAA,EAEA,MAAc,SACZ,MAAA,EAC8F;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAErD,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAI,gBAAA,CAAiB,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA;AACtF,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,CAAM,sBAAsB,CAAA;AACrE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,QAChC,WAAA,EAAa,SAAS,WAAA,IAAe,0BAAA;AAAA,QACrC,MAAM,KAAA,CAAM,MAAA;AAAA,QACZ,UAAU;AAAC,OACb;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC3D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,IACtD;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,MAC3B,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,GAAA,CAAI;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,MAAc,KACZ,MAAA,EACuH;AACvH,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,IAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAAiC,EAAA;AACxD,IAAA,MAAM,OAAA,GAAW,OAAO,OAAA,IAAkC,GAAA;AAC1D,IAAA,MAAM,oBAAoB,MAAA,CAAO,iBAAA;AAEjC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA;AAE7D,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,QAC7B,IAAI,oBAAA,CAAqB;AAAA,UACvB,MAAA,EAAQ,MAAA;AAAA,UACR,QAAQ,MAAA,IAAU,MAAA;AAAA,UAClB,OAAA,EAAS,OAAA;AAAA,UACT,iBAAA,EAAmB;AAAA,SACpB;AAAA,OACH;AACA,MAAA,OAAO;AAAA,QACL,OAAO,QAAA,CAAS,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9C,GAAA,EAAK,MAAM,GAAA,IAAO,EAAA;AAAA,UAClB,IAAA,EAAM,MAAM,IAAA,IAAQ,CAAA;AAAA,UACpB,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,OAAA,EAAQ,IAAK;AAAA,SACjD,CAAE,CAAA;AAAA,QACF,SAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AAAA,QACvC,GAAI,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,qBAAA,KAA0B,MAAA,GAC3D,EAAE,SAAA,EAAW,QAAA,CAAS,qBAAA,EAAsB,GAC5C;AAAC,OACP;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,GAAG,MAAM,CAAA,CAAA,CAAA;AAC9B,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACtC,IAAA,MAAM,UAAsE,EAAC;AAC7E,IAAA,KAAA,MAAW,CAAC,YAAA,EAAc,GAAG,CAAA,IAAK,KAAK,OAAA,EAAS;AAC9C,MAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,YAAA,CAAa,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAAA,QAC3C,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,cAAc,GAAA,CAAI;AAAA,OACnB,CAAA;AAAA,IACH;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AAEjD,IAAA,MAAM,MAAA,GAAS,sBAAsB,MAAA,GAAY,MAAA,CAAO,SAAS,iBAAA,EAAmB,EAAE,KAAK,CAAA,GAAI,CAAA;AAC/F,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,OAAO,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAA,GAAS,OAAA,GAAU,OAAA,CAAQ,MAAA;AAC7C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,SAAA;AAAA,MACA,GAAI,YAAY,EAAE,SAAA,EAAW,OAAO,MAAA,GAAS,OAAO,CAAA,EAAE,GAAI;AAAC,KAC7D;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,MAAA,EAA0D;AACnF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAEnD,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAI,mBAAA,CAAoB,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA;AACxE,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAC,CAAA;AAClD,IAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAAA,EAC5B;AAAA,EAEA,MAAc,OAAA,CACZ,MAAA,EACA,GAAA,EACA,WACA,SAAA,EAC6C;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,GAAA;AAC3C,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,UACJ,SAAA,KAAc,KAAA,GACV,IAAI,gBAAA,CAAiB,EAAE,QAAQ,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA,GACjD,IAAI,gBAAA,CAAiB,EAAE,QAAQ,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AACvD,MAAA,MAAMI,IAAAA,GAAM,MAAMC,YAAA,CAAe,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,WAAW,CAAA;AAChE,MAAA,OAAO,EAAE,GAAA,EAAAD,IAAAA,EAAK,SAAA,EAAU;AAAA,IAC1B;AACA,IAAA,MAAM,QAAQH,UAAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACpG,IAAA,MAAM,GAAA,GACJ,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAA,EAAI,GAAG,mDACQ,SAAS,CAAA,0CAAA,EACf,KAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA;AAC3E,IAAA,OAAO,EAAE,KAAK,SAAA,EAAU;AAAA,EAC1B;AAAA,EAEA,MAAc,aAAa,MAAA,EAAwE;AACjG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,SAAA,GAAa,OAAO,SAAA,IAAoC,IAAA;AAC9D,IAAA,MAAM,SAAA,GAAa,OAAO,SAAA,IAA2C,KAAA;AACrE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,QAAQ,GAAA,EAAK,SAAA,EAAW,WAAW,CAAA;AACjF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,EAAK,WAAW,SAAS,CAAA;AAAA,EACvD;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;;;AChb1C,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EAIrD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAJd,IAAA,IAAA,CAAQ,UAAA,uBAAkD,GAAA,EAAI;AAC9D,IAAA,IAAA,CAAQ,MAAA,uBAA0C,GAAA,EAAI;AAKpD,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,WAAA;AAC9B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,gHAAA;AAAA,QAEA,EAAE,UAAA;AAAW,OACf;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,uDAAuD,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AACrE,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC1D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAA,GAAqB;AAC3B,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,EACzB;AAAA;AAAA,EAGQ,cAAc,WAAA,EAAqD;AAEzE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAC7C,IAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,SAAS,CAAA,IAAK,KAAK,UAAA,EAAY;AAC7C,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9B,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,gBAAA,CAAiB,WAA+B,KAAA,EAAyB;AAC/E,IAAA,MAAM,KAAA,GAAkB,CAAC,GAAG,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,SAAA,IAAa,SAAA,CAAU,SAAA;AAElD,IAAA,OAAO,KAAA,CAAM,SAAS,KAAA,EAAO;AAC3B,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,QAAA,GAAW,MAAM,MAAA,GAAS,GAAI,EAAE,WAAA,EAAY;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,kBAAA,EAAqB,SAAA,CAAU,IAAI,CAAA,mBAAA,EAAiB,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IACxF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,MACZ,MAAA,EAC4E;AAC5E,IAAA,MAAM,UAAA,GAAc,OAAO,UAAA,IAAqC,YAAA;AAChE,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,OAAA,GAAW,OAAO,OAAA,IAAkC,GAAA;AAC1D,IAAA,MAAM,SAAA,GAAa,MAAA,CAAO,SAAA,IAAoD,EAAC;AAE/E,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,cAAA,EAAgB,EAAE,YAAY,GAAA,EAAK,OAAA,EAAS,WAAW,CAAA;AAEzE,IAAA,MAAM,OAAA,GAAU,CAAA,OAAA,EAAU,IAAA,CAAK,UAAA,EAAY,CAAA,CAAA;AAC3C,IAAA,MAAM,OAAO,IAAA,GAAc,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,IAAW,CAAA;AACjE,IAAA,MAAM,YAAY,GAAA,GAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAI,CAAA;AAExD,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,OAAA;AAAA,MACJ,GAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAE1B,IAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,SAAA,EAAU;AAAA,EACzC;AAAA,EAEA,MAAc,IACZ,MAAA,EAMC;AACD,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,IAAA,IAA+B,CAAA,UAAA,EAAa,IAAA,CAAK,YAAW,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC/F,IAAA,MAAM,QAAA,GAAY,MAAA,CAAO,KAAA,IAAuF,EAAC;AACjH,IAAA,MAAM,GAAA,GAAO,MAAA,CAAO,GAAA,IAA8C,EAAC;AACnE,IAAA,MAAM,UAAA,GAAc,MAAA,CAAO,OAAA,IAAsE,EAAC;AAClG,IAAA,MAAM,OAAA,GAAW,OAAO,OAAA,IAAkC,EAAA;AAE1D,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,YAAA,EAAc,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,GAAG,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,EAAG,SAAS,CAAA;AAE9L,IAAA,MAAM,WAAA,GAAc,KAAK,UAAA,EAAW;AAEpC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,KAC1B,CAAE,CAAA;AAEF,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACrC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAEF,IAAA,MAAM,SAAA,GAAgC;AAAA,MACpC,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,CAAA,EAAA,qBAAO,IAAA,EAAK,EAAE,aAAa,CAAA,2BAAA,EAA8B,IAAI,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA;AAAA,QACjF,oBAAG,IAAI,IAAA,IAAO,WAAA,EAAa,qBAAqB,IAAI,CAAA,eAAA;AAAA;AACtD,KACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,KACZ,MAAA,EACqE;AACrE,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,aAAA,EAAe,EAAE,aAAa,CAAA;AAEhD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAW,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,SAAA,IAAa,SAAA,CAAU,WAAW,QAAA,EAAU;AACnE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,WAAW,CAAA,iCAAA,EAAoC,SAAA,CAAU,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACjG;AAEA,IAAA,SAAA,CAAU,MAAA,GAAS,QAAA;AACnB,IAAA,SAAA,CAAU,SAAA,GAAY,KAAK,GAAA,EAAI;AAC/B,IAAA,SAAA,CAAU,IAAA,CAAK,IAAA;AAAA,MACb,CAAA,EAAA,qBAAO,IAAA,EAAK,EAAE,aAAa,CAAA,kBAAA,EAAqB,UAAU,IAAI,CAAA,QAAA;AAAA,KAChE;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,WAAW,SAAA,CAAU;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,MAAA,EACoD;AACpD,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,KAAA,GAAS,OAAO,KAAA,IAAiC,KAAA;AAEvD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,WAAA,EAAa,OAAO,CAAA;AAEzD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAW,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,SAAA,IAAa,CAAC,KAAA,EAAO;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,WAAW,CAAA,6CAAA;AAAA,OAC1B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAEnC,IAAA,OAAO,EAAE,WAAA,EAAa,SAAA,CAAU,EAAA,EAAI,SAAS,IAAA,EAAK;AAAA,EACpD;AAAA,EAEA,MAAc,KACZ,MAAA,EACqE;AACrE,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAA+B,GAAA;AACpD,IAAA,MAAM,KAAA,GAAS,OAAO,KAAA,IAAgC,MAAA;AAEtD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,aAAA,EAAe,EAAE,WAAA,EAAa,IAAA,EAAM,OAAO,CAAA;AAE7D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAW,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,IAAI,CAAA;AAGpD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AACxC,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS;AACnC,QAAA,MAAM,cAAA,GAAiB,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA;AAC9D,QAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAC5B,QAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA,CAAE,SAAQ,IAAK,OAAA;AAAA,MAClD,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,CAAC,IAAI,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,IAAA,EAAM,WAAA;AAAA,MACN,WAAW,WAAA,CAAY;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAc,OACZ,MAAA,EAUC;AACD,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,aAAa,CAAA;AAElD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAW,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,WAAW,SAAA,CAAU;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAc,KACZ,MAAA,EAWC;AACD,IAAA,MAAM,OAAA,GAAW,OAAO,GAAA,IAA+B,KAAA;AACvD,IAAA,MAAM,aAAA,GAAiB,OAAO,aAAA,IAAwC,MAAA;AAEtE,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,aAAA,EAAe,EAAE,GAAA,EAAK,OAAA,EAAS,eAAe,CAAA;AAEhE,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAGjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,CAAC,QAAA,EAAU,UAAU,CAAA,GAAI,aAAA,CAAc,MAAM,GAAG,CAAA;AACtD,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,OAAO,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA,KAAM,UAAA;AAAA,QAChC;AACA,QAAA,OAAO,YAAY,CAAA,CAAE,MAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAEhD,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACrC,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,UAAA,EAAY,KAAA,EAAO,UAAA,CAAW,MAAA,EAAO;AAAA,EAChD;AACF,CAAA;AAGA,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;;;ACnZ/C,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,UAAU,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEtF,SAAS,WAAW,EAAA,EAAqB;AACvC,EAAA,OAAQ,EAAA,IAAM,GAAA,IAAO,EAAA,IAAM,GAAA,IAAS,MAAM,GAAA,IAAO,EAAA,IAAM,GAAA,IAAS,EAAA,IAAM,GAAA,IAAO,EAAA,IAAM,GAAA,IAAQ,EAAA,KAAO,OAAO,EAAA,KAAO,GAAA;AAClH;AAGA,SAAS,gBAAA,CAAiB,GAAA,EAAa,KAAA,EAAe,OAAA,EAA0B;AAC9E,EAAA,IAAI,IAAI,KAAA,GAAQ,CAAA;AAChB,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,IAAI,OAAA,IAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,EAAM;AAC9B,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,MAAA,IAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACtB,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,OAAO,CAAA,GAAI,CAAA;AAAA,IACb;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,MAAA;AACb;AAGA,SAAS,gBAAA,CAAiB,KAAa,KAAA,EAAuB;AAC5D,EAAA,IAAI,IAAI,KAAA,GAAQ,CAAA;AAChB,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,MAAA,IAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACtB,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,OAAO,CAAA,GAAI,CAAA;AAAA,IACb;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,MAAA;AACb;AAGA,SAAS,cAAA,CAAe,KAAa,KAAA,EAAmC;AACtE,EAAA,IAAI,IAAI,KAAA,GAAQ,CAAA;AAChB,EAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,EAAA,IAAI,CAAC,KAAA,IAAS,EAAG,KAAA,IAAS,GAAA,IAAO,KAAA,IAAS,GAAA,IAAS,KAAA,IAAS,GAAA,IAAO,KAAA,IAAS,GAAA,IAAQ,KAAA,KAAU,GAAA,CAAA,EAAM;AAClG,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,CAAA,EAAA;AACA,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK,CAAA,EAAA;AAC/D,EAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,MAAA;AAC3B,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,CAAC,CAAA;AAC/B;AAGA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAEhB,IAAA,IAAI,OAAO,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,CAAC,MAAM,IAAA,EAAM,CAAA,EAAA;AAC1C,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAEpC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AAClC,QAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,IAAO,IAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACxC,UAAA,KAAA,EAAA;AACA,UAAA,CAAA,IAAK,CAAA;AAAA,QACP,CAAA,MAAA,IAAW,IAAI,CAAC,CAAA,KAAM,OAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAC/C,UAAA,KAAA,EAAA;AACA,UAAA,CAAA,IAAK,CAAA;AAAA,QACP,CAAA,MAAO;AACL,UAAA,CAAA,EAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,GAAA,EAAK;AAEd,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,KAAK,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,IAAQ,IAAI,CAAC,CAAA,KAAM,QAAQ,GAAA,CAAI,CAAC,MAAM,IAAA,CAAA,EAAO,CAAA,EAAA;AAC5F,MAAA,MAAM,IAAA,GAAO,CAAA,IAAK,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAC/B,MAAA,MAAM,OAAA,GAAA,CAAW,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,MAAS,CAAA,KAAM,CAAA,IAAK,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA;AACpF,MAAA,CAAA,GAAI,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA;AACpC,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,CAAA,GAAI,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAC3B,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,GAAA,EAAK,CAAC,CAAA;AACjC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,CAAA,GAAI,IAAI,MAAM,CAAA;AAC7C,QAAA,CAAA,GAAI,KAAA,KAAU,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,QAAQ,GAAA,CAAI,MAAA;AAC5C,QAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACpB;AAMO,SAAS,qBAAqB,GAAA,EAA6B;AAChE,EAAA,MAAM,SAAA,GAAY,YAAY,GAAG,CAAA;AAEjC,EAAA,MAAM,aAAa,SAAA,CAChB,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,iBAAA,EAAkB;AAAA,EAChD;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,oCAAA,EAAqC;AAAA,EACnE;AAEA,EAAA,MAAM,KAAA,GAAA,CAAS,WAAW,CAAC,CAAA,CAAE,MAAM,6BAA6B,CAAA,IAAK,EAAC,EAAG,GAAA;AAAA,IAAI,CAAC,CAAA,KAC5E,CAAA,CAAE,WAAA;AAAY,GAChB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAA,EAAQ;AAC1C,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,oCAAA,EAAqC;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,CAAC,MAAM,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAC,CAAA;AACvD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,0CAAA,EAA6C,MAAM,CAAA,CAAA,EAAG;AAAA,EACpF;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AACpB;;;AC1JA,IAAM,4BAAA,GAA+B,GAAA;AAGrC,IAAM,iBAAA,GAAoB,OAAA;AAE1B,IAAM,iBAAN,MAA+C;AAAA,EAG7C,WAAA,CAAY,kBAA0B,kBAAA,EAA4B;AAChE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA,MACnB,gBAAA;AAAA,MACA,iBAAA,EAAmB,kBAAA;AAAA,MACnB,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CACJ,GAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,GAAA,EAAK,CAAC,GAAG,MAAM,CAAC,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK;AAAA,KAC3C;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,GAAqB;AACzB,IAAA,MAAM,IAAA,CAAK,KAAK,GAAA,EAAI;AAAA,EACtB;AACF,CAAA;AAEA,SAAS,eAAe,KAAA,EAAkC;AACxD,EAAA,IAAI,KAAA,YAAiB,kBAAkB,OAAO,KAAA;AAC9C,EAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,OAAO,IAAI,gBAAA,CAAiB,4BAAA,EAA8B,eAAe,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,OAAO,IAAI,gBAAA,CAAiB,OAAA,EAAS,eAAe,CAAA;AACtD;AAQO,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EAIvD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAJd,IAAA,IAAA,CAAQ,OAAA,uBAA2C,GAAA,EAAI;AAMrD,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,6BAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,UAAU,CAAA,EAAG;AAC3C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,OAAO,CAAA,CAAE,CAAA;AAAA,MACrE;AACA,MAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,OAAA,IAAW,4BAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kCAAA,EAAoC;AAAA,MACnD,oBAAoB,IAAA,CAAK;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,MAA6B,CAAC,CAAA;AACrF,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAAA,EAA2D;AAChF,IAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,MAAA,CAAO,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,KAAA,CAAM,MAAA,IAAU,wBAAwB,CAAA,CAAA;AAAA,QAChE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,aAAa,CAAA;AAElD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,aAAA,EAAe,MAAA,CAAO,eAAe,CAAA;AAE3E,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA,EAGQ,UAAU,aAAA,EAAuC;AACvD,IAAA,MAAM,gBAAA,GAAmB,qBAAqB,aAAa,CAAA;AAC3D,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,yBAAyB,aAAa,CAAA,mDAAA,CAAA;AAAA,QACtC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAChD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe,gBAAA,EAAkB,KAAK,kBAAkB,CAAA;AAC3E,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,MAAM,CAAA;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAGA,mBAAA,CAAoB,YAAY,mBAAmB,CAAA;;;AClKnD,IAAM,aAAA,GAAgB,oCAAA;AACtB,IAAM,UAAA,GAAa,mCAAA;AACnB,IAAMK,mBAAAA,GAAqB,GAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAalB,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EAIxD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,GAAA,EAAK,oBAAA,IAAwB,UAAA;AACrD,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,wBAAwBA,mBAAkB,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mCAAmC,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAuD;AACnF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,SAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAEzD,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,CAAA,EAAE;AAAA,IAC9F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,QAAQ,MAAA,EAAsH;AAC1I,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,MAAM,MACJ,CAAA,EAAG,aAAa,CAAA,2IAAA,EAE4B,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AACvE,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,KAAK,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,EAAE,YAAA,EAAc,IAAA,CAAK,SAAA,EAAU,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC/F,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,EAAC;AACrB,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAO,KAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AACnC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,KAAY,KAAA,CAAA,SAAkB,EAAC;AACjD,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA,CAAE,IAAA,EAAK,GAAI,KAAA,CAAA;AACpG,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAA,EAAa,IAAA,CAAK,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAA,CAAA;AAAA,QAClG,WAAA,EAAa,KAAK,SAAA,EAAW,MAAA;AAAA,QAC7B;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,aAAa,oBAAoB,CAAA;;;ACzFrD,IAAM,WAAA,GAAc,4BAAA;AACpB,IAAMC,WAAAA,GAAa,mCAAA;AACnB,IAAMD,mBAAAA,GAAqB,GAAA;AAKpB,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAItD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,GAAA,EAAK,kBAAA,IAAsBC,WAAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,sBAAsBD,mBAAkB,CAAA;AAC5E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAuD;AACnF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACjE,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAEzD,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,CAAA,EAAE;AAAA,IAC9F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAA,EAAyD;AAC/E,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,QAAQ,KAAA,EAAM;AAClC,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAAE;AAAA,EAC/D;AAAA,EAEA,MAAc,OAAO,MAAA,EAAyD;AAC5E,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,CAAC,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAwB,CAAA,EAAG,WAAW,CAAA,cAAA,EAAiB,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AACzH,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,EAAC,EAAE;AAAA,EACpC;AAAA,EAEA,MAAc,YAAY,MAAA,EAA6D;AACrF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AACzC,IAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAM,OAAO,EAAE,MAAM,IAAA,EAAK;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAwB,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACjH,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,GAAQ,IAAI,CAAA,EAAG,IAAA,IAAQ,IAAA,EAAM,OAAA,GAAU,IAAI,CAAA,EAAG,IAAA,IAAQ,IAAA,EAAK;AAAA,EAClF;AAAA,EAEA,MAAc,OAAO,GAAA,EAA+B;AAClD,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,KAAK,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,YAAA,EAAc,KAAK,SAAA,EAAU,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC9G,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,QAAW,GAAA,EAAgC;AACvD,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,KAAK,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,EAAE,YAAA,EAAc,IAAA,CAAK,SAAA,EAAU,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC/F,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;;;AC1GjD,IAAM,cAAA,GAAiB,oCAAA;AACvB,IAAMA,mBAAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAA,GAAsB,CAAA;AAY5B,SAAS,UAAU,GAAA,EAA4B;AAC7C,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,SAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAwB;AACpC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,GAAG,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAC,CAAA;AAC3E,MAAA,OAAO,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,QAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,IAAA,EAAK,GAAI,EAAA;AAAA,IACnD,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,KAAK,IAAI,CAAA;AACpB,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC/C,IAAA,MAAM,UAAU,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,KAAK,WAAW,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,mCAAmC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AACpG,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,+CAA+C,CAAA;AAC7E,IAAA,MAAM,GAAA,GAAM,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AACvC,IAAA,IAAI,EAAA,IAAM,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,gBAAA,GAAN,cAA+B,eAAA,CAAgB;AAAA,EAGpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,oBAAoBA,mBAAkB,CAAA;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAuD;AACnF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAEzD,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,CAAA,EAAE;AAAA,IAC9F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,MAAA,EAAgE;AACnF,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AACjC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,mBAAmB,CAAA;AAElE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,cAAc,CAAA,cAAA,EAAiB,kBAAA,CAAmB,OAAO,KAAK,CAAA,CAAE,CAAC,CAAA,qBAAA,EAAwB,UAAU,CAAA,iBAAA,CAAA;AAClH,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,KAAK,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,EAAE,QAAA,EAAU,sBAAA,EAAuB,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACnG,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,SAAW,EAAE,OAAA,EAAS,EAAC,EAAE;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,IAAA,EAAK;AAC3B,MAAA,OAAO,EAAE,OAAA,EAAS,SAAA,CAAU,GAAG,CAAA,EAAE;AAAA,IACnC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAA;AAGA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;;;AChG7C,IAAM,gBAAA,GAAmB,uBAAA;AACzB,IAAMA,mBAAAA,GAAqB,GAAA;AAUpB,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EAIrD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,eAAA,IAAmB,gBAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA,IAAKA,mBAAAA;AACzD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,gCAAA,EAAkC,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS,mBAAA;AAAA,UACT,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAEJ,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,KAAK,MAAA,EAAO;AACzB,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAGzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,OAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAc,MAAA,GAAmC;AAC/C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MACrD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS;AAAA,KAC3C,CAAA;AACD,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAG;AAAA,EAC3B;AAAA,EAEA,MAAc,UAAU,MAAA,EAAuD;AAC7E,IAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAI,GAAI,MAAA;AAC3B,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,KAAK,CAAA;AAAA,MACvC,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS;AAAA,KAC3C,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,EAC9B;AAAA,EAEA,MAAc,OAAO,MAAA,EAA6C;AAChE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAK,MAAA,EAAQ,QAAO,GAAI,MAAA;AAC3C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,WAAW,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACvD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS;AAAA,KAC3C,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF,CAAA;AAGA,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;;;AC5GxC,IAAM,eAAA,GAAN,cAA8B,eAAA,CAAgB;AAAA,EAKnD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AALd,IAAA,IAAA,CAAQ,SAAA,uBAAsC,GAAA,EAAI;AAClD,IAAA,IAAA,CAAQ,QACN,EAAC;AAAA,EAIH;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAgB,IAAA,EAAqB;AAC/C,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiE;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EAC4B;AAE5B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAElC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAEtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,IAAI,gBAAA;AAAA,UACT,gCAAgC,MAAM,CAAA,CAAA;AAAA,UACtC;AAAA,SACF;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC;AAAA,KACzC;AAAA,EACF;AACF,CAAA;;;ACXO,SAAS,yBAAyB,OAAA,EAAiD;AACxF,EAAA,MAAM,OAAA,GAAU,OACd,OAAA,EACA,MAAA,EACA,QACA,OAAA,KACqB;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,OAAO,CAAA;AAE3E,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,MAAA,CAAO,KAAA;AAAA,IACf;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB,CAAA;AACA,EAAA,OAAO,OAAA;AACT;;;ACrDA,SAAS,sBAAsB,KAAA,EAA0D;AACvF,EAAA,MAAM,OAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA;AAAU,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA;AAAI,QAAA;AAAA,MAC1C,KAAK,QAAA;AAAU,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAAI,QAAA;AAAA,MAC/B,KAAK,SAAA;AAAW,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAM,QAAA;AAAA,MAClC,KAAK,QAAA;AAAU,QAAA,IAAA,CAAK,GAAG,IAAI,EAAC;AAAG,QAAA;AAAA,MAC/B,KAAK,UAAA;AAAY,QAAA,IAAA,CAAK,GAAG,IAAI,EAAC;AAAG,QAAA;AAAA,MACjC;AAAS,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA;AAAA;AAClC,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAQO,IAAM,4BAAN,MAAgC;AAAA,EAMrC,WAAA,GAAc;AAJd,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,YAAA,GAA0D,IAAA;AAClE,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAGnB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,kBAAA,EAAmB;AACtC,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,IAAA,oBAAA,CAAqB,KAAK,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAA,CACJ,KAAA,EACA,WAAA,EACe;AACf,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,eAAe,OAAA,CAAQ,GAAA;AAM3C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,0BAAA,KAA+B,OAAA;AACnE,IAAA,sBAAA,CAAuB,KAAK,CAAA;AAC5B,IAAA,MAAM,MAAM,IAAA,EAAK;AACjB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,KAAA,CAAM,OAAA,EAAS;AACpC,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,YAAY,CAAA;AAAA,IACtD;AACA,IAAA,KAAA,CAAM,SAAA,CAAU,MAAM,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA,EAGA,IAAI,qBAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAc,gBAAA,CACZ,KAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC5D,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AACjE,MAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,KAAA,EAAO;AAC9B,QAAA,IAAI,wBAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1C,QAAA,MAAM,KAAA,GAAQ,IAAI,MAAM,CAAA;AACxB,QAAA,IAAI,KAAA,IAAS,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,UAAA,MAAM,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA;AACtC,UAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,CAAC,KAAK,YAAA,EAAc;AACjD,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI,OAAO,IAAA,CAAK,YAAA;AAChB,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,MAAA,IAAA,GAAO,MAAA,CAAO,WAAA;AAAA,QACZ,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,YAAY,EAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC;AAAA,OACxE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,GAAG,IAAA,EAAM,GAAG,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAY,EAAG,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,4BAAA,GAAqC;AAC3C,IAAA,MAAM,kBAAkB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAO,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,OACrB,WAAA,EACA,MAAA,EACA,QACA,OAAA,KAC+B;AAC/B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,eAAA,CAAgB,WAAA,EAAa,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAAA,MACnE,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,gBAAgB,qCAAA,CAAsC,IAAA,CAAK,GAAG,CAAA,EAAG;AAC5F,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,OAAO,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,MAAA,EAAO;AAAA,YACvE,QAAA,EAAU,EAAE,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAE,WAClF;AAAA,QACF;AACA,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAiB,WAAA,EAAwD;AACvE,IAAA,MAAM,GAAA,GAAM,eAAe,OAAA,CAAQ,GAAA;AAKnC,IAAA,IAAI,GAAA,CAAI,yBAAA,KAA8B,MAAA,IAAU,GAAA,CAAI,kBAAkB,MAAA,EAAQ;AAC5E,MAAA,IAAI,GAAA,CAAI,aAAa,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAA,EAAU;AAAA,QAC/B,GAAA,EAAK;AAAA,UACH,mBAAmB,GAAA,CAAI;AAAA;AACzB,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,SAAA,EAAW;AAAA,QAChC,GAAA,EAAK;AAAA,UACH,iBAAiB,GAAA,CAAI;AAAA;AACvB,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,GAAA,CAAI,kBAAA,IAAsB,GAAA,CAAI,iBAAA,EAAmB;AACnD,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAA,EAAU;AAAA,QAC/B,GAAA,EAAK;AAAA,UACH,oBAAoB,GAAA,CAAI,kBAAA;AAAA,UACxB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,mBAAA,EAAqB,IAAI,mBAAA,IAAuB;AAAA;AAClD,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAA,EAAS;AAAA,QAC9B,GAAA,EAAK;AAAA,UACH,QAAA,EAAU,UAAA;AAAA,UACV,kBAAkB,GAAA,CAAI,gBAAA;AAAA,UACtB,UAAA,EAAY,IAAI,UAAA,IAAc;AAAA;AAChC,OACD,CAAA;AAAA,IACH,CAAA,MAAA,IAES,IAAI,cAAA,EAAgB;AAC3B,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAA,EAAS;AAAA,QAC9B,GAAA,EAAK;AAAA,UACH,QAAA,EAAU,QAAA;AAAA,UACV,gBAAgB,GAAA,CAAI,cAAA;AAAA,UACpB,UAAA,EAAY,IAAI,UAAA,IAAc;AAAA;AAChC,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,iBAAA,IAAqB,IAAI,aAAA,EAAe;AACtE,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAAA,QAC7B,GAAA,EAAK;AAAA,UACH,kBAAkB,GAAA,CAAI,gBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,eAAe,GAAA,CAAI;AAAA;AACrB,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,sBAAA,EAAwB;AAC9B,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,UAAA,EAAY;AAAA,QACjC,GAAA,EAAK;AAAA,UACH,wBAAwB,GAAA,CAAI,sBAAA;AAAA,UAC5B,uBAAA,EAAyB,IAAI,uBAAA,IAA2B,EAAA;AAAA,UACxD,kBAAA,EAAoB,IAAI,kBAAA,IAAsB;AAAA;AAChD,OACD,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,IAAI,mBAAA,IAAwB,GAAA,CAAI,8BAA8B,GAAA,CAAI,eAAA,IAAmB,IAAI,mBAAA,EAAsB;AACjH,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAA,EAAS;AAAA,QAC9B,GAAA,EAAK;AAAA,UACH,mBAAA,EAAqB,IAAI,mBAAA,IAAuB,EAAA;AAAA,UAChD,oBAAA,EAAsB,IAAI,oBAAA,IAAwB,EAAA;AAAA,UAClD,0BAAA,EAA4B,IAAI,0BAAA,IAA8B,EAAA;AAAA,UAC9D,sBAAA,EAAwB,IAAI,sBAAA,IAA0B,EAAA;AAAA,UACtD,eAAA,EAAiB,IAAI,eAAA,IAAmB,EAAA;AAAA,UACxC,mBAAA,EAAqB,IAAI,mBAAA,IAAuB;AAAA;AAClD,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,SAAA,EAAW;AAAA,QAChC,GAAA,EAAK;AAAA,UACH,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,kBAAA,EAAoB,IAAI,kBAAA,IAAsB;AAAA;AAChD,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,YAAA,EAAc,EAAE,GAAA,EAAK,IAAI,CAAA;AAGhD,IAAA,IAAI,GAAA,CAAI,oBAAA,IAAwB,GAAA,CAAI,qBAAA,EAAuB;AACzD,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,SAAA,EAAW;AAAA,QAChC,GAAA,EAAK;AAAA,UACH,sBAAsB,GAAA,CAAI,oBAAA;AAAA,UAC1B,uBAAuB,GAAA,CAAI;AAAA;AAC7B,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,GAAA,CAAI,iBAAA,IAAqB,GAAA,CAAI,qBAAA,EAAuB;AACtD,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAA,EAAS;AAAA,QAC9B,GAAA,EAAK;AAAA,UACH,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,uBAAuB,GAAA,CAAI;AAAA;AAC7B,OACD,CAAA;AAAA,IACH;AAKA,IAAA,IAAK,IAAI,eAAA,IAAmB,GAAA,CAAI,mBAAA,IAAwB,GAAA,CAAI,eAAe,MAAA,EAAQ;AACjF,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAA,EAAS;AAAA,QAC9B,GAAA,EAAK;AAAA,UACH,eAAA,EAAiB,IAAI,eAAA,IAAmB,EAAA;AAAA,UACxC,mBAAA,EAAqB,IAAI,mBAAA,IAAuB,EAAA;AAAA,UAChD,kBAAA,EAAoB,IAAI,kBAAA,IAAsB,EAAA;AAAA,UAC9C,eAAA,EAAiB,IAAI,eAAA,IAAmB,EAAA;AAAA,UACxC,UAAA,EAAY,IAAI,UAAA,IAAc;AAAA;AAChC,OACD,CAAA;AAAA,IACH;AAMA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,aAAA,EAAe;AAAA,MACpC,GAAA,EAAK;AAAA,QACH,8BAAA,EAAgC,IAAI,8BAAA,IAAkC,EAAA;AAAA,QACtE,0BAAA,EAA4B,IAAI,0BAAA,IAA8B;AAAA;AAChE,KACD,CAAA;AAID,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,SAAA,EAAW;AAAA,MAChC,GAAA,EAAK;AAAA,QACH,qBAAA,EAAuB,IAAI,qBAAA,IAAyB,EAAA;AAAA,QACpD,yBAAA,EAA2B,IAAI,yBAAA,IAA6B,EAAA;AAAA,QAC5D,cAAA,EAAgB,IAAI,cAAA,IAAkB,EAAA;AAAA,QACtC,cAAA,EAAgB,IAAI,cAAA,IAAkB,EAAA;AAAA,QACtC,gBAAA,EAAkB,IAAI,gBAAA,IAAoB,EAAA;AAAA,QAC1C,uBAAA,EAAyB,IAAI,uBAAA,IAA2B;AAAA;AAC1D,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,SAAA,EAAW;AAAA,MAChC,GAAA,EAAK;AAAA,QACH,sBAAA,EAAwB,IAAI,sBAAA,IAA0B,EAAA;AAAA,QACtD,kBAAA,EAAoB,IAAI,kBAAA,IAAsB;AAAA;AAChD,KACD,CAAA;AAID,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAA,EAAU;AAAA,MAC/B,GAAA,EAAK;AAAA,QACH,eAAA,EAAiB,IAAI,eAAA,IAAmB,EAAA;AAAA,QACxC,iBAAA,EAAmB,IAAI,iBAAA,IAAqB;AAAA;AAC9C,KACD,CAAA;AAQD,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,KAAK,CAAC,mBAAA,EAAqB,kBAAkB,kBAAA,EAAoB,cAAA,EAAgB,qBAAqB,CAAA,EAAG;AAClH,MAAA,IAAI,IAAI,CAAC,CAAA,SAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,GAAA,CAAI,QAAA;AACxC,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,oBAAA,EAAsB,iBAAA,EAAmB,mBAAmB,CAAA,EAAG;AAC9E,MAAA,IAAI,IAAI,CAAC,CAAA,SAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA,EAAO,EAAE,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,cAAA,EAAgB;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,IAAA,EAAM;AAAA,QAC3B,GAAA,EAAK;AAAA,UACH,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,gBAAgB,GAAA,CAAI,cAAA;AAAA,UACpB,mBAAA,EAAqB,IAAI,mBAAA,IAAuB;AAAA;AAClD,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,WAAA,EAAa;AAAA,QAClC,GAAA,EAAK;AAAA,UACH,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,iBAAA,EAAmB,IAAI,iBAAA,IAAqB;AAAA;AAC9C,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAA,EAAU;AAAA,QAC/B,GAAA,EAAK;AAAA,UACH,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,YAAA,EAAc,IAAI,YAAA,IAAgB,EAAA;AAAA,UAClC,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,eAAA,EAAiB,IAAI,eAAA,IAAmB;AAAA;AAC1C,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAEhC,IAAA,MAAM,QAAA,GAAW,KAAK,oBAAA,EAAqB;AAE3C,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,EAAE,MAAM,WAAA,EAAa,GAAA,EAAK,EAAC,EAAG,CAAA;AAE/D,MAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,QAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACxE,UAAA,IAAA,CAAK,YAAY,MAAA,CAAO,IAAA,EAAM,qBAAA,CAAsB,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,QAC3E,CAAA,MAAO;AAEL,UAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,QACpF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,WAAA,EAAa,EAAE,GAAA,EAAK,IAAI,CAAA;AAC/C,MAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,IAAI,CAAA;AAAA,IACjD;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,GAAoH;AAC1H,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,WAAW,+CAA+C,CAAA;AAG3E,MAAA,OAAO,QAAA,CAAS,QAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAA,GAA4C;AAC1C,IAAA,OAAO,wBAAA,CAAyB,KAAK,OAAO,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["/**\n * Core types for Almadar integrations\n */\n\n/**\n * Configuration for an integration instance\n */\nexport interface IntegrationConfig {\n /** Integration name (matches registry) */\n name: string;\n\n /** Environment variables (API keys, secrets) */\n env: Record<string, string>;\n\n /** Optional logger */\n logger?: IntegrationLogger;\n\n /** Optional rate limiting config */\n rateLimit?: {\n requestsPerSecond: number;\n burstSize: number;\n };\n\n /** Optional timeout (ms) */\n timeout?: number;\n\n /** Optional retry config */\n retry?: {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n };\n}\n\n/**\n * Result of an integration action call\n */\nexport interface IntegrationResult<T = unknown> {\n /** Success flag */\n success: boolean;\n\n /** Response data (on success) */\n data?: T;\n\n /** Error (on failure) */\n error?: IntegrationError;\n\n /** Metadata (timing, retries, etc.) */\n metadata: {\n integration: string;\n action: string;\n duration: number;\n retries: number;\n timestamp: number;\n };\n}\n\n/**\n * Integration error codes\n */\nexport type IntegrationErrorCode =\n | 'VALIDATION_ERROR'\n | 'AUTH_ERROR'\n | 'RATE_LIMIT_ERROR'\n | 'TIMEOUT_ERROR'\n | 'NETWORK_ERROR'\n | 'SERVICE_ERROR'\n | 'UNKNOWN_ERROR';\n\n/**\n * Integration error\n */\nexport class IntegrationError extends Error {\n code: IntegrationErrorCode;\n integration?: string;\n action?: string;\n details?: unknown;\n\n constructor(\n message: string,\n code: IntegrationErrorCode = 'UNKNOWN_ERROR',\n details?: unknown,\n ) {\n super(message);\n this.name = 'IntegrationError';\n this.code = code;\n this.details = details;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n integration: this.integration,\n action: this.action,\n details: this.details,\n };\n }\n}\n\nimport type { LogMeta } from '@almadar/core';\n\n/** Re-export LogMeta from @almadar/core as the canonical log metadata type. */\nexport type { LogMeta };\n\n/**\n * Logger interface\n */\nexport interface IntegrationLogger {\n debug(message: string, meta?: LogMeta): void;\n info(message: string, meta?: LogMeta): void;\n warn(message: string, meta?: LogMeta): void;\n error(message: string, meta?: LogMeta): void;\n}\n\n/**\n * Integration action parameters.\n * Each integration's execute() method receives params as this type.\n * Individual methods cast to specific param shapes from their contracts.\n *\n * Per-key value union is widened to admit `@almadar/core`'s `FieldValue`\n * shape (entity / payload values flowing into call-service args): `Date`\n * for date fields, `IntegrationParams[]` for nested object arrays, and a\n * raw-value array catch-all so `string[]` / `number[]` / mixed payload\n * arrays satisfy the index signature without requiring `as unknown as`\n * casts at the call site. Adapters narrow these to their canonical input\n * types (typically JSON-string serialisation for `Date`).\n */\nexport type IntegrationParamValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | ReadonlyArray<IntegrationParamValue>\n | { readonly [key: string]: IntegrationParamValue };\n\nexport interface IntegrationParams {\n [key: string]: IntegrationParamValue;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n param: string;\n message: string;\n}\n","/**\n * ServiceContract type definitions for all @almadar/integrations.\n *\n * Each integration defines its own action map as a Record<string, ServiceAction>,\n * suitable for use with ServiceContract<T> from @almadar/core.\n *\n * Types are simplified representations of the actual params/results. They capture\n * the contract shape without pulling in third-party SDK types (Stripe, Twilio, etc.).\n *\n * @packageDocumentation\n */\n\nimport type { EventPayload, ServiceAction, ServiceEvents, ServiceParams, ServiceParamsValue } from '@almadar/core';\nimport type { IntegrationParams } from './types';\nimport type { DatabaseQueryParamValue, DatabaseRow } from './integrations/database/types';\n\n// ============================================================================\n// GitHub\n// ============================================================================\n\nexport type GitHubActions = {\n /** Clone a repository via the git CLI into a local target directory, using the configured token for auth. */\n cloneRepo: {\n params: {\n /** HTTPS clone URL, e.g. https://github.com/owner/repo. Owner/repo are parsed from it when not preconfigured. */\n repoUrl: string;\n /** Local directory to clone into. */\n targetDir: string;\n /** Branch to check out after cloning; defaults to the repo's default branch. */\n branch?: string;\n };\n result: { message: string };\n };\n /** Create a new local branch via the git CLI in the configured working directory. */\n createBranch: {\n params: {\n /** Name of the branch to create. */\n branchName: string;\n /** Branch to branch from; defaults to the current branch. */\n baseBranch?: string;\n };\n result: { message: string };\n };\n /** Commit staged (or given) changes via the git CLI in the configured working directory. */\n commit: {\n params: {\n /** Commit message. */\n message: string;\n /** Specific files to commit; when omitted, all changes are committed. */\n files?: string[];\n };\n result: { message: string };\n };\n /** Push a local branch to the remote via the git CLI, using the configured token for auth. */\n push: {\n params: {\n /** Branch name to push. */\n branchName: string;\n /** Force-push (overwrites remote history); never set true in an agent context. */\n force?: boolean;\n };\n result: { message: string };\n };\n /** Open a pull request via the GitHub REST API. */\n createPR: {\n params: {\n /** Pull request title. */\n title: string;\n /** Pull request description body. */\n body: string;\n /** Branch the PR merges into, e.g. main. */\n baseBranch: string;\n /** Branch the PR merges from (the feature branch). */\n headBranch: string;\n /** Open as a draft PR instead of ready-for-review. */\n draft?: boolean;\n };\n result: { number: number; url: string; title: string };\n };\n /** List review comments on a pull request via the GitHub REST API. */\n getPRComments: {\n params: {\n /** Pull request number. */\n prNumber: number;\n };\n result: { comments: Array<{ id: number; body: string; user: string }> };\n };\n /** List issues on the configured repository via the GitHub REST API. */\n listIssues: {\n params: {\n /** Issue state filter: 'open', 'closed', or 'all'; defaults to open. */\n state?: string;\n /** Only issues carrying all of these labels. */\n labels?: string[];\n /** Page size for the GitHub API request. */\n per_page?: number;\n };\n result: { issues: Array<{ number: number; title: string; state: string }> };\n };\n /** Fetch a single issue's details via the GitHub REST API. */\n getIssue: {\n params: {\n /** Issue number. */\n issueNumber: number;\n };\n result: { number: number; title: string; body: string; state: string };\n };\n /** Read a file's content from a repository at a given ref (declared intent — dispatch is being wired). */\n getFile: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** File path within the repository. */\n path: string;\n /** Branch, tag, or commit SHA to read from; defaults to the default branch. */\n ref?: string;\n };\n result: { path: string; content: string; sha: string; size: number };\n };\n /** List commits on a repository, optionally filtered by file path (declared intent — dispatch is being wired). */\n listCommits: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** Only commits touching this file path. */\n path?: string;\n /** Branch, tag, or commit SHA to start from; defaults to the default branch. */\n ref?: string;\n /** Page size for the GitHub API request. */\n per_page?: number;\n };\n result: { commits: Array<{ sha: string; message: string; author: string; date: string }> };\n };\n /** Open a new issue on a repository (declared intent — dispatch is being wired). */\n createIssue: {\n params: {\n /** Repository owner (user or org). */\n owner: string;\n /** Repository name. */\n repo: string;\n /** Issue title. */\n title: string;\n /** Issue body/description. */\n body?: string;\n /** Labels to apply to the new issue. */\n labels?: string[];\n };\n result: { number: number; title: string; url: string };\n };\n};\n\n// ============================================================================\n// Stripe\n// ============================================================================\n\nexport type StripeActions = {\n /**\n * Create a Stripe PaymentIntent for a one-off charge.\n * @synonyms charge, pay\n */\n createPaymentIntent: {\n params: {\n /** Charge amount in the currency's smallest unit (e.g. cents for USD). */\n amount: number;\n /** ISO 4217 currency code, e.g. usd. */\n currency: string;\n /** Arbitrary key-value tags attached to the PaymentIntent (string values only). */\n metadata?: Record<string, string>;\n };\n result: { id: string; clientSecret: string; status: string; amount: number; currency: string };\n };\n /** Confirm a previously created PaymentIntent, attempting to complete the charge. */\n confirmPayment: {\n params: {\n /** The PaymentIntent id returned by createPaymentIntent. */\n paymentIntentId: string;\n };\n result: { id: string; status: string };\n };\n /** Refund a charged PaymentIntent, in full or in part. */\n refund: {\n params: {\n /** The PaymentIntent id to refund. */\n paymentIntentId: string;\n /** Amount to refund in the currency's smallest unit; omit for a full refund. */\n amount?: number;\n };\n result: { id: string; status: string; amount: number };\n };\n};\n\n// ============================================================================\n// LLM\n// ============================================================================\n\nexport type LLMIntegrationActions = {\n /** Generate free-form text from a prompt via the configured LLM provider (default 'You are a helpful assistant.' system prompt). */\n generate: {\n params: {\n /** The user/task prompt sent to the model. */\n userPrompt: string;\n /** System prompt steering the model's behavior; defaults to a generic assistant prompt. */\n systemPrompt?: string;\n /** Model id override; when set, a fresh client is built for this call instead of the shared one. */\n model?: string;\n /** Sampling temperature (0-1ish, provider-dependent); higher is more random. */\n temperature?: number;\n /** Maximum tokens to generate; defaults to 1024. */\n maxTokens?: number;\n };\n result: {\n content: string;\n usage: { promptTokens?: number; completionTokens?: number; totalTokens?: number; tokens?: number };\n };\n };\n /** Classify text into exactly one of a caller-supplied category list, with a confidence score and reasoning. */\n classify: {\n params: {\n /** Text to classify. */\n text: string;\n /** Closed set of category labels the model must choose from. */\n categories: string[];\n /** Model id override. */\n model?: string;\n };\n result: { category: string; confidence: number; reasoning: string };\n };\n /** Extract structured data from text according to a JSON-schema-shaped description; returned data is not validated against the schema. */\n extract: {\n params: {\n /** Source text to extract data from. */\n text: string;\n /** JSON-schema-like description of the fields to extract; passed to the model as a prompt, not enforced structurally. */\n schema: IntegrationParams;\n /** Model id override. */\n model?: string;\n };\n result: IntegrationParams;\n };\n /** Summarize text, optionally constrained by length and style, returning a summary plus key points. */\n summarize: {\n params: {\n /** Text to summarize. */\n text: string;\n /** Target maximum summary length in words. */\n maxLength?: number;\n /** Summary style: 'bullet' for bullet points, 'detailed' for thorough, otherwise concise. */\n style?: string;\n /** Model id override. */\n model?: string;\n };\n result: { summary: string; keyPoints: string[] };\n };\n /** Generate embedding vectors for an array of texts via the configured embedding model (default baai/bge-base-en-v1.5 on OpenRouter, independent of the chat provider). */\n embed: {\n params: {\n /** Texts to embed, one vector per entry, in order. */\n texts: string[];\n /** Embedding model id override. */\n model?: string;\n };\n result: { embeddings: number[][] };\n };\n};\n\n// ============================================================================\n// ML (model inference)\n// ============================================================================\n\nexport type MLActions = {\n /** Run inference against a deployed model-serving orbital by posting an INFER event and reading the prediction back out of the emitted INFERRED result; may cold-start (up to 60s default timeout). */\n infer: {\n params: {\n /** Checkpoint or model identifier the serving orbital resolves. */\n model: string;\n /** JSON-safe model input payload. */\n input: ServiceParamsValue;\n };\n result: { output: ServiceParamsValue; confidence: number; violations: ServiceParamsValue[] };\n };\n};\n\n// ============================================================================\n// YouTube\n// ============================================================================\n\nexport type YouTubeActions = {\n /** Search YouTube via the Data API and return matching video snippets. */\n search: {\n params: {\n /** Search query text. */\n query: string;\n /** Maximum number of results; defaults to 10. */\n maxResults?: number;\n /** Resource type filter passed to the Data API (e.g. 'video', 'channel', 'playlist'). */\n type?: string;\n };\n result: Array<{ videoId: string; title: string; thumbnail: string; description: string }>;\n };\n /** Fetch a video's snippet and statistics via the YouTube Data API. */\n getVideo: {\n params: {\n /** YouTube video id. */\n videoId: string;\n };\n result: { title: string; description: string; viewCount: string; likeCount: string };\n };\n /** Fetch a channel's snippet and statistics via the YouTube Data API. */\n getChannel: {\n params: {\n /** YouTube channel id. */\n channelId: string;\n };\n result: { name: string; description: string; subscriberCount: string };\n };\n};\n\n// ============================================================================\n// Twilio\n// ============================================================================\n\nexport type TwilioActions = {\n /**\n * Send an SMS message via Twilio.\n * @synonyms text message, text\n */\n sendSMS: {\n params: {\n /** Destination phone number, E.164 format. */\n to: string;\n /** Message text. */\n body: string;\n /** Sender phone number; defaults to TWILIO_PHONE_NUMBER. */\n from?: string;\n };\n result: { sid: string; status: string };\n };\n /** Send a WhatsApp message via Twilio, using the configured phone number as sender on both ends. */\n sendWhatsApp: {\n params: {\n /** Destination phone number, E.164 format (sent as whatsapp:number). */\n to: string;\n /** Message text. */\n body: string;\n };\n result: { sid: string; status: string };\n };\n};\n\n// ============================================================================\n// Email\n// ============================================================================\n\nexport type EmailActions = {\n /** Send a transactional email via the configured provider (SendGrid or Resend). */\n send: {\n params: {\n /** Recipient email address. */\n to: string;\n /** Email subject line. */\n subject: string;\n /** Plain-text (or HTML, if `htmlBody` is absent) body content. */\n body: string;\n /** Sender address; defaults to FROM_EMAIL. */\n from?: string;\n /** HTML content; when present `body` becomes the plain-text alternative. */\n htmlBody?: string;\n /** Reply-To address. */\n replyTo?: string;\n /** Provider template reference (SendGrid dynamic templates; Resend rejects it loudly). */\n templateId?: string;\n };\n result: { id: string; status: string };\n };\n};\n\n// ============================================================================\n// Webhook\n// ============================================================================\n\nexport type WebhookActions = {\n /** POST a JSON event notification to an external URL, HMAC-SHA256-signed when a secret is configured; 5xx responses retry, 4xx do not. */\n send: {\n params: {\n /** Destination URL to POST to. */\n url: string;\n /** Event name, carried in the body and the X-Almadar-Event header. */\n event: string;\n /** Event payload; defaults to an empty object. */\n payload?: Record<string, string>;\n /** Per-call HMAC signing secret, overriding WEBHOOK_SIGNING_SECRET. */\n secret?: string;\n };\n result: { status: number; ok: boolean; durationMs: number };\n };\n};\n\n// ============================================================================\n// Push (Web Push / VAPID)\n// ============================================================================\n\nexport type PushActions = {\n /** Send a VAPID-signed Web Push notification to a browser PushSubscription endpoint. */\n send: {\n params: {\n /** Browser PushSubscription: endpoint URL plus the p256dh/auth encryption keys. */\n subscription: { endpoint: string; keys: { p256dh: string; auth: string } };\n /** Notification title. */\n title: string;\n /** Notification body text. */\n body: string;\n /** URL to open when the notification is clicked. */\n url?: string;\n /** Notification icon URL. */\n icon?: string;\n };\n result: {\n statusCode: number;\n ok: boolean;\n /** True on a 404/410 push-service response — the subscription is gone and must be pruned, never retried. */\n expired: boolean;\n };\n };\n};\n\n// ============================================================================\n// Calendar (Google Calendar, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type CalendarActions = {\n /** List events on a Google Calendar; pass `syncToken` for incremental sync instead of a time window (the API rejects combining them). */\n listEvents: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID (or 'primary'). */\n calendarId?: string;\n /** ISO start of the time window (ignored when `syncToken` is set). */\n timeMin?: string;\n /** ISO end of the time window (ignored when `syncToken` is set). */\n timeMax?: string;\n /** Incremental-sync token from a previous call's `nextSyncToken`; supersedes timeMin/timeMax. */\n syncToken?: string;\n /** Maximum events to return; defaults to 250. */\n maxResults?: number;\n };\n result: {\n events: Array<{ id: string; summary: string; description: string; location: string; start: string; end: string; status: string; updated: string }>;\n /** Token to pass as `syncToken` on the next call; null when incremental sync isn't available for this response. */\n nextSyncToken: string | null;\n };\n };\n /** Create a calendar event; an all-day event uses a 10-char (YYYY-MM-DD) start with no `end`/`durationMinutes`, defaulting to the next day. */\n createEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Event title. */\n summary: string;\n /** Event description. */\n description?: string;\n /** Event location text. */\n location?: string;\n /** ISO start (10 chars = all-day date, longer = dateTime). */\n start: string;\n /** ISO end; if omitted, derived from `durationMinutes` or the all-day next-day convention. */\n end?: string;\n /** Duration in minutes used to derive `end` when `end` is omitted (non-all-day events only). */\n durationMinutes?: number;\n };\n result: { id: string; status: string; htmlLink: string };\n };\n /** Patch an existing event's fields; only fields present in params are changed. */\n updateEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Id of the event to update. */\n eventId: string;\n /** New event title. */\n summary?: string;\n /** New event description. */\n description?: string;\n /** New event location text. */\n location?: string;\n /** New ISO start. */\n start?: string;\n /** New ISO end. */\n end?: string;\n };\n result: { id: string; status: string };\n };\n /** Delete a calendar event. */\n deleteEvent: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Id of the event to delete. */\n eventId: string;\n };\n result: { id: string; deleted: boolean };\n };\n /** Query busy time blocks on a calendar within a window. */\n freeBusy: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** ISO start of the query window. */\n timeMin: string;\n /** ISO end of the query window. */\n timeMax: string;\n };\n result: { busy: Array<{ start: string; end: string }> };\n };\n /** Register a push-notification channel for calendar change events (Google Calendar API watch). */\n watch: {\n params: {\n /** Calendar id; defaults to GOOGLE_CALENDAR_ID. */\n calendarId?: string;\n /** Caller-chosen id identifying this notification channel. */\n channelId: string;\n /** HTTPS callback URL Google POSTs change notifications to. */\n address: string;\n /** Requested channel time-to-live in seconds. */\n ttlSeconds?: number;\n };\n result: { channelId: string; resourceId: string; expiration: string };\n };\n /** Stop an active watch channel, ending calendar change notifications. */\n stopWatch: {\n params: {\n /** The channel id from the corresponding `watch` call. */\n channelId: string;\n /** The resourceId returned by the corresponding `watch` call. */\n resourceId: string;\n };\n result: { stopped: boolean };\n };\n};\n\n// ============================================================================\n// Drive (Google Drive, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type DriveActions = {\n /** List non-trashed files in a Google Drive folder, optionally filtered by a Drive API query clause. */\n listFiles: {\n params: {\n /** Restrict to files whose parents include this folder id. */\n folderId?: string;\n /** Extra Drive API query clause, ANDed with the folder/trashed filters. */\n query?: string;\n /** Maximum files to return; defaults to 100. */\n maxResults?: number;\n };\n result: {\n files: Array<{ id: string; name: string; mimeType: string; size: number; modifiedTime: string; webViewLink: string }>;\n };\n };\n /** Download a file's content, base64-encoded. */\n getFile: {\n params: {\n /** Drive file id. */\n fileId: string;\n };\n result: { id: string; name: string; mimeType: string; content: string; size: number };\n };\n /**\n * Upload a file to Drive; writes go through the user OAuth client when configured (service-account uploads have no storage quota on personal accounts).\n * @synonyms upload file\n */\n uploadFile: {\n params: {\n /** File name to create. */\n name: string;\n /** File content as a base64 data URL (data:mime;base64,...) or raw base64/plain text. */\n content: string;\n /** MIME type; inferred from a data URL when omitted. */\n mimeType?: string;\n /** Parent folder id; defaults to GOOGLE_DRIVE_FOLDER_ID. */\n folderId?: string;\n };\n result: { id: string; name: string; webViewLink: string };\n };\n /** Create a new Drive folder. */\n createFolder: {\n params: {\n /** Folder name to create. */\n name: string;\n /** Parent folder id; defaults to GOOGLE_DRIVE_FOLDER_ID. */\n parentId?: string;\n };\n result: { id: string; name: string };\n };\n /** Grant a user permission on a Drive file. */\n shareFile: {\n params: {\n /** Drive file id. */\n fileId: string;\n /** Email address of the grantee. */\n email: string;\n /** Permission level; defaults to 'reader'. */\n role?: 'reader' | 'writer' | 'commenter';\n };\n result: { shared: boolean; permissionId: string };\n };\n};\n\n// ============================================================================\n// Meta Ads (Graph API Marketing Insights, read-only)\n// ============================================================================\n\nexport type MetaAdsActions = {\n /** Fetch total ad spend, impressions, and clicks for an account over a date range via the Meta Graph API Marketing Insights endpoint (read-only). */\n getSpend: {\n params: {\n /** Ad account id (with or without the `act_` prefix); defaults to META_AD_ACCOUNT_ID. */\n accountId?: string;\n /** Range start date (YYYY-MM-DD). */\n since: string;\n /** Range end date (YYYY-MM-DD). */\n until: string;\n };\n result: { spend: number; currency: string; impressions: number; clicks: number };\n };\n /** List campaigns on an ad account via the Meta Graph API (read-only); dailyBudget is converted from Meta's minor-unit reporting. */\n listCampaigns: {\n params: {\n /** Ad account id (with or without the `act_` prefix); defaults to META_AD_ACCOUNT_ID. */\n accountId?: string;\n /** Filter by campaign effective_status (e.g. 'ACTIVE', 'PAUSED'). */\n status?: string;\n };\n result: { campaigns: Array<{ id: string; name: string; status: string; dailyBudget: number }> };\n };\n};\n\n// ============================================================================\n// Accounting (generic export — provider-pluggable, CSV first)\n// ============================================================================\n\nexport type AccountingActions = {\n /** Shape invoice rows into an import-ready CSV export (no accounting-vendor connection — generic column set). */\n exportInvoices: {\n params: {\n /** Invoice rows to export, in column order id/number/customer/issuedAt/dueAt/currency/net/tax/gross/status. */\n invoices: Array<{ id: string; number: string; customer: string; issuedAt: string; dueAt: string; currency: string; net: number; tax: number; gross: number; status: string }>;\n /** Export format; only 'csv' is currently supported. */\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n /** Shape journal entry rows into an import-ready CSV export. */\n exportJournal: {\n params: {\n /** Journal entry rows to export, in column order date/account/description/debit/credit/reference. */\n entries: Array<{ date: string; account: string; description: string; debit: number; credit: number; reference: string }>;\n /** Export format; only 'csv' is currently supported. */\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n};\n\n// ============================================================================\n// Banking (GoCardless Bank Account Data)\n// ============================================================================\n\nexport type BankingActions = {\n /** Start a GoCardless Bank Account Data requisition (bank-connection consent flow); the returned `link` is where the end user authorizes access. */\n createRequisition: {\n params: {\n /** GoCardless institution id (the bank to connect). */\n institutionId: string;\n /** URL GoCardless redirects the user to after consent. */\n redirectUrl: string;\n /** Caller-chosen reference to correlate the requisition. */\n reference?: string;\n };\n result: { requisitionId: string; link: string };\n };\n /** List account ids linked under a completed requisition. */\n listAccounts: {\n params: {\n /** Requisition id from createRequisition. */\n requisitionId: string;\n };\n result: { accounts: string[] };\n };\n /** List booked transactions on a linked bank account, optionally filtered by date range. */\n listTransactions: {\n params: {\n /** GoCardless account id. */\n accountId: string;\n /** Only transactions booked on/after this date (YYYY-MM-DD). */\n dateFrom?: string;\n /** Only transactions booked on/before this date (YYYY-MM-DD). */\n dateTo?: string;\n };\n result: {\n transactions: Array<{ id: string; amount: number; currency: string; date: string; description: string; counterparty: string }>;\n };\n };\n};\n\n// ============================================================================\n// E-sign (pluggable, DocuSign first)\n// ============================================================================\n\nexport type EsignActions = {\n /** Send a document for e-signature via DocuSign; accepts the document content as a data URL or raw base64. */\n sendEnvelope: {\n params: {\n /** Signer's email address. */\n recipientEmail: string;\n /** Signer's display name. */\n recipientName: string;\n /** Document file name (its extension also picks the DocuSign fileExtension). */\n documentName: string;\n /** Document content as a base64 data URL or raw base64. */\n documentContent: string;\n /** Envelope email subject; defaults to \"Please sign: \" + documentName. */\n emailSubject?: string;\n };\n result: { envelopeId: string; status: string };\n };\n /** Poll a DocuSign envelope's signing status. */\n getEnvelopeStatus: {\n params: {\n /** DocuSign envelope id from sendEnvelope. */\n envelopeId: string;\n };\n result: { status: string; completedAt: string };\n };\n /** Download the combined signed document(s) for a completed envelope, base64-encoded PDF. */\n downloadDocument: {\n params: {\n /** DocuSign envelope id. */\n envelopeId: string;\n };\n result: { content: string; documentName: string };\n };\n};\n\n// ============================================================================\n// Docker\n// ============================================================================\n\nexport type DockerActions = {\n /** Simulate building a container image (in-memory backend — no real Docker daemon/SDK; a real build is not yet implemented). */\n build: {\n params: {\n /** Image tag to build, e.g. myapp:latest. */\n tag: string;\n /** Dockerfile path; defaults to 'Dockerfile'. */\n dockerfile?: string;\n /** Build context directory; defaults to '.'. */\n context?: string;\n /** Build-time --build-arg values. */\n buildArgs?: Record<string, string>;\n };\n result: { imageId: string; tag: string; size: number; buildTime: number };\n };\n /** Simulate starting a container from an image (in-memory backend). */\n run: {\n params: {\n /** Image to run (as built/tagged by the `build` action, or an arbitrary name). */\n image: string;\n /** Container name; auto-generated when omitted. */\n name?: string;\n /** Host/container port mappings. */\n ports?: Array<{ host: number; container: number; protocol?: string }>;\n /** Environment variables set inside the container. */\n env?: Record<string, string>;\n /** Host/container path mounts. */\n volumes?: Array<{ host: string; container: string }>;\n /** Override command run inside the container. */\n command?: string;\n };\n result: {\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n };\n };\n /** Stop a running (or paused) simulated container. */\n stop: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n };\n result: { containerId: string; status: string; stoppedAt: number };\n };\n /** Remove a simulated container; fails if it is running unless `force` is set. */\n remove: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n /** Remove even if the container is currently running. */\n force?: boolean;\n };\n result: { containerId: string; removed: boolean };\n };\n /** Fetch generated log lines for a simulated container. */\n logs: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n /** Number of most-recent lines to return; defaults to 100. */\n tail?: number;\n /** Only lines timestamped at/after this ISO time. */\n since?: string;\n };\n result: { containerId: string; logs: string[]; lineCount: number };\n };\n /** Fetch a simulated container's current status and metadata. */\n status: {\n params: {\n /** Container id, or a unique id prefix. */\n containerId: string;\n };\n result: {\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n };\n };\n /** List simulated containers; by default only running ones (like `docker ps`). */\n list: {\n params: {\n /** Include stopped/exited containers, not just running ones. */\n all?: boolean;\n /** Filter by a `key` or `key=value` label match. */\n filterByLabel?: string;\n };\n result: {\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n };\n };\n};\n\n// ============================================================================\n// Storage\n// ============================================================================\n\nexport type StorageActions = {\n /**\n * Upload an object to an S3-compatible bucket (real S3/R2/MinIO backend when storage credentials are configured, in-memory dev fallback otherwise — refused in production). Admits either the canonical `key`+`content` pair or the file-form `file` payload (UploadDropZone's `{ name, size, type, content }` shape); when `file` is present its `key`/`content` are derived from it.\n * @synonyms upload file, upload object\n */\n upload: {\n params: {\n /** Target bucket; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key to store under (canonical shape); ignored when `file` is present. */\n key?: string;\n /** Object content as a base64 data URL, raw base64, or plain text (canonical shape); ignored when `file` is present. */\n content?: string;\n /** MIME type override for the canonical shape; inferred from a data URL when omitted. */\n contentType?: string;\n /** File-form upload payload (as emitted by UploadDropZone); `content` is a base64 data URL. */\n file?: { name: string; size: number; type: string; content?: string };\n /** Object ACL — 'public' produces a public URL, otherwise the URL is signed/private. */\n acl?: 'public' | 'private';\n /** Reject the upload if the file-form payload's declared size exceeds this many bytes. */\n maxSize?: number;\n /** Object metadata stored alongside the content (S3-compatible object stores carry metadata as string headers — never structured values). */\n metadata?: Record<string, string>;\n };\n result: { key: string; bucket: string; size: number; etag: string; id: string; url: string };\n };\n /** Upload a whole UploadDropZone batch in one call, one item per file — the FSM-friendly shape for bulk-persisting uploaded-file rows. */\n uploadMany: {\n params: {\n /** Target bucket; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Files to upload, in UploadDropZone's `{ name, size, type, content }` shape. */\n files: Array<{ name: string; size: number; type: string; content?: string }>;\n /** Object ACL applied to every file in the batch. */\n acl?: 'public' | 'private';\n /** Reject any file whose declared size exceeds this many bytes. */\n maxSize?: number;\n };\n result: {\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n };\n };\n /** Download an object's content, base64-encoded. */\n download: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key. */\n key: string;\n };\n result: { content: string; contentType: string; size: number; metadata: Record<string, string> };\n };\n /** List object keys in a bucket, optionally prefix-filtered, one page at a time. */\n list: {\n params: {\n /** Bucket to list; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Only keys starting with this prefix. */\n prefix?: string;\n /** Maximum keys per page; defaults to 1000. */\n maxKeys?: number;\n /** Pagination token from a previous call's `nextToken`. */\n continuationToken?: string;\n };\n result: {\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n /** Present iff `truncated` — pass back as `continuationToken` for the next page. */\n nextToken?: string;\n };\n };\n /** Delete an object from a bucket. */\n delete: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key to delete. */\n key: string;\n };\n result: { deleted: boolean };\n };\n /** Generate a time-limited pre-signed URL for direct GET or PUT access to an object. */\n getSignedUrl: {\n params: {\n /** Bucket the object lives in; defaults to STORAGE_BUCKET. */\n bucket: string;\n /** Object key. */\n key: string;\n /** URL validity window in seconds; defaults to 3600. */\n expiresIn?: number;\n /** Whether the URL authorizes a read or a write; defaults to 'get'. */\n operation?: 'get' | 'put';\n };\n result: { url: string; expiresAt: number };\n };\n};\n\n// ============================================================================\n// Queue\n// ============================================================================\n\n/** A queued job as stored/returned by the in-memory queue. Extends\n * `EventPayload` so it flows through a `ServiceAction.result` (bus-payload-\n * shaped) without a boundary cast, the same reason `JsonSchemaDefinition`\n * extends `ServiceParams` above. */\ninterface QueueJob extends EventPayload {\n id: string;\n /** Whatever `enqueue` was given — the caller declares its own shape.\n * @shapedBy payload */\n payload: ServiceParams;\n enqueuedAt: number;\n priority: number;\n}\n\nexport type QueueActions = {\n /** Add a job to an in-memory job queue, ordered by priority (higher first) among ready jobs. */\n enqueue: {\n params: {\n /** Queue name. */\n queue: string;\n /** Job payload — the caller declares its own shape.\n * @shapedBy payload */\n payload: ServiceParams;\n /** Delay before the job becomes eligible for dequeue, in milliseconds. */\n delay?: number;\n /** Priority — higher values are dequeued before lower ones. */\n priority?: number;\n };\n result: { jobId: string; position: number };\n };\n /** Pop the highest-priority pending job whose delay has elapsed, marking it 'processing'; returns null if none is ready. */\n dequeue: {\n params: {\n /** Queue name. */\n queue: string;\n };\n result: { job: QueueJob | null };\n };\n /** Look up a job's current status by id. */\n status: {\n params: {\n /** Job id from enqueue. */\n jobId: string;\n };\n result: {\n status: 'pending' | 'processing' | 'completed' | 'failed';\n job: QueueJob | null;\n };\n };\n /** Mark a 'processing' job completed and store its result; no-op (returns false) if the job isn't in 'processing' state. */\n complete: {\n params: {\n /** Job id. */\n jobId: string;\n /** Result payload to attach to the job — the caller declares its own shape (not necessarily the same shape as the job's `payload`).\n * @shapedBy result */\n result?: ServiceParams;\n };\n result: { completed: boolean };\n };\n /** Mark a 'processing' job failed; no-op (returns false) if the job isn't in 'processing' state. */\n fail: {\n params: {\n /** Job id. */\n jobId: string;\n /** Failure reason to attach to the job. */\n error?: string;\n };\n result: { failed: boolean };\n };\n /** Remove a 'pending' job from its queue; no-op (returns false) once it has been dequeued. */\n cancel: {\n params: {\n /** Job id. */\n jobId: string;\n };\n result: { cancelled: boolean };\n };\n /** Count pending and processing jobs in a queue. */\n size: {\n params: {\n /** Queue name. */\n queue: string;\n };\n result: { size: number; pending: number; processing: number };\n };\n};\n\n// ============================================================================\n// Redis\n// ============================================================================\n\nexport type RedisActions = {\n /** Read a key's value from the in-memory cache; returns null (as `value`) if absent or expired. */\n get: {\n params: {\n /** Cache key. */\n key: string;\n };\n result: {\n /** Whatever `set` stored under this key — the caller declares its shape.\n * @shapedBy value */\n value: ServiceParams;\n };\n };\n /** Write a key's value, optionally with an expiry. */\n set: {\n params: {\n /** Cache key. */\n key: string;\n /** Value to store — the caller declares its own shape.\n * @shapedBy value */\n value: ServiceParams;\n /** Time-to-live in seconds; omit for no expiry. */\n ttl?: number;\n };\n result: { ok: boolean };\n };\n /** Delete a key. */\n delete: {\n params: {\n /** Cache key. */\n key: string;\n };\n result: { deleted: boolean };\n };\n /** Acquire a mutex on a key; fails (returns acquired:false) if another lock on the key is still alive. */\n lock: {\n params: {\n /** Lock key. */\n key: string;\n /** Lock time-to-live in milliseconds; defaults to 30000 (30s). */\n ttl?: number;\n };\n result: { acquired: boolean; lockId: string };\n };\n /** Release a lock; only succeeds when `lockId` matches the current holder. */\n unlock: {\n params: {\n /** Lock key. */\n key: string;\n /** Lock id returned by the corresponding `lock` call. */\n lockId: string;\n };\n result: { released: boolean };\n };\n /** Atomically add to a numeric key's value (creating it at 0 if absent), preserving any existing TTL. */\n increment: {\n params: {\n /** Cache key. */\n key: string;\n /** Amount to add; defaults to 1 (can be negative to decrement). */\n by?: number;\n };\n result: { value: number };\n };\n /** Set (or reset) a key's expiry; no-op (returns set:false) if the key doesn't exist or is already expired. */\n expire: {\n params: {\n /** Cache key. */\n key: string;\n /** New time-to-live in seconds. */\n ttl: number;\n };\n result: { set: boolean };\n };\n /** Publish a message to a channel; delivered synchronously to in-process subscriber callbacks only. */\n publish: {\n params: {\n /** Channel name. */\n channel: string;\n /** Message payload — the caller declares its own shape.\n * @shapedBy message */\n message: ServiceParams;\n };\n result: { receivers: number };\n };\n /** Register interest in a channel; does not itself wire a callback (that happens at a higher-level API). */\n subscribe: {\n params: {\n /** Channel name. */\n channel: string;\n };\n result: { subscribed: boolean };\n };\n};\n\n// ============================================================================\n// OAuth\n// ============================================================================\n\nexport type OAuthActions = {\n /** Build the provider authorization URL (PKCE + state) for an OAuth/OIDC login redirect; real OIDC discovery when OAUTH_CLIENT_ID/SECRET are configured, an in-memory mock otherwise. */\n authorize: {\n params: {\n /** Identity provider; OIDC issuer defaults to Google unless OIDC_ISSUER_URL overrides it. */\n provider: 'google' | 'github' | 'auth0';\n /** OAuth scopes to request. */\n scopes: string[];\n /** Callback URL the provider redirects back to after consent. */\n redirectUri: string;\n };\n result: { authUrl: string; state: string };\n };\n /** Exchange an authorization code for tokens, consuming the one-time-use `state` from the matching `authorize` call. */\n token: {\n params: {\n /** Authorization code from the provider's redirect callback. */\n code: string;\n /** The `state` value returned by `authorize`. */\n state: string;\n };\n result: { accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' };\n };\n /** Exchange a refresh token for a new access token. */\n refresh: {\n params: {\n /** Refresh token from a prior `token` call. */\n refreshToken: string;\n };\n result: { accessToken: string; expiresIn: number };\n };\n /** Revoke an access or refresh token. */\n revoke: {\n params: {\n /** The access or refresh token to revoke. */\n token: string;\n };\n result: { revoked: boolean };\n };\n /** Fetch the authenticated user's profile claims for an access token. */\n userinfo: {\n params: {\n /** Access token from a prior `token`/`refresh` call. */\n accessToken: string;\n };\n result: { sub: string; email: string; name: string; picture: string };\n };\n};\n\n// ============================================================================\n// Credentials (hosted tenant credential store — the settings-page backend)\n// ============================================================================\n\nexport type CredentialsActions = {\n /** List declared credentials and their masked (last-4) configuration status; open to any caller. */\n list: {\n params: {\n /** Restrict the listing to one service's declared credentials; omit for all services. */\n service?: string;\n };\n result: {\n enabled: boolean;\n entries: Array<{\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n }>;\n };\n };\n /** Save a credential value into the hosted store; the env var must be one declared for the service (or a well-formed connection-ref name for `database`). Admin/owner role required. */\n set: {\n params: {\n /** Integration name the credential belongs to. */\n service: string;\n /** Declared env-var name being set. */\n envVar: string;\n /** Secret value to store; never logged. */\n value: string;\n };\n result: { saved: boolean; service: string; envVar: string; last4: string };\n };\n /** Delete a stored credential from the hosted store. Admin/owner role required. */\n remove: {\n params: {\n /** Integration name the credential belongs to. */\n service: string;\n /** Env-var name to remove. */\n envVar: string;\n };\n result: { removed: boolean };\n };\n /** Check whether a service's required credentials are present and, if a live probe is declared for it, exercise the service to confirm they actually work. Admin/owner role required. */\n test: {\n params: {\n /** Integration name to test. */\n service: string;\n };\n result: { service: string; configured: boolean; missing: string[]; probed: boolean; ok: boolean; message: string };\n };\n /** Re-encrypt all stored credentials under the current master key (ALMADAR_CREDENTIAL_MASTER_KEY), retiring ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS. Admin/owner role required. */\n rotate: {\n params: Record<string, never>;\n result: {\n /** Entries successfully re-encrypted under the current key. */\n rotated: number;\n /** Entries already under the current key (no-op). */\n alreadyCurrent: number;\n /** Entries that could not be decrypted with either key (data loss risk). */\n unreadable: number;\n };\n };\n};\n\n// ============================================================================\n// OpenTelemetry\n// ============================================================================\n\nexport type OtelActions = {\n /** Start a trace span (in-memory backend — no OpenTelemetry SDK/exporter). */\n startSpan: {\n params: {\n /** Span name. */\n name: string;\n /** Key-value attributes attached to the span (OTel attribute values are scalar). */\n attributes?: Record<string, string | number | boolean>;\n /** Existing trace id to attach this span to; a new one is generated when omitted. */\n traceId?: string;\n };\n result: { spanId: string; traceId: string };\n };\n /** Mark a span ended, optionally recording its final status; no-op (returns ended:false) for an unknown span id. */\n endSpan: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n /** Final span status. */\n status?: 'ok' | 'error';\n };\n result: { ended: boolean };\n };\n /** Attach a timestamped event to an open span; no-op (returns added:false) for an unknown span id. */\n addEvent: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n /** Event name. */\n name: string;\n /** Key-value attributes attached to the event (OTel attribute values are scalar). */\n attributes?: Record<string, string | number | boolean>;\n };\n result: { added: boolean };\n };\n /** Record a metric sample: counters accumulate, gauges overwrite, histograms append to the sample list. */\n recordMetric: {\n params: {\n /** Metric name. */\n name: string;\n /** Sample value. */\n value: number;\n /** Aggregation kind; defaults to 'counter'. */\n type?: 'counter' | 'gauge' | 'histogram';\n /** Key-value labels attached to the metric (replaces prior labels on the same name; OTel label values are scalar). */\n labels?: Record<string, string | number | boolean>;\n };\n result: { recorded: boolean };\n };\n /** Fetch a stored span's full record by id; null if unknown. */\n getSpan: {\n params: {\n /** Span id from startSpan. */\n spanId: string;\n };\n result: {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n } | null;\n };\n /** Fetch all recorded metrics, keyed by metric name. */\n getMetrics: {\n params: Record<string, never>;\n result: Record<string, { name: string; type: string; value: number; values: number[]; labels: IntegrationParams }>;\n };\n};\n\n// ============================================================================\n// CLI\n// ============================================================================\n\nexport type CLIActions = {\n /** Validate an orbital schema by writing it to a temp file and shelling out to `npx @almadar/cli validate --format=json`. */\n validate: {\n params: {\n /** Raw .orb schema content to validate. */\n schema: string;\n };\n result: { valid: boolean; errors: string[]; warnings: string[]; summary: string };\n };\n};\n\n// ============================================================================\n// DeepAgent\n// ============================================================================\n\nexport type DeepAgentActions = {\n /** Send a chat message to the DeepAgent server (POST /api/agent/message), continuing an existing thread or starting one. */\n sendMessage: {\n params: {\n /** Message text. */\n message: string;\n /** Existing thread id to continue; a new thread starts when omitted. */\n threadId?: string;\n /** Named skill to invoke for this message. */\n skill?: string;\n /** Extra context passed through to the agent — the caller declares its own shape.\n * @shapedBy context */\n context?: IntegrationParams;\n };\n result: { response: string; threadId: string };\n };\n /** Cancel an in-flight generation on a DeepAgent thread (POST /api/agent/cancel). */\n cancelGeneration: {\n params: {\n /** Thread whose generation to cancel. */\n threadId: string;\n };\n result: { cancelled: boolean };\n };\n /** Validate a schema via the DeepAgent server (POST /api/schema/validate). */\n validateSchema: {\n params: {\n /** Schema content to validate. */\n schema: string;\n };\n result: { valid: boolean; errors: string[] };\n };\n /** Compile a schema to a target shell via the DeepAgent server (POST /api/schema/compile). */\n compileSchema: {\n params: {\n /** Schema content to compile. */\n schema: string;\n /** Target codegen shell (e.g. 'typescript'). */\n shell?: string;\n };\n result: { output: string; files: string[] };\n };\n /** Fetch a thread's message history via the DeepAgent server (POST /api/agent/history). */\n getThreadHistory: {\n params: {\n /** Thread id. */\n threadId: string;\n };\n result: { messages: Array<{ role: string; content: string; timestamp: number }> };\n };\n};\n\n// ============================================================================\n// Database\n// ============================================================================\n\nexport type DatabaseActions = {\n /** Run a single read-only SELECT against a Postgres connection (write statements and multi-statement SQL are rejected before execution). */\n query: {\n params: {\n /** Env-var NAME whose value is the Postgres connection string — never the secret itself; resolved from the credential store/environment at run time. */\n connectionRef: string;\n /** SQL text; must be exactly one SELECT statement. */\n sql: string;\n /** Positional bind parameters for the query. */\n params?: DatabaseQueryParamValue[];\n };\n result: {\n /** One row per matched record, keyed by column name — the shape follows\n * the caller's own `sql` SELECT list, which no param's TYPE can express.\n * @shapedBy rows */\n rows: DatabaseRow[];\n rowCount: number;\n };\n };\n};\n\n// ============================================================================\n// Wikimedia\n// ============================================================================\n\nexport type WikimediaActions = {\n /** Look up a Wikipedia page (redirect-resolved): a one-line description, a Commons thumbnail, and the lead-section extract; empty fields on a miss. */\n getPage: {\n params: {\n /** Page title to look up. */\n title: string;\n };\n result: { title?: string; description?: string; portraitUrl?: string; extract?: string };\n };\n};\n\n// ============================================================================\n// Iconify\n// ============================================================================\n\nexport type IconifyActions = {\n /** Check whether an icon exists at the given Iconify API path (a GET, not a HEAD, despite the name). */\n svgExists: {\n params: {\n /** Iconify API path segment to probe, e.g. 'prefix/name.svg'. */\n path: string;\n };\n result: { exists: boolean };\n };\n /** Search Iconify's icon sets by relevance. */\n search: {\n params: {\n /** Search query text. */\n query: string;\n /** Maximum icon ids to return; defaults to 1. */\n limit?: number;\n };\n result: { icons: string[] };\n };\n /** Fetch an icon's raw SVG body (for color-tone classification); null if the icon or its collection isn't found. */\n getIconBody: {\n params: {\n /** Icon id in \"prefix:name\" form. */\n iconId: string;\n };\n result: { body: string | null };\n };\n};\n\n// ============================================================================\n// arXiv\n// ============================================================================\n\nexport type ArxivActions = {\n /** Search arXiv's public Atom API by relevance. */\n search: {\n params: {\n /** Search query text (matched across all fields). */\n query: string;\n /** Maximum results to return; defaults to 8. */\n maxResults?: number;\n };\n result: { results: Array<{ id: string; title: string; summary: string; authors: string[]; published: string; url: string }> };\n };\n};\n\n// ============================================================================\n// Rigger\n// ============================================================================\n\nexport type RiggerActions = {\n /** Liveness probe of the local rigger service. */\n health: {\n params: Record<string, never>;\n result: { ok: boolean };\n };\n /** Build a rigged mesh bundle from a source image via the local rigger service. */\n buildMesh: {\n params: {\n /** Path to the source image. */\n imagePath: string;\n /** Rig type to build (e.g. 'humanoid', 'quadruped'). */\n rig: string;\n };\n result: { bundlePath: string; boneCount: number; vertexCount: number; triangleCount: number; clips: string[] };\n };\n /** Render a rigged mesh bundle to output files via the local rigger service. */\n render: {\n params: {\n /** Path to the source image. */\n imagePath: string;\n /** Rig type. */\n rig: string;\n /** Render preset name. */\n preset: string;\n /** Output directory for rendered files. */\n outDir: string;\n };\n result: Record<string, string>;\n };\n};\n\n// ============================================================================\n// Barrel: IntegrationContracts\n// ============================================================================\n\n/**\n * Maps each integration name (as used in `registerIntegration`) to its action\n * map type. Use with `ServiceContract<IntegrationContracts[K]>` to get a fully\n * typed service interface for a specific integration.\n *\n * @example\n * ```typescript\n * import type { ServiceContract } from '@almadar/core';\n * import type { IntegrationContracts } from '@almadar/integrations';\n *\n * type TypedStripe = ServiceContract<IntegrationContracts['stripe']>;\n * ```\n */\nexport type IntegrationContracts = {\n github: GitHubActions;\n stripe: StripeActions;\n llm: LLMIntegrationActions;\n ml: MLActions;\n youtube: YouTubeActions;\n twilio: TwilioActions;\n email: EmailActions;\n webhook: WebhookActions;\n push: PushActions;\n calendar: CalendarActions;\n drive: DriveActions;\n metaAds: MetaAdsActions;\n accounting: AccountingActions;\n banking: BankingActions;\n esign: EsignActions;\n docker: DockerActions;\n storage: StorageActions;\n queue: QueueActions;\n redis: RedisActions;\n oauth: OAuthActions;\n credentials: CredentialsActions;\n otel: OtelActions;\n cli: CLIActions;\n deepagent: DeepAgentActions;\n database: DatabaseActions;\n wikimedia: WikimediaActions;\n iconify: IconifyActions;\n arxiv: ArxivActions;\n rigger: RiggerActions;\n};\n\n/** Integration name literal union. */\nexport type IntegrationName = keyof IntegrationContracts;\n\n/**\n * Helper: extract the action names for a given integration.\n *\n * @example\n * ```typescript\n * type StripeAction = IntegrationActionName<'stripe'>;\n * // => 'createPaymentIntent' | 'confirmPayment' | 'refund'\n * ```\n */\nexport type IntegrationActionName<K extends IntegrationName> =\n keyof IntegrationContracts[K] & string;\n\n// ============================================================================\n// Event Map\n// ============================================================================\n\n/** Events emitted by integrations during execution. */\nexport type IntegrationEventMap = {\n INTEGRATION_CALL_STARTED: { integration: string; action: string; timestamp: number };\n INTEGRATION_CALL_SUCCEEDED: { integration: string; action: string; durationMs: number };\n INTEGRATION_CALL_FAILED: { integration: string; action: string; error: string; retryCount: number };\n INTEGRATION_RETRY: { integration: string; action: string; attempt: number; maxRetries: number };\n INTEGRATION_REGISTERED: { integration: string; actions: string[] };\n};\n\n/** Typed event emitter for integration events. */\nexport type IntegrationServiceEvents = ServiceEvents<IntegrationEventMap>;\n\n// ============================================================================\n// Type Assertions\n// ============================================================================\n\n// Compile-time verification that all action maps satisfy Record<string, ServiceAction>.\n// This is a type-level assertion, not runtime code.\ntype _AssertActions<T extends Record<string, ServiceAction>> = T;\ntype _CheckGitHub = _AssertActions<GitHubActions>;\ntype _CheckStripe = _AssertActions<StripeActions>;\ntype _CheckLLM = _AssertActions<LLMIntegrationActions>;\ntype _CheckML = _AssertActions<MLActions>;\ntype _CheckYouTube = _AssertActions<YouTubeActions>;\ntype _CheckTwilio = _AssertActions<TwilioActions>;\ntype _CheckEmail = _AssertActions<EmailActions>;\ntype _CheckWebhook = _AssertActions<WebhookActions>;\ntype _CheckPush = _AssertActions<PushActions>;\ntype _CheckCalendar = _AssertActions<CalendarActions>;\ntype _CheckDrive = _AssertActions<DriveActions>;\ntype _CheckMetaAds = _AssertActions<MetaAdsActions>;\ntype _CheckAccounting = _AssertActions<AccountingActions>;\ntype _CheckBanking = _AssertActions<BankingActions>;\ntype _CheckEsign = _AssertActions<EsignActions>;\ntype _CheckDocker = _AssertActions<DockerActions>;\ntype _CheckStorage = _AssertActions<StorageActions>;\ntype _CheckQueue = _AssertActions<QueueActions>;\ntype _CheckRedis = _AssertActions<RedisActions>;\ntype _CheckOAuth = _AssertActions<OAuthActions>;\ntype _CheckCredentials = _AssertActions<CredentialsActions>;\ntype _CheckOtel = _AssertActions<OtelActions>;\ntype _CheckCLI = _AssertActions<CLIActions>;\ntype _CheckDeepAgent = _AssertActions<DeepAgentActions>;\ntype _CheckDatabase = _AssertActions<DatabaseActions>;\ntype _CheckWikimedia = _AssertActions<WikimediaActions>;\ntype _CheckIconify = _AssertActions<IconifyActions>;\ntype _CheckArxiv = _AssertActions<ArxivActions>;\n\n// ============================================================================\n// Credential Declarations\n// ============================================================================\n\n/** A credential (environment variable) required by an integration. */\nexport interface CredentialDeclaration {\n envVar: string;\n required: boolean;\n description: string;\n}\n\n/**\n * Credential declarations for all integrations.\n *\n * This is the single source of truth for what env vars each service needs.\n * Consumed by:\n * - almadar-service-sync (extracts into services-registry.json)\n * - @almadar-io/terraform (provisions Secret Manager resources)\n * - RuntimeIntegrationManager (validates env configuration)\n */\nexport const serviceCredentials: Record<string, CredentialDeclaration[]> = {\n stripe: [\n { envVar: 'STRIPE_SECRET_KEY', required: true, description: 'Stripe secret API key' },\n { envVar: 'STRIPE_WEBHOOK_SECRET', required: false, description: 'Webhook endpoint signing secret' },\n ],\n youtube: [\n { envVar: 'YOUTUBE_API_KEY', required: true, description: 'YouTube Data API key' },\n ],\n twilio: [\n { envVar: 'TWILIO_ACCOUNT_SID', required: true, description: 'Twilio account SID' },\n { envVar: 'TWILIO_AUTH_TOKEN', required: true, description: 'Twilio auth token' },\n { envVar: 'TWILIO_PHONE_NUMBER', required: false, description: 'Default sender phone number' },\n ],\n email: [\n { envVar: 'SENDGRID_API_KEY', required: false, description: 'SendGrid API key (use this OR RESEND_API_KEY)' },\n { envVar: 'RESEND_API_KEY', required: false, description: 'Resend API key (use this OR SENDGRID_API_KEY)' },\n { envVar: 'FROM_EMAIL', required: false, description: 'Default sender email address' },\n ],\n webhook: [\n { envVar: 'WEBHOOK_SIGNING_SECRET', required: false, description: 'Default HMAC-SHA256 signing secret (per-call secret overrides)' },\n { envVar: 'WEBHOOK_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms, default 10000)' },\n ],\n push: [\n { envVar: 'VAPID_PUBLIC_KEY', required: true, description: 'VAPID public key (web-push generate-vapid-keys)' },\n { envVar: 'VAPID_PRIVATE_KEY', required: true, description: 'VAPID private key' },\n { envVar: 'VAPID_SUBJECT', required: true, description: 'VAPID subject (mailto: or https: contact URI)' },\n ],\n calendar: [\n { envVar: 'GOOGLE_CALENDAR_SA_KEY', required: true, description: 'Google service-account key JSON (raw or base64) with calendar scope; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_CALENDAR_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_CALENDAR_ID', required: false, description: 'Default calendar id (default: primary)' },\n { envVar: 'GOOGLE_CALENDAR_CHANNEL_TOKEN', required: false, description: 'Watch-channel verification token — required to receive inbound calendar hooks (two-way sync)' },\n ],\n drive: [\n { envVar: 'GOOGLE_DRIVE_SA_KEY', required: false, description: 'Google service-account key JSON (raw or base64) with drive scope — serves reads; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_DRIVE_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_DRIVE_REFRESH_TOKEN', required: false, description: 'User OAuth refresh token (drive-consent.mjs) — serves writes; SA uploads are impossible on personal accounts (no SA storage quota)' },\n { envVar: 'GOOGLE_DRIVE_FOLDER_ID', required: false, description: 'Default parent folder for uploads/new folders when the call names none' },\n ],\n metaAds: [\n { envVar: 'META_ACCESS_TOKEN', required: true, description: 'Meta Graph API access token (Marketing API, ads_read)' },\n { envVar: 'META_AD_ACCOUNT_ID', required: false, description: 'Default ad account id (act_…); per-call accountId overrides' },\n ],\n accounting: [],\n banking: [\n { envVar: 'GOCARDLESS_SECRET_ID', required: true, description: 'GoCardless Bank Account Data secret id' },\n { envVar: 'GOCARDLESS_SECRET_KEY', required: true, description: 'GoCardless Bank Account Data secret key' },\n ],\n esign: [\n { envVar: 'DOCUSIGN_BASE_URL', required: true, description: 'DocuSign REST base (e.g. https://demo.docusign.net/restapi/v2.1/accounts/<accountId>)' },\n { envVar: 'DOCUSIGN_ACCESS_TOKEN', required: true, description: 'DocuSign OAuth access token (JWT grant rotation is the deployment concern)' },\n ],\n llm: [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key (use this OR OPENAI_API_KEY)' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key (use this OR ANTHROPIC_API_KEY)' },\n ],\n 'llm-integration': [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key' },\n ],\n ml: [\n { envVar: 'MASAR_URL', required: true, description: 'Base URL of the deployed model-serving orbital' },\n { envVar: 'MASAR_ML_TRAIT', required: true, description: 'Kebab-case trait name the serving orbital exposes its /events route under' },\n ],\n deepagent: [\n { envVar: 'DEEPAGENT_API_URL', required: true, description: 'DeepAgent server URL' },\n { envVar: 'DEEPAGENT_API_KEY', required: false, description: 'DeepAgent API key' },\n ],\n github: [\n { envVar: 'GITHUB_TOKEN', required: true, description: 'GitHub personal access token' },\n { envVar: 'GITHUB_OWNER', required: false, description: 'Default repository owner' },\n { envVar: 'GITHUB_REPO', required: false, description: 'Default repository name' },\n ],\n docker: [\n { envVar: 'DOCKER_HOST', required: false, description: 'Docker daemon host URL' },\n ],\n storage: [\n { envVar: 'STORAGE_ACCESS_KEY_ID', required: true, description: 'S3-compatible access key id' },\n { envVar: 'STORAGE_SECRET_ACCESS_KEY', required: true, description: 'S3-compatible secret access key' },\n { envVar: 'STORAGE_BUCKET', required: true, description: 'Default bucket name' },\n { envVar: 'STORAGE_REGION', required: false, description: 'Region (default us-east-1)' },\n { envVar: 'STORAGE_ENDPOINT', required: false, description: 'Custom S3-compatible endpoint (R2/MinIO/…); empty = AWS S3' },\n { envVar: 'STORAGE_PUBLIC_URL_BASE', required: false, description: 'Base URL for public-acl object links; empty = endpoint-derived' },\n ],\n queue: [\n { envVar: 'QUEUE_URL', required: true, description: 'Message queue connection URL' },\n ],\n redis: [\n { envVar: 'REDIS_URL', required: true, description: 'Redis connection URL' },\n ],\n oauth: [\n { envVar: 'OAUTH_CLIENT_ID', required: true, description: 'OIDC client ID' },\n { envVar: 'OAUTH_CLIENT_SECRET', required: true, description: 'OIDC client secret' },\n { envVar: 'OAUTH_REDIRECT_URI', required: false, description: 'OIDC redirect URI (default per-call param)' },\n { envVar: 'OIDC_ISSUER_URL', required: false, description: 'OIDC issuer URL (default https://accounts.google.com)' },\n ],\n credentials: [\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY', required: false, description: 'AES-256 master key (64-char hex) enabling the hosted credential store — hold it alone in the platform secret store' },\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS', required: false, description: 'Previous master key, present only during a rotation window — decrypts old rows until `credentials.rotate` re-encrypts them' },\n ],\n otel: [\n { envVar: 'OTEL_EXPORTER_OTLP_ENDPOINT', required: true, description: 'OpenTelemetry collector endpoint' },\n { envVar: 'OTEL_SERVICE_NAME', required: false, description: 'Service name for traces' },\n ],\n cli: [],\n // No fixed env vars — connection strings are resolved per-query from the\n // caller-supplied connectionRef, so credentials cannot be declared statically.\n database: [],\n wikimedia: [\n { envVar: 'WIKIMEDIA_USER_AGENT', required: false, description: 'Descriptive User-Agent for the Wikipedia API' },\n { envVar: 'WIKIMEDIA_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n iconify: [\n { envVar: 'ICONIFY_USER_AGENT', required: false, description: 'User-Agent for the Iconify API' },\n { envVar: 'ICONIFY_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n arxiv: [\n { envVar: 'ARXIV_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n rigger: [\n { envVar: 'RIGGER_BASE_URL', required: false, description: 'Local rigger service base URL (default http://127.0.0.1:8181)' },\n { envVar: 'RIGGER_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n};\n\n/**\n * Every env var name declared anywhere in `serviceCredentials` — provider\n * secrets and the credential-store's own bootstrap keys alike. The single\n * source a forked verify/harness process scrubs from its env so it can never\n * see, and therefore never spend, a real credential (regardless of which\n * integration mode the fork ends up in).\n */\nexport function allCredentialEnvVars(): Set<string> {\n const vars = new Set<string>();\n for (const decls of Object.values(serviceCredentials)) {\n for (const { envVar } of decls) vars.add(envVar);\n }\n return vars;\n}\n\n/**\n * Bootstrap secrets that must NEVER enter store custody: the master key(s)\n * decrypt the store itself, so seeding them as rows (encrypted under\n * themselves) or stripping them from the env would be circular.\n */\nexport const STORE_BOOTSTRAP_ENV_VARS = new Set([\n 'ALMADAR_CREDENTIAL_MASTER_KEY',\n 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS',\n]);\n\n/**\n * Every declared PROVIDER credential env var — `allCredentialEnvVars()` minus\n * the store's own bootstrap keys. The store-first custody set (I-31):\n * `RuntimeIntegrationManager` strips these from the base env before merging\n * the store's decrypted values, so every resolution flows the exact store →\n * env → unconfigured path a deployed client app uses.\n */\nexport function declaredCredentialEnvVars(): Set<string> {\n const vars = allCredentialEnvVars();\n for (const bootstrapVar of STORE_BOOTSTRAP_ENV_VARS) vars.delete(bootstrapVar);\n return vars;\n}\n\n/**\n * Declared side-effect-free \"Test connection\" probes, executed by the\n * `credentials.test` action through the normal factory path. Only services\n * with a genuinely cheap, read-only, env-defaulted action carry one; the\n * rest report credential presence + constructor validation.\n */\n/**\n * One inbound-hook mount a service's provider needs in a deployed app:\n * `POST /api/hooks/:provider` verified by the provider's own token/signature,\n * dispatching `event` onto the app bus. A hook is a PROVIDER property — the\n * service invocation is the `.lolo` surface; codegen derives the mount from\n * the app's invoked services × these declarations (I-26).\n */\nexport interface HookDeclaration {\n /** Provider key mounted at POST /api/hooks/:provider */\n provider: string;\n /** Bus event dispatched into the app on a verified callback */\n event: string;\n /** Env var carrying the provider's verification secret/channel token */\n credentialEnv: string;\n /** Factory export in @almadar/integrations: (secret?) => HookProvider */\n providerExport: string;\n}\n\n/**\n * Inbound-hook declarations per service — the single source the registry,\n * codegen, and the playground mount derive from.\n */\nexport const serviceHooks: Record<string, HookDeclaration[]> = {\n calendar: [\n {\n provider: 'google-calendar',\n event: 'CAL_REMOTE_CHANGED',\n credentialEnv: 'GOOGLE_CALENDAR_CHANNEL_TOKEN',\n providerExport: 'googleCalendarHookProvider',\n },\n ],\n};\n\nexport const serviceProbes: Partial<Record<IntegrationName, { action: string; params: ServiceParams }>> = {\n calendar: { action: 'listEvents', params: { maxResults: 1 } },\n drive: { action: 'listFiles', params: { maxResults: 1 } },\n metaAds: { action: 'listCampaigns', params: {} },\n};\n\n/** Backend maturity grade of an integration implementation. */\nexport type IntegrationBackendGrade = 'production' | 'simulated' | 'stub';\n\n/**\n * Honest backend grade per integration — 'simulated' marks an in-memory\n * implementation that must never be mistaken for a real backend. Synced into\n * services-registry.json (`backend`) by `almadar-sync services` and surfaced\n * by the verify service manifest and /health.\n */\nexport const serviceBackends: Record<IntegrationName, IntegrationBackendGrade> = {\n github: 'production',\n stripe: 'production',\n llm: 'production',\n ml: 'production',\n youtube: 'production',\n twilio: 'production',\n email: 'production',\n webhook: 'production',\n push: 'production',\n calendar: 'production',\n drive: 'production',\n metaAds: 'production',\n accounting: 'production',\n banking: 'production',\n esign: 'production',\n docker: 'simulated',\n storage: 'production',\n queue: 'simulated',\n redis: 'simulated',\n oauth: 'production',\n credentials: 'production',\n otel: 'simulated',\n cli: 'production',\n deepagent: 'production',\n database: 'production',\n wikimedia: 'production',\n iconify: 'production',\n arxiv: 'production',\n rigger: 'production',\n};\n","import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/** Envelope keys owned by the call-service form, never action params. */\nconst RESERVED_ENVELOPE_KEYS = new Set(['emit', 'onSuccess', 'onError', 'timeout']);\n\n/** Thrown by an integration's dispatch default/miss arm — contract↔dispatch parity marker. */\nexport class UnknownActionError extends Error {\n integration: string;\n action: string;\n\n constructor(integration: string, action: string) {\n super(`Unknown ${integration} action: ${action}`);\n this.name = 'UnknownActionError';\n this.integration = integration;\n this.action = action;\n }\n}\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Unknown-key check (I-13 runtime parity with orb validate): a param the\n // contract does not declare is an error, not a silent drop. Envelope keys\n // belong to the call-service form itself, never to the action contract.\n const declaredNames = new Set(actionDef.params.map((p: ActionParam) => p.name));\n for (const key of Object.keys(params)) {\n if (RESERVED_ENVELOPE_KEYS.has(key)) continue;\n if (!declaredNames.has(key)) {\n errors.push({\n param: key,\n message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(', ')})`,\n });\n }\n }\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\nimport type { IntegrationCallContext } from '../factory';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action. `context` carries the caller's identity when the host\n * supplies one; integrations that gate actions by role read it and fail\n * closed when it is absent.\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","import type { IntegrationConfig } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\n\n/**\n * Integration constructor type\n */\nexport type IntegrationConstructor = new (\n config: IntegrationConfig,\n) => BaseIntegration;\n\n/**\n * Integration registry (populated as integrations are imported)\n */\nexport const INTEGRATION_REGISTRY: Record<string, IntegrationConstructor> = {};\n\n/**\n * Register an integration\n */\nexport function registerIntegration(\n name: string,\n constructor: IntegrationConstructor,\n): void {\n INTEGRATION_REGISTRY[name] = constructor;\n}\n\n/**\n * Get integration constructor by name\n */\nexport function getIntegration(\n name: string,\n): IntegrationConstructor | undefined {\n return INTEGRATION_REGISTRY[name];\n}\n\n/**\n * Check if integration is known\n */\nexport function isKnownIntegration(name: string): boolean {\n return name in INTEGRATION_REGISTRY;\n}\n\n/**\n * Get all registered integration names\n */\nexport function getRegisteredIntegrations(): string[] {\n return Object.keys(INTEGRATION_REGISTRY);\n}\n","import type { IntegrationConfig, IntegrationResult, IntegrationParams } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Optional per-call context for principal-scoped resolution (W4) and\n * caller-identity enforcement (I-25). The default — absent — means the\n * tenant/app-wide credential set with an anonymous caller; role-gated\n * integrations (credentials) fail closed without it. Additive: every\n * existing call site is untouched.\n */\nexport interface IntegrationCallContext {\n principal?: string;\n /** The caller's roster role, from the same identity entity-ACL enforces against. */\n role?: string;\n}\n\n/** Cache key for (name, principal?) — NUL never appears in either part. */\nfunction instanceKey(name: string, principal?: string): string {\n return principal ? `${name}\\u0000${principal}` : name;\n}\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet). A `principal` scopes\n * the config to that principal; the app-wide config (no principal) is the\n * fallback for every principal.\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>, principal?: string): void {\n this.configs.set(instanceKey(name, principal), { name, ...config });\n }\n\n /**\n * Get or create an integration instance. Principal-scoped lookups fall\n * back to the app-wide config when no per-principal config exists.\n */\n get(name: string, principal?: string): BaseIntegration {\n const key = instanceKey(name, principal);\n const cached = this.instances.get(key);\n if (cached) {\n return cached;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config — per-principal first, app-wide fallback\n const config = this.configs.get(key) ?? this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(key, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration, context?.principal);\n return await instance.execute(action, params, context);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string, principal?: string): boolean {\n return this.configs.has(instanceKey(name, principal)) || this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration, principal?: string): void {\n this.instances.set(instanceKey(name, principal), instance);\n }\n\n /**\n * Drop the cached instance(s) for a name so the next `get` rebuilds from\n * the current config — how a credential change goes live without restart.\n * Configs are kept; without a name, every instance is dropped.\n */\n invalidate(name?: string): void {\n if (name === undefined) {\n this.instances.clear();\n return;\n }\n for (const key of this.instances.keys()) {\n if (key === name || key.startsWith(`${name}\\u0000`)) {\n this.instances.delete(key);\n }\n }\n }\n\n /**\n * Clear all instances (useful for testing)\n */\n clear(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all instances and configs\n */\n reset(): void {\n this.instances.clear();\n this.configs.clear();\n }\n}\n\nlet _factory: IntegrationFactory | null = null;\n\nexport function getIntegrationFactory(): IntegrationFactory {\n if (!_factory) {\n _factory = new IntegrationFactory();\n }\n return _factory;\n}\n\nexport function resetIntegrationFactory(): void {\n _factory?.reset();\n _factory = null;\n}\n","import type { CredentialStore } from './store';\nimport type { IntegrationFactory } from '../factory';\n\nlet installedStore: CredentialStore | null = null;\nlet activeFactory: IntegrationFactory | null = null;\n\n/**\n * The factory the host's `RuntimeIntegrationManager` configures — installed\n * by its constructor so the `credentials.test` probe executes through the\n * SAME factory (and therefore the same configs) as every other call-service.\n */\nexport function installActiveFactory(factory: IntegrationFactory): void {\n activeFactory = factory;\n}\n\nexport function getActiveFactory(): IntegrationFactory | null {\n return activeFactory;\n}\n\n/**\n * Install the host's credential store as the process-wide resolution source.\n * Called once at boot (playground / generated server) after the store is\n * constructed over the host's persistence adapter.\n */\nexport function installCredentialStore(store: CredentialStore): void {\n installedStore = store;\n}\n\n/** The installed store, for the credentials admin service. */\nexport function getInstalledCredentialStore(): CredentialStore | null {\n return installedStore;\n}\n\n/** Testing/reset hook. */\nexport function uninstallCredentialStore(): void {\n installedStore = null;\n}\n\n/**\n * The one credential-reference resolver: store → env → undefined.\n * `ref` is an env-var name — the same name `serviceCredentials` declares and\n * `connectionRef` params carry. Every place that used to read\n * `process.env[ref]` for a credential routes through here.\n */\nexport function resolveCredentialRef(\n ref: string,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n return installedStore?.resolve(ref) ?? env[ref];\n}\n","import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { EntityRow } from '@almadar/core';\nimport type { CredentialPersistence } from './store';\n\n/** Env var overriding where the dev credential file lives. */\nexport const CREDENTIALS_FILE_ENV = 'ALMADAR_CREDENTIALS_FILE';\n\nconst DEFAULT_RELATIVE_PATH = join('.almadar', 'dev-credentials.json');\n\n/**\n * File-backed `CredentialPersistence` for dev store-first mode (I-31): rows\n * survive playground restarts so the encrypt-at-rest path is exercised on\n * every dev run, exactly like a deployed app's Firestore-backed store. Rows\n * arrive already encrypted (ciphertext/iv/authTag) — this adapter never sees\n * plaintext. Writes are atomic (tmp file + rename). Never use in production.\n */\nexport class FileCredentialPersistence implements CredentialPersistence {\n private readonly path: string;\n private counter = 0;\n\n constructor(path?: string) {\n this.path =\n path ?? process.env[CREDENTIALS_FILE_ENV] ?? join(process.cwd(), DEFAULT_RELATIVE_PATH);\n }\n\n get filePath(): string {\n return this.path;\n }\n\n private load(): Map<string, EntityRow> {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const rows = JSON.parse(raw) as EntityRow[];\n const map = new Map<string, EntityRow>();\n for (const row of rows) {\n if (typeof row.id === 'string') map.set(row.id, row);\n }\n return map;\n } catch {\n return new Map();\n }\n }\n\n private save(rows: Map<string, EntityRow>): void {\n mkdirSync(dirname(this.path), { recursive: true });\n const tmp = `${this.path}.tmp`;\n writeFileSync(tmp, JSON.stringify([...rows.values()], null, 2), 'utf-8');\n renameSync(tmp, this.path);\n }\n\n async create(entityType: string, data: EntityRow): Promise<{ id: string }> {\n const rows = this.load();\n const id = `${entityType}-${Date.now()}-${++this.counter}`;\n rows.set(id, { ...data, id });\n this.save(rows);\n return { id };\n }\n\n async update(_entityType: string, id: string, data: EntityRow): Promise<void> {\n const rows = this.load();\n const existing = rows.get(id);\n if (existing) {\n rows.set(id, { ...existing, ...data, id });\n this.save(rows);\n }\n }\n\n async delete(_entityType: string, id: string): Promise<void> {\n const rows = this.load();\n if (rows.delete(id)) this.save(rows);\n }\n\n async list(_entityType: string): Promise<EntityRow[]> {\n return [...this.load().values()];\n }\n}\n","import Stripe from 'stripe';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationError,\n IntegrationParams,\n} from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n AlmadarInvoicePayment,\n AlmadarInvoiceFailure,\n AlmadarStripeEvent,\n AlmadarStripeEventOk,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport { verifyAndParseStripeEvent } from './webhooks';\nexport type { VerifyAndParseInput } from './webhooks';\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction shapeCustomer(customer: Stripe.Customer): AlmadarCustomer {\n return {\n customerId: customer.id,\n email: customer.email ?? null,\n almadarUid: customer.metadata?.almadarUid ?? null,\n };\n}\n\n/**\n * Stripe integration for payment processing and subscription billing.\n *\n * Two surfaces:\n * - Legacy `execute(action, params)` switch for the original three\n * PaymentIntent actions (kept for back-compat).\n * - New typed methods (`createCustomer`, `createCheckoutSession`,\n * `createSubscription`, etc.) that return canonical `Almadar*`\n * types. Consumers MUST prefer these — `Stripe.*` types never leak.\n */\nexport class StripeIntegration extends BaseIntegration {\n private client: Stripe;\n private prices: StripePriceMap;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('STRIPE_SECRET_KEY not configured');\n }\n\n this.client = new Stripe(apiKey, {\n apiVersion: STRIPE_API_VERSION,\n });\n\n this.prices = {\n solo: config.env.STRIPE_PRICE_SOLO ?? '',\n teams: config.env.STRIPE_PRICE_TEAMS ?? '',\n };\n\n this.logger.info('Stripe integration initialized');\n }\n\n /** Provisioned Price IDs the integration was constructed with. */\n getPrices(): StripePriceMap {\n return this.prices;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n const retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createPaymentIntent':\n data = await this.executeWithRetry(() =>\n this.createPaymentIntent(params),\n );\n break;\n case 'confirmPayment':\n data = await this.executeWithRetry(() => this.confirmPayment(params));\n break;\n case 'refund':\n data = await this.executeWithRetry(() => this.refund(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async createPaymentIntent(params: IntegrationParams) {\n const { amount, currency, metadata } = params;\n this.logger.debug('Creating payment intent', {\n amount: Number(amount),\n currency: String(currency ?? ''),\n });\n return await this.client.paymentIntents.create({\n amount: amount as number,\n currency: currency as string,\n metadata: metadata as Stripe.MetadataParam | undefined,\n });\n }\n\n private async confirmPayment(params: IntegrationParams) {\n const { paymentIntentId } = params;\n this.logger.debug('Confirming payment', {\n paymentIntentId: String(paymentIntentId ?? ''),\n });\n return await this.client.paymentIntents.confirm(paymentIntentId as string);\n }\n\n private async refund(params: IntegrationParams) {\n const { paymentIntentId, amount } = params;\n this.logger.debug('Creating refund', {\n paymentIntentId: String(paymentIntentId ?? ''),\n amount: Number(amount),\n });\n return await this.client.refunds.create({\n payment_intent: paymentIntentId as string,\n amount: amount as number | undefined,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────\n // Typed action surface — canonical Almadar shapes only.\n // ───────────────────────────────────────────────────────────────────\n\n /** Look up an existing customer by Stripe ID. */\n async getCustomer(customerId: string): Promise<AlmadarCustomer | null> {\n this.logger.debug('Fetching customer', { customerId });\n const customer = await this.client.customers.retrieve(customerId);\n if (customer.deleted === true) return null;\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe Customer for the given Almadar user. `almadarUid` is\n * stored as Stripe metadata so webhook handlers can resolve back to\n * the right `users/{uid}` document.\n */\n async createCustomer(input: CreateCustomerInput): Promise<AlmadarCustomer> {\n this.logger.debug('Creating customer', { almadarUid: input.almadarUid });\n const customer = await this.client.customers.create({\n email: input.email,\n name: input.displayName ?? undefined,\n metadata: { almadarUid: input.almadarUid },\n });\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe-hosted Checkout Session for the given tier. Client\n * redirects the user to the returned `url`; on success Stripe fires\n * `customer.subscription.created`, which the apps/builder webhook\n * handler turns into a `users/{uid}.tier` write.\n */\n async createCheckoutSession(\n input: CreateCheckoutInput,\n ): Promise<AlmadarCheckoutSession> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n\n this.logger.debug('Creating Checkout session', {\n tier: input.tier,\n quantity: input.quantity,\n hasCustomer: input.customerId !== null,\n });\n\n const session = await this.client.checkout.sessions.create({\n mode: 'subscription',\n customer: input.customerId ?? undefined,\n line_items: [{ price, quantity: input.quantity }],\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n subscription_data: {\n metadata: input.metadata,\n },\n automatic_tax: { enabled: true },\n allow_promotion_codes: true,\n });\n\n return {\n url: session.url ?? '',\n sessionId: session.id,\n customerId:\n typeof session.customer === 'string'\n ? session.customer\n : session.customer?.id ?? null,\n };\n }\n\n /** Create a Billing Portal session for self-service plan management. */\n async createBillingPortalSession(\n input: CreatePortalInput,\n ): Promise<AlmadarPortalSession> {\n this.logger.debug('Creating Portal session', { customerId: input.customerId });\n const session = await this.client.billingPortal.sessions.create({\n customer: input.customerId,\n return_url: input.returnUrl,\n });\n return {\n url: session.url,\n customerId: input.customerId,\n };\n }\n\n /** Fetch a subscription and shape it into the canonical form. */\n async getSubscription(subscriptionId: string): Promise<AlmadarSubscription> {\n this.logger.debug('Fetching subscription', { subscriptionId });\n const sub = await this.client.subscriptions.retrieve(subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Create a subscription directly (server-side, no Checkout). Used by\n * P13.3 Solo → Teams upgrade flow.\n */\n async createSubscription(input: {\n customerId: string;\n tier: 'solo' | 'teams';\n quantity: number;\n metadata: Record<string, string>;\n }): Promise<AlmadarSubscription> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n this.logger.debug('Creating subscription', {\n customerId: input.customerId,\n tier: input.tier,\n quantity: input.quantity,\n });\n const sub = await this.client.subscriptions.create({\n customer: input.customerId,\n items: [{ price, quantity: input.quantity }],\n metadata: input.metadata,\n proration_behavior: 'create_prorations',\n automatic_tax: { enabled: true },\n });\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Update quantity or cancel-at-period-end. Used for Teams seat resize\n * and Solo → Teams transition.\n */\n async updateSubscription(\n input: UpdateSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Updating subscription', { subscriptionId: input.subscriptionId });\n const update: Stripe.SubscriptionUpdateParams = {\n proration_behavior: 'create_prorations',\n };\n if (typeof input.quantity === 'number') {\n const existing = await this.client.subscriptions.retrieve(input.subscriptionId);\n const itemId = existing.items.data[0]?.id;\n if (itemId !== undefined) {\n update.items = [{ id: itemId, quantity: input.quantity }];\n }\n }\n if (typeof input.cancelAtPeriodEnd === 'boolean') {\n update.cancel_at_period_end = input.cancelAtPeriodEnd;\n }\n const sub = await this.client.subscriptions.update(\n input.subscriptionId,\n update,\n );\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Cancel a subscription. Defaults to `atPeriodEnd: true` so the user\n * keeps access until the current period ends.\n */\n async cancelSubscription(\n input: CancelSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Canceling subscription', {\n subscriptionId: input.subscriptionId,\n atPeriodEnd: input.atPeriodEnd,\n });\n if (input.atPeriodEnd) {\n const sub = await this.client.subscriptions.update(input.subscriptionId, {\n cancel_at_period_end: true,\n });\n return shapeSubscription(sub, this.prices);\n }\n const sub = await this.client.subscriptions.cancel(input.subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n}\n\n// Auto-register\nregisterIntegration('stripe', StripeIntegration);\n","import { google, youtube_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * YouTube Data API integration\n */\nexport class YouTubeIntegration extends BaseIntegration {\n private client: youtube_v3.Youtube;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.YOUTUBE_API_KEY;\n if (!apiKey) {\n throw new Error('YOUTUBE_API_KEY not configured');\n }\n\n this.client = google.youtube({\n version: 'v3',\n auth: apiKey,\n });\n\n this.logger.info('YouTube integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getVideo':\n data = await this.executeWithRetry(() => this.getVideo(params));\n break;\n case 'getChannel':\n data = await this.executeWithRetry(() => this.getChannel(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams) {\n const { query, maxResults, type } = params;\n\n this.logger.debug('Searching YouTube', { query: String(query ?? ''), maxResults: Number(maxResults ?? 10), type: String(type ?? '') });\n\n const response = await this.client.search.list({\n part: ['snippet'],\n q: query as string,\n maxResults: (maxResults as number) || 10,\n type: type ? [type as string] : undefined,\n });\n\n return response.data.items?.map((item) => ({\n videoId: item.id?.videoId,\n title: item.snippet?.title,\n thumbnail: item.snippet?.thumbnails?.default?.url,\n description: item.snippet?.description,\n }));\n }\n\n private async getVideo(params: IntegrationParams) {\n const { videoId } = params;\n\n this.logger.debug('Getting video details', { videoId: String(videoId ?? '') });\n\n const response = await this.client.videos.list({\n part: ['snippet', 'statistics'],\n id: [videoId as string],\n });\n\n const video = response.data.items?.[0];\n if (!video) {\n throw new Error(`Video not found: ${videoId}`);\n }\n\n return {\n title: video.snippet?.title,\n description: video.snippet?.description,\n viewCount: video.statistics?.viewCount,\n likeCount: video.statistics?.likeCount,\n };\n }\n\n private async getChannel(params: IntegrationParams) {\n const { channelId } = params;\n\n this.logger.debug('Getting channel details', { channelId: String(channelId ?? '') });\n\n const response = await this.client.channels.list({\n part: ['snippet', 'statistics'],\n id: [channelId as string],\n });\n\n const channel = response.data.items?.[0];\n if (!channel) {\n throw new Error(`Channel not found: ${channelId}`);\n }\n\n return {\n name: channel.snippet?.title,\n description: channel.snippet?.description,\n subscriberCount: channel.statistics?.subscriberCount,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('youtube', YouTubeIntegration);\n","import twilio from 'twilio';\nimport type { Twilio } from 'twilio';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Twilio messaging integration\n */\nexport class TwilioIntegration extends BaseIntegration {\n private client: Twilio;\n private phoneNumber: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const accountSid = config.env.TWILIO_ACCOUNT_SID;\n const authToken = config.env.TWILIO_AUTH_TOKEN;\n this.phoneNumber = config.env.TWILIO_PHONE_NUMBER || '';\n\n if (!accountSid || !authToken) {\n throw new Error('TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN not configured');\n }\n\n this.client = twilio(accountSid, authToken);\n\n this.logger.info('Twilio integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendSMS':\n data = await this.executeWithRetry(() => this.sendSMS(params));\n break;\n case 'sendWhatsApp':\n data = await this.executeWithRetry(() => this.sendWhatsApp(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async sendSMS(params: IntegrationParams) {\n const { to, body, from } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: (from as string) || this.phoneNumber,\n to: to as string,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n\n private async sendWhatsApp(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending WhatsApp message', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: `whatsapp:${this.phoneNumber}`,\n to: `whatsapp:${to}`,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('twilio', TwilioIntegration);\n","import sgMail from '@sendgrid/mail';\nimport { Resend } from 'resend';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ntype EmailProvider = 'sendgrid' | 'resend';\n\n/**\n * Email integration (SendGrid/Resend)\n */\nexport class EmailIntegration extends BaseIntegration {\n private provider: EmailProvider;\n private fromEmail: string;\n private resendClient?: Resend;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.provider = (config.env.PROVIDER as EmailProvider) || 'sendgrid';\n this.fromEmail = config.env.FROM_EMAIL || 'noreply@example.com';\n\n if (this.provider === 'sendgrid') {\n const apiKey = config.env.SENDGRID_API_KEY;\n if (!apiKey) {\n throw new Error('SENDGRID_API_KEY not configured');\n }\n sgMail.setApiKey(apiKey);\n } else if (this.provider === 'resend') {\n const apiKey = config.env.RESEND_API_KEY;\n if (!apiKey) {\n throw new Error('RESEND_API_KEY not configured');\n }\n this.resendClient = new Resend(apiKey);\n }\n\n this.logger.info(`Email integration initialized (${this.provider})`);\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { to, subject, body, from, htmlBody, replyTo, templateId } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n const message: SendMessage = {\n to: to as string,\n subject: subject as string,\n body: body as string,\n from: (from as string) || this.fromEmail,\n htmlBody: (htmlBody as string) || undefined,\n replyTo: (replyTo as string) || undefined,\n templateId: (templateId as string) || undefined,\n };\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(message);\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(message);\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(message: SendMessage) {\n const msg = {\n to: message.to,\n from: message.from,\n subject: message.subject,\n // htmlBody present → it carries the HTML and body becomes the\n // plain-text alternative; absent → body renders as HTML (legacy).\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n ...(message.templateId ? { templateId: message.templateId } : {}),\n };\n\n const response = await sgMail.send(msg);\n\n return {\n id: response[0].headers['x-message-id'],\n status: 'sent',\n };\n }\n\n private async sendViaResend(message: SendMessage) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n if (message.templateId) {\n // Resend's send API has no template reference — silently ignoring the\n // author's template intent would be a dropped feature.\n throw new Error('templateId is not supported by the resend provider — use sendgrid or drop templateId');\n }\n\n const response = await this.resendClient.emails.send({\n from: message.from,\n to: message.to,\n subject: message.subject,\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\ninterface SendMessage {\n to: string;\n subject: string;\n body: string;\n from: string;\n htmlBody?: string;\n replyTo?: string;\n templateId?: string;\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { createHmac } from 'node:crypto';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Outbound webhook integration — signed HTTP POST notifications to external endpoints.\n */\nexport class WebhookIntegration extends BaseIntegration {\n private signingSecret: string;\n private timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.signingSecret = config.env.WEBHOOK_SIGNING_SECRET || '';\n this.timeoutMs = Number(config.env.WEBHOOK_TIMEOUT_MS) || 10000;\n\n this.logger.info('Webhook integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { url, event, payload, secret } = params;\n\n const body = JSON.stringify({\n event: event as string,\n payload: payload ?? {},\n timestamp: new Date().toISOString(),\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Almadar-Event': event as string,\n };\n\n const signingSecret = (secret as string) || this.signingSecret;\n if (signingSecret) {\n headers['X-Almadar-Signature'] =\n 'sha256=' + createHmac('sha256', signingSecret).update(body).digest('hex');\n }\n\n this.logger.debug('Sending webhook', { url: String(url), event: String(event) });\n\n const startTime = Date.now();\n const response = await fetch(url as string, {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n\n // 5xx should retry via executeWithRetry; 4xx is a caller error and must not.\n if (response.status >= 500) {\n throw new Error(`Webhook endpoint returned ${response.status}`);\n }\n\n return {\n status: response.status,\n ok: response.ok,\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('webhook', WebhookIntegration);\n","import webpush from 'web-push';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ninterface PushSubscriptionParam {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toSubscription(value: IntegrationParamValue | undefined): PushSubscriptionParam {\n if (isParamRecord(value)) {\n const { endpoint, keys } = value;\n if (typeof endpoint === 'string' && isParamRecord(keys)) {\n const { p256dh, auth } = keys;\n if (typeof p256dh === 'string' && typeof auth === 'string') {\n return { endpoint, keys: { p256dh, auth } };\n }\n }\n }\n throw new Error('push.send: subscription must be { endpoint, keys: { p256dh, auth } }');\n}\n\n/**\n * Web Push integration — VAPID-signed push notifications to browser\n * PushSubscription endpoints. VAPID details are passed per call (never via the\n * web-push module singleton) so concurrent configs cannot contaminate each other.\n */\nexport class PushIntegration extends BaseIntegration {\n private vapidPublicKey: string;\n private vapidPrivateKey: string;\n private vapidSubject: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.vapidPublicKey = config.env.VAPID_PUBLIC_KEY || '';\n this.vapidPrivateKey = config.env.VAPID_PRIVATE_KEY || '';\n this.vapidSubject = config.env.VAPID_SUBJECT || '';\n\n this.logger.info('Push integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async send(params: IntegrationParams) {\n const { subscription, title, body, url, icon } = params;\n const sub = toSubscription(subscription);\n\n const payload = JSON.stringify({\n title: title as string,\n body: body as string,\n url: (url as string) || undefined,\n icon: (icon as string) || undefined,\n });\n\n this.logger.debug('Sending push notification', { endpoint: sub.endpoint });\n\n try {\n const response = await webpush.sendNotification(sub, payload, {\n vapidDetails: {\n subject: this.vapidSubject,\n publicKey: this.vapidPublicKey,\n privateKey: this.vapidPrivateKey,\n },\n });\n return { statusCode: response.statusCode, ok: true, expired: false };\n } catch (error) {\n if (error instanceof webpush.WebPushError) {\n // 5xx retries via executeWithRetry; 404/410 means the subscription is\n // gone — the caller must prune the stored row, never retry.\n if (error.statusCode >= 500) {\n throw new Error(`Push endpoint returned ${error.statusCode}`);\n }\n return {\n statusCode: error.statusCode,\n ok: false,\n expired: error.statusCode === 404 || error.statusCode === 410,\n };\n }\n throw error;\n }\n }\n}\n\n// Auto-register\nregisterIntegration('push', PushIntegration);\n","export { parseCalendarPushNotification, googleCalendarHookProvider } from './webhooks';\nexport type { CalendarHookEvent } from './webhooks';\n\nimport { google, calendar_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Google Calendar integration — service account auth, optionally acting as a\n * Workspace user via domain-wide delegation (GOOGLE_CALENDAR_SUBJECT). All\n * event times are ISO strings on the wire; a 10-char value (YYYY-MM-DD) maps\n * to an all-day `date`, anything longer to `dateTime`.\n */\nexport class CalendarIntegration extends BaseIntegration {\n private client: calendar_v3.Calendar;\n private defaultCalendarId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_CALENDAR_SA_KEY;\n if (!rawKey) {\n throw new Error('GOOGLE_CALENDAR_SA_KEY not configured');\n }\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n\n const subject = config.env.GOOGLE_CALENDAR_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/calendar'],\n subject,\n });\n\n this.client = google.calendar({ version: 'v3', auth });\n this.defaultCalendarId = config.env.GOOGLE_CALENDAR_ID || 'primary';\n\n this.logger.info('Calendar integration initialized', {\n delegated: Boolean(subject),\n });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listEvents':\n data = await this.executeWithRetry(() => this.listEvents(params));\n break;\n case 'createEvent':\n data = await this.executeWithRetry(() => this.createEvent(params));\n break;\n case 'updateEvent':\n data = await this.executeWithRetry(() => this.updateEvent(params));\n break;\n case 'deleteEvent':\n data = await this.executeWithRetry(() => this.deleteEvent(params));\n break;\n case 'freeBusy':\n data = await this.executeWithRetry(() => this.freeBusy(params));\n break;\n case 'watch':\n data = await this.executeWithRetry(() => this.watch(params));\n break;\n case 'stopWatch':\n data = await this.executeWithRetry(() => this.stopWatch(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private calendarId(params: IntegrationParams): string {\n return (params.calendarId as string) || this.defaultCalendarId;\n }\n\n private toEventTime(value: string): calendar_v3.Schema$EventDateTime {\n return value.length === 10 ? { date: value } : { dateTime: value };\n }\n\n private fromEventTime(time: calendar_v3.Schema$EventDateTime | undefined): string {\n return time?.dateTime ?? time?.date ?? '';\n }\n\n private async listEvents(params: IntegrationParams) {\n const { timeMin, timeMax, syncToken, maxResults } = params;\n const response = await this.client.events.list({\n calendarId: this.calendarId(params),\n // Incremental sync: a syncToken supersedes the window params (the API\n // rejects combining them).\n ...(syncToken\n ? { syncToken: syncToken as string }\n : {\n timeMin: (timeMin as string) || undefined,\n timeMax: (timeMax as string) || undefined,\n singleEvents: true,\n orderBy: 'startTime' as const,\n }),\n maxResults: (maxResults as number) || 250,\n });\n const items = response.data.items ?? [];\n return {\n events: items.map((event) => ({\n id: event.id ?? '',\n summary: event.summary ?? '',\n description: event.description ?? '',\n location: event.location ?? '',\n start: this.fromEventTime(event.start ?? undefined),\n end: this.fromEventTime(event.end ?? undefined),\n status: event.status ?? '',\n updated: event.updated ?? '',\n })),\n nextSyncToken: response.data.nextSyncToken ?? null,\n };\n }\n\n private resolveEnd(start: string, end: string | undefined, durationMinutes: number | undefined): string {\n if (end) return end;\n if (start.length === 10) {\n // All-day start with no end → the exclusive-end convention: next day.\n const next = new Date(Date.parse(start) + 24 * 60 * 60_000);\n return next.toISOString().slice(0, 10);\n }\n if (durationMinutes && durationMinutes > 0) {\n return new Date(Date.parse(start) + durationMinutes * 60_000).toISOString();\n }\n throw new Error('createEvent requires `end` or a positive `durationMinutes`');\n }\n\n private async createEvent(params: IntegrationParams) {\n const { summary, description, location, start, end, durationMinutes } = params;\n const response = await this.client.events.insert({\n calendarId: this.calendarId(params),\n requestBody: {\n summary: summary as string,\n description: (description as string) || undefined,\n location: (location as string) || undefined,\n start: this.toEventTime(start as string),\n end: this.toEventTime(\n this.resolveEnd(start as string, (end as string) || undefined, (durationMinutes as number) || undefined),\n ),\n },\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n htmlLink: response.data.htmlLink ?? '',\n };\n }\n\n private async updateEvent(params: IntegrationParams) {\n const { eventId, summary, description, location, start, end } = params;\n const requestBody: calendar_v3.Schema$Event = {};\n if (typeof summary === 'string') requestBody.summary = summary;\n if (typeof description === 'string') requestBody.description = description;\n if (typeof location === 'string') requestBody.location = location;\n if (typeof start === 'string' && start) requestBody.start = this.toEventTime(start);\n if (typeof end === 'string' && end) requestBody.end = this.toEventTime(end);\n const response = await this.client.events.patch({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n requestBody,\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n };\n }\n\n private async deleteEvent(params: IntegrationParams) {\n const { eventId } = params;\n await this.client.events.delete({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n });\n return { id: eventId as string, deleted: true };\n }\n\n private async freeBusy(params: IntegrationParams) {\n const { timeMin, timeMax } = params;\n const id = this.calendarId(params);\n const response = await this.client.freebusy.query({\n requestBody: {\n timeMin: timeMin as string,\n timeMax: timeMax as string,\n items: [{ id }],\n },\n });\n const busy = response.data.calendars?.[id]?.busy ?? [];\n return {\n busy: busy.map((slot) => ({ start: slot.start ?? '', end: slot.end ?? '' })),\n };\n }\n\n private async watch(params: IntegrationParams) {\n const { channelId, address, ttlSeconds } = params;\n const response = await this.client.events.watch({\n calendarId: this.calendarId(params),\n requestBody: {\n id: channelId as string,\n type: 'web_hook',\n address: address as string,\n params: ttlSeconds ? { ttl: String(ttlSeconds) } : undefined,\n },\n });\n return {\n channelId: response.data.id ?? (channelId as string),\n resourceId: response.data.resourceId ?? '',\n expiration: response.data.expiration ?? '',\n };\n }\n\n private async stopWatch(params: IntegrationParams) {\n const { channelId, resourceId } = params;\n await this.client.channels.stop({\n requestBody: {\n id: channelId as string,\n resourceId: resourceId as string,\n },\n });\n return { stopped: true };\n }\n}\n\n// Auto-register\nregisterIntegration('calendar', CalendarIntegration);\n","import { Readable } from 'node:stream';\nimport { google, drive_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Google Drive integration — dual auth:\n * - **Service account** (GOOGLE_DRIVE_SA_KEY, optional GOOGLE_DRIVE_SUBJECT\n * delegation) serves reads (list/get/share).\n * - **User OAuth** (GOOGLE_DRIVE_REFRESH_TOKEN + the app's OAUTH_CLIENT_ID/\n * SECRET, obtained once via `scripts/drive-consent.mjs`) serves\n * WRITES (`uploadFile`/`createFolder`) when present — Google enforces zero\n * SA storage quota on personal accounts, so SA writes into a shared My\n * Drive folder are impossible; the user client also covers reads when no\n * SA key is configured. `GOOGLE_DRIVE_FOLDER_ID` is the default upload\n * parent. File content crosses this boundary as base64 (data URL accepted\n * on upload).\n */\nexport class DriveIntegration extends BaseIntegration {\n private readonly saClient: drive_v3.Drive | null;\n private readonly userClient: drive_v3.Drive | null;\n private readonly defaultFolderId: string | undefined;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_DRIVE_SA_KEY;\n if (rawKey) {\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n const subject = config.env.GOOGLE_DRIVE_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/drive'],\n subject,\n });\n this.saClient = google.drive({ version: 'v3', auth });\n } else {\n this.saClient = null;\n }\n\n const refreshToken = config.env.GOOGLE_DRIVE_REFRESH_TOKEN;\n const clientId = config.env.OAUTH_CLIENT_ID;\n const clientSecret = config.env.OAUTH_CLIENT_SECRET;\n if (refreshToken && clientId && clientSecret) {\n const oauth2 = new google.auth.OAuth2(clientId, clientSecret);\n oauth2.setCredentials({ refresh_token: refreshToken });\n this.userClient = google.drive({ version: 'v3', auth: oauth2 });\n } else {\n this.userClient = null;\n }\n\n if (!this.saClient && !this.userClient) {\n throw new Error(\n 'Drive not configured — set GOOGLE_DRIVE_SA_KEY (reads) and/or GOOGLE_DRIVE_REFRESH_TOKEN + OAUTH_CLIENT_ID/SECRET (writes)',\n );\n }\n\n this.defaultFolderId = config.env.GOOGLE_DRIVE_FOLDER_ID || undefined;\n\n this.logger.info('Drive integration initialized', {\n serviceAccount: this.saClient !== null,\n userToken: this.userClient !== null,\n delegated: Boolean(config.env.GOOGLE_DRIVE_SUBJECT),\n });\n }\n\n /** Reads prefer the SA client (delegation-aware); user client covers its absence. */\n private readClient(): drive_v3.Drive {\n const client = this.saClient ?? this.userClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n /** Writes REQUIRE the user client on personal accounts (SA has no storage quota); SA only as a Workspace fallback. */\n private writeClient(): drive_v3.Drive {\n const client = this.userClient ?? this.saClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listFiles':\n data = await this.executeWithRetry(() => this.listFiles(params));\n break;\n case 'getFile':\n data = await this.executeWithRetry(() => this.getFile(params));\n break;\n case 'uploadFile':\n data = await this.executeWithRetry(() => this.uploadFile(params));\n break;\n case 'createFolder':\n data = await this.executeWithRetry(() => this.createFolder(params));\n break;\n case 'shareFile':\n data = await this.executeWithRetry(() => this.shareFile(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async listFiles(params: IntegrationParams) {\n const { folderId, query, maxResults } = params;\n const clauses = ['trashed = false'];\n if (folderId) clauses.push(`'${String(folderId).replace(/'/g, \"\\\\'\")}' in parents`);\n if (query) clauses.push(String(query));\n const response = await this.readClient().files.list({\n q: clauses.join(' and '),\n pageSize: (maxResults as number) || 100,\n fields: 'files(id, name, mimeType, size, modifiedTime, webViewLink)',\n });\n return {\n files: (response.data.files ?? []).map((file) => ({\n id: file.id ?? '',\n name: file.name ?? '',\n mimeType: file.mimeType ?? '',\n size: Number(file.size ?? 0),\n modifiedTime: file.modifiedTime ?? '',\n webViewLink: file.webViewLink ?? '',\n })),\n };\n }\n\n private async getFile(params: IntegrationParams) {\n const fileId = params.fileId as string;\n const meta = await this.readClient().files.get({\n fileId,\n fields: 'id, name, mimeType, size',\n });\n const content = await this.readClient().files.get(\n { fileId, alt: 'media' },\n { responseType: 'arraybuffer' },\n );\n const bytes = Buffer.from(content.data as ArrayBuffer);\n return {\n id: meta.data.id ?? fileId,\n name: meta.data.name ?? '',\n mimeType: meta.data.mimeType ?? 'application/octet-stream',\n content: bytes.toString('base64'),\n size: bytes.length,\n };\n }\n\n private async uploadFile(params: IntegrationParams) {\n const { name, content, mimeType, folderId } = params;\n const { bytes, contentType } = decodeContent(content as string);\n const parent = (folderId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n parents: parent ? [parent] : undefined,\n },\n media: {\n mimeType: (mimeType as string) || contentType || 'application/octet-stream',\n body: Readable.from(bytes),\n },\n fields: 'id, name, webViewLink',\n });\n return {\n id: response.data.id ?? '',\n name: response.data.name ?? (name as string),\n webViewLink: response.data.webViewLink ?? '',\n };\n }\n\n private async createFolder(params: IntegrationParams) {\n const { name, parentId } = params;\n const parent = (parentId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n mimeType: 'application/vnd.google-apps.folder',\n parents: parent ? [parent] : undefined,\n },\n fields: 'id, name',\n });\n return { id: response.data.id ?? '', name: response.data.name ?? (name as string) };\n }\n\n private async shareFile(params: IntegrationParams) {\n const { fileId, email, role } = params;\n const response = await this.readClient().permissions.create({\n fileId: fileId as string,\n requestBody: {\n type: 'user',\n role: (role as string) || 'reader',\n emailAddress: email as string,\n },\n fields: 'id',\n });\n return { shared: true, permissionId: response.data.id ?? '' };\n }\n}\n\n// Auto-register\nregisterIntegration('drive', DriveIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GRAPH_BASE = 'https://graph.facebook.com/v21.0';\n\n/**\n * Meta Ads integration — Graph API Marketing Insights, READ-ONLY (spend and\n * campaign listings for profitability reporting). No SDK: plain fetch with\n * the webhook integration's 5xx-retries / 4xx-returns split.\n */\nexport class MetaAdsIntegration extends BaseIntegration {\n private accessToken: string;\n private defaultAccountId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.accessToken = config.env.META_ACCESS_TOKEN || '';\n if (!this.accessToken) {\n throw new Error('META_ACCESS_TOKEN not configured');\n }\n this.defaultAccountId = config.env.META_AD_ACCOUNT_ID || '';\n\n this.logger.info('Meta Ads integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'getSpend':\n data = await this.executeWithRetry(() => this.getSpend(params));\n break;\n case 'listCampaigns':\n data = await this.executeWithRetry(() => this.listCampaigns(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private accountId(params: IntegrationParams): string {\n const id = (params.accountId as string) || this.defaultAccountId;\n if (!id) {\n throw new Error('No ad account: pass `accountId` or set META_AD_ACCOUNT_ID');\n }\n return id.startsWith('act_') ? id : `act_${id}`;\n }\n\n private async graphGet(path: string, query: Record<string, string>): Promise<unknown> {\n const url = new URL(`${GRAPH_BASE}/${path}`);\n for (const [key, value] of Object.entries(query)) {\n url.searchParams.set(key, value);\n }\n url.searchParams.set('access_token', this.accessToken);\n const response = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (response.status >= 500) {\n // 5xx retries via executeWithRetry; 4xx is a caller/token error.\n throw new Error(`Meta Graph API returned ${response.status}`);\n }\n const body = (await response.json()) as { error?: { message?: string }; data?: unknown };\n if (!response.ok) {\n throw new Error(`Meta Graph API error: ${body.error?.message ?? response.status}`);\n }\n return body.data ?? body;\n }\n\n private async getSpend(params: IntegrationParams) {\n const { since, until } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/insights`, {\n fields: 'spend,impressions,clicks,account_currency',\n time_range: JSON.stringify({ since: since as string, until: until as string }),\n level: 'account',\n })) as Array<{ spend?: string; impressions?: string; clicks?: string; account_currency?: string }>;\n const row = Array.isArray(rows) ? rows[0] : undefined;\n return {\n spend: Number(row?.spend ?? 0),\n currency: row?.account_currency ?? '',\n impressions: Number(row?.impressions ?? 0),\n clicks: Number(row?.clicks ?? 0),\n };\n }\n\n private async listCampaigns(params: IntegrationParams) {\n const { status } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/campaigns`, {\n fields: 'id,name,status,daily_budget',\n ...(status ? { effective_status: JSON.stringify([status]) } : {}),\n })) as Array<{ id?: string; name?: string; status?: string; daily_budget?: string }>;\n return {\n campaigns: (Array.isArray(rows) ? rows : []).map((row) => ({\n id: row.id ?? '',\n name: row.name ?? '',\n status: row.status ?? '',\n // Meta reports budgets in minor units (cents).\n dailyBudget: Number(row.daily_budget ?? 0) / 100,\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('metaAds', MetaAdsIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Accounting export integration — the generic half of \"export to accounting\n * software\": shapes invoice / journal rows into import-ready CSV without\n * committing to a vendor. A `provider` field is reserved on the config for\n * direct DATEV/Xero/QuickBooks connectors later; the CSV column sets follow\n * the common import templates those systems accept.\n */\nexport class AccountingIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Accounting integration initialized (generic CSV export)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'exportInvoices':\n data = this.exportRows(params.invoices, INVOICE_COLUMNS, 'invoices');\n break;\n case 'exportJournal':\n data = this.exportRows(params.entries, JOURNAL_COLUMNS, 'journal');\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private exportRows(\n rowsValue: IntegrationParamValue | undefined,\n columns: readonly string[],\n kind: string,\n ): { content: string; filename: string; count: number } {\n if (!Array.isArray(rowsValue)) {\n throw new Error(`${kind} export requires an array of rows`);\n }\n const lines = [columns.join(',')];\n for (const row of rowsValue) {\n if (row === null || typeof row !== 'object' || Array.isArray(row) || row instanceof Date) {\n throw new Error(`${kind} export: every row must be an object`);\n }\n const record = row as { readonly [key: string]: IntegrationParamValue };\n lines.push(columns.map((column) => csvCell(record[column])).join(','));\n }\n const stamp = new Date().toISOString().slice(0, 10);\n return {\n content: lines.join('\\r\\n') + '\\r\\n',\n filename: `${kind}-export-${stamp}.csv`,\n count: rowsValue.length,\n };\n }\n}\n\nconst INVOICE_COLUMNS = ['id', 'number', 'customer', 'issuedAt', 'dueAt', 'currency', 'net', 'tax', 'gross', 'status'] as const;\nconst JOURNAL_COLUMNS = ['date', 'account', 'description', 'debit', 'credit', 'reference'] as const;\n\nfunction csvCell(value: IntegrationParamValue | undefined): string {\n if (value === undefined || value === null) return '';\n const raw = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\r\\n]/.test(raw) ? `\"${raw.replace(/\"/g, '\"\"')}\"` : raw;\n}\n\n// Auto-register\nregisterIntegration('accounting', AccountingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GC_BASE = 'https://bankaccountdata.gocardless.com/api/v2';\n\n/**\n * Banking integration — GoCardless Bank Account Data (read-only requisition →\n * accounts → transactions flow feeding reconciliation). Access tokens are\n * minted per instance from the secret pair and refreshed on expiry.\n */\nexport class BankingIntegration extends BaseIntegration {\n private secretId: string;\n private secretKey: string;\n private accessToken: string | null = null;\n private accessTokenExpiresAt = 0;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.secretId = config.env.GOCARDLESS_SECRET_ID || '';\n this.secretKey = config.env.GOCARDLESS_SECRET_KEY || '';\n if (!this.secretId || !this.secretKey) {\n throw new Error('GOCARDLESS_SECRET_ID / GOCARDLESS_SECRET_KEY not configured');\n }\n\n this.logger.info('Banking integration initialized (GoCardless Bank Account Data)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createRequisition':\n data = await this.executeWithRetry(() => this.createRequisition(params));\n break;\n case 'listAccounts':\n data = await this.executeWithRetry(() => this.listAccounts(params));\n break;\n case 'listTransactions':\n data = await this.executeWithRetry(() => this.listTransactions(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async token(): Promise<string> {\n if (this.accessToken && Date.now() < this.accessTokenExpiresAt - 60_000) {\n return this.accessToken;\n }\n const response = await fetch(`${GC_BASE}/token/new/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ secret_id: this.secretId, secret_key: this.secretKey }),\n signal: AbortSignal.timeout(15000),\n });\n if (!response.ok) {\n throw new Error(`GoCardless token request failed: ${response.status}`);\n }\n const body = (await response.json()) as { access: string; access_expires: number };\n this.accessToken = body.access;\n this.accessTokenExpiresAt = Date.now() + body.access_expires * 1000;\n return this.accessToken;\n }\n\n private async gcRequest(path: string, init?: { method?: string; body?: unknown }): Promise<unknown> {\n const response = await fetch(`${GC_BASE}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${await this.token()}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(20000),\n });\n if (response.status >= 500) {\n throw new Error(`GoCardless returned ${response.status}`);\n }\n const body: unknown = await response.json();\n if (!response.ok) {\n throw new Error(`GoCardless error ${response.status}: ${JSON.stringify(body).slice(0, 300)}`);\n }\n return body;\n }\n\n private async createRequisition(params: IntegrationParams) {\n const { institutionId, redirectUrl, reference } = params;\n const body = (await this.gcRequest('/requisitions/', {\n method: 'POST',\n body: {\n institution_id: institutionId as string,\n redirect: redirectUrl as string,\n reference: (reference as string) || undefined,\n },\n })) as { id?: string; link?: string };\n return { requisitionId: body.id ?? '', link: body.link ?? '' };\n }\n\n private async listAccounts(params: IntegrationParams) {\n const { requisitionId } = params;\n const body = (await this.gcRequest(`/requisitions/${requisitionId as string}/`)) as { accounts?: string[] };\n return { accounts: body.accounts ?? [] };\n }\n\n private async listTransactions(params: IntegrationParams) {\n const { accountId, dateFrom, dateTo } = params;\n const query = new URLSearchParams();\n if (dateFrom) query.set('date_from', dateFrom as string);\n if (dateTo) query.set('date_to', dateTo as string);\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n const body = (await this.gcRequest(`/accounts/${accountId as string}/transactions/${suffix}`)) as {\n transactions?: {\n booked?: Array<{\n transactionId?: string;\n internalTransactionId?: string;\n transactionAmount?: { amount?: string; currency?: string };\n bookingDate?: string;\n remittanceInformationUnstructured?: string;\n creditorName?: string;\n debtorName?: string;\n }>;\n };\n };\n return {\n transactions: (body.transactions?.booked ?? []).map((tx) => ({\n id: tx.transactionId ?? tx.internalTransactionId ?? '',\n amount: Number(tx.transactionAmount?.amount ?? 0),\n currency: tx.transactionAmount?.currency ?? '',\n date: tx.bookingDate ?? '',\n description: tx.remittanceInformationUnstructured ?? '',\n counterparty: tx.creditorName ?? tx.debtorName ?? '',\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('banking', BankingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * E-signature integration — DocuSign eSignature REST first, deliberately\n * provider-pluggable: the action surface (sendEnvelope / getEnvelopeStatus /\n * downloadDocument) is vendor-neutral and every DocuSign shape stays inside\n * this module. `DOCUSIGN_BASE_URL` carries the account-scoped REST base;\n * `DOCUSIGN_ACCESS_TOKEN` the OAuth token (JWT-grant rotation is the\n * deployment's concern — the token is read per call so a rotated env value\n * takes effect without restart).\n */\nexport class EsignIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n\n if (!config.env.DOCUSIGN_BASE_URL || !config.env.DOCUSIGN_ACCESS_TOKEN) {\n throw new Error('DOCUSIGN_BASE_URL / DOCUSIGN_ACCESS_TOKEN not configured');\n }\n\n this.logger.info('E-sign integration initialized (DocuSign)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendEnvelope':\n data = await this.executeWithRetry(() => this.sendEnvelope(params));\n break;\n case 'getEnvelopeStatus':\n data = await this.executeWithRetry(() => this.getEnvelopeStatus(params));\n break;\n case 'downloadDocument':\n data = await this.executeWithRetry(() => this.downloadDocument(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async dsRequest(\n path: string,\n init?: { method?: string; body?: unknown; raw?: boolean },\n ): Promise<unknown> {\n const base = this.config.env.DOCUSIGN_BASE_URL.replace(/\\/$/, '');\n const response = await fetch(`${base}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: init?.raw ? 'application/pdf' : 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.env.DOCUSIGN_ACCESS_TOKEN}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(30000),\n });\n if (response.status >= 500) {\n throw new Error(`DocuSign returned ${response.status}`);\n }\n if (!response.ok) {\n const detail = await response.text();\n throw new Error(`DocuSign error ${response.status}: ${detail.slice(0, 300)}`);\n }\n if (init?.raw) {\n return Buffer.from(await response.arrayBuffer());\n }\n return response.json();\n }\n\n private async sendEnvelope(params: IntegrationParams) {\n const { recipientEmail, recipientName, documentName, documentContent, emailSubject } = params;\n const rawContent = documentContent as string;\n // Accept a data URL or raw base64.\n const base64 = rawContent.startsWith('data:') ? rawContent.slice(rawContent.indexOf(',') + 1) : rawContent;\n const body = (await this.dsRequest('/envelopes', {\n method: 'POST',\n body: {\n emailSubject: (emailSubject as string) || `Please sign: ${documentName as string}`,\n status: 'sent',\n documents: [\n {\n documentBase64: base64,\n name: documentName as string,\n fileExtension: String(documentName).split('.').pop() || 'pdf',\n documentId: '1',\n },\n ],\n recipients: {\n signers: [\n {\n email: recipientEmail as string,\n name: recipientName as string,\n recipientId: '1',\n routingOrder: '1',\n },\n ],\n },\n },\n })) as { envelopeId?: string; status?: string };\n return { envelopeId: body.envelopeId ?? '', status: body.status ?? 'sent' };\n }\n\n private async getEnvelopeStatus(params: IntegrationParams) {\n const { envelopeId } = params;\n const body = (await this.dsRequest(`/envelopes/${envelopeId as string}`)) as {\n status?: string;\n completedDateTime?: string;\n };\n return { status: body.status ?? '', completedAt: body.completedDateTime ?? '' };\n }\n\n private async downloadDocument(params: IntegrationParams) {\n const { envelopeId } = params;\n const bytes = (await this.dsRequest(`/envelopes/${envelopeId as string}/documents/combined`, {\n raw: true,\n })) as Buffer;\n return { content: bytes.toString('base64'), documentName: `envelope-${envelopeId as string}.pdf` };\n }\n}\n\n// Auto-register\nregisterIntegration('esign', EsignIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n EmbeddingClient,\n getAvailableProvider,\n type LLMCallOptions,\n type LLMProvider,\n} from '@almadar/llm';\nimport { z } from 'zod';\n\n/**\n * LLM integration using @almadar/llm\n *\n * Provides 5 actions:\n * - generate: Generate text content from a prompt\n * - classify: Classify text into predefined categories\n * - extract: Extract structured data from text using a schema\n * - summarize: Summarize long text content\n * - embed: Generate embeddings for an array of texts\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private embeddings: EmbeddingClient | null = null;\n private provider: LLMProvider;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n // Determine provider from config or auto-detect from available API keys\n const configuredProvider = config.env.PROVIDER as LLMProvider | undefined;\n this.provider = configuredProvider || getAvailableProvider() || 'anthropic';\n\n this.logger.info(`LLM integration initialized (provider: ${this.provider})`);\n }\n\n /**\n * Lazily create client — avoids throwing on construction if API key is missing.\n * The client will throw a clear error when actually used without a key.\n */\n private getClient(): LLMClient {\n if (!this.client) {\n this.client = new LLMClient({\n provider: this.provider,\n temperature: 0.7,\n trackTokens: true,\n });\n }\n return this.client;\n }\n\n /**\n * Lazily create the embeddings client. Embeddings route through a dedicated\n * embedding model (default OpenRouter `baai/bge-base-en-v1.5`, matching\n * `@almadar/curation-core`), independent of the chat provider/key, because\n * most chat providers do not expose an embeddings endpoint. Override via\n * `EMBEDDING_PROVIDER` / `EMBEDDING_MODEL` / `EMBEDDING_API_KEY`.\n */\n private getEmbeddings(): EmbeddingClient {\n if (!this.embeddings) {\n this.embeddings = new EmbeddingClient({\n provider: (this.config.env.EMBEDDING_PROVIDER as 'openai' | 'openrouter') ?? 'openrouter',\n model: this.config.env.EMBEDDING_MODEL ?? 'baai/bge-base-en-v1.5',\n apiKey: this.config.env.EMBEDDING_API_KEY,\n });\n }\n return this.embeddings;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'generate':\n data = await this.executeWithRetry(() => this.generate(params));\n break;\n case 'classify':\n data = await this.executeWithRetry(() => this.classify(params));\n break;\n case 'extract':\n data = await this.executeWithRetry(() => this.extract(params));\n break;\n case 'summarize':\n data = await this.executeWithRetry(() => this.summarize(params));\n break;\n case 'embed':\n data = await this.executeWithRetry(() => this.embed(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async generate(params: IntegrationParams) {\n const {\n systemPrompt,\n userPrompt,\n model,\n temperature,\n maxTokens,\n } = params as {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n\n this.logger.debug('Generating content', { model, temperature });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: temperature ?? 0.7 })\n : this.getClient();\n\n const response = await client.callWithMetadata<string>({\n systemPrompt: systemPrompt || 'You are a helpful assistant.',\n userPrompt,\n maxTokens: maxTokens ?? 1024,\n temperature,\n skipSchemaValidation: true,\n });\n\n return {\n content: response.data,\n usage: response.usage\n ? {\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n totalTokens: response.usage.totalTokens,\n }\n : { tokens: 0 },\n };\n }\n\n private async classify(params: IntegrationParams) {\n const { text, categories, model } = params as {\n text: string;\n categories: string[];\n model?: string;\n };\n\n this.logger.debug('Classifying text', { categories: categories.join(', ') });\n\n const ClassificationSchema = z.object({\n category: z.enum(categories as [string, ...string[]]),\n confidence: z.number().min(0).max(1),\n reasoning: z.string(),\n });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.1 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text classifier. Classify the given text into one of these categories: ${categories.join(', ')}. Return JSON with: category, confidence (0-1), and reasoning.`,\n userPrompt: text,\n schema: ClassificationSchema,\n temperature: 0.1,\n });\n\n return result;\n }\n\n private async extract(params: IntegrationParams) {\n const { text, schema, model } = params as {\n text: string;\n schema: IntegrationParams;\n model?: string;\n };\n\n this.logger.debug('Extracting structured data', { schema: String(schema ?? '') });\n\n // Build a Zod schema from the JSON schema description.\n // For complex schemas, we use z.record to accept any shape and let the LLM\n // follow the schema description in the prompt.\n const ExtractSchema = z.record(z.unknown());\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.2 })\n : this.getClient();\n\n const schemaDescription = JSON.stringify(schema, null, 2);\n\n const result = await client.call({\n systemPrompt: `You are a structured data extractor. Extract data from the given text according to this schema:\\n\\n${schemaDescription}\\n\\nReturn ONLY valid JSON matching the schema.`,\n userPrompt: text,\n schema: ExtractSchema,\n temperature: 0.2,\n skipSchemaValidation: true,\n });\n\n return result;\n }\n\n private async summarize(params: IntegrationParams) {\n const { text, maxLength, style, model } = params as {\n text: string;\n maxLength?: number;\n style?: string;\n model?: string;\n };\n\n this.logger.debug('Summarizing text', { maxLength, style });\n\n const SummarySchema = z.object({\n summary: z.string(),\n keyPoints: z.array(z.string()),\n });\n\n const styleInstructions = style === 'bullet'\n ? 'Use bullet points.'\n : style === 'detailed'\n ? 'Be thorough and detailed.'\n : 'Be concise.';\n\n const lengthInstructions = maxLength\n ? `Keep the summary under ${maxLength} words.`\n : '';\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.3 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text summarizer. ${styleInstructions} ${lengthInstructions} Return JSON with: summary (string) and keyPoints (array of strings).`,\n userPrompt: text,\n schema: SummarySchema,\n temperature: 0.3,\n });\n\n return result;\n }\n\n private async embed(params: IntegrationParams) {\n const { texts } = params as { texts: string[] };\n\n if (!Array.isArray(texts)) {\n throw new Error('llm.embed: `texts` must be an array of strings');\n }\n\n this.logger.debug('Embedding texts', { count: texts.length });\n\n const batch = await this.getEmbeddings().embedBatch(texts);\n return { embeddings: batch.embeddings };\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport { IntegrationError } from '../../types';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type { ServiceParams, ServiceParamsValue } from '@almadar/core';\n\n/**\n * ML integration — model inference via a deployed serving orbital.\n *\n * The serving orbital is a separate compiled app (Python/PyTorch) with no\n * dedicated inference route; it is reached through the generic per-trait\n * event endpoint every compiled Almadar app exposes: `POST\n * /api/<kebab-trait>/events`. This integration posts an `INFER` event and\n * reads the prediction back out of the returned `effectResults` — the\n * `emit` effect result whose `data.event` matches `INFERRED_EVENT`.\n *\n * Provides 1 action:\n * - infer: Run inference against a deployed model checkpoint\n */\n\n/** Success/failure event names the serving orbital's `INFER` transition emits — mirrors `std-ml-infer`'s own emit vocabulary. */\nconst INFERRED_EVENT = 'INFERRED';\nconst INFER_FAILED_EVENT = 'INFER_FAILED';\n\nconst DEFAULT_TIMEOUT_MS = 60_000; // masar scales to zero — cold starts run long.\n\ninterface MLEffectResult {\n effect: string;\n action?: string;\n entityType?: string;\n data?: ServiceParamsValue;\n success: boolean;\n error?: string;\n}\n\ninterface MLEventsResponse {\n success: boolean;\n newState?: string;\n data?: Record<string, ServiceParamsValue>;\n effectResults?: MLEffectResult[];\n error?: string;\n}\n\ninterface InferResult {\n output: ServiceParamsValue;\n confidence: number;\n violations: readonly ServiceParamsValue[];\n}\n\nfunction isServiceParams(value: ServiceParamsValue | undefined): value is ServiceParams {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/**\n * Find the `INFERRED` emit result in the serving orbital's `effectResults`\n * and pull `{ output, confidence, violations }` out of its payload. Returns\n * `null` on any shape mismatch — the caller turns that into a typed failure,\n * never a fabricated result.\n */\nfunction extractInferResult(response: MLEventsResponse): InferResult | null {\n const emitted = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && result.success && isServiceParams(result.data) && result.data.event === INFERRED_EVENT,\n );\n if (!emitted || !isServiceParams(emitted.data)) {\n return null;\n }\n\n const payload = emitted.data.payload;\n if (!isServiceParams(payload)) {\n return null;\n }\n\n if (!('output' in payload) || typeof payload.confidence !== 'number' || !Array.isArray(payload.violations)) {\n return null;\n }\n\n return {\n output: payload.output,\n confidence: payload.confidence,\n violations: payload.violations,\n };\n}\n\nexport class MLIntegration extends BaseIntegration {\n private readonly eventsUrl: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const baseUrl = config.env.MASAR_URL;\n const traitPrefix = config.env.MASAR_ML_TRAIT;\n if (!baseUrl || !traitPrefix) {\n throw new Error(\n 'ML integration requires MASAR_URL (serving orbital host) and MASAR_ML_TRAIT (kebab-case trait name of its /events route) to be configured',\n );\n }\n\n this.eventsUrl = `${baseUrl.replace(/\\/+$/, '')}/api/${traitPrefix}/events`;\n this.timeoutMs = config.env.MASAR_ML_TIMEOUT_MS ? Number(config.env.MASAR_ML_TIMEOUT_MS) : DEFAULT_TIMEOUT_MS;\n\n this.logger.info('ML integration initialized', { eventsUrl: this.eventsUrl });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'infer':\n data = await this.executeWithRetry(() => this.infer(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async infer(params: IntegrationParams): Promise<InferResult> {\n const { model, input } = params as { model: string; input: ServiceParamsValue };\n\n this.logger.debug('Running ML inference', { model });\n\n const response = await this.postEvent(model, input);\n\n if (!response.success) {\n throw new IntegrationError(\n `ML service reported failure: ${response.error ?? 'unknown error'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const failed = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && isServiceParams(result.data) && result.data.event === INFER_FAILED_EVENT,\n );\n if (failed) {\n throw new IntegrationError(\n `ML service could not infer: ${failed.error ?? 'model unavailable'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const inferred = extractInferResult(response);\n if (!inferred) {\n throw new IntegrationError(\n 'ML service response did not include a valid inference result',\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n return inferred;\n }\n\n private async postEvent(model: string, input: ServiceParamsValue): Promise<MLEventsResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let httpResponse: Response;\n try {\n httpResponse = await fetch(this.eventsUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ event: 'INFER', payload: { model, input } }),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new IntegrationError(\n `ML service request timed out after ${this.timeoutMs}ms (model may be cold-starting)`,\n 'TIMEOUT_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n }\n throw new IntegrationError(\n `ML service request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n } finally {\n clearTimeout(timer);\n }\n\n if (!httpResponse.ok) {\n const body = await httpResponse.text().catch(() => '');\n throw new IntegrationError(\n `ML service responded with status ${httpResponse.status}`,\n 'SERVICE_ERROR',\n { model, status: httpResponse.status, body },\n );\n }\n\n try {\n return (await httpResponse.json()) as MLEventsResponse;\n } catch (error) {\n throw new IntegrationError(\n `ML service returned a malformed response body: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { model },\n );\n }\n }\n}\n\n// Auto-register\nregisterIntegration('ml', MLIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * DeepAgent integration for AI code generation\n */\nexport class DeepAgentIntegration extends BaseIntegration {\n private apiUrl: string;\n private apiKey: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.apiUrl = config.env.DEEPAGENT_API_URL || 'http://localhost:3000';\n this.apiKey = config.env.DEEPAGENT_API_KEY || '';\n\n this.logger.info('DeepAgent integration initialized', { apiUrl: this.apiUrl });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'sendMessage':\n data = await this.executeWithRetry(() => this.sendMessage(params));\n break;\n case 'cancelGeneration':\n data = await this.executeWithRetry(() =>\n this.cancelGeneration(params),\n );\n break;\n case 'validateSchema':\n data = await this.executeWithRetry(() => this.validateSchema(params));\n break;\n case 'compileSchema':\n data = await this.executeWithRetry(() => this.compileSchema(params));\n break;\n case 'getThreadHistory':\n data = await this.executeWithRetry(() =>\n this.getThreadHistory(params),\n );\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async sendMessage(params: IntegrationParams) {\n const { message, threadId, skill, context } = params;\n\n this.logger.debug('Sending message to DeepAgent', { threadId: String(threadId ?? ''), skill: String(skill ?? '') });\n\n const response = await this.request('/api/agent/message', {\n message,\n threadId,\n skill,\n context,\n });\n\n return response;\n }\n\n private async cancelGeneration(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Cancelling generation', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/cancel', {\n threadId,\n });\n\n return response;\n }\n\n private async validateSchema(params: IntegrationParams) {\n const { schema } = params;\n\n this.logger.debug('Validating schema');\n\n const response = await this.request('/api/schema/validate', {\n schema,\n });\n\n return response;\n }\n\n private async compileSchema(params: IntegrationParams) {\n const { schema, shell } = params;\n\n this.logger.debug('Compiling schema', { shell: String(shell ?? '') });\n\n const response = await this.request('/api/schema/compile', {\n schema,\n shell,\n });\n\n return response;\n }\n\n private async getThreadHistory(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Getting thread history', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/history', {\n threadId,\n });\n\n return response;\n }\n\n private async request(endpoint: string, body: IntegrationParams) {\n const url = `${this.apiUrl}${endpoint}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `DeepAgent request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return await response.json();\n }\n}\n\n// Auto-register\nregisterIntegration('deepagent', DeepAgentIntegration);\n","/**\n * Git CLI operations for GitHub integration\n */\n\nimport { spawn } from 'child_process';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubInitParams,\n GitHubPullParams,\n GitHubPullResult,\n GitHubAddRemoteParams,\n GitHubSetUserConfigParams,\n GitHubRenameBranchParams,\n} from './types';\nimport type { GitHubCommit } from './github-api';\n\n/**\n * Execute a git command\n */\nasync function execGit(\n args: string[],\n cwd: string,\n env?: Record<string, string>\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd,\n env: { ...process.env, ...env },\n stdio: 'pipe',\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n } else {\n reject(\n new IntegrationError(\n `Git command failed: ${args.join(' ')}\\n${stderr}`,\n 'SERVICE_ERROR',\n { code, stderr }\n )\n );\n }\n });\n\n proc.on('error', (error) => {\n reject(\n new IntegrationError(\n `Failed to execute git: ${error.message}`,\n 'SERVICE_ERROR',\n { error }\n )\n );\n });\n });\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n params: GitHubCloneParams,\n token: string\n): Promise<void> {\n const { repoUrl, targetDir, branch, depth = 1 } = params;\n\n // Inject token into URL for authentication\n const authUrl = injectTokenIntoUrl(repoUrl, token);\n\n const args = ['clone'];\n\n if (depth > 0) {\n args.push('--depth', depth.toString());\n }\n\n if (branch) {\n args.push('--branch', branch);\n }\n\n args.push(authUrl, targetDir);\n\n try {\n await execGit(args, process.cwd());\n\n // Immediately scrub the token from git config\n await scrubTokenFromRemote(targetDir, repoUrl);\n } catch (error) {\n throw new IntegrationError(\n `Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { repoUrl, error }\n );\n }\n}\n\n/**\n * Create a new branch\n */\nexport async function createBranch(\n params: GitHubCreateBranchParams,\n workDir: string\n): Promise<void> {\n const { branchName, baseBranch } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // If baseBranch is specified, check it out first\n if (baseBranch) {\n await execGit(['checkout', baseBranch], cwd);\n }\n\n // Create and checkout new branch\n await execGit(['checkout', '-b', branchName], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to create branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, baseBranch, error }\n );\n }\n}\n\n/**\n * Commit changes\n */\nexport async function commit(\n params: GitHubCommitParams,\n workDir: string\n): Promise<void> {\n const { message, files } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // Stage files\n if (files && files.length > 0) {\n await execGit(['add', ...files], cwd);\n } else {\n // Stage all changes\n await execGit(['add', '.'], cwd);\n }\n\n // Commit\n await execGit(['commit', '-m', message], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { message, error }\n );\n }\n}\n\n/**\n * Push branch to remote\n */\nexport async function push(\n params: GitHubPushParams,\n workDir: string,\n token: string\n): Promise<void> {\n const { branchName, force = false } = params;\n const cwd = params.workDir || workDir;\n\n // Security: Never allow force push to protected branches\n const protectedBranches = ['main', 'master', 'production', 'prod'];\n if (force && protectedBranches.includes(branchName.toLowerCase())) {\n throw new IntegrationError(\n `Force push to protected branch '${branchName}' is not allowed`,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // Create a temporary credential helper script\n const credHelper = await createTempCredentialHelper(token);\n\n const args = ['push'];\n\n if (force) {\n args.push('--force');\n }\n\n args.push('-u', 'origin', branchName);\n\n // Use GIT_ASKPASS for authentication\n await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n\n // Clean up credential helper\n await fs.unlink(credHelper);\n } catch (error) {\n throw new IntegrationError(\n `Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, error }\n );\n }\n}\n\n/**\n * Inject token into repository URL for authentication\n */\nfunction injectTokenIntoUrl(repoUrl: string, token: string): string {\n const url = new URL(repoUrl);\n url.username = 'x-access-token';\n url.password = token;\n return url.toString();\n}\n\n/**\n * Remove token from git remote URL (security measure)\n */\nasync function scrubTokenFromRemote(workDir: string, originalUrl: string): Promise<void> {\n try {\n // Parse the URL to ensure it's clean (no credentials)\n const url = new URL(originalUrl);\n url.username = '';\n url.password = '';\n const cleanUrl = url.toString();\n\n await execGit(['remote', 'set-url', 'origin', cleanUrl], workDir);\n } catch (error) {\n // Log but don't fail - the clone succeeded\n console.error('Warning: Failed to scrub token from remote URL:', error);\n }\n}\n\n/**\n * Create a temporary credential helper script for GIT_ASKPASS\n */\nasync function createTempCredentialHelper(token: string): Promise<string> {\n const tmpDir = process.env.TMPDIR || '/tmp';\n const helperPath = join(tmpDir, `git-cred-${Date.now()}.sh`);\n\n const script = `#!/bin/sh\\necho \"${token}\"`;\n\n await fs.writeFile(helperPath, script, { mode: 0o700 });\n\n return helperPath;\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['branch', '--show-current'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Check if working directory has uncommitted changes\n */\nexport async function hasUncommittedChanges(workDir: string): Promise<boolean> {\n try {\n const { stdout } = await execGit(['status', '--porcelain'], workDir);\n return stdout.trim().length > 0;\n } catch (error) {\n throw new IntegrationError(\n `Failed to check git status: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Initialize a git repository in `workDir`. No-op when `.git/` already\n * exists. The default initial branch is `main` to match what GitHub\n * creates for new repos.\n */\nexport async function init(params: GitHubInitParams): Promise<void> {\n const { workDir, initialBranch = 'main' } = params;\n try {\n // `git init -b <branch>` works on git >= 2.28; the runtime ships 2.x.\n // The command is idempotent — re-running on an existing repo just\n // re-asserts the initial branch ref (no error).\n await execGit(['init', '-b', initialBranch], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to git init: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { workDir, error }\n );\n }\n}\n\n/**\n * Add a remote to the repository. Used after `init` to attach the\n * freshly-created GitHub remote as `origin`.\n */\nexport async function addRemote(params: GitHubAddRemoteParams): Promise<void> {\n const { name, url, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n throw new IntegrationError(\n `addRemote requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n try {\n await execGit(['remote', 'add', name, url], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to add remote ${name}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { name, error }\n );\n }\n}\n\n/**\n * Set `user.name` and `user.email` for git commits. Scope defaults to\n * per-repo (`--local`) so each workspace can carry the GitHub identity\n * of the user who owns it — global config would clobber the developer's\n * own machine settings.\n */\nexport async function setUserConfig(params: GitHubSetUserConfigParams): Promise<void> {\n const { userName, userEmail, scope = 'local', workDir } = params;\n const scopeFlag = scope === 'global' ? '--global' : '--local';\n if (scope === 'local' && !workDir) {\n throw new IntegrationError(\n `setUserConfig with scope='local' requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n const cwd = workDir ?? process.cwd();\n try {\n await execGit(['config', scopeFlag, 'user.name', userName], cwd);\n await execGit(['config', scopeFlag, 'user.email', userEmail], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to set git user config: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Pull from the remote. Returns a structured outcome so callers can\n * tell \"the workspace advanced\" from \"nothing changed because <X>\"\n * without parsing git's stderr. Best-effort posture: network / conflict\n * / no-upstream all resolve cleanly rather than throwing — the caller\n * decides whether to surface the no-op as user-facing.\n */\nexport async function pull(\n params: GitHubPullParams,\n token: string,\n): Promise<GitHubPullResult> {\n const { branchName, ffOnly = true, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n return { updated: false, reason: 'no-upstream' };\n }\n\n let credHelper: string | null = null;\n try {\n credHelper = await createTempCredentialHelper(token);\n const args = ['pull'];\n if (ffOnly) args.push('--ff-only');\n args.push('origin', branchName);\n\n const { stdout } = await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n // `git pull` prints \"Already up to date.\" when there's nothing to\n // fetch. Anything else (Updating, Fast-forward, +n -m line) means\n // the working tree actually moved.\n const updated = !/^Already up to date\\.?\\s*$/m.test(stdout.trim());\n return updated ? { updated: true } : { updated: false, reason: 'up-to-date' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Heuristics on git's stderr text — exit codes are too coarse to\n // discriminate the cases.\n if (/no upstream|no such ref|couldn't find remote ref/i.test(message)) {\n return { updated: false, reason: 'no-upstream' };\n }\n if (/conflict|not possible to fast-forward|divergent/i.test(message)) {\n return { updated: false, reason: 'conflict' };\n }\n return { updated: false, reason: 'network' };\n } finally {\n if (credHelper) {\n try { await fs.unlink(credHelper); } catch { /* best-effort */ }\n }\n }\n}\n\n/**\n * Return the current HEAD commit sha (full 40-char). Throws when the\n * workspace has no commits yet (caller decides whether that's an error\n * or an \"init, then commit, then read\" sequencing issue).\n */\nexport async function getHeadSha(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['rev-parse', 'HEAD'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get HEAD sha: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Return the current HEAD commit as a `GitHubCommit` shape. Reuses the\n * canonical type from the REST module (no parallel `LocalCommit`\n * interface). `stats` is absent — that's GitHub-API-only and would\n * require a separate fetch to populate.\n *\n * The format string uses NUL (`%x00`) as a field separator so commit\n * messages containing newlines / pipes can't break parsing.\n */\nexport async function getHeadCommit(workDir: string): Promise<GitHubCommit> {\n try {\n const FORMAT = '%H%x00%an%x00%ae%x00%aI%x00%B';\n const { stdout } = await execGit(\n ['show', '--no-patch', `--format=${FORMAT}`, 'HEAD'],\n workDir,\n );\n const [sha, name, email, date, ...messageParts] = stdout.split('\\x00');\n return {\n sha: sha.trim(),\n message: messageParts.join('\\x00').trimEnd(),\n author: {\n name: name?.trim() ?? '',\n email: email?.trim() ?? '',\n date: date?.trim() ?? '',\n },\n };\n } catch (error) {\n throw new IntegrationError(\n `Failed to read HEAD commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Rename the current branch with `git branch -M <newName>`. The `-M`\n * (capital) flag forces the rename even if a branch with that name\n * already exists, which is fine for our use case (aligning a fresh\n * local workspace's branch with the linked repo's default branch).\n */\nexport async function renameCurrentBranch(params: GitHubRenameBranchParams): Promise<void> {\n const { newName, workDir } = params;\n try {\n await execGit(['branch', '-M', newName], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to rename branch to ${newName}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { newName, error }\n );\n }\n}\n","/**\n * GitHub REST API client\n */\n\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCreateRepoParams,\n GitHubRepoCreated,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubGetFileParams,\n GitHubFileContent,\n GitHubListCommitsParams,\n GitHubCommitSummary,\n GitHubCreateIssueParams,\n GitHubIssueCreated,\n GitHubPullRequest,\n GitHubIssue,\n GitHubComment,\n GitHubRateLimit,\n} from './types';\n\n/**\n * GitHub API client configuration\n */\nexport interface GitHubAPIConfig {\n token: string;\n owner: string;\n repo: string;\n}\n\n/**\n * GitHub API response\n */\ninterface GitHubAPIResponse<T> {\n data: T;\n rateLimit: GitHubRateLimit;\n}\n\n/**\n * Execute a GitHub API request\n */\nasync function githubFetch<T>(\n endpoint: string,\n config: GitHubAPIConfig,\n options: RequestInit = {}\n): Promise<GitHubAPIResponse<T>> {\n const url = `https://api.github.com${endpoint}`;\n\n const headers = {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Extract rate limit info\n const rateLimit: GitHubRateLimit = {\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\n limit: parseInt(response.headers.get('x-ratelimit-limit') || '5000', 10),\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\n };\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n\n // Handle rate limiting\n if (response.status === 429) {\n throw new IntegrationError(\n 'GitHub API rate limit exceeded',\n 'RATE_LIMIT_ERROR',\n { rateLimit, error }\n );\n }\n\n // Handle authentication errors\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationError(\n `GitHub API authentication failed: ${error.message || response.statusText}`,\n 'AUTH_ERROR',\n { status: response.status, error }\n );\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error.message || response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status, error }\n );\n }\n\n const data = await response.json();\n\n return { data, rateLimit };\n } catch (error) {\n if (error instanceof IntegrationError) {\n throw error;\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { error }\n );\n }\n}\n\n/**\n * GAP-104/105: Create a new repository for the authenticated user.\n * The token must have the `repo` scope.\n */\nexport async function createRepo(\n params: GitHubCreateRepoParams,\n token: string,\n): Promise<GitHubRepoCreated> {\n const { name, isPrivate = true, description, autoInit = true } = params;\n\n const response = await fetch('https://api.github.com/user/repos', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n name,\n private: isPrivate,\n description: description ?? 'Generated by Almadar Studio',\n auto_init: autoInit,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new IntegrationError(\n `Failed to create GitHub repository \"${name}\": ${response.status} ${err}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n const repo = await response.json() as {\n clone_url: string;\n owner: { login: string };\n name: string;\n default_branch: string;\n full_name: string;\n };\n\n return {\n repoUrl: repo.clone_url,\n owner: repo.owner.login,\n repo: repo.name,\n defaultBranch: repo.default_branch,\n fullName: repo.full_name,\n };\n}\n\n/**\n * GAP-104/105: List the file tree of a repository using the Git Trees API.\n * Returns a flat list of all files in one request (recursive=1).\n */\nexport async function listRepoTree(\n config: GitHubAPIConfig,\n branch?: string,\n): Promise<Array<{ path: string; type: 'blob' | 'tree'; size?: number }>> {\n const ref = branch ?? 'main';\n const { data } = await githubFetch<{ tree: Array<{ path: string; type: string; size?: number }> }>(\n `/repos/${config.owner}/${config.repo}/git/trees/${ref}?recursive=1`,\n config,\n );\n return data.tree.map(entry => ({\n path: entry.path,\n type: entry.type as 'blob' | 'tree',\n size: entry.size,\n }));\n}\n\n/**\n * GAP-104/105: Read a single file's content from a repository.\n */\nexport async function readRepoFile(\n config: GitHubAPIConfig,\n filePath: string,\n branch?: string,\n): Promise<string | null> {\n const ref = branch ? `?ref=${branch}` : '';\n try {\n const response = await fetch(\n `https://api.github.com/repos/${config.owner}/${config.repo}/contents/${filePath}${ref}`,\n {\n headers: {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n },\n );\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n\n/**\n * Create a pull request\n */\nexport async function createPR(\n params: GitHubCreatePRParams,\n config: GitHubAPIConfig\n): Promise<GitHubPullRequest> {\n const { title, body, baseBranch, headBranch, draft = false } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls`;\n\n const { data } = await githubFetch<GitHubPullRequest>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({\n title,\n body,\n base: baseBranch,\n head: headBranch,\n draft,\n }),\n });\n\n return data;\n}\n\n/**\n * Get pull request comments\n */\nexport async function getPRComments(\n params: GitHubGetPRCommentsParams,\n config: GitHubAPIConfig\n): Promise<GitHubComment[]> {\n const { prNumber } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls/${prNumber}/comments`;\n\n const { data } = await githubFetch<GitHubComment[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * List repository issues\n */\nexport async function listIssues(\n params: GitHubListIssuesParams,\n config: GitHubAPIConfig\n): Promise<GitHubIssue[]> {\n const { state = 'open', labels = [], per_page = 30 } = params;\n\n const queryParams = new URLSearchParams({\n state,\n per_page: Math.min(per_page, 100).toString(),\n });\n\n if (labels.length > 0) {\n queryParams.append('labels', labels.join(','));\n }\n\n const endpoint = `/repos/${config.owner}/${config.repo}/issues?${queryParams}`;\n\n const { data } = await githubFetch<GitHubIssue[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * Get issue details\n */\nexport async function getIssue(\n params: GitHubGetIssueParams,\n config: GitHubAPIConfig\n): Promise<{ issue: GitHubIssue; comments: GitHubComment[] }> {\n const { issueNumber } = params;\n\n // Get issue details\n const issueEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}`;\n const { data: issue } = await githubFetch<GitHubIssue>(issueEndpoint, config);\n\n // Get issue comments\n const commentsEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}/comments`;\n const { data: comments } = await githubFetch<GitHubComment[]>(commentsEndpoint, config);\n\n return { issue, comments };\n}\n\n/**\n * Get current rate limit status\n */\nexport async function getRateLimit(config: GitHubAPIConfig): Promise<GitHubRateLimit> {\n const endpoint = '/rate_limit';\n\n const { data } = await githubFetch<{ rate: GitHubRateLimit }>(endpoint, config);\n\n return data.rate;\n}\n\n// ============================================================================\n// Git History API\n// ============================================================================\n\n/**\n * A commit from the GitHub API with optional stats.\n */\nexport interface GitHubCommit {\n sha: string;\n message: string;\n author: { name: string; email: string; date: string };\n stats?: { additions: number; deletions: number; total: number };\n}\n\n/**\n * List commits for a repository, optionally filtered by file path.\n */\nexport async function listCommits(\n config: GitHubAPIConfig,\n options?: { path?: string; ref?: string; perPage?: number; page?: number },\n): Promise<GitHubCommit[]> {\n const params = new URLSearchParams();\n if (options?.path) params.set('path', options.path);\n if (options?.ref) params.set('sha', options.ref);\n if (options?.perPage) params.set('per_page', options.perPage.toString());\n if (options?.page) params.set('page', options.page.toString());\n\n const queryStr = params.toString();\n const endpoint = `/repos/${config.owner}/${config.repo}/commits${queryStr ? `?${queryStr}` : ''}`;\n\n const { data } = await githubFetch<Array<{\n sha: string;\n commit: {\n message: string;\n author: { name: string; email: string; date: string };\n };\n stats?: { additions: number; deletions: number; total: number };\n }>>(endpoint, config);\n\n return data.map((item) => ({\n sha: item.sha,\n message: item.commit.message,\n author: item.commit.author,\n stats: item.stats,\n }));\n}\n\n/**\n * Get the diff for a specific commit as a unified diff string.\n */\nexport async function getCommitDiff(\n config: GitHubAPIConfig,\n sha: string,\n): Promise<string> {\n const url = `https://api.github.com/repos/${config.owner}/${config.repo}/commits/${sha}`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.diff',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n throw new IntegrationError(\n `GitHub API request failed: ${response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n return response.text();\n}\n\n/**\n * Get a file's content at a specific commit SHA.\n * Returns null if the file doesn't exist at that commit.\n */\nexport async function getFileAtCommit(\n config: GitHubAPIConfig,\n path: string,\n sha: string,\n): Promise<string | null> {\n const endpoint = `/repos/${config.owner}/${config.repo}/contents/${path}?ref=${sha}`;\n\n try {\n const response = await fetch(`https://api.github.com${endpoint}`, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) return null;\n throw new Error(`${response.status}: ${response.statusText}`);\n }\n\n return response.text();\n } catch (error) {\n if (error instanceof IntegrationError) throw error;\n throw new IntegrationError(\n `Failed to get file at commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { path, sha, error },\n );\n }\n}\n\n/**\n * Get a file's content plus metadata (sha, size) — the `getFile` contract\n * action. Unlike `getFileAtCommit` (raw bytes only, no sha/size), this reads\n * the JSON contents API to satisfy the declared response shape in one call,\n * and takes owner/repo per-call rather than from a pre-resolved config.\n */\nexport async function getFile(\n params: GitHubGetFileParams,\n token: string,\n): Promise<GitHubFileContent> {\n const { owner, repo, path, ref } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : '';\n const endpoint = `/repos/${owner}/${repo}/contents/${path}${query}`;\n\n const { data } = await githubFetch<{\n path: string;\n sha: string;\n size: number;\n content: string;\n encoding: string;\n }>(endpoint, config);\n\n const content =\n data.encoding === 'base64' ? Buffer.from(data.content, 'base64').toString('utf-8') : data.content;\n\n return { path: data.path, content, sha: data.sha, size: data.size };\n}\n\n/**\n * List commits shaped for the `listCommits` contract action — per-call\n * owner/repo, and the flattened author-name + date the declared response\n * requires (the raw API nests author under `commit.author`).\n */\nexport async function listCommitsSummary(\n params: GitHubListCommitsParams,\n token: string,\n): Promise<GitHubCommitSummary[]> {\n const { owner, repo, path, ref, per_page } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n\n const commits = await listCommits(config, { path, ref, perPage: per_page });\n\n return commits.map((commit) => ({\n sha: commit.sha,\n message: commit.message,\n author: commit.author.name,\n date: commit.author.date,\n }));\n}\n\n/**\n * Create an issue — the `createIssue` contract action.\n */\nexport async function createIssue(\n params: GitHubCreateIssueParams,\n token: string,\n): Promise<GitHubIssueCreated> {\n const { owner, repo, title, body, labels } = params;\n const config: GitHubAPIConfig = { token, owner, repo };\n const endpoint = `/repos/${owner}/${repo}/issues`;\n\n const { data } = await githubFetch<GitHubIssue>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({ title, body, labels }),\n });\n\n return { number: data.number, title: data.title, url: data.url };\n}\n\n/**\n * Parse repository owner and name from URL\n */\nexport function parseRepoUrl(repoUrl: string): { owner: string; repo: string } {\n try {\n const url = new URL(repoUrl);\n const pathParts = url.pathname.split('/').filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error('Invalid repository URL format');\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1].replace(/\\.git$/, '');\n\n return { owner, repo };\n } catch (error) {\n throw new IntegrationError(\n `Failed to parse repository URL: ${repoUrl}`,\n 'VALIDATION_ERROR',\n { error }\n );\n }\n}\n","/**\n * GitHub Integration for Almadar\n * Provides git operations and GitHub API access for the agent\n */\n\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport * as GitOps from './github-git';\nimport * as GitHubAPI from './github-api';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubGetFileParams,\n GitHubListCommitsParams,\n GitHubCreateIssueParams,\n} from './types';\n\n/**\n * GitHub integration class\n */\nexport class GitHubIntegration extends BaseIntegration {\n private token: string;\n private owner: string;\n private repo: string;\n private workDir: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.token = config.env.GITHUB_TOKEN;\n if (!this.token) {\n throw new Error('GITHUB_TOKEN not configured');\n }\n\n this.owner = config.env.GITHUB_OWNER || '';\n this.repo = config.env.GITHUB_REPO || '';\n this.workDir = config.env.GITHUB_WORK_DIR || process.cwd();\n\n this.logger.info('GitHub integration initialized', {\n owner: this.owner,\n repo: this.repo,\n });\n }\n\n /**\n * Execute a GitHub action\n */\n async execute(\n action: string,\n params: IntegrationParams\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'cloneRepo':\n data = await this.executeWithRetry(() =>\n this.cloneRepo(params as GitHubCloneParams)\n );\n break;\n\n case 'createBranch':\n data = await this.executeWithRetry(() =>\n this.createBranch(params as GitHubCreateBranchParams)\n );\n break;\n\n case 'commit':\n data = await this.executeWithRetry(() =>\n this.commit(params as GitHubCommitParams)\n );\n break;\n\n case 'push':\n data = await this.executeWithRetry(() =>\n this.push(params as GitHubPushParams)\n );\n break;\n\n case 'createPR':\n data = await this.executeWithRetry(() =>\n this.createPR(params as GitHubCreatePRParams)\n );\n break;\n\n case 'getPRComments':\n data = await this.executeWithRetry(() =>\n this.getPRComments(params as GitHubGetPRCommentsParams)\n );\n break;\n\n case 'listIssues':\n data = await this.executeWithRetry(() =>\n this.listIssues(params as GitHubListIssuesParams)\n );\n break;\n\n case 'getIssue':\n data = await this.executeWithRetry(() =>\n this.getIssue(params as GitHubGetIssueParams)\n );\n break;\n\n case 'getFile':\n data = await this.executeWithRetry(() =>\n this.getFile(params as GitHubGetFileParams)\n );\n break;\n\n case 'listCommits':\n data = await this.executeWithRetry(() =>\n this.listCommits(params as GitHubListCommitsParams)\n );\n break;\n\n case 'createIssue':\n data = await this.executeWithRetry(() =>\n this.createIssue(params as GitHubCreateIssueParams)\n );\n break;\n\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /**\n * Clone a repository\n */\n private async cloneRepo(params: GitHubCloneParams): Promise<{ message: string }> {\n this.logger.debug('Cloning repository', { repoUrl: params.repoUrl });\n\n // If owner/repo not set, parse from URL\n if (!this.owner || !this.repo) {\n const parsed = GitHubAPI.parseRepoUrl(params.repoUrl);\n this.owner = parsed.owner;\n this.repo = parsed.repo;\n }\n\n await GitOps.cloneRepo(params, this.token);\n\n return {\n message: `Successfully cloned ${params.repoUrl} to ${params.targetDir}`,\n };\n }\n\n /**\n * Create a branch\n */\n private async createBranch(params: GitHubCreateBranchParams): Promise<{ message: string }> {\n this.logger.debug('Creating branch', { branchName: params.branchName });\n\n await GitOps.createBranch(params, this.workDir);\n\n return {\n message: `Successfully created branch: ${params.branchName}`,\n };\n }\n\n /**\n * Commit changes\n */\n private async commit(params: GitHubCommitParams): Promise<{ message: string }> {\n this.logger.debug('Committing changes', { message: params.message });\n\n await GitOps.commit(params, this.workDir);\n\n return {\n message: `Successfully committed changes: ${params.message}`,\n };\n }\n\n /**\n * Push branch\n */\n private async push(params: GitHubPushParams): Promise<{ message: string }> {\n this.logger.debug('Pushing branch', { branchName: params.branchName });\n\n await GitOps.push(params, this.workDir, this.token);\n\n return {\n message: `Successfully pushed branch: ${params.branchName}`,\n };\n }\n\n /**\n * Create a pull request\n */\n private async createPR(params: GitHubCreatePRParams) {\n this.logger.debug('Creating pull request', { title: params.title });\n\n const apiConfig = this.getAPIConfig();\n const pr = await GitHubAPI.createPR(params, apiConfig);\n\n this.logger.info('Pull request created', { number: pr.number, url: pr.url });\n\n return pr;\n }\n\n /**\n * Get PR comments\n */\n private async getPRComments(params: GitHubGetPRCommentsParams) {\n this.logger.debug('Getting PR comments', { prNumber: params.prNumber });\n\n const apiConfig = this.getAPIConfig();\n const comments = await GitHubAPI.getPRComments(params, apiConfig);\n\n return { comments };\n }\n\n /**\n * List issues\n */\n private async listIssues(params: GitHubListIssuesParams) {\n this.logger.debug('Listing issues', { state: params.state, labels: params.labels?.join(', '), per_page: params.per_page });\n\n const apiConfig = this.getAPIConfig();\n const issues = await GitHubAPI.listIssues(params, apiConfig);\n\n return { issues };\n }\n\n /**\n * Get issue details\n */\n private async getIssue(params: GitHubGetIssueParams) {\n this.logger.debug('Getting issue', { issueNumber: params.issueNumber });\n\n const apiConfig = this.getAPIConfig();\n const result = await GitHubAPI.getIssue(params, apiConfig);\n\n return result;\n }\n\n /**\n * Get a file's content plus metadata (owner/repo are per-call, not the\n * configured default repo)\n */\n private async getFile(params: GitHubGetFileParams) {\n this.logger.debug('Getting file', { owner: params.owner, repo: params.repo, path: params.path });\n\n return GitHubAPI.getFile(params, this.token);\n }\n\n /**\n * List commits (owner/repo are per-call, not the configured default repo)\n */\n private async listCommits(params: GitHubListCommitsParams) {\n this.logger.debug('Listing commits', { owner: params.owner, repo: params.repo, path: params.path });\n\n const commits = await GitHubAPI.listCommitsSummary(params, this.token);\n\n return { commits };\n }\n\n /**\n * Create an issue (owner/repo are per-call, not the configured default repo)\n */\n private async createIssue(params: GitHubCreateIssueParams) {\n this.logger.debug('Creating issue', { owner: params.owner, repo: params.repo, title: params.title });\n\n return GitHubAPI.createIssue(params, this.token);\n }\n\n /**\n * Get API config for GitHub API calls\n */\n private getAPIConfig(): GitHubAPI.GitHubAPIConfig {\n if (!this.owner || !this.repo) {\n throw new Error(\n 'GitHub owner and repo must be configured. Either set GITHUB_OWNER/GITHUB_REPO or clone a repository first.'\n );\n }\n\n return {\n token: this.token,\n owner: this.owner,\n repo: this.repo,\n };\n }\n}\n\n// Auto-register the integration\nregisterIntegration('github', GitHubIntegration);\n\n// Export types\nexport * from './types';\n\n// Export git CLI operations (clone, push, commit, branch)\nexport {\n cloneRepo,\n createBranch,\n commit,\n push,\n getCurrentBranch,\n hasUncommittedChanges,\n init,\n pull,\n addRemote,\n setUserConfig,\n getHeadSha,\n getHeadCommit,\n renameCurrentBranch,\n} from './github-git';\n\n// Export GitHub REST API functions\nexport {\n createRepo,\n listRepoTree,\n readRepoFile,\n createPR,\n getPRComments,\n listIssues,\n getIssue,\n getRateLimit,\n parseRepoUrl,\n listCommits,\n listCommitsSummary,\n getCommitDiff,\n getFileAtCommit,\n getFile,\n createIssue,\n type GitHubAPIConfig,\n type GitHubCommit,\n} from './github-api';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { execSync } from 'child_process';\nimport { writeFileSync, mkdtempSync, rmSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\n\n/**\n * CLI integration for Almadar CLI commands.\n *\n * Wraps `@almadar/cli` commands (validate, compile) as integration actions.\n * This runs server-side and executes CLI commands as child processes.\n *\n * Actions:\n * - validate: Validate an orbital schema and return structured results\n */\nexport class CLIIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('CLI integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'validate':\n data = await this.validate(params);\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async validate(params: IntegrationParams) {\n const { schema } = params as { schema: string };\n\n if (!schema || typeof schema !== 'string') {\n throw new Error('validate requires a \"schema\" parameter (string)');\n }\n\n // Create temp directory for the schema file\n const tempDir = mkdtempSync(join(tmpdir(), 'almadar-validate-'));\n const schemaPath = join(tempDir, 'schema.orb');\n\n try {\n // Write schema content to temp file\n writeFileSync(schemaPath, schema, 'utf-8');\n\n this.logger.debug('Validating schema', { path: schemaPath });\n\n // Run CLI validation\n const output = execSync(\n `npx @almadar/cli validate \"${schemaPath}\" --format=json`,\n {\n encoding: 'utf-8',\n timeout: 30000,\n cwd: tempDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n // Parse JSON output\n const result = JSON.parse(output.trim());\n\n return {\n valid: result.valid ?? true,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch (error: unknown) {\n // CLI may return non-zero exit code for validation failures\n const execError = error as { stdout?: string; stderr?: string; message?: string };\n if (execError.stdout) {\n try {\n const result = JSON.parse(execError.stdout.trim());\n return {\n valid: false,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch {\n // stdout wasn't valid JSON, fall through\n }\n }\n\n // Actual execution failure\n throw new Error(\n `CLI validation failed: ${execError.message || String(error)}`,\n );\n } finally {\n // Cleanup temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n }\n}\n\n// Auto-register\nregisterIntegration('cli', CLIIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored entry in the in-memory cache */\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\n/** Callback type for pub/sub subscribers */\ntype SubscriberCallback = (msg: unknown) => void;\n\n/**\n * Redis / Cache integration with in-memory default backend.\n *\n * When `REDIS_URL` is provided in `config.env`, a warning is logged and the\n * integration falls back to the in-memory store (real Redis client support is\n * not yet implemented). When `REDIS_URL` is absent the in-memory store is\n * used silently — this is the expected development mode.\n */\nexport class RedisIntegration extends BaseIntegration {\n private store: Map<string, CacheEntry> = new Map();\n private locks: Map<string, string> = new Map();\n private channels: Map<string, Set<SubscriberCallback>> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const redisUrl = config.env.REDIS_URL;\n if (redisUrl) {\n this.logger.warn(\n 'REDIS_URL is configured but real Redis client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { redisUrl },\n );\n }\n\n this.logger.info('Redis integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'get':\n data = await this.executeWithRetry(() => this.getKey(params));\n break;\n case 'set':\n data = await this.executeWithRetry(() => this.setKey(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteKey(params));\n break;\n case 'lock':\n data = await this.executeWithRetry(() => this.acquireLock(params));\n break;\n case 'unlock':\n data = await this.executeWithRetry(() => this.releaseLock(params));\n break;\n case 'increment':\n data = await this.executeWithRetry(() => this.incrementKey(params));\n break;\n case 'expire':\n data = await this.executeWithRetry(() => this.expireKey(params));\n break;\n case 'publish':\n data = await this.executeWithRetry(() => this.publishMessage(params));\n break;\n case 'subscribe':\n data = await this.executeWithRetry(() =>\n this.subscribeChannel(params),\n );\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Remove expired entries on access and return whether a key is alive. */\n private isAlive(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n /** Generate a unique lock identifier. */\n private generateLockId(): string {\n return `lock_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async getKey(\n params: IntegrationParams,\n ): Promise<{ value: unknown }> {\n const key = params.key as string;\n\n this.logger.debug('Cache GET', { key });\n\n if (!this.isAlive(key)) {\n return { value: null };\n }\n\n const entry = this.store.get(key);\n return { value: entry ? entry.value : null };\n }\n\n private async setKey(\n params: IntegrationParams,\n ): Promise<{ ok: boolean }> {\n const key = params.key as string;\n const value = params.value;\n const ttl = params.ttl as number | undefined;\n\n this.logger.debug('Cache SET', { key, ttl });\n\n const entry: CacheEntry = { value };\n if (ttl !== undefined && ttl > 0) {\n entry.expiresAt = Date.now() + ttl * 1000;\n }\n\n this.store.set(key, entry);\n return { ok: true };\n }\n\n private async deleteKey(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const key = params.key as string;\n\n this.logger.debug('Cache DELETE', { key });\n\n const existed = this.store.has(key);\n this.store.delete(key);\n return { deleted: existed };\n }\n\n private async acquireLock(\n params: IntegrationParams,\n ): Promise<{ acquired: boolean; lockId: string }> {\n const key = params.key as string;\n const ttl = (params.ttl as number | undefined) ?? 30_000;\n\n this.logger.debug('Cache LOCK', { key, ttl });\n\n // Check if the lock already exists and is still alive\n const existingLockId = this.locks.get(key);\n if (existingLockId) {\n // The lock key in the store tracks its expiry\n if (this.isAlive(`__lock:${key}`)) {\n return { acquired: false, lockId: '' };\n }\n // Expired — clean up\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n }\n\n const lockId = this.generateLockId();\n this.locks.set(key, lockId);\n // Store the lock with a TTL (ttl param is in ms, expiresAt is epoch ms)\n this.store.set(`__lock:${key}`, {\n value: lockId,\n expiresAt: Date.now() + ttl,\n });\n\n return { acquired: true, lockId };\n }\n\n private async releaseLock(\n params: IntegrationParams,\n ): Promise<{ released: boolean }> {\n const key = params.key as string;\n const lockId = params.lockId as string;\n\n this.logger.debug('Cache UNLOCK', { key, lockId });\n\n const currentLockId = this.locks.get(key);\n if (currentLockId !== lockId) {\n return { released: false };\n }\n\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n return { released: true };\n }\n\n private async incrementKey(\n params: IntegrationParams,\n ): Promise<{ value: number }> {\n const key = params.key as string;\n const by = (params.by as number | undefined) ?? 1;\n\n this.logger.debug('Cache INCR', { key, by });\n\n let current = 0;\n\n if (this.isAlive(key)) {\n const entry = this.store.get(key);\n if (entry) {\n current = typeof entry.value === 'number' ? entry.value : 0;\n }\n }\n\n const newValue = current + by;\n // Preserve existing TTL if the key already exists\n const existing = this.store.get(key);\n this.store.set(key, {\n value: newValue,\n expiresAt: existing?.expiresAt,\n });\n\n return { value: newValue };\n }\n\n private async expireKey(\n params: IntegrationParams,\n ): Promise<{ set: boolean }> {\n const key = params.key as string;\n const ttl = params.ttl as number;\n\n this.logger.debug('Cache EXPIRE', { key, ttl });\n\n if (!this.isAlive(key)) {\n return { set: false };\n }\n\n const entry = this.store.get(key);\n if (!entry) {\n return { set: false };\n }\n\n entry.expiresAt = Date.now() + ttl * 1000;\n this.store.set(key, entry);\n return { set: true };\n }\n\n private async publishMessage(\n params: IntegrationParams,\n ): Promise<{ receivers: number }> {\n const channel = params.channel as string;\n const message = params.message;\n\n this.logger.debug('Cache PUBLISH', { channel });\n\n const subscribers = this.channels.get(channel);\n if (!subscribers || subscribers.size === 0) {\n return { receivers: 0 };\n }\n\n for (const callback of subscribers) {\n try {\n callback(message);\n } catch (err) {\n this.logger.error('Subscriber callback error', {\n channel,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { receivers: subscribers.size };\n }\n\n private async subscribeChannel(\n params: IntegrationParams,\n ): Promise<{ subscribed: boolean }> {\n const channel = params.channel as string;\n\n this.logger.debug('Cache SUBSCRIBE', { channel });\n\n if (!this.channels.has(channel)) {\n this.channels.set(channel, new Set());\n }\n\n // The in-memory subscribe registers the channel but the actual callback\n // would be wired via a higher-level API. For the integration contract we\n // simply confirm the subscription was created.\n return { subscribed: true };\n }\n}\n\n// Auto-register\nregisterIntegration('redis', RedisIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Job status values */\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed';\n\n/** Internal job representation */\ninterface QueueJob {\n id: string;\n queue: string;\n payload: unknown;\n priority: number;\n status: JobStatus;\n enqueuedAt: number;\n delay: number;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Queue integration with in-memory backend.\n *\n * Provides job queue semantics: enqueue, dequeue, status tracking,\n * completion, failure, cancellation, and size queries.\n */\nexport class QueueIntegration extends BaseIntegration {\n /** Map from queue name to ordered list of job IDs */\n private queues: Map<string, string[]> = new Map();\n\n /** Map from job ID to job data */\n private jobs: Map<string, QueueJob> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Queue integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'enqueue':\n data = await this.executeWithRetry(() => this.enqueue(params));\n break;\n case 'dequeue':\n data = await this.executeWithRetry(() => this.dequeue(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'complete':\n data = await this.executeWithRetry(() => this.complete(params));\n break;\n case 'fail':\n data = await this.executeWithRetry(() => this.failJob(params));\n break;\n case 'cancel':\n data = await this.executeWithRetry(() => this.cancel(params));\n break;\n case 'size':\n data = await this.executeWithRetry(() => this.size(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a unique job identifier. */\n private generateJobId(): string {\n return `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /** Get or create the queue array for a given queue name. */\n private getQueue(name: string): string[] {\n let queue = this.queues.get(name);\n if (!queue) {\n queue = [];\n this.queues.set(name, queue);\n }\n return queue;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async enqueue(\n params: IntegrationParams,\n ): Promise<{ jobId: string; position: number }> {\n const queueName = params.queue as string;\n const payload = params.payload;\n const delay = (params.delay as number | undefined) ?? 0;\n const priority = (params.priority as number | undefined) ?? 0;\n\n this.logger.debug('Queue ENQUEUE', { queue: queueName, delay, priority });\n\n const jobId = this.generateJobId();\n const job: QueueJob = {\n id: jobId,\n queue: queueName,\n payload,\n priority,\n status: 'pending',\n enqueuedAt: Date.now(),\n delay,\n };\n\n this.jobs.set(jobId, job);\n\n const queue = this.getQueue(queueName);\n\n // Insert respecting priority (higher priority = earlier in queue)\n let insertIndex = queue.length;\n for (let i = 0; i < queue.length; i++) {\n const existingJob = this.jobs.get(queue[i]);\n if (existingJob && existingJob.priority < priority) {\n insertIndex = i;\n break;\n }\n }\n queue.splice(insertIndex, 0, jobId);\n\n return { jobId, position: insertIndex };\n }\n\n private async dequeue(\n params: IntegrationParams,\n ): Promise<{ job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue DEQUEUE', { queue: queueName });\n\n const queue = this.getQueue(queueName);\n const now = Date.now();\n\n // Find first pending job whose delay has elapsed\n for (let i = 0; i < queue.length; i++) {\n const job = this.jobs.get(queue[i]);\n if (!job || job.status !== 'pending') continue;\n\n const readyAt = job.enqueuedAt + job.delay;\n if (now < readyAt) continue;\n\n // Mark as processing and remove from queue\n job.status = 'processing';\n queue.splice(i, 1);\n\n return {\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n return { job: null };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{ status: JobStatus; job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue STATUS', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job) {\n return { status: 'pending', job: null };\n }\n\n return {\n status: job.status,\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n private async complete(\n params: IntegrationParams,\n ): Promise<{ completed: boolean }> {\n const jobId = params.jobId as string;\n const result = params.result;\n\n this.logger.debug('Queue COMPLETE', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { completed: false };\n }\n\n job.status = 'completed';\n job.result = result;\n return { completed: true };\n }\n\n private async failJob(\n params: IntegrationParams,\n ): Promise<{ failed: boolean }> {\n const jobId = params.jobId as string;\n const error = params.error as string | undefined;\n\n this.logger.debug('Queue FAIL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { failed: false };\n }\n\n job.status = 'failed';\n job.error = error;\n return { failed: true };\n }\n\n private async cancel(\n params: IntegrationParams,\n ): Promise<{ cancelled: boolean }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue CANCEL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'pending') {\n return { cancelled: false };\n }\n\n // Remove from queue\n const queue = this.queues.get(job.queue);\n if (queue) {\n const idx = queue.indexOf(jobId);\n if (idx !== -1) {\n queue.splice(idx, 1);\n }\n }\n\n this.jobs.delete(jobId);\n return { cancelled: true };\n }\n\n private async size(\n params: IntegrationParams,\n ): Promise<{ size: number; pending: number; processing: number }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue SIZE', { queue: queueName });\n\n let pending = 0;\n let processing = 0;\n\n for (const job of this.jobs.values()) {\n if (job.queue !== queueName) continue;\n if (job.status === 'pending') pending++;\n if (job.status === 'processing') processing++;\n }\n\n return { size: pending + processing, pending, processing };\n }\n}\n\n// Auto-register\nregisterIntegration('queue', QueueIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** In-memory span representation */\ninterface Span {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n events: Array<{ name: string; timestamp: number; attributes?: IntegrationParams }>;\n}\n\n/** Shape of a stored metric */\ninterface Metric {\n name: string;\n type: 'counter' | 'gauge' | 'histogram';\n value: number;\n values: number[];\n labels: IntegrationParams;\n}\n\n/** Generate a random hex id of the given byte-length. */\nfunction randomHexId(bytes: number): string {\n const arr: string[] = [];\n for (let i = 0; i < bytes; i++) {\n arr.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return arr.join('');\n}\n\n/**\n * OpenTelemetry integration with in-memory backend.\n *\n * Tracks spans and metrics internally for development and testing purposes.\n * No actual OpenTelemetry SDK dependency is required.\n */\nexport class OtelIntegration extends BaseIntegration {\n private spans: Map<string, Span> = new Map();\n private metrics: Map<string, Metric> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OTel integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'startSpan':\n data = await this.executeWithRetry(() => this.startSpan(params));\n break;\n case 'endSpan':\n data = await this.executeWithRetry(() => this.endSpan(params));\n break;\n case 'addEvent':\n data = await this.executeWithRetry(() => this.addEvent(params));\n break;\n case 'recordMetric':\n data = await this.executeWithRetry(() => this.recordMetric(params));\n break;\n case 'getSpan':\n data = await this.executeWithRetry(() => this.getSpan(params));\n break;\n case 'getMetrics':\n data = await this.executeWithRetry(() => this.getAllMetrics());\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async startSpan(\n params: IntegrationParams,\n ): Promise<{ spanId: string; traceId: string }> {\n const name = params.name as string;\n const attributes = (params.attributes as IntegrationParams | undefined) ?? {};\n const spanId = randomHexId(8);\n const traceId = (params.traceId as string | undefined) ?? randomHexId(16);\n\n const span: Span = {\n spanId,\n traceId,\n name,\n startTime: Date.now(),\n attributes,\n events: [],\n };\n\n this.spans.set(spanId, span);\n this.logger.debug('Span started', { spanId, traceId, name });\n\n return { spanId, traceId };\n }\n\n private async endSpan(\n params: IntegrationParams,\n ): Promise<{ ended: boolean }> {\n const spanId = params.spanId as string;\n const status = params.status as 'ok' | 'error' | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('endSpan called for unknown span', { spanId });\n return { ended: false };\n }\n\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n }\n\n this.logger.debug('Span ended', { spanId, status, duration: span.endTime - span.startTime });\n return { ended: true };\n }\n\n private async addEvent(\n params: IntegrationParams,\n ): Promise<{ added: boolean }> {\n const spanId = params.spanId as string;\n const name = params.name as string;\n const attributes = params.attributes as IntegrationParams | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('addEvent called for unknown span', { spanId });\n return { added: false };\n }\n\n span.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n\n this.logger.debug('Event added to span', { spanId, eventName: name });\n return { added: true };\n }\n\n private async recordMetric(\n params: IntegrationParams,\n ): Promise<{ recorded: boolean }> {\n const name = params.name as string;\n const value = params.value as number;\n const type = (params.type as 'counter' | 'gauge' | 'histogram' | undefined) ?? 'counter';\n const labels = (params.labels as IntegrationParams | undefined) ?? {};\n\n const existing = this.metrics.get(name);\n\n if (existing) {\n switch (type) {\n case 'counter':\n existing.value += value;\n break;\n case 'gauge':\n existing.value = value;\n break;\n case 'histogram':\n existing.values.push(value);\n break;\n }\n existing.labels = labels;\n } else {\n this.metrics.set(name, {\n name,\n type,\n value: type === 'histogram' ? 0 : value,\n values: type === 'histogram' ? [value] : [],\n labels,\n });\n }\n\n this.logger.debug('Metric recorded', { name, value, type });\n return { recorded: true };\n }\n\n private async getSpan(\n params: IntegrationParams,\n ): Promise<Span | null> {\n const spanId = params.spanId as string;\n const span = this.spans.get(spanId);\n return span ?? null;\n }\n\n private async getAllMetrics(): Promise<Record<string, Metric>> {\n const result: Record<string, Metric> = {};\n for (const [key, metric] of this.metrics) {\n result[key] = metric;\n }\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('otel', OtelIntegration);\n","import * as oidc from 'openid-client';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Supported OAuth providers */\ntype OAuthProvider = 'google' | 'github' | 'auth0';\n\n/** Mock provider authorization endpoints */\nconst PROVIDER_AUTH_URLS: Record<OAuthProvider, string> = {\n google: 'https://accounts.google.com/o/oauth2/v2/auth',\n github: 'https://github.com/login/oauth/authorize',\n auth0: 'https://auth.example.com/authorize',\n};\n\n/** Default OIDC issuer per provider (Google Workspace first — W4 decision). */\nconst PROVIDER_ISSUERS: Partial<Record<OAuthProvider, string>> = {\n google: 'https://accounts.google.com',\n};\n\n/** Stored token set */\ninterface TokenSet {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n}\n\n/** Mock user profile */\ninterface UserInfo {\n sub: string;\n email: string;\n name: string;\n picture: string;\n}\n\n/** Server-held per-authorization state (never leaves the process). */\ninterface PendingAuthorization {\n provider: OAuthProvider;\n redirectUri: string;\n pkceVerifier: string;\n}\n\n/**\n * Where pending OIDC authorizations (PKCE verifier, redirect URI) live\n * between `authorize` and `token`. The in-memory default works single-\n * instance; a multi-instance deployment injects a shared-store impl (the\n * FirestoreCredentialPersistence structural pattern) via\n * `installPendingGrantStore` — no sticky routing needed once it does.\n * `take` is single-use: it returns AND removes, so a state token can never\n * be replayed. `sweep` drops expired grants.\n */\nexport interface PendingGrantStore {\n put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void>;\n take(state: string): Promise<PendingAuthorization | null>;\n sweep(): Promise<void>;\n}\n\nconst PENDING_GRANT_TTL_MS = 10 * 60 * 1000;\n\nexport class InMemoryPendingGrantStore implements PendingGrantStore {\n private readonly grants = new Map<string, { grant: PendingAuthorization; expiresAt: number }>();\n\n async put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void> {\n this.grants.set(state, { grant, expiresAt: Date.now() + ttlMs });\n }\n\n async take(state: string): Promise<PendingAuthorization | null> {\n const entry = this.grants.get(state);\n if (!entry) return null;\n this.grants.delete(state);\n return entry.expiresAt >= Date.now() ? entry.grant : null;\n }\n\n async sweep(): Promise<void> {\n const now = Date.now();\n for (const [state, entry] of this.grants) {\n if (entry.expiresAt < now) this.grants.delete(state);\n }\n }\n}\n\nlet installedPendingGrantStore: PendingGrantStore | null = null;\n\n/** Install a shared pending-grant store (multi-instance hosts); null resets to in-memory. */\nexport function installPendingGrantStore(store: PendingGrantStore | null): void {\n installedPendingGrantStore = store;\n}\n\n/**\n * OAuth2/OIDC integration.\n *\n * Two backends behind one contract:\n * - **OIDC (production)** — `openid-client` against a discovered issuer\n * (default Google; override via `OIDC_ISSUER_URL`), authorization-code +\n * PKCE, real token exchange / refresh / revocation / userinfo. Selected\n * whenever `OAUTH_CLIENT_ID` + `OAUTH_CLIENT_SECRET` are configured and\n * `OAUTH_MODE` is not `mock`.\n * - **Mock (dev/tests)** — the original in-memory backend, kept verbatim\n * behind `OAUTH_MODE=mock` (or absent client credentials) so existing\n * tests and offline dev flows are untouched.\n *\n * Pending-authorization state (PKCE verifier, redirect URI) lives in a\n * `PendingGrantStore` — in-memory by default (single instance), injectable\n * via `installPendingGrantStore` for multi-instance deployments (a shared\n * store replaces the old sticky-routing requirement). Grants are TTL-bound\n * and single-use.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending MOCK authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set (mock backend) */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups (mock backend) */\n private refreshIndex: Map<string, string> = new Map();\n\n /** Maps access token -> mock user session */\n private sessions: Map<string, UserInfo> = new Map();\n\n /** Pending OIDC authorizations (real backend) — injectable, in-memory default. */\n private readonly fallbackPending = new InMemoryPendingGrantStore();\n\n private pendingStore(): PendingGrantStore {\n return installedPendingGrantStore ?? this.fallbackPending;\n }\n\n /** Maps access token -> ID-token subject, for userinfo subject checks */\n private subjects: Map<string, string> = new Map();\n\n /** Discovered issuer configurations, keyed by issuer URL */\n private discovered: Map<string, oidc.Configuration> = new Map();\n\n private readonly real: boolean;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.real =\n config.env.OAUTH_MODE !== 'mock' &&\n Boolean(config.env.OAUTH_CLIENT_ID) &&\n Boolean(config.env.OAUTH_CLIENT_SECRET);\n this.logger.info(\n this.real\n ? 'OAuth integration initialized (OIDC backend via openid-client)'\n : 'OAuth integration initialized (mock backend)',\n );\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'authorize':\n data = await this.executeWithRetry(() => (this.real ? this.oidcAuthorize(params) : this.authorize(params)));\n break;\n case 'token':\n data = await this.executeWithRetry(() => (this.real ? this.oidcToken(params) : this.token(params)));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRefresh(params) : this.refresh(params)));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRevoke(params) : this.revoke(params)));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => (this.real ? this.oidcUserinfo(params) : this.userinfo(params)));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // OIDC backend (openid-client)\n // ---------------------------------------------------------------------------\n\n private issuerFor(provider: OAuthProvider): string {\n const configured = this.config.env.OIDC_ISSUER_URL;\n if (configured) return configured;\n const issuer = PROVIDER_ISSUERS[provider];\n if (!issuer) {\n throw new Error(\n `Provider \"${provider}\" has no OIDC issuer — set OIDC_ISSUER_URL to an OIDC-compliant issuer, or use OAUTH_MODE=mock`,\n );\n }\n return issuer;\n }\n\n private async configurationFor(provider: OAuthProvider): Promise<oidc.Configuration> {\n const issuer = this.issuerFor(provider);\n const cached = this.discovered.get(issuer);\n if (cached) return cached;\n const configuration = await oidc.discovery(\n new URL(issuer),\n this.config.env.OAUTH_CLIENT_ID,\n this.config.env.OAUTH_CLIENT_SECRET,\n );\n this.discovered.set(issuer, configuration);\n return configuration;\n }\n\n private async oidcAuthorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = (params.redirectUri as string) || this.config.env.OAUTH_REDIRECT_URI;\n\n const configuration = await this.configurationFor(provider);\n const state = oidc.randomState();\n const pkceVerifier = oidc.randomPKCECodeVerifier();\n const codeChallenge = await oidc.calculatePKCECodeChallenge(pkceVerifier);\n\n const parameters: Record<string, string> = {\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n };\n // Google issues a refresh token only for offline-consented requests.\n if (provider === 'google') {\n parameters.access_type = 'offline';\n parameters.prompt = 'consent';\n }\n\n const authUrl = oidc.buildAuthorizationUrl(configuration, parameters);\n await this.pendingStore().put(state, { provider, redirectUri, pkceVerifier }, PENDING_GRANT_TTL_MS);\n void this.pendingStore().sweep();\n return { authUrl: authUrl.toString(), state };\n }\n\n private async oidcToken(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' }> {\n const code = params.code as string;\n const state = params.state as string;\n\n const pendingAuth = await this.pendingStore().take(state);\n if (!pendingAuth) {\n throw new Error(`Invalid or expired state token: ${state}`);\n }\n\n const configuration = await this.configurationFor(pendingAuth.provider);\n const callbackUrl = new URL(pendingAuth.redirectUri);\n callbackUrl.searchParams.set('code', code);\n callbackUrl.searchParams.set('state', state);\n\n const tokens = await oidc.authorizationCodeGrant(configuration, callbackUrl, {\n expectedState: state,\n pkceCodeVerifier: pendingAuth.pkceVerifier,\n });\n\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? '',\n expiresIn: tokens.expires_in ?? 3600,\n tokenType: 'bearer',\n };\n }\n\n private async oidcRefresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n const configuration = await this.configurationFor('google');\n\n const tokens = await oidc.refreshTokenGrant(configuration, refreshToken);\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n return {\n accessToken: tokens.access_token,\n expiresIn: tokens.expires_in ?? 3600,\n };\n }\n\n private async oidcRevoke(params: IntegrationParams): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n const configuration = await this.configurationFor('google');\n await oidc.tokenRevocation(configuration, token);\n this.subjects.delete(token);\n return { revoked: true };\n }\n\n private async oidcUserinfo(params: IntegrationParams): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n const configuration = await this.configurationFor('google');\n const subject = this.subjects.get(accessToken);\n const info = await oidc.fetchUserInfo(\n configuration,\n accessToken,\n subject ?? oidc.skipSubjectCheck,\n );\n return {\n sub: info.sub,\n email: typeof info.email === 'string' ? info.email : '',\n name: typeof info.name === 'string' ? info.name : '',\n picture: typeof info.picture === 'string' ? info.picture : '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex token of the given byte length. */\n private generateToken(bytes: number = 32): string {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < bytes * 2; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n }\n\n /** Generate a mock user profile from a provider and access token. */\n private generateMockUser(provider: OAuthProvider, sub: string): UserInfo {\n return {\n sub,\n email: `user-${sub.slice(0, 8)}@${provider}.example.com`,\n name: `Mock User (${provider})`,\n picture: `https://${provider}.example.com/avatar/${sub.slice(0, 8)}.png`,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend actions\n // ---------------------------------------------------------------------------\n\n private async authorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = params.redirectUri as string;\n\n this.logger.debug('OAuth AUTHORIZE', { provider, scopes: scopes.join(', '), redirectUri });\n\n const state = this.generateToken(16);\n this.states.set(state, provider);\n\n const baseUrl = PROVIDER_AUTH_URLS[provider];\n const queryParams = new URLSearchParams({\n response_type: 'code',\n scope: scopes.join(' '),\n redirect_uri: redirectUri,\n state,\n client_id: this.config.env.CLIENT_ID ?? 'mock-client-id',\n });\n\n const authUrl = `${baseUrl}?${queryParams.toString()}`;\n\n return { authUrl, state };\n }\n\n private async token(\n params: IntegrationParams,\n ): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n tokenType: 'bearer';\n }> {\n const code = params.code as string;\n const state = params.state as string;\n\n this.logger.debug('OAuth TOKEN', { code, state });\n\n const provider = this.states.get(state);\n if (!provider) {\n throw new Error(\n `Invalid or expired state token: ${state}`,\n );\n }\n\n // Consume the state (one-time use)\n this.states.delete(state);\n\n const accessToken = this.generateToken(32);\n const refreshToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(accessToken, tokenSet);\n this.refreshIndex.set(refreshToken, accessToken);\n\n // Generate and store a mock user session\n const sub = this.generateToken(8);\n this.sessions.set(accessToken, this.generateMockUser(provider, sub));\n\n return { accessToken, refreshToken, expiresIn, tokenType: 'bearer' };\n }\n\n private async refresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n\n this.logger.debug('OAuth REFRESH', { refreshToken: refreshToken.slice(0, 8) + '...' });\n\n const oldAccessToken = this.refreshIndex.get(refreshToken);\n if (!oldAccessToken) {\n throw new Error('Invalid refresh token');\n }\n\n // Carry over user session to the new access token\n const userInfo = this.sessions.get(oldAccessToken);\n\n // Clean up old access token\n this.tokens.delete(oldAccessToken);\n this.sessions.delete(oldAccessToken);\n\n // Issue new access token\n const newAccessToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken: newAccessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(newAccessToken, tokenSet);\n this.refreshIndex.set(refreshToken, newAccessToken);\n\n if (userInfo) {\n this.sessions.set(newAccessToken, userInfo);\n }\n\n return { accessToken: newAccessToken, expiresIn };\n }\n\n private async revoke(\n params: IntegrationParams,\n ): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n\n this.logger.debug('OAuth REVOKE', { token: token.slice(0, 8) + '...' });\n\n // Check if it is an access token\n const tokenSet = this.tokens.get(token);\n if (tokenSet) {\n this.refreshIndex.delete(tokenSet.refreshToken);\n this.tokens.delete(token);\n this.sessions.delete(token);\n return { revoked: true };\n }\n\n // Check if it is a refresh token\n const accessToken = this.refreshIndex.get(token);\n if (accessToken) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n this.refreshIndex.delete(token);\n return { revoked: true };\n }\n\n return { revoked: false };\n }\n\n private async userinfo(\n params: IntegrationParams,\n ): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n\n this.logger.debug('OAuth USERINFO', { accessToken: accessToken.slice(0, 8) + '...' });\n\n const tokenSet = this.tokens.get(accessToken);\n if (!tokenSet) {\n throw new Error('Invalid access token');\n }\n\n if (Date.now() > tokenSet.expiresAt) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n throw new Error('Access token expired');\n }\n\n const userInfo = this.sessions.get(accessToken);\n if (!userInfo) {\n throw new Error('No session found for access token');\n }\n\n return userInfo;\n }\n}\n\n// Auto-register\nregisterIntegration('oauth', OAuthIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport { IntegrationError, type IntegrationConfig, type IntegrationResult, type IntegrationParams } from '../../types';\nimport type { IntegrationCallContext } from '../../factory';\nimport { registerIntegration } from '../../registry';\nimport {\n getActiveFactory,\n getInstalledCredentialStore,\n resolveCredentialRef,\n} from '../../credentials';\nimport { serviceCredentials, serviceProbes, type IntegrationName } from '../../contracts';\n\n/** Env-var name shape accepted for the `database` connectionRef exception. */\nconst ENV_VAR_NAME = /^[A-Z][A-Z0-9_]*$/;\n\n/** Write/probe actions require an admin-role caller; `list` stays open (masked last-4 only). */\nconst ROLE_GATED_ACTIONS = new Set(['set', 'remove', 'test', 'rotate']);\n\nconst DEFAULT_ADMIN_ROLES = ['admin', 'owner'];\n\ninterface CredentialListEntry {\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n}\n\nfunction isProbeService(service: string): service is IntegrationName {\n return service in serviceProbes;\n}\n\n/**\n * The hosted credential store's service surface (W4 Tier C) — what the\n * Owner-gated Integrations settings page calls through the NORMAL\n * call-service path (server-side only; organisms own the access policy,\n * per the I-16 std-atom ACL constraint).\n *\n * Security contract: `list` returns masked entries only (last-4, never\n * plaintext); `set` accepts only env vars DECLARED in `serviceCredentials`\n * for the named service (plus well-formed connection refs for `database`),\n * so the page can never become an arbitrary env-injection surface; values\n * are never logged. `set`/`remove`/`test` additionally require the caller's\n * role (from IntegrationCallContext) to be in the admin list\n * (ALMADAR_CREDENTIAL_ADMIN_ROLES, default admin,owner) and FAIL CLOSED\n * without one — the un-bypassable twin of the organism-side page gate (I-25).\n */\nexport class CredentialsIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Credentials integration initialized (tenant credential store surface)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n if (ROLE_GATED_ACTIONS.has(action)) {\n const allowed = this.adminRoles();\n if (!context?.role || !allowed.includes(context.role)) {\n return {\n success: false,\n error: new IntegrationError(\n `forbidden: \"${action}\" requires one of roles: ${allowed.join(', ')}`,\n 'AUTH_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n }\n\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'list':\n data = this.list(typeof params.service === 'string' ? params.service : undefined);\n break;\n case 'set':\n data = await this.set(params.service as string, params.envVar as string, params.value as string);\n break;\n case 'remove':\n data = await this.remove(params.service as string, params.envVar as string);\n break;\n case 'test':\n data = await this.test(params.service as string, context);\n break;\n case 'rotate': {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n data = await store.rotate();\n break;\n }\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private adminRoles(): string[] {\n const raw = this.config.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || process.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || '';\n const roles = raw.split(',').map((r) => r.trim()).filter((r) => r.length > 0);\n return roles.length > 0 ? roles : DEFAULT_ADMIN_ROLES;\n }\n\n private declaredFor(service: string): { envVar: string; required: boolean; description: string }[] {\n return serviceCredentials[service] ?? [];\n }\n\n private assertSettable(service: string, envVar: string): void {\n if (service === 'database') {\n if (!ENV_VAR_NAME.test(envVar)) {\n throw new Error(`\"${envVar}\" is not a well-formed connection reference (expected an env-var name)`);\n }\n return;\n }\n const declared = this.declaredFor(service);\n if (declared.length === 0) {\n throw new Error(`Service \"${service}\" declares no credentials`);\n }\n if (!declared.some((c) => c.envVar === envVar)) {\n const valid = declared.map((c) => c.envVar).join(', ');\n throw new Error(`\"${envVar}\" is not a declared credential of \"${service}\" (declared: ${valid})`);\n }\n }\n\n private storeFirst(): boolean {\n const flag = this.config.env['ALMADAR_CREDENTIALS_SOURCE'] || process.env['ALMADAR_CREDENTIALS_SOURCE'];\n return flag === 'store';\n }\n\n private list(serviceFilter?: string): { enabled: boolean; entries: CredentialListEntry[] } {\n const store = getInstalledCredentialStore();\n const stored = new Map((store?.entries() ?? []).map((e) => [`${e.service}\\u0000${e.envVar}`, e]));\n const entries: CredentialListEntry[] = [];\n for (const [service, declared] of Object.entries(serviceCredentials)) {\n if (serviceFilter && service !== serviceFilter) continue;\n for (const { envVar, required, description } of declared) {\n const fromStore = stored.get(`${service}\\u0000${envVar}`);\n stored.delete(`${service}\\u0000${envVar}`);\n // Store-first (I-31): declared refs resolve ONLY through the store, so\n // an env-only value reports 'none' — never a source the runtime won't use.\n const fromEnv = this.storeFirst() ? undefined : process.env[envVar];\n const source: CredentialListEntry['source'] = fromStore ? 'store' : fromEnv ? 'env' : 'none';\n entries.push({\n service,\n envVar,\n required,\n description,\n configured: source !== 'none',\n source,\n last4: fromStore ? fromStore.last4 : fromEnv ? fromEnv.slice(-4) : '',\n });\n }\n }\n // Stored rows outside the declared tables (database connection refs).\n for (const e of stored.values()) {\n if (serviceFilter && e.service !== serviceFilter) continue;\n entries.push({\n service: e.service,\n envVar: e.envVar,\n required: false,\n description: 'Stored connection reference',\n configured: true,\n source: 'store',\n last4: e.last4,\n });\n }\n return { enabled: store?.enabled ?? false, entries };\n }\n\n private async set(\n service: string,\n envVar: string,\n value: string,\n ): Promise<{ saved: boolean; service: string; envVar: string; last4: string }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host — set credentials via the environment');\n }\n this.assertSettable(service, envVar);\n const entry = await store.set(service, envVar, value);\n return { saved: true, service, envVar, last4: entry.last4 };\n }\n\n private async remove(service: string, envVar: string): Promise<{ removed: boolean }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n this.assertSettable(service, envVar);\n return { removed: await store.remove(envVar) };\n }\n\n private async test(service: string, context?: IntegrationCallContext): Promise<{\n service: string;\n configured: boolean;\n missing: string[];\n probed: boolean;\n ok: boolean;\n message: string;\n }> {\n const declared = this.declaredFor(service);\n const missing = declared\n .filter((c) => c.required && !resolveCredentialRef(c.envVar))\n .map((c) => c.envVar);\n const configured = missing.length === 0;\n if (!configured) {\n return { service, configured, missing, probed: false, ok: false, message: `Missing required credentials: ${missing.join(', ')}` };\n }\n\n const factory = getActiveFactory();\n const probe = isProbeService(service) ? serviceProbes[service] : undefined;\n if (!factory || !probe) {\n return { service, configured, missing, probed: false, ok: true, message: 'Credentials present (no live probe declared for this service)' };\n }\n if (!factory.isConfigured(service)) {\n return { service, configured, missing, probed: false, ok: false, message: 'Credentials present but the service is not configured on this host — restart or re-save a credential' };\n }\n const result = await factory.execute(service, probe.action, probe.params as IntegrationParams, context);\n if (!result.success) {\n return { service, configured, missing, probed: true, ok: false, message: result.error?.message ?? `Probe ${probe.action} failed` };\n }\n const echoed = result.data !== null && typeof result.data === 'object' && '_mock' in result.data;\n if (echoed) {\n return { service, configured, missing, probed: false, ok: false, message: 'Probe was mock-echoed — the service is not actually configured' };\n }\n return { service, configured, missing, probed: true, ok: true, message: `Probe ${probe.action} succeeded` };\n }\n}\n\n// Auto-register\nregisterIntegration('credentials', CredentialsIntegration);\n","import { createHash } from 'node:crypto';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n ListObjectsV2Command,\n type ObjectCannedACL,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl as s3GetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored object in the in-memory store */\ninterface StoredObject {\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n lastModified: number;\n etag: string;\n}\n\ninterface UploadResult {\n key: string;\n bucket: string;\n size: number;\n etag: string;\n /** Mirror of `key` — the field the .lolo upload consumers read. */\n id: string;\n /** Public (acl: public) or signed GET address of the uploaded object. */\n url: string;\n}\n\n/** The file-form upload payload (UploadDropZone emit shape). */\ninterface UploadFilePayload {\n name: string;\n size: number;\n type: string;\n /** base64 data URL (`data:<mime>;base64,...`) or raw base64. */\n content?: string;\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toFilePayload(value: IntegrationParamValue | undefined): UploadFilePayload | null {\n if (!isParamRecord(value)) return null;\n const { name, size, type, content } = value;\n if (typeof name !== 'string') return null;\n return {\n name,\n size: typeof size === 'number' ? size : 0,\n type: typeof type === 'string' ? type : 'application/octet-stream',\n content: typeof content === 'string' ? content : undefined,\n };\n}\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Object storage integration — real S3-compatible backend (AWS S3, R2, MinIO,\n * …) when `STORAGE_ACCESS_KEY_ID`/`STORAGE_SECRET_ACCESS_KEY` are configured,\n * in-memory simulation otherwise. Production REFUSES the in-memory fallback:\n * a missing credential must fail loudly, never simulate success (D-3).\n *\n * `upload` admits two shapes: the canonical `{ key, content }` pair and the\n * file-form `{ file: { name, size, type, content }, acl?, maxSize? }` that\n * lolo authors wire from UploadDropZone. The result carries `id`/`url`\n * alongside `key` — the fields the .lolo consumers read.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n private s3: S3Client | null = null;\n private defaultBucket: string;\n private publicUrlBase: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.defaultBucket = config.env.STORAGE_BUCKET || '';\n this.publicUrlBase = config.env.STORAGE_PUBLIC_URL_BASE || '';\n\n const accessKeyId = config.env.STORAGE_ACCESS_KEY_ID || '';\n const secretAccessKey = config.env.STORAGE_SECRET_ACCESS_KEY || '';\n if (accessKeyId && secretAccessKey) {\n const endpoint = config.env.STORAGE_ENDPOINT || undefined;\n this.s3 = new S3Client({\n region: config.env.STORAGE_REGION || 'us-east-1',\n endpoint,\n // Path-style is what MinIO/R2-style endpoints expect.\n forcePathStyle: Boolean(endpoint),\n credentials: { accessKeyId, secretAccessKey },\n });\n this.logger.info('Storage integration initialized (S3 backend)', {\n endpoint: endpoint ?? 'aws',\n bucket: this.defaultBucket,\n });\n } else {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'Storage credentials missing in production (STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEY) — refusing the in-memory fallback. See SECRETS.md.',\n );\n }\n this.logger.warn('Storage integration initialized (in-memory backend — dev only, nothing persists)');\n }\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'upload':\n data = await this.executeWithRetry(() => this.upload(params));\n break;\n case 'uploadMany':\n data = await this.executeWithRetry(() => this.uploadMany(params));\n break;\n case 'download':\n data = await this.executeWithRetry(() => this.download(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteObject(params));\n break;\n case 'getSignedUrl':\n data = await this.executeWithRetry(() => this.getSignedUrl(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private bucketOf(params: IntegrationParams): string {\n return (params.bucket as string) || this.defaultBucket;\n }\n\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n private generateEtag(bytes: Buffer): string {\n return `\"${createHash('md5').update(bytes).digest('hex')}\"`;\n }\n\n /** Resolve the upload inputs from either admitted shape. */\n private resolveUpload(params: IntegrationParams): {\n key: string;\n bytes: Buffer;\n contentType: string;\n acl: ObjectCannedACL | undefined;\n } {\n const file = toFilePayload(params.file);\n if (file) {\n const maxSize = typeof params.maxSize === 'number' ? params.maxSize : 0;\n if (maxSize > 0 && file.size > maxSize) {\n throw new Error(`Upload rejected: ${file.name} is ${file.size} bytes (max ${maxSize})`);\n }\n if (!file.content) {\n throw new Error(\n `Upload rejected: file payload for '${file.name}' carries no content — the uploader must include the base64 data URL`,\n );\n }\n const { bytes, contentType } = decodeContent(file.content);\n // Timestamped key keeps concurrent uploads of a same-named file distinct.\n const safeName = file.name.replace(/[^A-Za-z0-9._-]/g, '_');\n return {\n key: `${Date.now()}-${safeName}`,\n bytes,\n contentType: contentType ?? file.type,\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n const key = params.key as string | undefined;\n const content = params.content;\n if (!key || content === undefined || content === null) {\n throw new Error('upload requires either `file` (with content) or the `key` + `content` pair');\n }\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n const { bytes, contentType } = decodeContent(raw);\n return {\n key,\n bytes,\n contentType: (params.contentType as string) || contentType || 'application/octet-stream',\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n private publicUrl(bucket: string, key: string): string {\n if (this.publicUrlBase) {\n return `${this.publicUrlBase.replace(/\\/$/, '')}/${key}`;\n }\n const endpoint = this.config.env.STORAGE_ENDPOINT;\n if (endpoint) {\n return `${endpoint.replace(/\\/$/, '')}/${bucket}/${key}`;\n }\n const region = this.config.env.STORAGE_REGION || 'us-east-1';\n return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(params: IntegrationParams): Promise<UploadResult> {\n const bucket = this.bucketOf(params);\n const { key, bytes, contentType, acl } = this.resolveUpload(params);\n const etag = this.generateEtag(bytes);\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType, size: bytes.length });\n\n if (this.s3) {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: bytes,\n ContentType: contentType,\n ACL: acl,\n }),\n );\n } else {\n this.objects.set(this.compositeKey(bucket, key), {\n content: bytes.toString('base64'),\n contentType,\n size: bytes.length,\n metadata: (params.metadata as IntegrationParams | undefined) ?? {},\n lastModified: Date.now(),\n etag,\n });\n }\n\n // In-memory (no-credentials) mode: the bytes live only in this process, so\n // a fabricated S3/signed address is a DEAD link — every uploaded image\n // renders broken in the playground. A data: URL is the only address that\n // resolves to the actual bytes; consumers persist it and <img>/download\n // chips read it directly. Real-credential paths are unchanged.\n const url = this.s3\n ? acl === 'public-read'\n ? this.publicUrl(bucket, key)\n : (await this.signUrl(bucket, key, 'get', 3600)).url\n : `data:${contentType};base64,${bytes.toString('base64')}`;\n\n return { key, bucket, size: bytes.length, etag, id: key, url };\n }\n\n /**\n * Upload a whole UploadDropZone batch in one action — the FSM-friendly\n * shape for multi-file atoms (std-image-upload-multi): one call-service\n * arm in, one bulk-persistable `items` array out. Each item carries\n * id/url plus the name/sizeBytes/mimeType columns an uploaded-file row\n * declares.\n */\n private async uploadMany(params: IntegrationParams): Promise<{\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n }> {\n const rawFiles = Array.isArray(params.files) ? params.files : [];\n const files = rawFiles\n .map((f) => toFilePayload(f))\n .filter((f): f is UploadFilePayload => f !== null);\n if (files.length === 0) {\n throw new Error('uploadMany requires a non-empty `files` array (UploadDropZone batch shape)');\n }\n const items = [];\n for (const file of files) {\n const result = await this.upload({\n bucket: params.bucket,\n file: { name: file.name, size: file.size, type: file.type, content: file.content },\n acl: params.acl,\n maxSize: params.maxSize,\n });\n items.push({\n id: result.id,\n key: result.key,\n url: result.url,\n name: file.name,\n sizeBytes: file.size,\n mimeType: file.type,\n });\n }\n return { items, count: items.length };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{ content: string; contentType: string; size: number; metadata: IntegrationParams }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n if (this.s3) {\n const response = await this.s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));\n const bytes = Buffer.from(await response.Body!.transformToByteArray());\n return {\n content: bytes.toString('base64'),\n contentType: response.ContentType ?? 'application/octet-stream',\n size: bytes.length,\n metadata: {},\n };\n }\n\n const obj = this.objects.get(this.compositeKey(bucket, key));\n if (!obj) {\n throw new Error(`Object not found: ${bucket}/${key}`);\n }\n return {\n content: String(obj.content),\n contentType: obj.contentType,\n size: obj.size,\n metadata: obj.metadata,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{ keys: Array<{ key: string; size: number; lastModified: number }>; truncated: boolean; nextToken?: string }> {\n const bucket = this.bucketOf(params);\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n const continuationToken = params.continuationToken as string | undefined;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n if (this.s3) {\n const response = await this.s3.send(\n new ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix || undefined,\n MaxKeys: maxKeys,\n ContinuationToken: continuationToken,\n }),\n );\n return {\n keys: (response.Contents ?? []).map((entry) => ({\n key: entry.Key ?? '',\n size: entry.Size ?? 0,\n lastModified: entry.LastModified?.getTime() ?? 0,\n })),\n truncated: Boolean(response.IsTruncated),\n ...(response.IsTruncated && response.NextContinuationToken !== undefined\n ? { nextToken: response.NextContinuationToken }\n : {}),\n };\n }\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n results.push({\n key: compositeKey.slice(bucketPrefix.length),\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n results.sort((a, b) => a.key.localeCompare(b.key));\n // Dev backend: the token is a plain offset into the sorted listing.\n const offset = continuationToken !== undefined ? Number.parseInt(continuationToken, 10) || 0 : 0;\n const page = results.slice(offset, offset + maxKeys);\n const truncated = offset + maxKeys < results.length;\n return {\n keys: page,\n truncated,\n ...(truncated ? { nextToken: String(offset + maxKeys) } : {}),\n };\n }\n\n private async deleteObject(params: IntegrationParams): Promise<{ deleted: boolean }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n if (this.s3) {\n await this.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));\n return { deleted: true };\n }\n\n const existed = this.objects.has(this.compositeKey(bucket, key));\n this.objects.delete(this.compositeKey(bucket, key));\n return { deleted: existed };\n }\n\n private async signUrl(\n bucket: string,\n key: string,\n operation: 'get' | 'put',\n expiresIn: number,\n ): Promise<{ url: string; expiresAt: number }> {\n const expiresAt = Date.now() + expiresIn * 1000;\n if (this.s3) {\n const command =\n operation === 'put'\n ? new PutObjectCommand({ Bucket: bucket, Key: key })\n : new GetObjectCommand({ Bucket: bucket, Key: key });\n const url = await s3GetSignedUrl(this.s3, command, { expiresIn });\n return { url, expiresAt };\n }\n const token = createHash('sha256').update(`${bucket}/${key}/${expiresAt}`).digest('hex').slice(0, 16);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host&X-Amz-Signature=${token}&operation=${operation}`;\n return { url, expiresAt };\n }\n\n private async getSignedUrl(params: IntegrationParams): Promise<{ url: string; expiresAt: number }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n const expiresIn = (params.expiresIn as number | undefined) ?? 3600;\n const operation = (params.operation as 'get' | 'put' | undefined) ?? 'get';\n this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n return this.signUrl(bucket, key, operation, expiresIn);\n }\n}\n\n// Auto-register\nregisterIntegration('storage', StorageIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Represents a container in the in-memory store */\ninterface SimulatedContainer {\n id: string;\n name: string;\n image: string;\n status: 'created' | 'running' | 'paused' | 'exited' | 'dead';\n ports: Array<{ host: number; container: number; protocol: string }>;\n env: Record<string, string>;\n volumes: Array<{ host: string; container: string }>;\n command: string;\n labels: Record<string, string>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n logs: string[];\n}\n\n/** Represents a built image in the in-memory store */\ninterface SimulatedImage {\n id: string;\n tag: string;\n dockerfile: string;\n size: number;\n createdAt: number;\n}\n\n/**\n * Docker/Container integration with in-memory backend for development/testing.\n *\n * Provides container lifecycle operations (build, run, stop, remove, logs,\n * status, list) backed by an in-memory Map. No Docker SDK or daemon connection\n * is required.\n */\nexport class DockerIntegration extends BaseIntegration {\n private containers: Map<string, SimulatedContainer> = new Map();\n private images: Map<string, SimulatedImage> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const dockerHost = config.env.DOCKER_HOST;\n if (dockerHost) {\n this.logger.warn(\n 'DOCKER_HOST is configured but real Docker client is not yet implemented. ' +\n 'Falling back to in-memory simulation.',\n { dockerHost },\n );\n }\n\n this.logger.info('Docker integration initialized (in-memory simulation)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'build':\n data = await this.executeWithRetry(() => this.build(params));\n break;\n case 'run':\n data = await this.executeWithRetry(() => this.run(params));\n break;\n case 'stop':\n data = await this.executeWithRetry(() => this.stop(params));\n break;\n case 'remove':\n data = await this.executeWithRetry(() => this.removeContainer(params));\n break;\n case 'logs':\n data = await this.executeWithRetry(() => this.logs(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex container/image ID. */\n private generateId(): string {\n const segments: string[] = [];\n for (let i = 0; i < 16; i++) {\n segments.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return segments.join('');\n }\n\n /** Find a container by ID (prefix match supported). */\n private findContainer(containerId: string): SimulatedContainer | undefined {\n // Exact match first\n const exact = this.containers.get(containerId);\n if (exact) return exact;\n\n // Prefix match (like real Docker)\n for (const [id, container] of this.containers) {\n if (id.startsWith(containerId)) {\n return container;\n }\n }\n\n return undefined;\n }\n\n /** Generate realistic log lines for a container. */\n private generateLogLines(container: SimulatedContainer, count: number): string[] {\n const lines: string[] = [...container.logs];\n const baseTime = container.startedAt ?? container.createdAt;\n\n while (lines.length < count) {\n const ts = new Date(baseTime + lines.length * 1000).toISOString();\n lines.push(`${ts} [info] Container ${container.name} — heartbeat #${lines.length + 1}`);\n }\n\n return lines;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async build(\n params: IntegrationParams,\n ): Promise<{ imageId: string; tag: string; size: number; buildTime: number }> {\n const dockerfile = (params.dockerfile as string | undefined) ?? 'Dockerfile';\n const tag = params.tag as string;\n const context = (params.context as string | undefined) ?? '.';\n const buildArgs = (params.buildArgs as Record<string, string> | undefined) ?? {};\n\n this.logger.debug('Docker BUILD', { dockerfile, tag, context, buildArgs });\n\n const imageId = `sha256:${this.generateId()}`;\n const size = 150_000_000 + Math.floor(Math.random() * 350_000_000); // 150–500 MB\n const buildTime = 2000 + Math.floor(Math.random() * 8000); // 2–10s simulated\n\n const image: SimulatedImage = {\n id: imageId,\n tag,\n dockerfile,\n size,\n createdAt: Date.now(),\n };\n\n this.images.set(tag, image);\n\n return { imageId, tag, size, buildTime };\n }\n\n private async run(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n }> {\n const image = params.image as string;\n const name = (params.name as string | undefined) ?? `container-${this.generateId().slice(0, 12)}`;\n const rawPorts = (params.ports as Array<{ host: number; container: number; protocol?: string }> | undefined) ?? [];\n const env = (params.env as Record<string, string> | undefined) ?? {};\n const rawVolumes = (params.volumes as Array<{ host: string; container: string }> | undefined) ?? [];\n const command = (params.command as string | undefined) ?? '';\n\n this.logger.debug('Docker RUN', { image, name, ports: rawPorts.map(p => `${p.host}:${p.container}`).join(', '), volumes: rawVolumes.map(v => `${v.host}:${v.container}`).join(', '), command });\n\n const containerId = this.generateId();\n\n const ports = rawPorts.map((p) => ({\n host: p.host,\n container: p.container,\n protocol: p.protocol ?? 'tcp',\n }));\n\n const volumes = rawVolumes.map((v) => ({\n host: v.host,\n container: v.container,\n }));\n\n const container: SimulatedContainer = {\n id: containerId,\n name,\n image,\n status: 'running',\n ports,\n env,\n volumes,\n command,\n labels: {},\n createdAt: Date.now(),\n startedAt: Date.now(),\n stoppedAt: null,\n logs: [\n `${new Date().toISOString()} [info] Starting container ${name} from image ${image}`,\n `${new Date().toISOString()} [info] Container ${name} is now running`,\n ],\n };\n\n this.containers.set(containerId, container);\n\n return {\n containerId,\n name,\n status: container.status,\n ports,\n };\n }\n\n private async stop(\n params: IntegrationParams,\n ): Promise<{ containerId: string; status: string; stoppedAt: number }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STOP', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status !== 'running' && container.status !== 'paused') {\n throw new Error(`Container ${containerId} is not running (current status: ${container.status})`);\n }\n\n container.status = 'exited';\n container.stoppedAt = Date.now();\n container.logs.push(\n `${new Date().toISOString()} [info] Container ${container.name} stopped`,\n );\n\n return {\n containerId: container.id,\n status: container.status,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async removeContainer(\n params: IntegrationParams,\n ): Promise<{ containerId: string; removed: boolean }> {\n const containerId = params.containerId as string;\n const force = (params.force as boolean | undefined) ?? false;\n\n this.logger.debug('Docker REMOVE', { containerId, force });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status === 'running' && !force) {\n throw new Error(\n `Container ${containerId} is running. Stop it first or use force=true.`,\n );\n }\n\n this.containers.delete(container.id);\n\n return { containerId: container.id, removed: true };\n }\n\n private async logs(\n params: IntegrationParams,\n ): Promise<{ containerId: string; logs: string[]; lineCount: number }> {\n const containerId = params.containerId as string;\n const tail = (params.tail as number | undefined) ?? 100;\n const since = (params.since as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LOGS', { containerId, tail, since });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n let logLines = this.generateLogLines(container, tail);\n\n // Filter by since timestamp if provided\n if (since) {\n const sinceMs = new Date(since).getTime();\n logLines = logLines.filter((line) => {\n const timestampMatch = /^\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z/.exec(line);\n if (!timestampMatch) return true;\n return new Date(timestampMatch[0]).getTime() >= sinceMs;\n });\n }\n\n // Apply tail limit\n const tailedLines = logLines.slice(-tail);\n\n return {\n containerId: container.id,\n logs: tailedLines,\n lineCount: tailedLines.length,\n };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STATUS', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n return {\n containerId: container.id,\n name: container.name,\n image: container.image,\n status: container.status,\n ports: container.ports,\n createdAt: container.createdAt,\n startedAt: container.startedAt,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n }> {\n const showAll = (params.all as boolean | undefined) ?? false;\n const filterByLabel = (params.filterByLabel as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LIST', { all: showAll, filterByLabel });\n\n let entries = Array.from(this.containers.values());\n\n // By default, only show running containers (like `docker ps`)\n if (!showAll) {\n entries = entries.filter((c) => c.status === 'running');\n }\n\n // Filter by label if specified\n if (filterByLabel) {\n const [labelKey, labelValue] = filterByLabel.split('=');\n entries = entries.filter((c) => {\n if (labelValue !== undefined) {\n return c.labels[labelKey] === labelValue;\n }\n return labelKey in c.labels;\n });\n }\n\n // Sort by creation time (newest first)\n entries.sort((a, b) => b.createdAt - a.createdAt);\n\n const containers = entries.map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image,\n status: c.status,\n ports: c.ports,\n createdAt: c.createdAt,\n }));\n\n return { containers, total: containers.length };\n }\n}\n\n// Auto-register\nregisterIntegration('docker', DockerIntegration);\n","/**\n * Read-only SQL enforcement for the database integration.\n *\n * The guard accepts exactly one SELECT statement (optionally CTE-led) and\n * nothing else. Comments are stripped and string/identifier contents are\n * blanked before keyword checks, so denied keywords inside literals (e.g.\n * `WHERE note = 'delete this'`) never false-positive, and comment/quote\n * tricks cannot smuggle a second statement past the check.\n */\n\nexport interface SqlGuardResult {\n ok: boolean;\n reason?: string;\n}\n\n/**\n * Reserved words that mutate or lock wherever they appear inside a SELECT:\n * data-modifying CTE bodies (INSERT/UPDATE/DELETE/MERGE), `SELECT ... INTO`\n * DDL, and `FOR UPDATE`/`FOR SHARE` locking clauses.\n */\nconst DENIED_KEYWORDS = new Set(['INSERT', 'UPDATE', 'DELETE', 'MERGE', 'INTO', 'FOR']);\n\nfunction isWordChar(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_' || ch === '$';\n}\n\n/** Skip a single-quoted literal starting at `start` (the opening quote). */\nfunction skipSingleQuoted(sql: string, start: number, eString: boolean): number {\n let i = start + 1;\n while (i < sql.length) {\n if (eString && sql[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (sql[i] === \"'\") {\n if (sql[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Skip a double-quoted identifier starting at `start` (the opening quote). */\nfunction skipDoubleQuoted(sql: string, start: number): number {\n let i = start + 1;\n while (i < sql.length) {\n if (sql[i] === '\"') {\n if (sql[i + 1] === '\"') {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Match a dollar-quote tag ($$ or $tag$) at `start`; `$1` placeholders are not tags. */\nfunction matchDollarTag(sql: string, start: number): string | undefined {\n let i = start + 1;\n if (sql[i] === '$') return '$$';\n const first = sql[i];\n if (!first || !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first === '_')) {\n return undefined;\n }\n i++;\n while (i < sql.length && isWordChar(sql[i]) && sql[i] !== '$') i++;\n if (sql[i] !== '$') return undefined;\n return sql.slice(start, i + 1);\n}\n\n/** Strip comments and blank string/identifier contents, keeping structure. */\nfunction sanitizeSql(sql: string): string {\n const out: string[] = [];\n let i = 0;\n\n while (i < sql.length) {\n const ch = sql[i];\n\n if (ch === '-' && sql[i + 1] === '-') {\n while (i < sql.length && sql[i] !== '\\n') i++;\n out.push(' ');\n continue;\n }\n\n if (ch === '/' && sql[i + 1] === '*') {\n // Postgres nests block comments\n let depth = 1;\n i += 2;\n while (i < sql.length && depth > 0) {\n if (sql[i] === '/' && sql[i + 1] === '*') {\n depth++;\n i += 2;\n } else if (sql[i] === '*' && sql[i + 1] === '/') {\n depth--;\n i += 2;\n } else {\n i++;\n }\n }\n out.push(' ');\n continue;\n }\n\n if (ch === \"'\") {\n // E'…' strings honor backslash escapes; standard strings do not\n let j = i - 1;\n while (j >= 0 && (sql[j] === ' ' || sql[j] === '\\t' || sql[j] === '\\n' || sql[j] === '\\r')) j--;\n const prev = j >= 0 ? sql[j] : '';\n const eString = (prev === 'e' || prev === 'E') && (j === 0 || !isWordChar(sql[j - 1]));\n i = skipSingleQuoted(sql, i, eString);\n out.push(\"''\");\n continue;\n }\n\n if (ch === '\"') {\n i = skipDoubleQuoted(sql, i);\n out.push('\"\"');\n continue;\n }\n\n if (ch === '$') {\n const tag = matchDollarTag(sql, i);\n if (tag) {\n const close = sql.indexOf(tag, i + tag.length);\n i = close === -1 ? sql.length : close + tag.length;\n out.push('$$');\n continue;\n }\n }\n\n out.push(ch);\n i++;\n }\n\n return out.join('');\n}\n\n/**\n * Verify `sql` is a single read-only SELECT statement.\n * Returns `{ ok: false, reason }` for anything else.\n */\nexport function assertReadOnlySelect(sql: string): SqlGuardResult {\n const sanitized = sanitizeSql(sql);\n\n const statements = sanitized\n .split(';')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (statements.length === 0) {\n return { ok: false, reason: 'Empty statement' };\n }\n if (statements.length > 1) {\n return { ok: false, reason: 'Only a single statement is allowed' };\n }\n\n const words = (statements[0].match(/\\b[A-Za-z_][A-Za-z0-9_]*\\b/g) ?? []).map((w) =>\n w.toUpperCase(),\n );\n const first = words[0];\n if (first !== 'SELECT' && first !== 'WITH') {\n return { ok: false, reason: 'Only SELECT statements are allowed' };\n }\n\n const denied = words.find((w) => DENIED_KEYWORDS.has(w));\n if (denied) {\n return { ok: false, reason: `Keyword not allowed in a read-only query: ${denied}` };\n }\n\n return { ok: true };\n}\n","/**\n * Database Integration for Almadar\n * Read-only SQL queries over external connections (migration fetch seam).\n */\n\nimport { Pool } from 'pg';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { IntegrationError } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { resolveCredentialRef } from '../../credentials';\nimport { assertReadOnlySelect } from './sql-guard';\nimport type {\n DatabaseDriver,\n DatabaseQueryParams,\n DatabaseQueryParamValue,\n DatabaseQueryResult,\n DatabaseRow,\n} from './types';\n\nconst DEFAULT_STATEMENT_TIMEOUT_MS = 10_000;\n\n/** Postgres SQLSTATE raised when statement_timeout cancels a query. */\nconst PG_QUERY_CANCELED = '57014';\n\nclass PostgresDriver implements DatabaseDriver {\n private pool: Pool;\n\n constructor(connectionString: string, statementTimeoutMs: number) {\n this.pool = new Pool({\n connectionString,\n statement_timeout: statementTimeoutMs,\n query_timeout: statementTimeoutMs,\n });\n }\n\n async query(\n sql: string,\n params: readonly DatabaseQueryParamValue[],\n ): Promise<DatabaseQueryResult> {\n const result = await this.pool.query(sql, [...params]);\n return {\n rows: result.rows as DatabaseRow[],\n rowCount: result.rowCount ?? result.rows.length,\n };\n }\n\n async end(): Promise<void> {\n await this.pool.end();\n }\n}\n\nfunction mapDriverError(error: unknown): IntegrationError {\n if (error instanceof IntegrationError) return error;\n const code = (error as { code?: string }).code;\n if (code === PG_QUERY_CANCELED) {\n return new IntegrationError('Statement timeout exceeded', 'TIMEOUT_ERROR');\n }\n const message = error instanceof Error ? error.message : String(error);\n return new IntegrationError(message, 'SERVICE_ERROR');\n}\n\n/**\n * Generic database integration. One action — `query` — with read-only\n * enforced in the integration itself (single SELECT only, statement\n * timeout). `connectionRef` is an environment variable NAME, never the\n * secret; the connection string is resolved from `process.env` at run time.\n */\nexport class DatabaseIntegration extends BaseIntegration {\n private drivers: Map<string, DatabaseDriver> = new Map();\n private statementTimeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const fromEnv = config.env.DATABASE_STATEMENT_TIMEOUT_MS;\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid DATABASE_STATEMENT_TIMEOUT_MS: ${fromEnv}`);\n }\n this.statementTimeoutMs = parsed;\n } else {\n this.statementTimeoutMs = config.timeout ?? DEFAULT_STATEMENT_TIMEOUT_MS;\n }\n\n this.logger.info('Database integration initialized', {\n statementTimeoutMs: this.statementTimeoutMs,\n });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'query':\n data = await this.executeWithRetry(() => this.runQuery(params as DatabaseQueryParams));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async runQuery(params: DatabaseQueryParams): Promise<DatabaseQueryResult> {\n const guard = assertReadOnlySelect(params.sql);\n if (!guard.ok) {\n throw new IntegrationError(\n `Read-only violation: ${guard.reason ?? 'not a SELECT statement'}`,\n 'VALIDATION_ERROR',\n );\n }\n\n const driver = this.driverFor(params.connectionRef);\n\n this.logger.debug('Database QUERY', { connectionRef: params.connectionRef });\n\n try {\n return await driver.query(params.sql, params.params ?? []);\n } catch (error) {\n throw mapDriverError(error);\n }\n }\n\n /** Resolve (and cache) the driver for a connection reference. */\n private driverFor(connectionRef: string): DatabaseDriver {\n const connectionString = resolveCredentialRef(connectionRef);\n if (!connectionString) {\n throw new IntegrationError(\n `Connection reference \"${connectionRef}\" is not set in the credential store or environment`,\n 'AUTH_ERROR',\n );\n }\n\n const cached = this.drivers.get(connectionString);\n if (cached) return cached;\n\n const driver = new PostgresDriver(connectionString, this.statementTimeoutMs);\n this.drivers.set(connectionString, driver);\n return driver;\n }\n}\n\n// Auto-register\nregisterIntegration('database', DatabaseIntegration);\n\n// Export types\nexport * from './types';\nexport { assertReadOnlySelect, type SqlGuardResult } from './sql-guard';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Wikimedia (Wikipedia API) integration — redirect-resolved page lookup returning\n * a verified one-line description, a real Commons portrait, and the lead-section\n * extract. The single canonical home for the User-Agent + timeout that kflow's\n * persona services previously duplicated as ad-hoc `fetch` calls.\n */\nconst WIKI_ENDPOINT = 'https://en.wikipedia.org/w/api.php';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\nconst EXTRACT_CHAR_CAP = 2000;\n\ninterface WikiPage {\n missing?: '' | boolean;\n title?: string;\n description?: string;\n extract?: string;\n thumbnail?: { source?: string };\n}\ninterface WikiQueryResponse {\n query?: { pages?: Record<string, WikiPage> };\n}\n\nexport class WikimediaIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.WIKIMEDIA_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.WIKIMEDIA_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Wikimedia integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'getPage':\n data = await this.executeWithRetry(() => this.getPage(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /** Look up a title on Wikipedia: description, portrait, lead extract. Empty fields on miss. */\n private async getPage(params: IntegrationParams): Promise<{ title?: string; description?: string; portraitUrl?: string; extract?: string }> {\n const title = String(params.title ?? '').trim();\n if (!title) return {};\n const url =\n `${WIKI_ENDPOINT}?action=query&format=json&redirects=1` +\n `&prop=pageimages|description|extracts&explaintext=1&exintro=1` +\n `&piprop=thumbnail&pithumbsize=240&titles=${encodeURIComponent(title)}`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return {};\n const data = (await res.json()) as WikiQueryResponse;\n const pages = data.query?.pages;\n if (!pages) return {};\n const page = Object.values(pages)[0];\n if (!page || page.missing !== undefined) return {};\n const extract = typeof page.extract === 'string' ? page.extract.slice(0, EXTRACT_CHAR_CAP).trim() : undefined;\n return {\n title: page.title,\n description: page.description ?? (typeof page.extract === 'string' ? page.extract.split('.')[0] : undefined),\n portraitUrl: page.thumbnail?.source,\n extract,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('wikimedia', WikimediaIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Iconify integration — brand-logo / icon resolution via the Iconify API.\n * Exposes the three atomic HTTP calls kflow's concept-icon service previously\n * made as ad-hoc `fetch`: existence check, relevance search, and icon-body\n * fetch (for color-tone classification). Caching + tone classification stay\n * in the caller; this owns only the transport (UA, timeout, retry).\n */\nconst ICONIFY_API = 'https://api.iconify.design';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\n\ninterface IconCollection { icons?: Record<string, { body: string }>; aliases?: Record<string, { body: string }>; }\ninterface SearchResponse { icons?: string[]; }\n\nexport class IconifyIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.ICONIFY_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.ICONIFY_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Iconify integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'svgExists':\n data = await this.executeWithRetry(() => this.svgExists(params));\n break;\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getIconBody':\n data = await this.executeWithRetry(() => this.getIconBody(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async svgExists(params: IntegrationParams): Promise<{ exists: boolean }> {\n const path = String(params.path ?? '');\n if (!path) return { exists: false };\n return { exists: await this.headOk(`${ICONIFY_API}/${path}`) };\n }\n\n private async search(params: IntegrationParams): Promise<{ icons: string[] }> {\n const query = String(params.query ?? '');\n if (!query) return { icons: [] };\n const limit = Number(params.limit ?? 1);\n const data = await this.getJson<SearchResponse>(`${ICONIFY_API}/search?query=${encodeURIComponent(query)}&limit=${limit}`);\n return { icons: data?.icons ?? [] };\n }\n\n private async getIconBody(params: IntegrationParams): Promise<{ body: string | null }> {\n const iconId = String(params.iconId ?? '');\n const [prefix, name] = iconId.split(':');\n if (!prefix || !name) return { body: null };\n const data = await this.getJson<IconCollection>(`${ICONIFY_API}/${prefix}.json?icons=${encodeURIComponent(name)}`);\n return { body: data?.icons?.[name]?.body ?? data?.aliases?.[name]?.body ?? null };\n }\n\n private async headOk(url: string): Promise<boolean> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { method: 'GET', headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async getJson<T>(url: string): Promise<T | null> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('iconify', IconifyIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * arXiv integration — the live-search backend for the knowledge-worker's\n * \"emerging\" axis (frontier academic concepts beyond the user's graph). Wraps\n * the public Atom API at export.arxiv.org. Chosen as the placeholder web-search\n * vendor; the action shape matches a generic search so the backend can be\n * swapped without touching the rabit tool surface.\n */\nconst ARXIV_ENDPOINT = 'https://export.arxiv.org/api/query';\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_RESULTS = 8;\n\nexport interface ArxivResult {\n id: string;\n title: string;\n summary: string;\n authors: string[];\n published: string;\n url: string;\n}\n\n/** Minimal Atom `<entry>` extractor — arXiv's feed is regular; no XML dep needed. */\nfunction parseAtom(xml: string): ArxivResult[] {\n const entries: ArxivResult[] = [];\n for (const block of xml.split('<entry>').slice(1)) {\n const grab = (tag: string): string => {\n const m = block.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)</${tag}>`, 'i'));\n return m ? m[1].replace(/<[^>]+>/g, '').trim() : '';\n };\n const id = grab('id');\n const title = grab('title').replace(/\\s+/g, ' ');\n const summary = grab('summary').replace(/\\s+/g, ' ');\n const published = grab('published');\n const authors = Array.from(block.matchAll(/<author>\\s*<name>([^<]+)<\\/name>/g)).map(m => m[1].trim());\n const linkMatch = block.match(/<link[^>]*rel=\"alternate\"[^>]*href=\"([^\"]+)\"/i);\n const url = linkMatch ? linkMatch[1] : id;\n if (id || title) entries.push({ id, title, summary, authors, published, url });\n }\n return entries;\n}\n\nexport class ArxivIntegration extends BaseIntegration {\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.timeoutMs = Number(config.env?.ARXIV_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('arXiv integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n try {\n let data: unknown;\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams): Promise<{ results: ArxivResult[] }> {\n const query = String(params.query ?? '').trim();\n if (!query) return { results: [] };\n const maxResults = Number(params.maxResults ?? DEFAULT_MAX_RESULTS);\n // arXiv search_query: quote the term as an all-fields term.\n const url = `${ARXIV_ENDPOINT}?search_query=${encodeURIComponent(`all:${query}`)}&start=0&max_results=${maxResults}&sortBy=relevance`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'Accept': 'application/atom+xml' }, signal: ctrl.signal });\n if (!res.ok) return { results: [] };\n const xml = await res.text();\n return { results: parseAtom(xml) };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('arxiv', ArxivIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { UnknownActionError } from '../../core/validation';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Rigger integration — local FastAPI mesh-rigging / render service.\n * Default endpoint http://127.0.0.1:8181; override with RIGGER_BASE_URL.\n */\nconst DEFAULT_BASE_URL = 'http://127.0.0.1:8181';\nconst DEFAULT_TIMEOUT_MS = 30000;\n\ninterface MeshBuildResponse {\n bundlePath: string;\n boneCount: number;\n vertexCount: number;\n triangleCount: number;\n clips: string[];\n}\n\nexport class RiggerIntegration extends BaseIntegration {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.baseUrl = config.env.RIGGER_BASE_URL || DEFAULT_BASE_URL;\n this.timeoutMs = Number(config.env.RIGGER_TIMEOUT_MS) || DEFAULT_TIMEOUT_MS;\n this.logger.info('Rigger integration initialized', { baseUrl: this.baseUrl });\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'health':\n data = await this.health();\n break;\n case 'buildMesh':\n data = await this.executeWithRetry(() => this.buildMesh(params));\n break;\n case 'render':\n data = await this.executeWithRetry(() => this.render(params));\n break;\n default:\n throw new UnknownActionError(this.config.name, action);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async health(): Promise<{ ok: boolean }> {\n const response = await fetch(`${this.baseUrl}/health`, {\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n return { ok: response.ok };\n }\n\n private async buildMesh(params: IntegrationParams): Promise<MeshBuildResponse> {\n const { imagePath, rig } = params;\n const response = await fetch(`${this.baseUrl}/mesh/build`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imagePath, rig }),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(`Rigger /mesh/build returned ${response.status}`);\n }\n return (await response.json()) as MeshBuildResponse;\n }\n\n private async render(params: IntegrationParams): Promise<unknown> {\n const { imagePath, rig, preset, outDir } = params;\n const response = await fetch(`${this.baseUrl}/render`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imagePath, rig, preset, outDir }),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(`Rigger /render returned ${response.status}`);\n }\n return response.json();\n }\n}\n\n// Auto-register\nregisterIntegration('rigger', RiggerIntegration);\n","import { BaseIntegration } from '../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../types';\nimport { IntegrationError } from '../types';\n\n/**\n * Mock integration for testing\n */\nexport class MockIntegration extends BaseIntegration {\n private responses: Map<string, unknown> = new Map();\n private calls: Array<{ action: string; params: IntegrationParams }> =\n [];\n\n constructor(config: IntegrationConfig) {\n super(config);\n }\n\n /**\n * Set mock response for an action\n */\n setResponse(action: string, data: unknown): void {\n this.responses.set(action, data);\n }\n\n /**\n * Get all calls made to this integration\n */\n getCalls(): Array<{ action: string; params: IntegrationParams }> {\n return this.calls;\n }\n\n /**\n * Clear all calls\n */\n clearCalls(): void {\n this.calls = [];\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n // Record the call\n this.calls.push({ action, params });\n\n const data = this.responses.get(action);\n\n if (!data) {\n return {\n success: false,\n error: new IntegrationError(\n `No mock response for action: ${action}`,\n 'UNKNOWN_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, 0),\n };\n }\n}\n","import { IntegrationFactory, type IntegrationCallContext } from '../factory';\nimport type { IntegrationResult, IntegrationParams } from '../types';\nimport type {\n IntegrationContracts,\n IntegrationName,\n IntegrationActionName,\n} from '../contracts';\n\n/**\n * Signature of the call-service handler returned by `createCallServiceHandler`\n * and `RuntimeIntegrationManager.getCallServiceHandler`. Exported so that\n * consumers (e.g. orbital-codegen-emitted `clients.ts`) can give the value\n * a public type and avoid TS2742 \"inferred type cannot be named without a\n * reference to <bundler-internal>\" errors when emitting `.d.ts`.\n *\n * Overloaded: when the caller passes a service + action LITERAL pair the\n * compiler narrows to `IntegrationContracts[Service][Action]['result']`.\n * Codegen-emitted call sites pass string literals (`callService('github',\n * 'listIssues', ...)`) so they get the typed result for free and no\n * longer need a `: unknown` annotation or downstream `as <Result>` casts.\n * The wide fallback signature keeps non-literal call sites (e.g. dynamic\n * dispatch via `manager.getCallServiceHandler()`) working.\n */\nexport interface CallServiceHandler {\n <S extends IntegrationName, A extends IntegrationActionName<S>>(\n service: S,\n action: A,\n params: IntegrationContracts[S][A] extends { params: infer P } ? P : IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<\n IntegrationContracts[S][A] extends { result: infer R } ? R : unknown\n >;\n (\n service: string,\n action: string,\n params: IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<unknown>;\n}\n\n/**\n * Create a callService effect handler for @almadar/runtime.\n *\n * The implementation is the wide form `(string, string, params) =>\n * Promise<unknown>` — at runtime we don't know which action's result\n * shape to return. The handler is returned as `CallServiceHandler`,\n * whose typed overload narrows to `IntegrationContracts[S][A]['result']`\n * at every literal call site (codegen-emitted `callService('github',\n * 'listIssues', ...)` gets typed result for free). The cast is to a\n * specific callable interface — not `unknown` / `any` — so the\n * `no-as-any` / `no-unknown-type` rules are unaffected.\n */\nexport function createCallServiceHandler(factory: IntegrationFactory): CallServiceHandler {\n const handler = async (\n service: string,\n action: string,\n params: IntegrationParams | undefined,\n context?: IntegrationCallContext,\n ): Promise<unknown> => {\n const result = await factory.execute(service, action, params || {}, context);\n\n if (!result.success) {\n throw result.error;\n }\n\n return result.data;\n };\n return handler as CallServiceHandler;\n}\n","import { createRequire } from 'node:module';\nimport { IntegrationFactory, type IntegrationCallContext } from '../factory';\nimport { MockIntegration } from '../mocks/MockIntegration';\nimport { createCallServiceHandler, type CallServiceHandler } from './effectHandler';\nimport { installActiveFactory, installCredentialStore, type CredentialStore } from '../credentials';\nimport { serviceCredentials, declaredCredentialEnvVars, STORE_BOOTSTRAP_ENV_VARS } from '../contracts';\nimport type { IntegrationResult, IntegrationParams } from '../types';\n\n/** Mock data value types generated from response shapes */\ntype MockValue = string | number | boolean | Record<string, never> | never[];\n\n/**\n * Generate mock data from a responseShape definition.\n * Maps type strings to realistic placeholder values.\n */\nfunction generateMockFromShape(shape: Record<string, string>): Record<string, MockValue> {\n const data: Record<string, MockValue> = {};\n for (const [key, type] of Object.entries(shape)) {\n switch (type) {\n case 'string': data[key] = `mock_${key}`; break;\n case 'number': data[key] = 42; break;\n case 'boolean': data[key] = true; break;\n case 'object': data[key] = {}; break;\n case 'string[]': data[key] = []; break;\n default: data[key] = `mock_${key}`;\n }\n }\n return data;\n}\n\n/**\n * Runtime integration manager\n * Auto-configures integrations from environment variables.\n * When USE_MOCK_DATA=true, registers mock integrations for all services\n * using response shapes from services-registry.json.\n */\nexport class RuntimeIntegrationManager {\n private factory: IntegrationFactory;\n private credentialStore: CredentialStore | null = null;\n private storeEnvBase: Record<string, string | undefined> | null = null;\n private storeFirst = false;\n\n constructor() {\n this.factory = new IntegrationFactory();\n this.installNotConfiguredFallback();\n installActiveFactory(this.factory);\n }\n\n /**\n * W4: configure with the tenant credential store layered over the env —\n * store → env → unconfigured. Installs the store as the process-wide\n * `resolveCredentialRef` source, warms it, and re-configures whenever a\n * credential changes (dropping cached instances so new keys go live\n * without a restart). Mock mode short-circuits inside `configureFromEnv`\n * exactly as before, so verify harnesses are unaffected.\n */\n async configureFromStore(\n store: CredentialStore,\n envOverride?: Record<string, string | undefined>,\n ): Promise<void> {\n this.credentialStore = store;\n this.storeEnvBase = envOverride ?? process.env;\n // I-31 store-first: the store is the ONLY source for declared credentials —\n // boot seeds it from the declared env values (.env stays the documented\n // write surface, as seed data), then the env fallback is stripped so every\n // resolution flows the exact path a deployed client app uses. Undeclared\n // refs (database connectionRefs) deliberately pass through.\n this.storeFirst = this.storeEnvBase.ALMADAR_CREDENTIALS_SOURCE === 'store';\n installCredentialStore(store);\n await store.warm();\n if (this.storeFirst && store.enabled) {\n await this.seedStoreFromEnv(store, this.storeEnvBase);\n }\n store.subscribe(() => this.refreshFromStore());\n this.refreshFromStore();\n }\n\n /** Whether store-first custody (I-31) is active on this manager. */\n get credentialsStoreFirst(): boolean {\n return this.storeFirst;\n }\n\n /** Copy each declared credential present in env but absent from the store. */\n private async seedStoreFromEnv(\n store: CredentialStore,\n env: Record<string, string | undefined>,\n ): Promise<void> {\n const present = new Set(store.entries().map((e) => e.envVar));\n for (const [service, decls] of Object.entries(serviceCredentials)) {\n for (const { envVar } of decls) {\n if (STORE_BOOTSTRAP_ENV_VARS.has(envVar)) continue;\n const value = env[envVar];\n if (value && !present.has(envVar)) {\n await store.set(service, envVar, value);\n present.add(envVar);\n }\n }\n }\n }\n\n /**\n * Re-derive configs from base env + warmed store values. `reset()` (not\n * `invalidate()`): configs must go too, or a REMOVED credential's service\n * resurrects from its stale config on the next `get()` — removal must\n * revoke. `configureFromEnv` below rebuilds every configured service from\n * the merged env.\n */\n private refreshFromStore(): void {\n if (!this.credentialStore || !this.storeEnvBase) return;\n this.factory.reset();\n let base = this.storeEnvBase;\n if (this.storeFirst) {\n const declared = declaredCredentialEnvVars();\n base = Object.fromEntries(\n Object.entries(this.storeEnvBase).filter(([key]) => !declared.has(key)),\n );\n }\n this.configureFromEnv({ ...base, ...this.credentialStore.snapshotEnv() });\n }\n\n /**\n * Wrap `factory.execute` so an unknown/unconfigured service echoes its\n * params instead of throwing. This makes the manager safe to install as a\n * default `callService` handler (e.g. the playground sidecar) without every\n * service being configured. REAL execution errors (API failures, bad\n * params, schema violations) still propagate so the circuit's failure\n * events fire — only the two \"not set up\" errors (`Unknown integration`,\n * `Integration not configured`) are caught. Subsumes the broader wrapper\n * that previously lived inside `configureMockMode`.\n *\n * In production the fallback is OFF: a missing key must surface as the\n * circuit's failure event and a degraded health check, never a fake success.\n */\n private installNotConfiguredFallback(): void {\n const originalExecute = this.factory.execute.bind(this.factory);\n this.factory.execute = async (\n integration: string,\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> => {\n try {\n return await originalExecute(integration, action, params, context);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (process.env.NODE_ENV !== 'production' && /Unknown integration|not configured/i.test(msg)) {\n return {\n success: true,\n data: { ...params, _mock: true, _service: integration, _action: action },\n metadata: { integration, action, duration: 0, retries: 0, timestamp: Date.now() },\n };\n }\n throw err;\n }\n };\n }\n\n /**\n * Configure from environment variables.\n * In mock mode (USE_MOCK_DATA=true), all services return realistic mock data.\n *\n * Pass an explicit env map to configure hermetically (verify harnesses,\n * per-tenant resolution); defaults to `process.env`.\n */\n configureFromEnv(envOverride?: Record<string, string | undefined>): void {\n const env = envOverride ?? process.env;\n\n // ALMADAR_INTEGRATIONS_MODE=mock scopes mock mode to integrations only\n // (verify harnesses set it so catalog runs never spend real keys);\n // USE_MOCK_DATA=true additionally mocks the data tier and implies it.\n if (env.ALMADAR_INTEGRATIONS_MODE === 'mock' || env.USE_MOCK_DATA === 'true') {\n if (env.NODE_ENV === 'production') {\n throw new Error(\n 'Mocked integrations are not permitted when NODE_ENV=production — unset ALMADAR_INTEGRATIONS_MODE/USE_MOCK_DATA.',\n );\n }\n this.configureMockMode();\n return;\n }\n\n // Stripe\n if (env.STRIPE_SECRET_KEY) {\n this.factory.configure('stripe', {\n env: {\n STRIPE_SECRET_KEY: env.STRIPE_SECRET_KEY,\n },\n });\n }\n\n // YouTube\n if (env.YOUTUBE_API_KEY) {\n this.factory.configure('youtube', {\n env: {\n YOUTUBE_API_KEY: env.YOUTUBE_API_KEY,\n },\n });\n }\n\n // Twilio\n if (env.TWILIO_ACCOUNT_SID && env.TWILIO_AUTH_TOKEN) {\n this.factory.configure('twilio', {\n env: {\n TWILIO_ACCOUNT_SID: env.TWILIO_ACCOUNT_SID,\n TWILIO_AUTH_TOKEN: env.TWILIO_AUTH_TOKEN,\n TWILIO_PHONE_NUMBER: env.TWILIO_PHONE_NUMBER || '',\n },\n });\n }\n\n // Email (SendGrid)\n if (env.SENDGRID_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'sendgrid',\n SENDGRID_API_KEY: env.SENDGRID_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n // Email (Resend)\n else if (env.RESEND_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'resend',\n RESEND_API_KEY: env.RESEND_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n\n // Push (Web Push / VAPID)\n if (env.VAPID_PUBLIC_KEY && env.VAPID_PRIVATE_KEY && env.VAPID_SUBJECT) {\n this.factory.configure('push', {\n env: {\n VAPID_PUBLIC_KEY: env.VAPID_PUBLIC_KEY,\n VAPID_PRIVATE_KEY: env.VAPID_PRIVATE_KEY,\n VAPID_SUBJECT: env.VAPID_SUBJECT,\n },\n });\n }\n\n // Calendar (Google service account, optional domain-wide delegation)\n if (env.GOOGLE_CALENDAR_SA_KEY) {\n this.factory.configure('calendar', {\n env: {\n GOOGLE_CALENDAR_SA_KEY: env.GOOGLE_CALENDAR_SA_KEY,\n GOOGLE_CALENDAR_SUBJECT: env.GOOGLE_CALENDAR_SUBJECT || '',\n GOOGLE_CALENDAR_ID: env.GOOGLE_CALENDAR_ID || '',\n },\n });\n }\n\n // Drive — SA (reads, optional delegation) and/or user OAuth (writes;\n // SA writes are impossible on personal accounts — zero SA storage quota).\n if (env.GOOGLE_DRIVE_SA_KEY || (env.GOOGLE_DRIVE_REFRESH_TOKEN && env.OAUTH_CLIENT_ID && env.OAUTH_CLIENT_SECRET)) {\n this.factory.configure('drive', {\n env: {\n GOOGLE_DRIVE_SA_KEY: env.GOOGLE_DRIVE_SA_KEY || '',\n GOOGLE_DRIVE_SUBJECT: env.GOOGLE_DRIVE_SUBJECT || '',\n GOOGLE_DRIVE_REFRESH_TOKEN: env.GOOGLE_DRIVE_REFRESH_TOKEN || '',\n GOOGLE_DRIVE_FOLDER_ID: env.GOOGLE_DRIVE_FOLDER_ID || '',\n OAUTH_CLIENT_ID: env.OAUTH_CLIENT_ID || '',\n OAUTH_CLIENT_SECRET: env.OAUTH_CLIENT_SECRET || '',\n },\n });\n }\n\n // Meta Ads (Graph API, read-only insights)\n if (env.META_ACCESS_TOKEN) {\n this.factory.configure('metaAds', {\n env: {\n META_ACCESS_TOKEN: env.META_ACCESS_TOKEN,\n META_AD_ACCOUNT_ID: env.META_AD_ACCOUNT_ID || '',\n },\n });\n }\n\n // Accounting — generic CSV export, no credentials\n this.factory.configure('accounting', { env: {} });\n\n // Banking (GoCardless Bank Account Data)\n if (env.GOCARDLESS_SECRET_ID && env.GOCARDLESS_SECRET_KEY) {\n this.factory.configure('banking', {\n env: {\n GOCARDLESS_SECRET_ID: env.GOCARDLESS_SECRET_ID,\n GOCARDLESS_SECRET_KEY: env.GOCARDLESS_SECRET_KEY,\n },\n });\n }\n\n // E-sign (DocuSign)\n if (env.DOCUSIGN_BASE_URL && env.DOCUSIGN_ACCESS_TOKEN) {\n this.factory.configure('esign', {\n env: {\n DOCUSIGN_BASE_URL: env.DOCUSIGN_BASE_URL,\n DOCUSIGN_ACCESS_TOKEN: env.DOCUSIGN_ACCESS_TOKEN,\n },\n });\n }\n\n // OAuth (OIDC via openid-client; OAUTH_MODE=mock keeps the in-memory\n // backend for tests). Configured whenever a client is registered OR mock\n // mode is explicit — no silent half-configuration.\n if ((env.OAUTH_CLIENT_ID && env.OAUTH_CLIENT_SECRET) || env.OAUTH_MODE === 'mock') {\n this.factory.configure('oauth', {\n env: {\n OAUTH_CLIENT_ID: env.OAUTH_CLIENT_ID || '',\n OAUTH_CLIENT_SECRET: env.OAUTH_CLIENT_SECRET || '',\n OAUTH_REDIRECT_URI: env.OAUTH_REDIRECT_URI || '',\n OIDC_ISSUER_URL: env.OIDC_ISSUER_URL || '',\n OAUTH_MODE: env.OAUTH_MODE || '',\n },\n });\n }\n\n // Credentials — the hosted store's service surface; always configured\n // (its actions degrade honestly when no store is installed). The admin\n // role list + store-first flag ride the env so injected env maps stay\n // hermetic.\n this.factory.configure('credentials', {\n env: {\n ALMADAR_CREDENTIAL_ADMIN_ROLES: env.ALMADAR_CREDENTIAL_ADMIN_ROLES || '',\n ALMADAR_CREDENTIALS_SOURCE: env.ALMADAR_CREDENTIALS_SOURCE || '',\n },\n });\n\n // Storage — S3-compatible when credentialed; in-memory dev backend\n // otherwise (the integration itself refuses that fallback in production).\n this.factory.configure('storage', {\n env: {\n STORAGE_ACCESS_KEY_ID: env.STORAGE_ACCESS_KEY_ID || '',\n STORAGE_SECRET_ACCESS_KEY: env.STORAGE_SECRET_ACCESS_KEY || '',\n STORAGE_BUCKET: env.STORAGE_BUCKET || '',\n STORAGE_REGION: env.STORAGE_REGION || '',\n STORAGE_ENDPOINT: env.STORAGE_ENDPOINT || '',\n STORAGE_PUBLIC_URL_BASE: env.STORAGE_PUBLIC_URL_BASE || '',\n },\n });\n\n // Webhook — no required credentials; target URL is a per-call param\n this.factory.configure('webhook', {\n env: {\n WEBHOOK_SIGNING_SECRET: env.WEBHOOK_SIGNING_SECRET || '',\n WEBHOOK_TIMEOUT_MS: env.WEBHOOK_TIMEOUT_MS || '',\n },\n });\n\n // Rigger — local HTTP service; configured by default on the localhost\n // endpoint so call-service executes rather than echoing.\n this.factory.configure('rigger', {\n env: {\n RIGGER_BASE_URL: env.RIGGER_BASE_URL || '',\n RIGGER_TIMEOUT_MS: env.RIGGER_TIMEOUT_MS || '',\n },\n });\n\n // LLM — configure when any provider key (or an explicit PROVIDER) is\n // present. Pass every available key through and let the integration\n // auto-detect the provider via getAvailableProvider(), so deepseek /\n // openrouter / kimi work without a per-provider branch here. Embeddings\n // (the `embed` action) default to OpenRouter `baai/bge-base-en-v1.5`\n // unless EMBEDDING_* overrides.\n const llmEnv: Record<string, string> = {};\n for (const k of ['ANTHROPIC_API_KEY', 'OPENAI_API_KEY', 'DEEPSEEK_API_KEY', 'KIMI_API_KEY', 'OPEN_ROUTER_API_KEY']) {\n if (env[k]) llmEnv[k] = env[k] as string;\n }\n if (env.PROVIDER) llmEnv.PROVIDER = env.PROVIDER;\n for (const k of ['EMBEDDING_PROVIDER', 'EMBEDDING_MODEL', 'EMBEDDING_API_KEY']) {\n if (env[k]) llmEnv[k] = env[k] as string;\n }\n if (Object.keys(llmEnv).length > 0) {\n this.factory.configure('llm', { env: llmEnv });\n }\n\n // ML (model inference via a deployed serving orbital)\n if (env.MASAR_URL && env.MASAR_ML_TRAIT) {\n this.factory.configure('ml', {\n env: {\n MASAR_URL: env.MASAR_URL,\n MASAR_ML_TRAIT: env.MASAR_ML_TRAIT,\n MASAR_ML_TIMEOUT_MS: env.MASAR_ML_TIMEOUT_MS || '',\n },\n });\n }\n\n // DeepAgent\n if (env.DEEPAGENT_API_URL) {\n this.factory.configure('deepagent', {\n env: {\n DEEPAGENT_API_URL: env.DEEPAGENT_API_URL,\n DEEPAGENT_API_KEY: env.DEEPAGENT_API_KEY || '',\n },\n });\n }\n\n // GitHub\n if (env.GITHUB_TOKEN) {\n this.factory.configure('github', {\n env: {\n GITHUB_TOKEN: env.GITHUB_TOKEN,\n GITHUB_OWNER: env.GITHUB_OWNER || '',\n GITHUB_REPO: env.GITHUB_REPO || '',\n GITHUB_WORK_DIR: env.GITHUB_WORK_DIR || '',\n },\n });\n }\n }\n\n /**\n * Configure mock mode: register MockIntegration for all known services\n * with auto-generated responses from the services registry.\n */\n private configureMockMode(): void {\n // Load registry and populate mocks\n const registry = this.loadServicesRegistry();\n\n for (const [serviceName, service] of Object.entries(registry)) {\n const mock = new MockIntegration({ name: serviceName, env: {} });\n\n for (const action of service.actions) {\n if (action.responseShape && Object.keys(action.responseShape).length > 0) {\n mock.setResponse(action.name, generateMockFromShape(action.responseShape));\n } else {\n // No responseShape defined: return generic success\n mock.setResponse(action.name, { success: true, _mock: true, _action: action.name });\n }\n }\n\n this.factory.configure(serviceName, { env: {} });\n this.factory.registerInstance(serviceName, mock);\n }\n\n // Unknown/unconfigured services (e.g. custom-bearer-api) are echoed by\n // the constructor's `installNotConfiguredFallback`; nothing more to do.\n }\n\n /**\n * Load services registry from @almadar/core/patterns.\n * Returns a map of service name to { actions: [...] }.\n */\n private loadServicesRegistry(): Record<string, { actions: Array<{ name: string; responseShape: Record<string, string> }> }> {\n try {\n const esmRequire = createRequire(import.meta.url);\n const registry = esmRequire('@almadar/core/patterns/services-registry.json') as {\n services: Record<string, { actions: Array<{ name: string; responseShape: Record<string, string> }> }>;\n };\n return registry.services;\n } catch {\n // Registry not available (e.g., not installed). Return empty - fallback mock handles everything.\n return {};\n }\n }\n\n /**\n * Get effect handler for runtime. Annotated with `CallServiceHandler` so\n * the inferred type at consumer call sites resolves to a public exported\n * name instead of a tsup-bundler-generated chunk path (which causes\n * TS2742 in `.d.ts` emit).\n */\n getCallServiceHandler(): CallServiceHandler {\n return createCallServiceHandler(this.factory);\n }\n\n /**\n * Get factory (for advanced usage)\n */\n getFactory(): IntegrationFactory {\n return this.factory;\n }\n}\n"]}